Всем привет! Arduino и Python - два мощных инструмента, которые можно объединить через Serial для непосредственного взаимодействия плат с компьютером. Сегодня мы рассмотрим, как настроить связь между Arduino и программой на Python, а так-же создадим несколько практических примеров.
Serial порт – это интерфейс для передачи данных между компьютером и другими устройствами. Это удобный способ обмена информацией. Мы можем отправлять данные с компьютера на Arduino и наоборот. Но что, если нам нужно автоматизировать эту процедуру? На Arduino можно написать обработчики команд, а с компьютера обработчиком выступит Python-скрипт.
Это можно сделать через менеджер пакетов pip:
pip install pyserial
Для этого используйте следующий 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.
Сначала попробуем обменяться данными. Для этого используем следующий скрипт:
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 не сможет открыть порт и вы получите ошибку:
Для устранения, просто завершите процесс использующий порт.
Теперь давайте рассмотрим более практический пример. Мы будем считывать данные с датчика DHT11, подключенного к Arduino, и записывать их в Excel файл.
#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. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Комментарии