P2-012
← Všetky témyPython v STEMlabe · 05 / 18

Python – sériová komunikácia s Arduinom

Poznámka

Sériová komunikácia (UART) umožňuje Pythonu na Raspberry Pi/PC vymieňať si dáta s Arduinom cez USB kábel – ideálne na kombinovanie senzorov z Arduina s výpočtami alebo zobrazením v Pythone.

Knižnica pyserial

pip3 install pyserial      # inštalácia knižnice

Nájdenie sériového portu

ls /dev/tty*                # Linux - hľadaj /dev/ttyUSB0 alebo /dev/ttyACM0

Tip

Port sa môže meniť podľa poradia pripojenia USB zariadení. Ak nie si istý, odpoj Arduino, spusti príkaz znova, pripoj ho a porovnaj rozdiel v zozname.

Strana Arduino – odosielanie dát

void setup() {
  Serial.begin(9600);          // rovnaká rýchlosť (baud rate) na obidvoch stranách
}

void loop() {
  int hodnota = analogRead(A0);
  Serial.println(hodnota);     // odošli hodnotu a nový riadok
  delay(500);
}

Strana Python – čítanie dát

import serial
import time

port = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
time.sleep(2)                   # počkaj, kým sa Arduino po pripojení reštartuje

while True:
    riadok = port.readline().decode('utf-8').strip()
    if riadok:
        print("Prijaté:", riadok)

Upozornenie

Rýchlosť komunikácie (baud rate, napr. 9600) musí byť rovnaká na strane Arduina aj Pythonu – inak budú prijaté dáta nezmyselné znaky.

Odosielanie dát z Pythonu do Arduina

port.write(b'1')               # odošli jeden byte (znak '1')
void loop() {
  if (Serial.available() > 0) {
    char prikaz = Serial.read();
    if (prikaz == '1') {
      digitalWrite(LED_BUILTIN, HIGH);
    }
  }
}

Mini-úlohy – sériová komunikácia

  1. Pripoj Arduino a zisti jeho sériový port príkazom ls /dev/tty*.
  2. Naprogramuj Arduino, aby každú sekundu odoslalo hodnotu z analogRead(A0).
  3. V Pythone prijaté hodnoty vypisuj a ukladaj do zoznamu (list).
  4. Rozšír projekt: keď Python zistí hodnotu nad určitý prah, odošle Arduinu príkaz na rozsvietenie LED.

Cheat sheet – rýchla referencia

import serial
port = serial.Serial('/dev/ttyACM0', 9600, timeout=1)  # otvor port

port.readline()                 # prečítaj riadok (bytes)
port.write(b'text')             # odošli dáta (bytes)
port.close()                    # zatvor port po skončení
Postup sa ukladá iba v tomto prehliadači.
18 kapitol · vyhľadávanie aj v texte