Arduino二台をシリアルでRubyを使い通信させることに関して

More than 5 years have passed since last update.

Arduinoを二台つなげる方法にはシリアル通信以外にもあるのだが、Xbeeなどを使いたい時には二台Arduinoを使うのが一番楽だと思う。今回は間にRubyのscriptを挟む方法を使った。


serial-Ruby

二台のArduinoを同時に操作する時のサンプルを載せる。

require 'rubygems'

require 'serialport'

@serial_port_1 = "/dev/ttyACM0" #シリアルを送信する方のArduinoのポート
@serial_port_2 = "/dev/ttyACM1" #シリアルを受信する方のArduinoのポート
@serial_bps = 9600

sp1 = SerialPort.new(@serial_port_1,@serial_bps) #送信用
sp2 = SerialPort.new(@serial_port_2,@serial_bps) #受信用

loop do
read = sp1.read #送信用から送られてきた値をreadに格納
sp2.write(read) #readを受信用Arduinoにそのまま転送。
sleep(1) #時間調整
end


Arduino送信側

char ch = 'R'; //送受信の時に使う文字列。

void setup()
{
Serial.begin(9600);
pinMode(13,INPUT); //ボタン用
}

void loop(){
if(digitalRead(13) == 0){ //ボタンが押されていなければ'0'を送信
Serial.println('0');
}else if(digitalRead(13) == 1){ //ボタンが押されていれば'1'を送信
Serial.println('1');
}
delay(1000);
}

ボタンが押されていれば1を、そうでなければ2を送信するプログラム。

こちらは送信側のArduinoなので、portを/dev/ttyACM1に設定する。


Arduino受信側

char ch = 'R'; //受信の時に使う文字列。

void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
}

void loop()
{
while(Serial.available()){
ch = Serial.read();
if(ch == '0'){
digitalWrite(13,HIGH);
}
if(ch == '1'){
digitalWrite(13,LOW);
}
}
}

こちらは受信側のものなので、Portを/dev/ttyACM01/の方にする。


Arduinoでシリアル通信を行うときにハマりやすい点として、「一文字ずつしかシリアルを受け取れない」というものがある。その点にさえ注意がむけば、そこまで難しくはないはずである。


Portに関して

このようにArduino二台をシリアル通信させることは比較的簡単だが、Portのことを考えるのが多少面倒になっている。正しいポートに接続できているかどうか一発で分かる方法は多分ないので(あったら教えてください!!!)、一台ずつつなげるしか方法はなさそうである。