Arduino

2017/01/12更新

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

Node.jsでArduino Unoにつないだタクトスイッチの状態を読み取って内蔵LEDを点灯・点滅させる。

Node.jsを動かす母艦はUbuntu 16.04とする。

結線

結線は以下の通りで、タクトスイッチとGNDの間に10kΩのプルダウン抵抗を挟む。タクトスイッチの状態はデジタル2ピンを使って取得し、スイッチの状態によって内蔵LEDを制御する。

押した状態(press)

LED点灯

離した状態(release)

LED消灯

押しっ放し(hold)

LED点滅

ソース

以下のようなコードを書きNode.jsで実行する。タクトスイッチを離した時の処理としてstop(点滅を点灯に変更)とoff(消灯)を両方指定する必要があることに注意する。

button.js
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var button = new five.Button(2);      // スイッチ状態
  var led    = new five.Led(13);        // LED

  // 押す
  button.on("press", function() {
    led.on();
  });

  // 離す
  button.on("release", function() {
    led.stop();         // for strobe()
    led.off();          // for on()
  });

  // 長押し
  button.on("hold", function() {
    led.strobe(500);
  });

});
実行
% node button.js
1484147909373 Device(s) /dev/ttyACM0  
1484147909404 Connected /dev/ttyACM0  
1484147912650 Repl Initialized  
>>

関連資料・記事

参考サイト

2017/1/14更新

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

Node.jsでSocket.IOを使ってArduino UnoにつないだRGBフルカラーLED(OSTA5131A)(カソードコモン)をWebページから操作する。

Node.jsを動かす母艦はUbuntu 16.04とする。

Johnny-FiveのインストールやLED結線などの事前準備は以下を参照のこと。

関連資料・記事

Socket.IOインストール

まずSocket.IOをインストールする。Socket.IOはnpmを使って簡単にインストールできる。

% sudo npm install -g socket.io

ソース

次に以下のJavaScriptコードとHTMLを書きNode.jsで実行する。

socketio.js
var fs = require("fs");
var http = require("http");
var server = http.createServer();

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  // Server
  server.on("request", function(req, res) {
    var stream = fs.createReadStream("index.html");
    res.writeHead(200, {
      "Content-Type": "text/html"
    });
    stream.pipe(res);
  });

  // Socket.IO
  var io = require("socket.io").listen(server);
  server.listen(8000);

  // LED
  var led = new five.Led.RGB({
    pins: {
      red: 6,
      green: 5,
      blue: 3
    }
  });

  // Control
  io.on("connection", function(socket) {
    socket.on("msg", function(color) {
      console.log(color);

      if (color == "off") {
        led.off();
      } else {
        led.color(color);
      }
    });
  });
});
index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>arduino-socket.io</title>
  <script src="/socket.io/socket.io.js"></script>
  <script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
</head>

<body>
  <form>
    <p>
      <input type="radio" name="color" value="red">RED</input>
      <input type="radio" name="color" value="green">GREEN</input>
      <input type="radio" name="color" value="blue">BLUE</input>
      <input type="radio" name="color" value="off">(OFF)</input>
    </p>
    <p>
      <input type="submit" value="submit" />
    </p>
  </form>

  <script type="text/javascript">
    var socket = io();
    $('form').submit(function() {
      socket.emit("msg", $("input[name=color]:checked").val());
      return false;
    });
  </script>
</body>
</html>
実行
% node socketio.js 
1484404749919 Device(s) /dev/ttyACM0  
1484404749927 Connected /dev/ttyACM0  
1484404753174 Repl Initialized  
>>
Webブラウザからアクセス

localhost:8000にアクセスし、ラジオボタンで色を指定してsubmitをクリックすると指定した色でLEDが点灯する。OFFを選ぶと消灯する。

関連資料・記事

参考サイト

2017/01/23更新

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

Node.jsでArduino Unoにつないだ超音波距離センサー(HC-SR04)の値を読み取る。

Node.jsを動かす母艦はUbuntu 16.04とする。

PingFirmata書き込み

HC-SR04の値を読み取るのにJohnny-Fiveを使用する場合、標準のFirmataでは動作しないので以下の手順でPingFirmataをArduinoに書き込む。

% wget https://gist.githubusercontent.com/rwaldron/0519fcd5c48bfe43b827/raw/f17fb09b92ed04722953823d9416649ff380c35b/PingFirmata.ino
% arduino --upload PingFirmata.ino 

