ArduinoはArduino言語によって制御します。
ただ、もっと複雑な処理をしたい、何かのプログラムと一緒にArduinoを制御したいという時が訪れることでしょう。
今回紹介するpySerialというモジュールはRaspberry PiやArduinoとシリアル通信を行うことができます。
シリアル通信をすることによって、pythonのプログラムからArduinoやRaspberry Piに指令を出し、pythonプログラムを通して制御することができます。
今回はその基本的なプログラム紹介します。
これが使えるだけで、プログラムでできることの幅がかなり広がるでしょう。
インストール方法
pip install pyserial
ターミナルやコマンドプロントでpythonを開き、インストールできます。
もしくは、PyCharmなどのターミナルでインストールもできます。
プログラム例
今回は1秒ずつLEDをつけたり消したりするプログラムです。
もともとArduinoについているLEDの13ピンに出力して検証したいと思います。
Pythonのプログラムでは
import serial, time
def main():
# COMポートを開く
print("Open Port")
ser = serial.Serial("COM3", 9600)
while True:
# LED点灯
ser.write(b"1")
time.sleep(1)
# LED消灯
ser.write(b"0")
time.sleep(1)
print("Close Port")
ser.close()
if __name__ == '__main__':
main()
serial.Serialでポートと、シリアル通信の設定を行います。
Arduino UNOでは9600を指定します。
これはボードによって異なるので、Arduino IDEで確認しましょう。
b”1″のbは非常に重要な役割を担っています。
serial.write()関数では、シリアル通信をするためにはbyte列にして数字や文字列を送信しなければなりません。
このようにして、byte列であることを示す必要性があります。
このプログラムは無限ループなので、1秒ごとのLEDのオンオフがプログラムを止めるまで続きます。
次にArduino側のプログラムです。
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW); // 初期化
}
void loop() {
byte var;
var = Serial.read();
switch(var){
case '0':
digitalWrite(13, LOW);
break;
case '1':
digitalWrite(13, HIGH);
break;
default:
break;
}
}
ここではswitch case構文を使っています。
このほうがプログラムがわかりやすいです。
詳しくは前回のブログを見てみてください。
ここでは0が送信されるとLOW、1が送信されるとHIGHとなります。
このプログラムをベースに使うことによって、色々なパターンでArduinoをPythonプログラムで制御することができます。
コメント
Oh that’s nice!
I got it
This situation is familiar to me. Let’s discuss.