アフィリエイト広告
アフィリエイト広告

Arduino シリアル通信でLチカを試す

Arduino とパソコンをシリアル通信でつないでみましょう。

パソコンの OS は ubuntu 18.04 LTS です。python でシリアル通信を行うためには「pyserial」というパッケージが必要です。そいつをインストールするには「pip」というパッケージをインストールするユーティリティが必要になります。

とゆーことで、まず「pip」のインストールです。

$ sudo apt install python3-pip

ちなみにこれでインストールされるのは「pip3」です。「pip」というのもありますが、python3 を使うのでこれで良いようです。「pip」も必要なら、

$ sudo apt install python-pip python3-pip

で両方インストールされます。

次に「pyserial」をインストールします。

$ sudo pip3 install pyserial

特権ユーザーでインストールすると /usr/local/lib にインストールされます。一般ユーザーでインストールすると ~/.local にインストールされ、他のユーザーに影響を与えずに追加・削除ができるとか。自分のパソコンなので特権ユーザーで良しです。

ちなみに、パッケージ名は「pyserial」ですが、使うときは「import serial」と書きます。

以上、シリアル通信のための準備作業。

下図のような LED を点灯させるための回路を作っておきます。基本的にね、出力ポートに直接 LED つなぐなんてのはやめときましょうね。

画像キャプション

Arduino のスケッチです。

シリアルから二桁の数字を受け取ります。10の位は制御する LED 、1の位は 0 で消灯、1 で点灯します。たとえば「11」と入力すると 2番目の LED が点灯します。「a」を受け取るとすべて消灯させます。

まぁシリアル通信のデータの受け渡しがまだよく理解できていないので、なんだかこれで動いたよってレベルなので笑ってやってください。

// シリアル入力 2桁の数字
// 10位:PIN番号 0:PIN1 1:PIN2 2:PIN3 3:PIN4
//  1位:制御 0:消灯 1:点灯
// 「a」を受信したら全消灯

int pin[4] = {3,5,6,9};
int input[3];

void setup() {
    Serial.begin(115200);

    for(int i=0; i<4; i++) {
        pinMode(pin[i], OUTPUT);
    }
}

void loop() {
    if(Serial.available()) {
        for(int i=0; i<3; i++) {
            input[i] = Serial.read();    // input[2]は’¥n’
        delay(10);
        }

    if(input[0] != ‘a’) {
        digitalWrite(pin[input[0]-48], input[1]&1);
        } else {
        for(int i=0; i<4; i++) {
            digitalWrite(pin[i], 0);
      }
    }
  }
}

シリアルモニタから送信して、期待どおりに動くことを確認しておきます。

さて、パソコン側の python のソースです。こちらも同様に、笑ってやってください。エラー処理とかまったくやっていません。

起動すると入力待ちになるので、たとえば「21」と入力すると 3番めの LED が点灯し「20」とすると消灯します。「a」を入力するとすべて消灯し、プログラムが終了します。

# シリアル通信でArduinoへLED制御コードを送る
# 10位:PIN番号 0:PIN1 1:PIN2 2:PIN3 3:PIN4
#  1位:制御 0:消灯 1:点灯

import serial

def main():
    with serial.Serial(‘/dev/ttyACM0’,115200,timeout=1) as ser:

        while True:
            flag = bytes(input(),’utf-8′)
            ser.write(flag)
            if(flag == bytes(‘a’,’utf-8′)):
                break;

        ser.close()

if __name__ == “__main__”:
    main()

パソコン側で「01」と入力します。すると変数 flag に代入されますが、シリアル通信のためには bytes 型にしなければいけませんので、flag=bytes(input(), ‘utf-8’) としています。入力する文字は utf-8 です。このとき flag の値は「b’01’」、つまり文字列「01」をバイナリコードにしたものです。

「a」を入力すると、while True: のループを抜けて終了します。Arduino へは「b’a’」が送られます。

Arduino 側では serial.read() を 3回繰り返しています。1回目は10の位、2回目は 1の位、3回目は終端の ¥n などを受け取ります。ただし受け取るデータは文字の「’0’」や「’1’」ですので、その値は「48」( b’0′) や「49」(b’1′) という数値になっています。

そこで、input[0] ( 10 の位) から 48 を引いて出力する PIN 番号を決めています。

input[1] ( 1 の位) も同様にしても良かったのですが、こちらは &1 で最後の 1 ビットを取り出して、そのまま PIN の出力を制御させています。1 の位に 2 以上の値がきたときの動きが変わりますが、そこらあたりはエラー処理で考えることになるんだろうと思います。

そんなわけで、パソコンからデータを送ること、それを Arduino で受け取ること、それらのデータの型や処理の仕方などなど、いろいろわからないことだらけの中でもなんとか形ができたので、またいろいろ応用していけるかなぁと思っています。

参考:PC-Arduino間 Python経由 シリアル通信備忘録 – Qiita

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