結線

Arduino IDEのスケッチでなくJohnny-Fiveを使用する場合、4つのピンのうちTrig(出力)とEcho(入力)はまとめてよい。VccとGndはそれぞれ5VとGNDに接続する。

ソース

以下のようなコードを書きNode.jsで実行する。

echo.js
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var proximity = new five.Proximity({
    controller: "HCSR04",
    pin: 7
  });

  proximity.on("change", function() {
    console.log(this.cm + " cm");
  });
});
実行
% node echo.js
1485094276071 Device(s) /dev/ttyACM0  
1485094276078 Connected /dev/ttyACM0  
1485094279831 Repl Initialized  
>> 277.388 cm
277.835 cm
277.904 cm
277.027 cm
:
(障害物を近づけた時)
13.093 cm
11.684 cm
12.519 cm
:

関連資料・記事

参考サイト

2017/01/21更新

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

Johnny-Fiveは様々な温度センサーをサポートしているので対象センサーであれば以下のようにThermometerクラスを使って簡単に温度を取得することができる。

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var temp = new five.Thermometer({
    controller: "LM35",
    pin: "A0"
  });

  temp.on("change", function() {
    console.log(this.celsius + "°C", this.fahrenheit + "°F");
  });
});

しかしJohnny-Fiveでサポートされていない温度センサーの値を温度に変換するにはそのセンサーのデータシートを見てThermometerクラスのtoCelsiusオプションで計算式を定義する必要がある。

ここではLM61BIZを使用する場合の計算式を示す。

上記ページからデータシートを参照すると出力電圧のオフセット値が0.6Vであることが分かる。

これを以下の式に当てはめれば温度が計算できる。

((センサー値 * 電源電圧 / 1024) - 出力電圧のオフセット値) * 100
= ((センサー値 * 5 / 1024) - 0.6) * 100

この計算式をThermometerクラスのtoCelsiusオプションに定義してデフォルト定義をオーバーライドすればよい。

結線

ソース

lm61.js
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var temp = new five.Thermometer({
    pin: "A0",
    toCelsius: function(raw) {
      var val = ((raw * 5 / 1024) - 0.6) * 100;  // 温度計算
      return Math.round(val * 10) / 10;          // 小数点第2位以下四捨五入
    }
  });

  temp.on("change", function() { 
    console.log(this.celsius + "°C");
  });
});
実行
% node lm61.js 
1485009719195 Device(s) /dev/ttyACM0  
1485009719202 Connected /dev/ttyACM0  
1485009722449 Repl Initialized  
>> 19.6
19.1
19.6
19.1
19.6
19.1
:

関連資料・記事

参考サイト

2016/12/24更新

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

Node.jsでArduino Unoにつないだフォトリフレクタ(RPR-220)の値を読み取る。

Node.jsを動かす母艦はUbuntu 16.04とする。

結線

このセンサーは刻印面に向かって左が赤外線LED(出力側)、右が対象物からの反射を受けるフォトトランジスタ(入力側)になっている。

ピンは4つで左の赤外線LEDは手前がアノード(長いピン)で奥がカソード(短いピン)、右のフォトトランジスタは手前がコレクタ(短いピン)で奥がエミッタ(長いピン)である。

結線はそれぞれ以下のようになる。

赤外線LED

Arduinoの5V電源ピン → 330Ω抵抗(*1) → アノード(長いピン) → カソード(短いピン) → ArduinoのGNDピン

フォトトランジスタ

Arduinoの5V電源ピン → コレクタ(長いピン) → エミッタ(短いピン) → Arduinoのアナログ"A0"ピン → 1kΩ抵抗(*2) → ArduinoのGNDピン

抵抗値の計算方法については、データシートの絶対最大定格によると赤外線LEDの順電流が50mAでフォトトランジスタのコレクタ電流が30mAなので最低限必要な抵抗値はそれぞれ以下のようになる。

(*1) 赤外線LED側

抵抗 = (電源電圧5V - 順電圧1.34V) / 順電流50mA

= 3.66 / 0.050

= 73 (→ ここでは330Ωを使用)

(*2) フォトトランジスタ側

抵抗 = 電源電圧5V / コレクタ電流30mA

= 5 / 0.030

= 166 (→ ここでは1kΩを使用)

ソース

以下のようなコードを書きNode.jsで実行する。

