Python3でArduinoからのデータを受信する

スポンサーリンク
Arduino
スポンサーリンク

今回はArduinoが送信したデータをPCで受信してみたいと思います。

スポンサーリンク

要件

  • PCとarduinoでシリアル通信を行う
  • ボーレートは9600bps
  • Arduinoからの送信は1s周期とする
  • PC側のプログラムはPython3で作成する

ハードウェア

  • Arduino uno
  • USB-シリアル変換基板(AE-UM232R)
  • ブレッドボード
  • ジャンパワイヤ(適量)
  • USBケーブル×2(ArduinoへのプログラムDL&電源供給用とシリアル通信用)

arduino側のプログラム

void setup() {
  Serial.begin(9600);       // シリアル通信を使える様にする
}
  
void loop() {
  Serial.println("Hello!");
  delay(1000);
}

PC側のプログラム

あらかじめPython3のserialモジュールをインストールしておく必要があります。

$ sudo pip3 install PySerial
import serial

ser = serial.Serial('/dev/ttyUSB0',9600,timeout=None)   # '/dev/ttyUSB0'の部分は自分の環境に合わせて変更する

while True:
    line = ser.readline()
    print(line)

ser.close()            # 無限ループだから到達しないけど一応・・・

動かす

python3 serial_rx.py

結果

b'Hello!\r\n'
b'Hello!\r\n'
b'Hello!\r\n'
b'Hello!\r\n'
b'Hello!\r\n'
b'Hello!\r\n'

timeoutパラメータについて

シリアルポートをオープンするときのパラメータでreadメソッドのタイムアウト時間を指定することができます。

  • timeout = None: 受信完了するまで待つ
  • timeout = 0: 直ちに処理が返る。ノンブロッキングモード。
  • timeout = x: x秒でタイムアウト

<参考>
http://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial

今回作ったプログラムではtimeout=Noneを指定しましたが、これだと何も受信がない場合ずっとそこで待ち続けることになってしまいます。一般的にデータの受信はいつ発生するかわからないので、受信を待っている間は別の処理を行っておきたいです。そのためにはtimeoutにNone以外を設定します。

メインループで受信の状態をポーリングしながら別の処理を行う方法は以下のとおりです。

import serial

ser = serial.Serial('/dev/ttyUSB0',9600, timeout=0)   #

while True:

    line = ser.readline()
    if 受信あり/なしの判定:
        # ここに受信があった時の処理
    else:
        # ここに受信がなかった時の処理

ser.close()

コメント