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 で受け取ること、それらのデータの型や処理の仕方などなど、いろいろわからないことだらけの中でもなんとか形ができたので、またいろいろ応用していけるかなぁと思っています。