■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
トラックバック

■calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< October 2019 >>

■search this site.

■recommend

毎日貯まるポイントサイト ECナビ

■recommend

* 楽天ROOM *

■Twitter

■recommend

■recommend

■selected entries

■categories

■archives

■recent comment

■recent trackback

■links

■profile

■others

■mobile

qrcode

■powered

無料ブログ作成サービス JUGEM