Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Raspberry piとArduino連携:USBでシリアル通信をする

arduino connect

この記事の内容は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でエコーバックをするサンプルになります。

  1. Raspberry Pi から文字をArudinoに送信
  2. Arudinoで受信
  3. Arudinoで受信した文字列をそのままRaspberry Piに送信
  4. 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コンバータの値を取得する等、いろいろなことができます。