sensor.js
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var sensor = new five.Sensor("A0");   

  sensor.on("change", function() {
    var val = this.value;
    console.log(val);
  });
});
実行
% node sensor.js
1483360780654 Device(s) /dev/ttyACM0  
1483360780661 Connected /dev/ttyACM0  
>> 0

色によって反射率が異なるので例えば白は光が反射するのでセンサーが反応し、黒は光が吸収されるのでセンサーが反応しなくなる。

関連資料・記事

参考サイト

2016/12/24更新

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

Node.jsでArduino Unoにつないだ光センサー(LLS05-A)やCdSセル(GL5528)の値を読み取り、一定の暗さになったらLEDを点灯する仕組みを作る。

Node.jsを動かす母艦はUbuntu 16.04とする。

結線

センサー(ブレッドボードの右上)

光センサーの場合

Arduinoの5V電源ピン → 光センサーのアノード(長いピン) → 光センサーのカソード(短いピン) → Arduinoのアナログ"A0"ピン及び10KΩ抵抗経由のArduinoのGNDピン

CdSセルの場合

Arduinoの5V電源ピン → CdSセル → Arduinoのアナログ"A0"ピン及び10KΩ抵抗経由のArduinoのGNDピン

LED(ブレッドボードの左下)

Arduinoのデジタル13番ピン(5V) → 抵抗(330Ω) → LEDのアノード(長いピン) → LEDのカソード(短いピン) → ArduinoのGNDピン

※回路図と写真は光センサーのものだがCdSセルの場合も同じ。

ソース

以下のようなコードを書きNode.jsで実行する。

sensor.js
var five = require("johnny-five");
var board = new five.Board();

var before = 0;                         // 前回値

board.on("ready", function() {
  var sensor = new five.Sensor("A0");   // センサーデータ
  var led    = new five.Led(13);        // LED

  // センサーデータ取得
  sensor.on("change", function() {
    var val = this.value;               // センサーデータ
    console.log(before + " -> " + val); // センサーデータ出力(前回 + 今回)

    // センサーデータが前回値と変わったら
    if (val != before) {
      // センサーデータが10未満ならLED点灯、それ以上なら消灯
      if (val < 10) {
        led.on();
      } else {
        led.off();
      }
    }

    // センサーデータ退避
    before = val; 
  });
});
実行
% node sensor.js
1483183307714 Device(s) /dev/ttyACM0  
1483183307744 Connected /dev/ttyACM0  
1483183311010 Repl Initialized  
>> 0 -> 253
253 -> 249
249 -> 244
244 -> 243
243 -> 245
:

プログラムを実行するとセンサーデータの前回値と今回値が左右に表示されるのでセンサーを覆って暗くすると(センサーデータが10を下回ると)LEDが点灯する。

Node.jsおよびJohnny-Fiveの導入については「Node.jsのJohnny-Fiveフレームワークを使ってArduino UnoでLチカ」を参照のこと。

関連資料・記事

参考サイト

2016/12/24更新

対応バージョン: Arduino IDE 1.8.0

Arduinoで温度センサー(LM61BIZ)の値を読み取る。

Arduino IDEを動かす母艦はUbuntu 16.04とする。

結線

センサーのピンは3つで刻印面に向かって左から+Vs(電源電圧)、Vout(出力電圧)、GND(グラウンド)。これをArduinoの5V、A0、GNDにそれぞれ接続する。

ソース

Vout(出力電圧)は0℃の時600mVで1℃あたり10mV変化するので例えば20℃の室温の場合、Voutは以下の値になる。

Vout = 600(mV) + (10(mV/℃) * 20(℃)) = 800(mV)

温度を求めるにはセンサーから取得した値、出力電圧、温度それぞれ取り得る値を相互変換すればよい。

具体的にはまずセンサー値(0〜1023)を電圧(0〜5000)に変換し、次にこのセンサーの計測範囲の電圧(300〜1600)を温度(-30〜100)に変換する。

センサー値を電圧に変換
map(センサー値, 0, 1023, 0, 5000)
電圧を温度に変換
map(電圧, 300, 1600, -30, 100)

上記をコードにすると以下のようになるのでArduino IDEでコンパイルしてArduinoに書き込む。

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val = analogRead(A0);
  float volt = map(val, 0, 1023, 0, 5000);
  float temp = map(volt, 300, 1600, -30, 100);
  Serial.println("val = " + String(val) + ", volt = " + String(volt) + ", temp = " + String(temp));
  delay(1000);
}

