Python & Raspberry Pi 開発ブログ ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbianを使用して開発中。

【スポンサーリンク】

USBでシリアル通信をする:ラズパイとArduinoの接続

【スポンサーリンク】

USBでシリアル通信をする方法を紹介します。今回は、ArudinoUnoと通信する例を紹介します。シリアル通信で制御できるデバイスもたくさんありますので、参考にしてください。それでは説明をしていきます。

Raspberry Pi と Arduinoの接続

Raspberry PiとArduinoUnoとの接続はUSBケーブルで直結するだけです。とても簡単です。

今回行うサンプルコードの内容

・Raspberry Pi から文字をArudinoに送信
・Arudinoで受信
・Arudinoで受信した文字列をそのままRaspberry Piに送信
・Raspberry Pi で受信

エコーバックのサンプルです。

Raspberry Pi のサンプルコード

まず、シリアル通信で使用するモジュールをインストールします。

$ 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:
            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:") # ターミナルから入力された文字を取得
        uno.send_serial(input_data.rstrip()) # ターミナルから入力された文字をArudinoに送信 rstrip()で明示的に改行コードを削除
        data = uno.receive_serial() # Arudinoからデータ受信
        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コンバータの値を取得する等、いろいろなことができます。

ラズパイ ハードウェアに戻る
TOPページに戻る