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を選ぶと消灯する。

参考サイト

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

関連資料・記事

参考サイト

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が操作できるようになる。

関連資料・記事

参考サイト