Arduino IDEのシリアルモニターには1秒おきに以下のような内容が出力される。

このセンサーに指を触れると体温でセンサーが温まって温度が上昇する。

関連資料・記事

参考サイト

2016/12/24更新

対応バージョン: Arduino IDE 1.7.11, Node.js 4.2.6, Johnny-Five 0.9.58

Arduinoの操作はArduino IDEを使うのが一般的だが、以下のステップが常に必要になり面倒である。

Arduino IDEを起動
スケッチ(プログラム)を作成
スケッチをコンパイル
スケッチをマイコンに書き込む

そこでNode.jsから直接Arduinoを操作できるようにJohnny-Fiveというフレームワークを導入する手順を示す。

Arduino IDEやNode.jsを動かす母艦はUbuntu 16.04とする。

Firmata書き込み

Johnny-FiveはFirmataプロトコルを使ってArduinoと通信するので最初にFirmataのプログラムをArduinoに書き込んでおく。

このプログラムはArduino IDEのスケッチの例に用意されているのでArduino IDEを起動して[ファイル] > [スケッチの例] > [Firmata] > [StandardFirmata]を選択してスケッチを表示し、コンパイルとArduinoへの書き込みを行う。

ただこのままだとコンパイル時に「SoftwareSerial.hがない」というエラーが発生する。

In file included from /foo/bar/arduino-1.7.11-linux64/libraries/Firmata/utility/SerialFirmata.cpp:20:0:
/foo/bar/arduino-1.7.11-linux64/libraries/Firmata/utility/SerialFirmata.h:30:28: fatal error: SoftwareSerial.h: No such file or directory

SoftwareSerial.hは存在するが置かれているパスが違うので以下の手順でSoftwareSerial.hを見に行く場所にシンボリックリンクを張る。これでコンパイルがうまくいく。

% cd /foo/bar/arduino-1.7.11-linux64
% ln -s `pwd`/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h libraries/Firmata

Arduino IDEを使わずにFirmataを書き込む場合は以下の手順を参照のこと。

関連資料・記事

Johnny-Fiveインストール

次にJohnny-Fiveをインストールする。Johnny-Fiveはnpmを使って簡単にインストールできる。

% sudo npm install -g johnny-five

Johnny-Five動作確認(Lチカ)

Johnny-Fiveの公式サイトに載っているサンプルを実行してLチカがうまくいけば今後Node.jsからArduinoの様々な操作ができる。

sample.js
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var led = new five.Led(13);
  led.blink(500);
});
実行
% node sample.js
1482503689500 Device(s) /dev/ttyACM0  
1482503689507 Connected /dev/ttyACM0  
1482503693257 Repl Initialized  
>>

関連資料・記事

参考サイト

2017/01/13更新

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

Node.jsでArduino UnoにつないだRGBフルカラーLED(OSTA5131A)(カソードコモン)を色を変えつつ点灯させる。

Node.jsを動かす母艦はUbuntu 16.04とする。

結線

結線は以下の通り。一番長いピンが左から2番目に位置する見え方の場合、左からR(Red)、GND、B(Blue)、G(Green)という並びになり、GND以外のピンはそれぞれ330Ωの抵抗を挟んでArduinoの6(R)、5(G)、3(B)ピンと接続する。

ソース

以下のようなコードを書きNode.jsで実行する。LEDの色が一秒おきに赤→緑→青と変わって最後に消灯する。

led_rgb.js
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var led = new five.Led.RGB({
    pins: {
      red: 6,
      green: 5,
      blue: 3
    }
  });

  led.on();

  led.color("red");

  setTimeout(function() {
    led.color("green");
  }, 1000);

  setTimeout(function() {
    led.color("blue");
  }, 2000);

  setTimeout(function() {
    led.off();
  }, 3000);

});
実行
% node led_rgb.js
1484147909373 Device(s) /dev/ttyACM0  
1484147909404 Connected /dev/ttyACM0  
>>

関連資料・記事

参考サイト

2017/01/28更新

Arduino UnoにつないだRGBイルミネーションフルカラーLEDを点灯させる。

このLEDにはRGB三原色とICが内蔵されているので通電すればキレイにイルミネーション表示される。

結線

ここでは4つのLEDを光らせる。1つのLEDにつき5V電源 → 330Ω抵抗 → アノード → カソード → GNDという結線をし、それを4組作る。

