Arduino 資料一覧
2017/03/04更新
対応バージョン: Node.js 4.2.6, Johnny-Five 0.10.6
Node.jsでArduino Unoにつないだ3桁7セグLEDをダイナミック点灯方式を用いて3桁同時に表示する(ように見せかける)。
小型3桁赤色7セグメントLED表示器 7mm高 アノードコモン (秋月電子通商)
Node.jsを動かす母艦はUbuntu 16.04とする。
抵抗値計算
IF(順電流): 20mA
VF(順電圧): 2.2V
抵抗 = (電源電圧5V - 順電圧2.2V) / 順電流20mA
= 2.8V / 0.02A
= 140Ω
抵抗はこの値より大きければ問題ないのでここでは220Ωの抵抗を使用する。
結線
結線は以下の通り。12,9,8番ピンはアノードコモンでその他のピンは抵抗を挟んでそれぞれ同じ番号のソケットに接続する。ただ1番ピンを接続する1番ソケットは動作しなかったので13番ソケットにつないでいる。
ソース
ダイナミックドライブによる表示が主目的なのでここでは表示する数字をプログラム中に直書きすることとする。プログラムの流れは以下の通り。
各桁出力制御用の8,9,12番ピンへのON/OFFパターンを配列で定義(digit_list[][])
各セグメント出力用ピンのON/OFFパターンを配列で定義(led_list[][])
LED出力用の関数(lighting)を定義
表示したい数字を各桁に分解して配列に格納(num_per_digit[])
各桁出力のON/OFFパターンと表示したい数字をセットにしてLED出力用の関数(lighting)を呼び出す処理をsetInterval()で5ミリ秒毎に高速に切り替える
上記を実装したコードを書きNode.jsで実行する。
7seg_3digit.js
// ピン定義(アノードコモン)
//
// -- ピン配列 ---------------------------------
//
// DIG.1(12) DIG.2(9) DIG.3(8)
// | | |
// +-------+ +-------+ +-------+
// A-G, DP A-G, DP A-G, DP
// +-------+ +-------+ +-------+
//
// A(11)
// +------+
// F(10)| |B(7)
// +-G(5)-+
// E(1)| |C(4)
// +------+
// D(2) []DP(3)
//
// -- 各桁出力制御用ピンパターン ---------------
// 1
// 2 9 8
// ---------------------------------------------
var digit_list = [
[0,0,0], // 消灯
[1,0,0], // DIG.1
[0,1,0], // DIG.2
[0,0,1], // DIG.3
];
//
// -- 各セグメント出力用ピンパターン -----------
// 0: LOW (点灯)
// 1: HIGH(消灯)
// 9: 未使用
//
// *) 0,6ピンは存在しないので未使用(=9)
// *) ArduinoのDIGITAL 1が動作しないので未使用(=9)とし、DIGITAL 13に接続
// *) 3ピン(DP)は常時消灯(=1)
// *) 8,9,12ピンは各桁出力制御用なので未使用(=9)
//
// 1 1 1 1
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3
// ---------------------------------------------
var led_list = [
[9,9,0,1,0,1,9,0,9,9,0,0,9,0], // 0
[9,9,1,1,0,1,9,0,9,9,1,1,9,1], // 1
[9,9,0,1,1,0,9,0,9,9,1,0,9,0], // 2
[9,9,0,1,0,0,9,0,9,9,1,0,9,1], // 3
[9,9,1,1,0,0,9,0,9,9,0,1,9,1], // 4
[9,9,0,1,0,0,9,1,9,9,0,0,9,1], // 5
[9,9,0,1,0,0,9,1,9,9,0,0,9,0], // 6
[9,9,1,1,0,1,9,0,9,9,1,0,9,1], // 7
[9,9,0,1,0,0,9,0,9,9,0,0,9,0], // 8
[9,9,0,1,0,0,9,0,9,9,0,0,9,1], // 9
[9,9,1,1,1,1,9,1,9,9,1,1,9,1] // 消灯
];
// メインループ
var five = require("johnny-five");
var board = new five.Board();
board.on("ready", function() {
// LED出力(桁, 数値)
var lighting = function(digit, num) {
// 各桁出力制御
board.digitalWrite(12, digit_list[digit][0]); // DIG.1
board.digitalWrite( 9, digit_list[digit][1]); // DIG.2
board.digitalWrite( 8, digit_list[digit][2]); // DIG.3
// 各セグメント出力
// - 8,9,12ピンは制御用なので未使用(=9)
// - 1ピンは13ピンで代替
for (var i = 1; i <= 13; i++) {
onoff = led_list[num][i];
if (onoff == 9) {
continue;
}
board.digitalWrite(i, onoff);
}
}
// 出力データ準備
cnt = 123;
num = ('000' + cnt).slice(-3); // ゼロパディング
// 3桁の値を1桁ずつ分解して配列に格納
num_per_digit = new Array();
for(var i = 0; i < 3; i++) {
num_per_digit[i + 1] = num.toString().substr(i,1);
}
// ダイナミックドライブ(ダイナミック点灯)
var n = 0;
setInterval(() => {
digit = n % 3 + 1; // 1,2,3の桁を繰り返す
lighting(digit, num_per_digit[digit]); // 各桁出力
lighting(0, 10); // いったん消灯
n++;
}, 5);
});
実行
% 7seg_3digit.js 1486305432162 Device(s) /dev/ttyACM0 1486305432169 Connected /dev/ttyACM0 1486305435411 Repl Initialized >>
*) 画像では各桁が順番に表示されているように見えるが実際は同時に表示されているように見える。
関連資料・記事
[Arduino] Node.jsのJohnny-Fiveフレームワークを使ってArduino UnoでLチカ
[Arduino] ArduinoをNode.jsで操作する準備としてArduinoにFirmataプログラムを書き込む際にArduino IDEを使わずコマンドラインで実行する方法(GORT)
参考サイト
Arduino (Wikipedia)
Arduino技術情報 (Qiita)
Arduino関連情報 (Device Plus)
Arduino記事一覧 (Think IT)
Node.js技術情報 (Qiita)
Johnny-Five技術情報 (Qiita)
エレクトロニクス豆知識 (ROHM)