tariel.ge › Полезное: бесплатные книги › Программирование: от нулей и единиц до PythonБесплатно · автор Тариел Бежанидзе
← Учебник по программированию ЛИСТ 26БЛОК 5 — ЧТО ДОБАВИЛИ ОТ СЕБЯРЕВ. 1
Глава 26 · Что добавили от себя

Python встречает железо: pyserial и управление Arduino

Всё, что уже отработано в этой книге — модули (глава 20), объекты (глава 24), файлы (глава 19) — здесь встречается с Arduino-скетчами из учебника самоделок, только логика теперь может жить на стороне компьютера, а не только внутри самого микроконтроллера.

Зачем управлять Arduino из Python, если можно просто написать скетч

В учебнике самоделок Arduino программировался самостоятельно — вся логика (прочитать датчик, принять решение, включить реле) жила внутри самой платы. Это отлично работает для автономных устройств. Но у связки Python + Arduino есть свои сильные стороны: Arduino берёт на себя то, в чём он силён — точное взаимодействие с реальным временем и электрическими сигналами, а Python на стороне компьютера — то, в чём силён он: сложная логика, запись данных в файл (глава 19), работа с сетью, удобный текстовый интерфейс — вообще всё, для чего у маленького микроконтроллера просто не хватит памяти или мощности.

pyserial — мост между Python и последовательным портом

$ pip install pyserial # прямое применение главы 20
import serial

arduino = serial.Serial("/dev/tty.usbmodem1101", 9600) # порт и скорость

Объект serial.Serial — прямое практическое применение ООП из главы 24: он хранит открытое соединение как своё состояние и предоставляет методы для чтения и записи, не заставляя каждый раз заново разбираться, какой именно порт использовать.

Как найти правильное имя порта

Снова терминал из блока 2

На macOS Arduino обычно появляется как /dev/tty.usbmodemXXXX или /dev/cu.usbmodemXXXX — найти точное имя можно командой ls /dev/tty.* в терминале (глава 09) до и после подключения платы, сравнив список. На Windows порт называется вроде COM3, COM4 — видно в Диспетчере устройств или через PowerShell (глава 11). Имя порта различается от компьютера к компьютеру и даже от порта USB к порту USB — универсального значения "по умолчанию" не существует, его нужно определять каждый раз заново под конкретную машину.

Скетч Arduino, слушающий команды по Serial

void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);// реле, как в учебнике самоделок, глава 08
}

void loop() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    if (command == "ON") {
      digitalWrite(7, HIGH);
      Serial.println("OK: реле включено");
    } else if (command == "OFF") {
      digitalWrite(7, LOW);
      Serial.println("OK: реле выключено");
    }
  }
}

Python-скрипт, отправляющий команды

import serial
import time

arduino = serial.Serial("/dev/tty.usbmodem1101", 9600)
time.sleep(2) # дать плате время перезапуститься после открытия порта

while True:
    command = input("Команда (ON/OFF/exit): ").strip().upper()
    if command == "EXIT":
        break

    arduino.write((command + "\n").encode("utf-8")) # текст → байты, глава 18
    response = arduino.readline().decode("utf-8").strip()
    print(response)

arduino.close()

Здесь видна прямая практика главы 18: .encode() перед отправкой (Python-строка → байты для передачи), .decode() после получения (байты обратно в текст). Небольшая пауза после открытия порта нужна, потому что многие платы Arduino автоматически перезагружаются при установке нового serial-соединения — без паузы первые отправленные команды рискуют потеряться, пока плата ещё не успела запуститься заново.

Практический пример: запись показаний датчика в файл

import serial
import time

arduino = serial.Serial("/dev/tty.usbmodem1101", 9600)
time.sleep(2)

with open("readings.csv", "a", encoding="utf-8") as f: # 'a' — дописываем, не перезаписываем (глава 19)
    while True:
        line = arduino.readline().decode("utf-8").strip()
        if line:
            timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
            f.write(f"{timestamp},{line}\n")
            print(f"Записано: {timestamp} — {line}")

Это ровно то, что физически невозможно сделать удобно на самом Arduino без дополнительного модуля SD-карты — а на стороне Python получается естественно и просто: та же плата (например, с термистором из учебника самоделок), периодически отправляющая показания по Serial, теперь ведёт полноценный файл-журнал с меткой времени каждой записи, готовый для дальнейшего анализа.

Что дальше

Финальная глава книги собирает всё это в единый инструмент командной строки — не просто пример кода, а нечто, что реально можно вызывать как полноценную команду со своими аргументами и опциями.

Глава26 — Python и Arduino
Блок5 — Что добавили от себя
Далее27 — Финальный проект
СтатусГотово · рев. 1
Предыдущая глава ← 25 · Git Следующая глава 27 · Финальный проект →

Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.