
リンク
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()
リンク
リンク
コメント