点灯

特にプログラミングの必要もなく、単に通電すればよい(動画だとうまく撮影できなかったので写真のみ載せる。実際には色が少しずつ変わりながらイルミネーション表示される)。

関連資料・記事

参考サイト

2017/02/07更新

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

Node.jsでArduino Unoにつないだ7セグLEDを0〜9までカウントアップ表示させる。

Node.jsを動かす母艦はUbuntu 16.04とする。

抵抗値計算

IF(順電流): 20mA
VF(順電圧): 2.2V
抵抗 = (電源電圧5V - 順電圧2.2V) / 順電流20mA
     = 2.8V / 0.02A
     = 140Ω 

抵抗はこの値より大きければ問題ないのでここでは220Ωの抵抗を使用する。

結線

結線は以下の通り。3番ピンと8番ピンはコモンカソードなのでGNDに接続し、その他のピンは抵抗を挟んでそれぞれ同じ番号のソケットに接続する。ただ1番ピンを接続する1番ソケットは動作しなかったので11番ソケットにつないでいる。

ソース

以下のようなコードを書きNode.jsで実行する。

各数字に対応したLEDのON/OFF状態を配列として定義しておき、0〜9まで順番に表示する。

7seg.js
// ピン定義
//
// -- ピン配列 ----------------------
//       a(7)
//     +-----+
// f(9)|     |b(6)
//     +g(10)+
// e(1)|     |c(4)
//     +-----+
//       d(2) []DP(5)
//
// -- 値 ----------------------------
// 0: LOW (点灯)
// 1: HIGH(消灯)
// 9: 未使用
//
// -- ピン番号 ----------------------
// *) 0ピンは存在しないので未使用(=9)
// *) 5ピン(DP)は常時消灯(=0)
// *) 1ピンが動作しないので11ピン使用
//                     1 1
// 0 1 2 3 4 5 6 7 8 9 0 1
// -------------------------
var led_list = [
  [9,9,1,9,1,0,1,1,9,1,0,1],  // 0
  [9,9,0,9,1,0,1,0,9,0,0,0],  // 1
  [9,9,1,9,0,0,1,1,9,0,1,1],  // 2
  [9,9,1,9,1,0,1,1,9,0,1,0],  // 3
  [9,9,0,9,1,0,1,0,9,1,1,0],  // 4
  [9,9,1,9,1,0,0,1,9,1,1,0],  // 5
  [9,9,1,9,1,0,0,1,9,1,1,1],  // 6
  [9,9,0,9,1,0,1,1,9,0,0,0],  // 7
  [9,9,1,9,1,0,1,1,9,1,1,1],  // 8
  [9,9,1,9,1,0,1,1,9,1,1,0],  // 9
  [9,9,0,9,0,0,0,0,9,0,0,0]   // 消灯
];

// メインループ
var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var num = 0;  // 表示する数字

  // 表示する数字毎に各セグメント(ピン)をON/OFF
  this.loop(500, function() {
    for (var i = 1; i <= 11; i++) {
      onoff = led_list[num][i];
      if (onoff == 0 || onoff == 1) {
        board.digitalWrite(i, onoff);
      }
    }
    num++;

    // 9の次はいったん消灯して0に戻る
    if (num > 10) {
      num = 0
    };
  });
});
実行
% node 7seg.js
1486305432162 Device(s) /dev/ttyACM0  
1486305432169 Connected /dev/ttyACM0  
1486305435411 Repl Initialized  
>>

関連資料・記事

参考サイト

2017/01/21更新

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

Node.jsでArduino UnoにつないだLEDに対してタクトスイッチを使って点灯、点滅、フェードイン・アウトを繰り返すプログラムを作る。

Node.jsを動かす母艦はUbuntu 16.04とする。

結線

結線は以下の通り。

ソース

以下のようなコードを書きNode.jsで実行する。タクトスイッチを押す毎にLEDが点灯→点滅→フェードイン・アウトに切り替わり、タクトスイッチの長押しで消灯する。

led.js
var five = require("johnny-five");
var board = new five.Board();

cnt = 0;

// LED点灯
function led_on(led) {
  switch(cnt % 3) {
    case 0:
      led.on();                         // 点灯
      break;
    case 1:
      led.strobe(500);                  // 点滅
      break;
    case 2:
      led.pulse(500);                   // フェードイン・アウト
  }

  cnt++;
}

