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を使って通信することもできます。興味ある方は調べてみるとよいかと思います。
追記:Jetson NanoとRaspberry Piでのシリアル通信をする方法に関しても記事を書きました。Raspberry Pi x Raspberry Pi等の組み合わせにも応用がきく方法となります。