Skip to the content.

pythonでArduinoとPC間でシリアル通信する

raspiとarduinoを想定(試した環境はUbuntu18.04)

PC => Arduino

PCからの命令でLEDを光らせる.

Arduino側(PCからの命令受け取り)↓

byte data = 0;

void setup(){
  Serial.begin(115200);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);  //  初期化
}

void loop(){
  if (Serial.available() > 0){
    data = (byte)Serial.read();
    if(data == 123){
      digitalWrite(13, HIGH);
      delay(3000);
    }
    else{
      digitalWrite(13, HIGH);   
      delay(1000);
      digitalWrite(13, LOW);
    }    
  }
}

PC側(Arduinoへの命令送信)↓

import serial
import time

ser = serial.Serial("/dev/ttyACM0", 115200, timeout = 0.1)
time.sleep(2)           // Arduino側との接続のための待ち時間が必要
ser.write(chr(123))     // char型で送信しArduino側でbyte型へ変換すれば数字をそのまま扱える
ser.close()

Arduino => PC

Arduino内の数値をPCに送る

Arduino側(PCへのデータ送信)↓

//Arduino
int val = 0;
int x = 100;
int y = 100;
void setup(){
  Serial.begin(9600);
}
void loop(){
  val = analogRead(1);
  // Serial.println(val);
  Serial.println((String)"x:"+x+" y:"+y);
  delay(100);
}

PC側(Arduinoからのデータ受信)↓

# coding: utf-8

import serial
ser = serial.Serial('/dev/ttyACM0', 9600) 
not_used = ser.readline()
while True:
    val_arduino = ser.readline()
    # val_decoded = float(repr(val_arduino.decode())[1:-5])
    val_decoded = val_arduino
    print(val_decoded)

ser.close()

注意点

arduino=>pc,pc=>arduinoでデータをやり取りする際の注意点

ser = serial.Serial('/dev/ttyACM0', 9600) 
while True:
    ser.write(123)

ではなく

ser = serial.Serial('/dev/ttyACM0', 9600) 
while True:
    ser.readline()
    ser.write(123)

とするとうまくいく.
arduinoへの書き込みに対して,読込を常に行う必要がある.(バッファの関係?クロックなんちゃらのせい?)

参考