こんにちは、DevRelチャンネル外部ライターの田中正吾です。電子回路のパーツを磁石でパチパチとつなげるだけで電子工作ができる「littleBits」の連載第5回目です。
前回の記事では入出力を連携し、Lチカをしたり三三七拍子を打ったりする方法を紹介しました。
今回は、パソコンから文字を入力してlittleBitsに出力するということをやってみます。また、Node.jsでlittleBitsへ簡単に入出力する方法があるので、合わせて紹介します。前回に続き、littleBits Arduinoモジュールを使いましょう。
では、さっそく始めていきましょう!
前回&今回の仕組み
前回の仕組みでは、littleBitsの入力モジュールへ入力すると、出力モジュールがすぐに反応していました。
今回は、PCから「2」という文字を入力すると、出力モジュールが反応する仕組みを作ります。補足を入れているので参考にしてみてください。
PCから「2」を入力すると出力が反応する
まず、「2」を入力すると出力が反応するプログラムを以下に載せます。
// 入力の状態記録
int stateInputValue = LOW;
void setup() {
// 出力のピンを上から2番目の出力に指定
pinMode(5, OUTPUT);
// 入力のピンを上から2番目の入力に指定
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop() {
// 入力側の処理 ////////////////////////////////////////////////
// 入力の状態を取得
int inputValue = digitalRead(A0);
// 入力2(ポート5)が反応したら2をシリアルモニタに連絡
if ( (stateInputValue != inputValue) && (inputValue == HIGH) ) {
Serial.println(2);
delay(1000);
}
// 入力の状態を次のループまで記憶
stateInputValue = inputValue;
// 出力側の処理 ////////////////////////////////////////////////
// USBから入ってくる値を監視(1文字)
if(Serial.available() > 0){
int inputTextByte = Serial.read();
if(inputTextByte == '2'){
// ON
digitalWrite(5,HIGH);
// 3秒間ONがつづく
delay(3000);
// 3秒後OFFになる
digitalWrite(5,LOW);
}
}
// 基礎ループ
delay(10);
}
入力側は、「2」が入力されたら、入力2(ポート5)が反応しPC側に連絡しています。出力側は、PC側からUSBを通じて入ってくる値を監視して、「2」が来たときにONになるという仕組みです。
これを、Arduinoモジュールに書き込むプログラムへ保存します。Arduino IDEの使い方やプログラムの書き込み方は以前の記事を参考にしてください。
シリアルモニタの入力で動作させる
「2」という入力は、Arduino IDEについている「シリアルモニタ」というものでおこないます。シリアルモニタとは、USBケーブルを経由してArduinoからくる値を表示するものです。
このように、Arduinoモジュールがつながっているときに上部のテキストエリアで「2」を入力して送信を押すと、Arduino側に「2」の文字を伝えることが可能です。
// USBから入ってくる値を監視(1文字)
if(Serial.available() > 0){
int inputTextByte = Serial.read();
if(inputTextByte == '2'){ // 2が入力されたら
具体的には、こちらのコードで一文字ずつ入力をチェックしていて「2」が入力されると反応します。
早速書き込んで動かしてみます。
問題がなければ、このように動きます!
Node.jsを組み合わせてみる
さきほどはArduinoのシリアルモニタで入力をおこないましたが、実はNode.jsでも同じことができます。USBシリアルポートと会話ができる「serialport」というライブラリを使います。
- Node.jsとは?
- ハードの制御もできる、いまアツいJavaScript。大量の処理に対応する「ノンブロッキングI/O」というモデルを採用している。最短5分でインストールが可能。
Node.jsをインストールされていない方はこちらの記事を参考ください。
いまアツいJavaScript!ゼロから始めるNode.js入門〜5分で環境構築編〜
Node.jsから動かしてみる(Node.js→littleBits)
Node.jsからlittleBitsを動かしてみます。こちらの図のように、Node.jsから「2」を連絡してlittleBits Arduinoモジュール動作させています。
// Serial Port ///////////////////////////////
var serialport = require('serialport');
var portName = 'COM3'; // Win環境
var sp = new serialport.SerialPort(portName, {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
parser: serialport.parsers.readline("\n")
});
// 起動した瞬間に出力を反応させる
// シリアルモニタでの2の入力と同じ
sp.on('open',function () {
sp.write('2');
});
// littleBitsからの入力(シリアルポート経由)
sp.on('data', function(input) {
var buffer = new Buffer(input, 'utf8');
try {
console.log('serialport buffer: ' + buffer);
if( buffer == 2 ){
// シリアルモニタで入力が表示されるものがNode.jsで反応
console.log('/input/button');
}
} catch(e) {
return;
}
});
以上のようにコードを書き、
node index.js
で起動します。すると、シリアルポート経由でlittleBits Arduinoに「2」の文字列を連絡します。
// 起動した瞬間に出力を反応させる
// シリアルモニタでの2の入力と同じ
sp.on('open',function () {
sp.write('2');
});
こちらが、起動した瞬間にシリアルモニタでの「2」の入力と同じ出力ができる部分です。
Node.jsでボタンの反応を受け付ける(littleBits→Node.js)
先ほどのコードでNode.jsでボタンの反応を受け付けることもできます。このように、ボタンを押すとシリアルポート経由で「2」という文字を受け付けたことをNode.jsで検出して「/input/button」という文字を出力します。
プログラムは以下のようになっています。
// littleBitsからの入力(シリアルポート経由)
sp.on('data', function(input) {
var buffer = new Buffer(input, 'utf8');
try {
console.log('serialport buffer: ' + buffer);
if( buffer == 2 ){
// シリアルモニタで入力が表示されるものがNode.jsで反応
console.log('/input/button');
}
} catch(e) {
return;
}
});
Node.jsを起動していると上記のように反応します。
おわりに
今回はlittleBits Arduinoモジュールを使い、テキスト入力で出力する方法と、Node.jsで入出力する方法をお伝えしました。
Node.jsをつかうと、PCと会話がしやすくなります。Node.jsではWebサーバーを立てることができるので、ネットワークからの反応や、ボタンを押したユーザーの操作といったさまざまな動作へつなげることも可能です。
次回は、今回紹介したNode.jsのプログラムをより発展させて、littleBits Arduinoモジュールの入出力のやりとりからネットワークと連携してみる流れをお伝えします。