LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-03

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6