Raspberry PiとArduino間でUSB経由のシリアル通信

f:id:karaage:20150531171749j:plain:w640

Raspberry PiとArduinoのシリアル通信

 いろんな事情でRaspberry PiとArduinoをUSB経由で通信させる必要が出てしまったので、ちょっと試してみました。ネットで検索すると腐るほど情報出てきますが、これまた自分へのメモに残しておきます。

 今回は、プログラム(通称宇宙語)ばかりなので、必要な人だけ続きを読むをクリックください。

Arduino側準備

 Arduino側は以下のプログラムを書き込むだけ。Arduinoのシリアルモニタで、「A」を送信するとDIGITAL PIN3がHighになって、「B」を送信するとDIGITAL PIN3がLOWになることを確認しましょう。10k程度の抵抗とLEDをArduinoのDIGITAL PIN3とGND間に繋いでLED点灯させるとわかりやすいです(主に他の人が)。

#define LED_PIN (3)
byte val;

void setup(){
  // Serial Setting
  Serial.begin(9600);

  // Port Setting
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

void loop(){
  if(Serial.available() > 0){
    
    val = Serial.read();
    Serial.write(val);
    if(val == 'A'){
      digitalWrite(LED_PIN, HIGH);
    }

    if(val == 'B'){
      digitalWrite(LED_PIN, LOW);
    }
  }
}

Raspberry Pi側準備

 Raspberry Pi側は、pythonを使って通信します。

pyserialインストール

 pythonでシリアル通信するために、pyserialというライブラリをインストールします。
pyserialをインストールするには、pipというやつが必要なので、まずはそれをインストール。ややこしいですね。Raspberry Piにログインして、以下のコマンドうつだけです。

$ sudo apt-get install python-pip

 pip使ってpyserialインストール。以下のコマンドうつだけ

$ pip install pyserial
Raspberry Pi側通信プログラム

 通信テストのプログラム(test.py)を作成します。

$ vi test.py

 中身は以下。一応python3対応。

# -*- coding: utf-8 -*-
import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(2)
ser.write(b'A')
ser.close()

通信実行

 Raspberry PiとArduinoをUSBで接続。dmesgコマンドで USBを認識したことを確認しましょう。
基本/dev/ttyACM0として認識されていると思います。もし違う名前で認識されていたら、Raspberry Pi側のプログラムの/dev/ttyACM0の箇所を合わせて修正してやりましょう。複数のUSBデバイスを接続したい場合はudevを使ってやるとよいです。udevに関して詳しく知りたい方はudevで検索して色々調べてみるとよいです。


 あとは、Raspberry Pi側でプログラムを実行しましょう。

$ python test.py

 LEDが点灯すれば(ArduinoのDigital Pin3がHiになれば)OK。

まとめ

 Raspberry PiとArduinoの通信例です。簡単な例ですが、応用すれば色々なことができそうですね。USB以外にもI2C・SPI・GPIOを使って通信することもできます。興味ある方は調べてみるとよいかと思います。

[asin:B0044X2E5S:detail]

 追記:Jetson NanoとRaspberry Piでのシリアル通信をする方法に関しても記事を書きました。Raspberry Pi x Raspberry Pi等の組み合わせにも応用がきく方法となります。

関連記事