リンク
python ⇒ Arduinoにシリアル通信で数値を送る
python(PC)からArduinoにシリアル通信で数値を送ろうとすると、文字に変換されててうまくいかない。そこで、文字を数値にむりやり変換する。
以下はpythonからシリアル通信で送られてきた数値(0~255)に応じて9番ピンにつないだLEDの明るさを変化させるスケッチ。
//Arduino int val = 0; int add = 0; int input = -1; void setup() { Serial.begin(9600); } void loop() { input = Serial.read(); if(input!=-1){ switch(input){ case '0': add = 0 + add*10; break; case '1': add = 1 + add*10; break; case '2': add = 2 + add*10; break; case '3': add = 3 + add*10; break; case '4': add = 4 + add*10; break; case '5': add = 5 + add*10; break; case '6': add = 6 + add*10; break; case '7': add = 7 + add*10; break; case '8': add = 8 + add*10; break; case '9': add = 9 + add*10; break; case 'a': val = add; add = 0; break; default: break; } } analogWrite(9,val); }
python側はpyserialをインストールしておきます。
pip install pyserial
pythonからval=100を送る。送る数値の後ろに'a'をつけて1,0,0と100を区別する。
#python import serial import time ser =serial.Serial("COM6", 9600) time.sleep(2) val = 100 a = str(val) + 'a' ser.write(bytes(a,'utf-8')) ser.close()
input()で数値を入力する場合。aを送ると終了する。
#python import serial import time val = 0 ser =serial.Serial("COM6", 9600) time.sleep(2) while 1: val = input() if val=='a': break; a = str(val) + 'a' ser.write(bytes(a,'utf-8')) ser.close()
Arduino ⇒ pythonにシリアル通信で数値を送る
Arduinoのスケッチ。analogピンの値を送ります。
//Arduino float val = 0; void setup(){ Serial.begin(9600); } void loop(){ val = analogRead(1); Serial.println(val); delay(100); }
改行コード込みで送られてくる場合は以下のようにすれば読み取れました。val_arduinoの値をdecodeしたり切り取ったりして数値だけを取り出してます。
#python import serial ser = serial.Serial('COM6', 9600) not_used = ser.readline() while True: val_arduino = ser.readline() val_decoded = float(repr(val_arduino.decode())[1:-5]) print(val_decoded) ser.close()
リンク
リンク
コメント