(python⇔Arduino)シリアル通信で数値をやりとり

記事内に広告が含まれています。
arduino_python
スポンサーリンク

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()

コメント