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のことを考えるのが多少面倒になっている。正しいポートに接続できているかどうか一発で分かる方法は多分ないので(あったら教えてください!!!)、一台ずつつなげるしか方法はなさそうである。