// LED消灯
function led_off(led) {
  led.stop();
  led.off();
}

// メインループ
board.on("ready", function() {
  var button = new five.Button(2);      // スイッチ状態
  var led    = new five.Led(11);        // LED

  // 押す
  button.on("press", function() {
    led_on(led);
  });

  // 長押し
  button.on("hold", function() {
    led_off(led);
  });

});
実行
% node led.js
1484147909373 Device(s) /dev/ttyACM0  
1484147909404 Connected /dev/ttyACM0  
>>

関連資料・記事

参考サイト

2017/02/18更新

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

Node.jsでI2C接続のLCDに文字列を表示させる。

このパーツはLCDモジュールAQM0802A-RN-GBWとピッチ変換基板AE-AQM0802を組み合わせたもので、コントローラICはST7032iが使われている。

Node.jsを動かす母艦はUbuntu 16.04とする。

結線

ピッチ変換基板に対する結線は以下の通り。

VDD: 3.3Vに接続
RESET: (未使用)
SCL(クロック): A5に接続
SDA(データ): A4に接続
GND: GNDに接続

I2Cバスのプルアップ抵抗(10kΩ)はピッチ変換基盤側に用意されている(基盤のPUの2箇所がハンダでショートされている)ため改めて抵抗を使用する必要はない。

ソース

以下のようなコードを書きNode.jsで実行する。

データシートに従って細かい制御ができるものの、ここではいったん文字列を表示している。

lcd.js
// AQM0802A-RN-GBW - I2C接続小型液晶 8文字x2行
//
// ピン配置
//   1. VDD(3.3Vに接続)
//   2. RESET  (*)未使用
//   3. SCL(クロック)
//   4. SDA(データ)
//   5. GND

//
// 初期設定
//
var five = require("johnny-five");
var board = new five.Board();

var LCD_ADR = 0x3E;  // コントローラIC ST7032iのI2Cアドレス(固定)
var clm_list = [     // 送信コマンドを変えることで表示行を変える
  0x80,  // 0行目表示
  0xc0   // 1行目表示
];

//
// 関数定義
//

// LCD制御
var lcd_cmd = function(cmd) {
  board.io.i2cWrite(LCD_ADR, 0x00, cmd);
}

// データ送信
var lcd_data = function(lcd_data) {
  board.io.i2cWrite(LCD_ADR, 0x40, lcd_data);
}

// 出力位置指定(行, 列)
var lcd_setCursor = function(row, clm){
  lcd_cmd(clm_list[row] + clm);
}

// LCDクリア
var lcd_clear = function() {
  lcd_cmd(0x01);
}

// LCD初期化
// (*)コントラストは好みに応じて微調整するとよい
var lcd_init = function() {
  board.io.i2cConfig();

  lcd_cmd(0x38);  // 画面サイズ指定(8文字 x 2行)
  lcd_cmd(0x39);  // 拡張コマンド設定
  lcd_cmd(0x14);  // 内部OSC周波数
  lcd_cmd(0x7A);  // コントラスト
  lcd_cmd(0x56);  // 電源(3V)/アイコンOFF/コントラスト
  lcd_cmd(0x6A);  // フォロワー操作
  lcd_cmd(0x38);  // 拡張コマンド設定終了
  lcd_cmd(0x0C);  // 表示ON
  lcd_clear();    // LCDクリア
}

//
// メイン
//
board.on("ready", function() {
  // LCD出力
  var lcd_print = function(msg) {
    for(var i = 0; i < msg.length; i++) {
      lcd_data(msg.charCodeAt(i));  // 1文字出力
    }
  }

  lcd_init();           // LCD初期化
  lcd_clear();          // LCDクリア
  lcd_setCursor(0, 0);  // カーソル位置(行, 列)
  lcd_print("I Love");  // 表示文字列
  lcd_setCursor(1, 0);
  lcd_print("Arduino!");
});
実行
% node lcd.js
1487422161958 Device(s) /dev/ttyACM0  
1487422161965 Connected /dev/ttyACM0  
1487422165206 Repl Initialized  
>>

関連資料・記事

参考サイト

2016/12/04更新

対応バージョン: Arduino IDE 1.7.11

Arduinoは本体 + IDE(ソフトウェア)の組み合わせで一つの環境を構成する。

ここではRaspberry Uno R3にArduino IDEからスケッチ(Arduinoではプログラムのことをスケッチと呼ぶ)を送り込んで実行させる手順を示す。IDEを動かす母艦はUbuntu 16.04とする。

