Arduino и Python: Связь через Serial порт

08 октября 2023

Всем привет! Arduino и Python - два мощных инструмента, которые можно объединить через Serial для непосредственного взаимодействия плат с компьютером. Сегодня мы рассмотрим, как настроить связь между Arduino и программой на Python, а так-же создадим несколько практических примеров.

Введение

Serial порт – это интерфейс для передачи данных между компьютером и другими устройствами. Это удобный способ обмена информацией. Мы можем отправлять данные с компьютера на Arduino и наоборот. Но что, если нам нужно автоматизировать эту процедуру? На Arduino можно написать обработчики команд, а с компьютера обработчиком выступит Python-скрипт.

Начнем с настроек:

  1. Подключите Arduino к компьютеру.
  2. Установите библиотеку pyserial для работы с Serial портом:

Это можно сделать через менеджер пакетов pip:

pip install pyserial

  1. Определите порт, к которому подключено Arduino:

Для этого используйте следующий Python-скрипт:

import serial.tools.list_ports
# Получаем список доступных Serial портов
ports = list(serial.tools.list_ports.comports())
# Выводим информацию о каждом порте
for port in ports:
 print(f"Порт: {port.device}")
 print(f"Описание: {port.description}")
 print(f"Производитель: {port.manufacturer}\n")

После запуска, программа выдаст порт, к которому подключено Arduino.

Практические примеры:

Пример 1: Отправка и прием данных

Сначала попробуем обменяться данными. Для этого используем следующий скрипт:

import serial
# Открываем Serial порт ('COMX' замените на имя вашего порта)
ser = serial.Serial('COMX', 9600)
# Отправляем строку "Hello, Arduino!" на Arduino, предварительно преобразовав ее в байты
ser.write(b'Hello, Arduino!')
# Читаем ответ от Arduino через Serial порт
response = ser.readline()
# Декодируем ответ из байтов в строку с использованием UTF-8
decoded_response = response.decode('utf-8')
# Закрываем порт
ser.close()
print(decoded_response)

Для Arduino нужен ответный скетч:

void setup() {
 // Начинаем работу с Serial портом на скорости 9600 бит/с
 Serial.begin(9600);
}
void loop() {
 // Проверяем, есть ли данные из Serial порта
 if (Serial.available() > 0) {
 // Читаем полученные данные и сохраняем их в переменной
 String receivedData = Serial.readString();
 // Отправляем ответ обратно в Serial порт
 Serial.println("Получено: " + receivedData);
 }
}

Сначала загрузим скетч в Arduino, а затем запустим Python-скрипт:

Как видно, ответ возвратился обратно. Но если вдруг порт будет занят чем-то другим, будь то монитор порта в Arduino IDE или еще какая программа, python не сможет открыть порт и вы получите ошибку:

Для устранения, просто завершите процесс использующий порт.

Пример 2: Сбор и запись данных с датчика

Теперь давайте рассмотрим более практический пример. Мы будем считывать данные с датчика DHT11, подключенного к Arduino, и записывать их в Excel файл.

Загружаем скетч в Arduino:

#include <DHT.h>
#define DHTPIN 2 // Пин, к которому подключен датчик DHT11
#define DHTTYPE DHT11 // Тип датчика (DHT11 или DHT22)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
 Serial.begin(9600);
 dht.begin();
}
void loop() {
 // Читаем температуру и влажность с датчика
 float humidity = dht.readHumidity();
 float temperature = dht.readTemperature();
 // Проверяем, что данные с датчика считаны корректно
 if (isnan(humidity) || isnan(temperature)) {
 Serial.println("Ошибка при чтении данных с датчика DHT11");
 } else {
 // Формируем строку с данными (температура и влажность)
 String dataString = String(temperature) + "," + String(humidity);
 // Отправляем данные в порт
 Serial.println(dataString);
 // Задержка перед отправкой
 delay(1000);
 }
}

Для работы с xlsx файлами нам понадобиться библиотека openpyxl, которую можно установить командой:

pip install openpyxl

Теперь запускаем Python скрипт:

import serial
import time
from datetime import datetime
from openpyxl import Workbook
ser = serial.Serial('COM5', 9600) # Замените 'COMX' на ваш порт
# Создаем новый файл Excel
workbook = Workbook()
sheet = workbook.active
# Записываем заголовок
sheet.append(["ID записи", "Время", "Температура (°C)", "Влажность (%)"])
id_record = 1 # Инициализируем ID записи
while True:
 # Считываем строку с Arduino
 data = ser.readline().decode('utf-8').strip()
 # Выводим текущие показания
 print(id_record, data)
 # Получаем текущее время
 current_time = datetime.now().strftime('%H:%M:%S')
 # Парсим строку на температуру и влажность
 temperature, humidity = data.split(',')
 # Записываем данные в ячейки
 sheet.append([id_record, current_time, float(temperature), float(humidity)])
 # Увеличиваем ID
 id_record += 1
 # Сохраняем файл
 workbook.save('data.xlsx')
 # Задержка
 time.sleep(1)

Как видно, данные успешно получаются и записываются в файл.

Теперь посмотрим xlsx файл, для этого нужно остановить python код:

Можно построить графики:

Где возможно применить данную технологию? Например, использовать для создания интерфейса управления устройством без доступа к интернету, например стационарным роботом манипулятором, самодельным 3D-принтером или же для мониторинга нескольких физических датчиков в долгосрочных экспериментах, для последующего анализа результатов.

Надеюсь, что эта статья помогла вам понять, как автоматизировать работу с Serial портом, и вдохновила вас на создание собственных проектов. Успехов в вашей работе с Arduino и Python!


Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: