最近、Pythonでラズパイ側からArduino側へシリアル通信で情報を送るプログラムを作る機会があったので、その方法を紹介します。
環境
今回使用するデバイスと言語
Raspberry Pi3 => Python3
Arduino Leonardo => Arduino
Arduino Leonardo => Arduino
Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品
posted with カエレバ
Raspberry Pi 2016-02-29
流れ
STEP.1
Pythonライブラリのインストール
Pythonで使用するserialをインストールします。
pip
pip3 install serial
STEP.2
Pythonプログラム
上記でインストールしたserialライブラリを使用してシリアル通信します。
ここでシリアル通信するにあたってのビットレートを指定する必要があるので、送信するデータ量にあわせて考えて置く必要があります。
基本的に何も考えてない状態であれば、9600で問題ないと思います。
ここでシリアル通信するにあたってのビットレートを指定する必要があるので、送信するデータ量にあわせて考えて置く必要があります。
基本的に何も考えてない状態であれば、9600で問題ないと思います。
今回のサンプルプログラムは、文字列を送信しエコーされた文字列を受け取って表示します。
STEP.3
Arduinoプログラム
Arduinoサイドのプログラムは単純にシリアルデータを受け取るだけです。
終了符号を付けて書く必要があります。
タイムアウトでも可能ですが時間がかかってしまって効率が悪いので終了符号をつける方法を取ります。
終了符号を付けて書く必要があります。
タイムアウトでも可能ですが時間がかかってしまって効率が悪いので終了符号をつける方法を取ります。
今回のサンプルプログラムは、受け取った文字列をエコーします。
STEP.4
ACM0の権限を変える
ここが以外とハマってしまうポイントになっています。
ディレクトリ
/dev/ttyACM0
Adruinoをラズパイ側に接続するとこのマウントポイントからArduino側にシリアル通信する事が可能です。
ですが権限がroot:rootになっているため、一般ユーザが実行するとパーミッションエラーを吐かれます。
そのため、chgrpやchownで自分へのパーミッションを空けておく必要があります。
STEP.5
プログラムの起動
これでうまく動くはずです。
ソースコード
Python3
Python3
import serial
def send():
with serial.Serial('/dev/ttyACM0',9600) as ser:
str=bytes("AIUEO;",'utf-8')
ser.write(str)
#エコーされた文字を出力
print(ser.readline())
ser.close()
if __name__ == "__main__":
send()
Arduino
Arduino
void setup() {
Serial.begin(9600);
}
String serialRead() {
String str;
if (Serial.available() > 0) {
str = Serial.readStringUntil(';');
}
return str;
}
void loop() {
String cmd = serialRead();
//cmdが受け取ったシリアルデータをエコーする
Serial.println(cmd);
}