PythonでArduinoを制御したいのだ!

Arduino

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プログラムで制御することができます。

コメント

  1. tankoro0214 より:

    Oh that’s nice!
    I got it

  2. fesIsofs より:

    This situation is familiar to me. Let’s discuss.

タイトルとURLをコピーしました