JREインストール

Arduino IDEはJavaで書かれているのでまず母艦のUbuntuにJREをインストールする。JREのバージョンが9だとIDEが起動できないので8をインストールする。

% sudo apt install openjdk-8-jre openjdk-8-jre-headless

% java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2ubuntu0.16.04.2-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)

Arduino IDEインストール

次にArduino IDEをインストールする。arduino.orgからLinux(64bit)版をダウンロードし、任意の場所に展開する。

% tar xvf arduino-1.7.11.org-linux64.tar.xz

Arduino IDE起動、各種設定

arduino-1.7.11-linux64配下のarduinoを実行するとArduino IDEが起動する。

% cd arduino-1.7.11-linux64/
% sudo ./arduino

Arduino IDEが起動したら[ツール] > [ポート] > [/dev/ttyACM0(Arduino Uno)]を選択してシリアルポートの設定を行う。

この設定を行わないとスケッチをArduinoに送り込む際にデバイス指定誤りでエラーになる。

avrdude: ser_open(): can't open device "COM1": No such file or directory
ioctl("TIOCMGET"): Inappropriate ioctl for device
マイコンボードに書き込もうとしましたが、エラーが発生しました。

サンプルスケッチ動作確認

Arduino IDEにはサンプルスケッチが多数用意されているので例として基板上のLEDを点滅させるスケッチを実行させてみる。

手順としてはまず[ファイル] > [スケッチの例] > [01.Basics] > [Blink]を選択してスケッチを表示し、画面左上のチェックボタン( )をクリックしてスケッチをコンパイルしてから隣の右矢印ボタン( )をクリックすればスケッチがArduinoに書き込まれて動作する。

これでスケッチをArduinoに送り込んで動作させる確認がとれたのであとはいろいろな用途に活用できる。

関連資料・記事

参考サイト

2016/12/30更新

対応バージョン: gort 0.6.2

ArduinoをNode.jsで操作するためには事前にArduinoにFirmataプログラムを書き込んでおく必要があるが、一般的なArduino IDEを使った方法だとIDEを起動してメニュー操作する手間がかかって面倒なのでGORTを使ってコマンドラインで書き込む手順を示す。

作業を行う母艦はUbuntu 16.04とする。

GORTインストール

まずGORTのダウンロードサイトから対象のパッケージをダウンロードする。

このファイルをdpkgコマンドを使ってインストールする。

% sudo dpkg -i gort_0.6.2_amd64.deb
% gort -v
gort version 0.6.2

シリアルポート確認 + ユーザ設定

次にArduinoをUSBケーブルで接続しているポートを確認する。この例では/dev/ttyACM0として認識されている。

% gort scan serial

1 serial port(s) found.

1. [/dev/ttyACM0] - [usb-Arduino_Srl_Arduino_Uno_75431343334351214222-if00]
  USB device:  Bus 003 Device 010: ID 2a03:0043 dog hunter AG Arduino Uno Rev3

このデバイスはrootユーザあるいはdialoutグループに属するユーザのみが使用できるので一般ユーザでこのデバイスを使用したい場合はそのユーザをdialoutグループに追加する。ログインユーザに対してこの作業を行った場合は設定を有効にするためにいったんログアウトしてログインし直す。

% ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 12月 30 00:38 /dev/ttyACM0

% sudo gpasswd -a <user> dialout

AVRDUDEインストール + Firmata書き込み

シリアルポートが使えるようになったらまずプログラムの書き込みに必要なAVR Downloader/UploaDErのAVRDUDEをインストールし、続けてこのAVRDUDEの機能を使ってFirmataプログラムを書き込む。

AVRDUDEインストール
% gort arduino install
Attempting to install avrdude with apt-get.
:
Firmata書き込み
% gort arduino upload firmata /dev/ttyACM0

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "/tmp/880691775"
avrdude: writing flash (11452 bytes):

Writing | ################################################## | 100% 1.84s

avrdude: 11452 bytes of flash written
avrdude: verifying flash memory against /tmp/880691775:
avrdude: load data flash data from input file /tmp/880691775:
avrdude: input file /tmp/880691775 contains 11452 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.47s

avrdude: verifying ...
avrdude: 11452 bytes of flash verified

avrdude done.  Thank you.

これでNode.jsでArduinoが操作できるようになる。

関連資料・記事

参考サイト