Arduino資料一覧

Node.jsで3桁7セグLED(2381BS)をダイナミック点灯により3桁同時に表示する

2017/03/04更新

対応バージョン: Node.js 4.2.6, Johnny-Five 0.10.6

Node.jsでArduino Unoにつないだ3桁7セグLEDをダイナミック点灯方式を用いて3桁同時に表示する(ように見せかける)。

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  
>>

*) 画像では各桁が順番に表示されているように見えるが実際は同時に表示されているように見える。

関連資料・記事

参考サイト