Иван Иванов   3 января в 00:44

Arduino + Python: программирование платы на «питоне»

Материал по основам взаимодействия плат Arduino и языка программирования Python.

Вступление

Практически для всех проектов над которыми приходиться работать нужно иметь возможность общаться с Arduino и, к счастью, она может общаться через последовательный порт (англ. - serial port).

Что еще интересно - это то, что почти любой язык программирования может быть использован для последовательной (serial) связи, но Python кажется самым простым и доступным на данный момент. Его популярность и понятность привлекает всё больше новых последователей.

В начале у вас может возникнуть ряд сложностей по взаимодействию Arduino и Python, но надеюсь, что этот материал объяснит основы всем, кто хочет начать использовать последовательные функции, которые предоставляет Arduino.

Также я предполагаю, что раз вы читаете эту публикацию, то у вас есть некоторые знания о том, как работает Arduino, как загружать скетчи и тому подобное. Если нет, то вы можете пройти мой курс "Ардуино для начинающих". Но в любом случае я объясню ниже код Arduino и Python, который довольно простой. Сама программа не так сложна для понимания, как понимание работы последовательной связи.

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

Установка Python и библиотек

Очевидно, что нам на нашем компьютере понадобится Python, если мы хотим что-то сделать. Если у вас не установлен Python, то вам нужно зайти на официальный сайт python и скачать: python.org (ссылка). Вы скорее всего скачаете файл с расширением .exe. Запустите файл и пройдите все необходимые шаги установки. Она очень простая.

Как только у нас будет установлен Python, вам понадобится новая дополнительная библиотека под названием PySerial. Данная библиотека обеспечит все функции и методы, которые нам понадобятся для общения с нашим Arduino.

Ссылка на PySerial

Также вы можете посмотреть на GitHub:

  • библиотека: https://github.com/pyserial/pyserial
  • документация: https://pyserial.readthedocs.org/en/latest/

Для установки используем встроенный менеджер пакетов pip:

pip install pyserial

Еще вариант для более ранней версии - после того, как вы загрузите Питон, откройте Терминал и введите:

tar xfvz /Users/*Account*/Downloads/pyserial-2.6.tar.gz
cd pyserial-2.6
sudo python setup.py install

Чтобы убедиться, что все установлено правильно, откройте Idle и введите: Import Serial. Если ошибок нет, значит, все хорошо.

Вы можете проверить доступные порты таким образом:

ls /dev/tty.*

По ссылкам выше можно найти документацию по работе с библиотекой в Windows, macOS, Linux. Если вы используете Eclipse, то вам может пригодиться дополнение Python для Eclipse, если вы хотите программировать в среде Eclipse. Теперь, когда всё установлено, мы можем начать писать нашу программу на Python.

Код Python

Теперь мы можем начать программирование. Также ниже разберем код программы более детально.

import serial

connected = False

ser = serial.Serial("COM11", 9600)

while not connected:
    serin = ser.read()
    connected = True

ser.write("1")

while ser.read() == '1':
    ser.read()

ser.close()

Чтобы реально использовать методы PySerial, нам нужно импортировать последовательную библиотеку, прежде чем мы попытаемся ее использовать, что мы и делаем в первой строке программы.

Далее я объявляю переменную, которая будет действовать как флаг, когда последовательное соединение Arduino открывается. Мы не будем пытаться отправлять что-либо в Arduino, пока плата не отправит что-нибудь нам.

Затем мы инициализируем последовательную переменную ser, которая будет связываться с Arduino. Два параметра отправляются при инициализации последовательной переменной.

Во-первых, вы должны указать  порт по которому мы будем общаться (в моем случае это COM11, но в вашем случае может отличаться). Чтобы узнать, какой порт использует ваш Arduino, подключите его к компьютеру и откройте диспетчер устройств. Arduino IDE также сообщит вам, какой порт она использует.

Второй отправляемый параметр - это скорость передачи. Скорость в бодах - это скорость, с которой последовательный контроллер будет отправлять и получать данные. Важно то, что скорость в бодах должна соответствовать скорости в бодах, которую вы используете в скетче Arduino. Я выбрал 9600, потому как это средняя скорость и в нашем примере нет острой необходимости в большой скорости.

Далее мы используем функцию записи, которая отправляет число 1 в Arduino, чтобы заставить светодиод мигать. Плата мигнет дважды.

Далее мы ждем пока Arduino скажет нам, что она мигнула дважды. Цикл while будет работать пока не получит сообщение. Когда мы получаем сообщение от Arduino, мы можем закрыть последовательный порт и завершить программу. Так что это все, что нам нужно для программы на Python, всего 10 строк кода.

Важно! Вы должны всегда помнить, что нужно закрыть последовательный порт, когда вы закончите, используя ser.close().

Есть еще один пример кода Python. Посмотрите на него самостоятельно и попробуйте разобраться в нем:

from time import sleep
import serial
ser = serial.Serial('/dev/tty.usbmodem1d11', 9600)
counter = 32
while True:
     counter +=1
     ser.write(str(chr(counter)))
     print ser.readline()
     sleep(.1)
     if counter == 255:
     counter = 32

Для второго примера кода Питона ниже я приведу соответствующий код программы Ардуино.

Во втором примере вам также нужно иметь в виду два основных момента. Нужно определить к какому последовательному порту подключена ваша Arduino. Что бы это ни было, это должно быть в кавычках в строке 3 программы Python.

Вы также можете изменить скорость передачи данных в строке 3 программы Python и строке 2 программы Arduino, если они не изменяются.

После запуска программы она выведет большинство символов ASCII, сначала отправив их в Arduino, который, в свою очередь, отправит их обратно на компьютер, который затем выведет Python.

Скетч Ардуино

Скетч Ардуино для первого примера со светодиодом ниже:

void setup(){
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.write('1'); 
}

void loop(){ 
  if(Serial.available() > 0){
    digitalWrite(13, HIGH);
    delay(500);            
    digitalWrite(13, LOW);
    delay(500); 
    digitalWrite(13, HIGH);
    delay(500);            
    digitalWrite(13, LOW);
    Serial.write('0');
  }
} 

Я изначально предполагаю, что у вас установлено и работает программное обеспечение Arduino. Так как мы просто хотим мигнуть светодиодом, то мы можем просто использовать светодиод платы Arduino или подключить светодиод к контакту 13 и заземлению.

В void setup() мы запускаем последовательный монитор со скоростью 9600 бод. Скорость не имеет значения, просто убедитесь, что она соответствует скорости в бодах в программе Python.

Затем мы создаем выходной контакт, к которому подключен светодиод. Наконец, мы пишем в последовательный порт, чтобы программа на Python знала, что мы готовы.

В void loop() у нас есть одно большое выражение в виде условного if. Суть в ожидании момента, когда программа python отправит что-то через последовательный порт. Когда Arduino что-то получит, светодиод мигнет дважды.

После двух миганий Arduino отправляет сообщение о том, что плата прекратила мигать. Программа Python увидит это и затем остановится.

Для второго варианта наш скетч Ардуино будет выглядеть так:

void setup() {
Serial.begin(9600);
Serial.println("Ready");
}
void loop() {
char inByte = ' ';
if(Serial.available()){
char inByte = Serial.read();
Serial.println(inByte);
}
delay(100);

Загрузите скетч на свою плату и запустите программу Python. Если все сделано правильно, вы должны увидеть мигание светодиода из первого примера. Далее, для эксперимента вы можете попробовать добавить еще один светодиод и сделать их чередующимися. На этом всё. Хороших вам проектов.