В настоящее время Arduino является одной из самых мощных и простых в использовании платформ с открытым исходным кодом. Однако тенденции современного мира таковы, что часто электронными платформами необходимо управлять с помощью высокоуровневого общецелевого языка программирования чтобы сделать их более эффективными и дружественными. Одним из таких языков является Python, который представляет собой интерпретируемый, объектно-ориентированный, высокоуровневый язык программирования с динамической семантикой и высокоуровневыми встроенными структурами данных, что делает его весьма привлекательным для быстрой разработки приложений.
Объединение возможностей Arduino и Python открывает двери для множества новых возможностей, поскольку Python имеет повышенную производительность и умеет взаимодействовать с другими платформами, такими как openCV, Matlab и т. д.
В этой статье мы изучим как установить Python на компьютер и как его использовать вместе с Arduino для включения/выключения встроенного в плату Arduino светодиода.
Установка Python на ваш компьютер
В данном разделе статьи будет рассмотрена установка языка программирования на компьютер с 32 или 64-битной windows. Установка Python на компьютеры под управлением MAC и Linux будет отличаться.
Для установки Python выполните следующую последовательность шагов:
1. Установите 32-битную версию Python 2.7.9 IDLE на ваш компьютер. Не скачивайте 64-битную версию Python или его более свежую версию поскольку они могут быть не совместимы с используемыми нами библиотеками Arduino. Даже если ваш компьютер работает на 64-битной операционной системе, то вы все равно можете использовать на нем 32-битную версию Python.
Примечание: оригинал данной статьи был написан в 2017 году, поэтому, возможно, сейчас Arduino IDE уже поддерживает совместимость с более свежими версиями Python (этот вопрос будет уточняться в дальнейшем).
2. Запустите на выполнение скачанный установочный файл и установите эту версию языка Python на ваш компьютер. Не изменяйте каталог для установки Python, оставьте его по умолчанию - C:\Python27.
3. Возможно, во время установки Python на него будет “ругаться” антивирус – не обращайте на это внимание.
После установки Python вы можете проверить действительно ли он установлен на ваш компьютер введя в строке поиска Windows строку “Python IDLE”.
После его запуска вы должны увидеть на экране компьютера “Python shell” (оболочка Python) как показано на следующем рисунке.
Вы можете непосредственно писать программу в этой оболочке или же создать новый файл и писать и проверять программу в нем. Теперь давайте удостоверимся в том, что Python работает. Для этого напечатайте “print (1+1)” и нажмите enter. Вы должны после этого увидеть в оболочке напечатанный результат вычислений – 2.
Установка PySerial в Python
Следующим шагом необходимо установить программу PySerial, которая представляет собой Python API module (модуль прикладного программного интерфейса Python’а), с помощью которого можно считывать и записывать данные в последовательном виде в плату Arduino или любой другой микроконтроллер.
Кликните на Pyserial Windows чтобы скачать PySerial. По приведенной ссылке вы можете скачать установочный файл этого приложения и установить его. Не изменяйте настройки (в том числе и каталог для установки) во время установки приложения – оставьте их по умолчанию.
Теперь давайте убедимся в том, что PySerial корректно установлена и работает. Для этого снова откройте Python Shell и напечатайте в нем “import serial”. Если библиотека успешно установлена, то после этого вы не увидите никаких сообщений об ошибке как показано на следующем рисунке.
Дальнейший материал статьи предполагает что вы хотя бы немного знакомы с платформой Arduino и умеете загружать в нее программы. Если это не так, то советуем ознакомиться с руководством по Arduino для начинающих.
Наша первая совместная программа на Arduino и Python
Как отмечалось ранее, в этой программе мы будем управлять встроенным в плату Arduino светодиодом.
Программа для Arduino
Полный текст программы для платы Arduino приведен в конце статьи, здесь же обсудим наиболее важные его фрагменты.
Внутри функции setup мы инициализируем последовательную связь со скоростью 9600 бод/с и зададим режим работы для контакта, с которого будем управлять светодиодом. Также мы передадим приветственное сообщение в Python при помощи последовательной связи.
1 2 3 4 5 6 |
void setup() { Serial.begin(9600); //инициализируем последовательную связь на COM порту со скоростью 9600 бод/с pinMode(LED_BUILTIN, OUTPUT); //задаем режим работы на вывод данных для контакта 13, к которому подключен светодиод digitalWrite (LED_BUILTIN, LOW); Serial.println("Hi!, I am Arduino"); // передаем приветственное сообщение } |
Внутри функции loop мы будем проверять поступают ли какие-нибудь данные по последовательному порту и записывать их в переменную “data”. А затем в зависимости от значения этой переменной мы будем включать или выключать светодиод.
1 2 3 4 5 6 7 8 9 10 11 |
void loop() { while (Serial.available()){ data = Serial.read(); } if (data == '1') digitalWrite (LED_BUILTIN, HIGH); else if (data == '0') digitalWrite (LED_BUILTIN, LOW); } |
Программа для Python
Полный текст программы для Python приведен в конце статьи, здесь же обсудим наиболее важные его фрагменты.
Откройте Python Shell (Python IDLE) и кликните в ней на File->New. После этого откроется новый текстовый файл, где вы можете писать свою программу. Но перед давайте предварительно сохраним его, нажав Ctrl+S. Введите любое имя для файла и нажмите сохранить. После этого файл автоматически сохранится с расширением “.py”.
После этого вы можете писать в нем свою программу или скопировать текст нашей программы, приведенный в конце статьи.
В нашей программе на Python мы первым делом должны подключить библиотеки для работы с последовательным портом связи и для работы с временем. Библиотека для работы с последовательным портом связи будет использоваться для передачи и приема данных по последовательному порту, а библиотека для работы с временем будет использоваться для создания временных задержек в программе. Эти библиотеки можно подключить с помощью двух следующих строчек кода:
1 2 |
import serial #Serial imported for Serial communication import time #Required to use delay functions |
Следующим шагом необходимо инициализировать объект (serial object), использующий нашу библиотеку последовательной связи. В нашей программе мы назвали этот объект “ArduinoSerial”. Также в этой команде необходимо правильно указать COM порт к которому подключена Arduino (можно узнать в диспетчере устройств на вашем компьютере) и задать скорость работы последовательного порта в бодах.
1 |
ArduinoSerial = serial.Serial('com18',9600) |
После этого в программе необходимо организовать временную задержку на 2 секунды чтобы последовательная связь установилась. Это можно сделать с помощью следующей команды:
1 |
time.sleep(2) |
Теперь мы можем передавать/принимать данные от платы Arduino. Следующая команда будет считывать какие-нибудь данные, поступающие от платы Arduino и печатать их в окне нашей оболочки Python.
1 |
print ArduinoSerial.readline() |
Также эти считанные данные вы можете записать в переменную и использовать потом ее в своей программе.
Следующая команда будет передавать строку данных в плату Arduino.
1 |
ArduinoSerial.write('1') |
Эта команда передаст ‘1’ в плату Arduino. С помощью этой команды можно передавать что угодно, начиная от десятичных чисел и заканчивая строками.
Теперь в нашей программе внутри бесконечного цикла while мы должны написать следующие строки:
1 2 3 4 5 6 7 8 9 10 11 12 |
var = raw_input() #получаем данные от пользователя print "you entered", var #печатаем что ввел пользователь if (var == '1'): # если значение равно 1 ArduinoSerial.write('1') # передаем 1 print ("LED turned ON") time.sleep(1) if (var == '0'): # если значение равно 0 ArduinoSerial.write('0') # передаем 0 print ("LED turned OFF") time.sleep(1) |
Команда var=raw_input считывает любое значение, которое печатается в текстовом поле оболочки Python и записывает ее в переменную var.
Далее, если значение этой переменной равно 1, то по последовательному каналу в плату Arduino передается ‘1’, а если 0 – то в плату Arduino передается ‘0’. А программа на Arduino в зависимости от принятого значения включает или выключает встроенный в плату светодиод.
Полный текст программы на Python у вас должен выглядеть примерно следующим образом:
Теперь нажмите Run -> Run Module или клавишу F5 и ваша программа запустится (возможно, она дополнительно спросит о том сохранить изменения или нет).
Управление светодиодом с помощью Python и Arduino
Загрузите программу в плату Arduino и удостоверьтесь в том, что она подсоединена к тому COM порту, который указан в программе на Python. Затем запустите на выполнение программу в Python.
Запустится скрипт оболочки Python как показано на следующем рисунке. Окно слева на этом рисунке – это окно оболочки показывающее выходные данные программы, а справа – окно непосредственно с программой.
Как вы можете видеть, строка “Hi!, I am Arduino”, передаваемая платой Arduino, принимается программой на Python и отображается в окне его оболочки.
Когда окно оболочки просит ввести значения, мы можем ввести 0 или 1. Если мы введем 1, то светодиод на плате Arduino зажгется, а если 0 – то погаснет. Это будет свидетельствовать об успешном взаимодействии наших программ на Arduino и Python.
Исходный код программы
Далее приведен текст двух программ: одна для Arduino, а вторая – на Python. Надеемся что это простой пример поможет вам в создании более сложных проектов, основанных на совместном взаимодействии Arduino и Python.
Исходный код программы для Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int data; void setup() { Serial.begin(9600); //инициализируем последовательную связь на COM порту со скоростью 9600 бод/с pinMode(LED_BUILTIN, OUTPUT); //задаем режим работы на вывод данных для контакта 13, к которому подключен светодиод digitalWrite (LED_BUILTIN, LOW); Serial.println("Hi!, I am Arduino"); } void loop() { while (Serial.available()){ data = Serial.read(); } if (data == '1') digitalWrite (LED_BUILTIN, HIGH); else if (data == '0') digitalWrite (LED_BUILTIN, LOW); } |
Исходный код программы для Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import serial #подключаем библиотеку для последовательной связи import time #подключаем библиотеку чтобы задействовать функции задержки в программе ArduinoSerial = serial.Serial('com18',9600) #создаем объект для работы с портом последовательной связи time.sleep(2) #ждем 2 секунды чтобы установилась последовательная связь print ArduinoSerial.readline() #считываем данные из последовательного порта и печатаем их в виде строки print ("Enter 1 to turn ON LED and 0 to turn OFF LED") while 1: #бесконечный цикл var = raw_input() #считываем данные от пользователя print "you entered", var #печатаем подтверждение ввода if (var == '1'): #если значение равно 1 ArduinoSerial.write('1') #передаем 1 print ("LED turned ON") time.sleep(1) if (var == '0'): # если значение равно 0 ArduinoSerial.write('0') #передаем 0 print ("LED turned OFF") time.sleep(1) |
Видео, демонстрирующее работу схемы
Примечание: если вам понравилась данная статья, то вы можете прочитать ее продолжение - использование графических возможностей VPython совместно с Arduino.
17 141 просмотров
Добрый вечер, не получилось ( Ошибку дает, типа порт не может открыть:
Traceback (most recent call last):
File "C:/2mysite/2023/wArdu.py", line 5, in
ArduinoSerial = serial.Serial('COM3',9600) #создаем объект для работы с портом последовательной связи
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 38, in __init__
SerialBase.__init__(self, *args, **kwargs)
File "C:\Python27\lib\site-packages\serial\serialutil.py", line 282, in __init__
self.open()
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 66, in open
raise SerialException("could not open port %r: %r" % (self.portstr, ctypes.WinError()))
SerialException: could not open port 'COM3': WindowsError(2, '\xcd\xe5 \xf3\xe4\xe0\xe5\xf2\xf1\xff \xed\xe0\xe9\xf2\xe8 \xf3\xea\xe0\xe7\xe0\xed\xed\xfb\xe9 \xf4\xe0\xe9\xeb.')
Добрый день, пока, к сожалению, ничем не могу помочь, нахожусь в отъезде в отпуске
"питон имеет повышенную производительность" по сравнению с чем? с машинными кодами?
Ну не придирайтесь вы слишком сильно к этой фразе, она образная. По сравнению со старыми языками с интерпретаторами Python действительно имеет более высокую производительность
вместо raw_input() достаточно просто input() ввести, я правильно понимаю, что на питонах с 3 версии это одно и то же?
Да, в Python 3 можно использовать просто input(), а в Python 2 нужно использовать raw_input(). А удалось ли вам реализовать описанный в статье проект на Python 3? Если не секрет, то на какой именно версии?
ну по нажатию на 1 или 0 у меня ошибки вылетают, но для меня главное, что сообщение от ардуино выходит вначале.
Понятно. Но все равно хорошо что у вас заработало то, что вам нужно
Можно ли загрузить неким образом код на python в плату arduino, чтобы устройство было портативным?
К сожалению не знаю точного ответа на этот вопрос. А чем вас не устраивает язык Wiring, который используется в arduino. Если же вам жизненно необходим именно python в качестве языка программирования для микроконтроллеров, то я бы посоветовал вам посмотреть Raspberry Pi Pico - по цене она всего лишь немного дороже arduino.
Ответ нашла: использовать wifi модули
Ну вот, вы молодец, разобрались