この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
今回は、USBでシリアル通信をする方法を紹介します。USBケーブル1本でRaspberry PiとArudinoUnoを連携させることができます。シリアル通信で制御できるデバイスはたくさんありますので、ぜひマスターしてください。
それでは、Raspberry Pi と Arduinoを接続して、動かしてみましょう。
Raspberry Pi と Arduinoの接続
Raspberry PiとArduinoUnoとの接続はUSBケーブルで直結するだけです。とても簡単です。
今回行うサンプルコードの内容
Raspberry PiとArduinoUnoでエコーバックをするサンプルになります。
- Raspberry Pi から文字をArudinoに送信
- Arudinoで受信
- Arudinoで受信した文字列をそのままRaspberry Piに送信
- Raspberry Pi で受信
Raspberry Pi のサンプルコード
まず、シリアル通信で使用するpythonのモジュールをインストールします。
$ pip install pyserial
下記がサンプルコードになります。特に難しい部分はないと思います。コード中のコメントを見ていただければと思います。try - exceptで少し長くなっていますが、はじめにシリアル通信の設定をして、あとはsend/receiveをしているだけです。
import serial import traceback import time class USBSerial: def __init__(self, path): # シリアル通信設定 ボーレートはArudinoと合わせる try: self.serialport = serial.Serial( port=path, baudrate=19200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=0.5, ) except serial.SerialException: print(traceback.format_exc()) # 受信バッファ、送信バッファクリア self.serialport.reset_input_buffer() self.serialport.reset_output_buffer() time.sleep(1) # データ送信関数 def send_serial(self, cmd): print("send data : {0}".format(cmd)) try: # rstrip()で明示的に改行コードを削除 cmd.rstrip() # 改行コードを付与 バイナリに変換して送信 self.serialport.write((cmd + "\n").encode("utf-8")) except serial.SerialException: print(traceback.format_exc()) # データ受信関数 def receive_serial(self): try: rcvdata = self.serialport.readline() except serial.SerialException: print(traceback.format_exc()) # 受信データを文字列に変換 改行コードを削除 return rcvdata.decode("utf-8").rstrip() if __name__ == '__main__': path = "/dev/ttyUSB0" # Arudinoの接続先 uno = USBSerial(path) while True: # ターミナルから入力された文字を取得 input_data = input("input data:") # ターミナルから入力された文字をArudinoに送信 uno.send_serial(input_data) # Arudinoからデータ受信 data = uno.receive_serial() print("recv data : {0}".format(data))
Arudino のサンプルコード
こちらも難しくありません。コード内のコメントを参照してください。
boolean stringComplete = false; // データ受信完了フラグ String inputString = ""; // 受信データ格納先 void setup() { //シリアル通信設定 ボーレートはRaspberry Piと合わせる Serial.begin(19200); } void loop() { if (stringComplete) { Serial.print(inputString); //受信したデータをRaspberry Piに送信 inputString = ""; stringComplete = false; //データ受信完了フラグクリア } } void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); //1バイトずつデータ受信 inputString += inChar; if (inChar == '\n') { //改行コードなら、受信完了 stringComplete = true; //受信完了フラグを立てる } } }
これでRaspberry PiとArudinoをUSBケーブル1本で接続することができました。Raspberry Piからの文字を判別して、ArudinoのGPIOを制御する、ArudinoのADコンバータの値を取得する等、いろいろなことができます。
リンク