Хотя Raspberry Pi и Arduino являются, по своей сути, разными аппаратными платформами по своей структуре, тем не менее, в современном мире они являются конкурирующими платформами с открытым исходным кодом. Обе эти платформы имеют достаточно большое сообщество во всем мире и хорошую поддержку. В этой статье мы постараемся показать как можно совместно использовать преимущества обеих этих платформ – мы будем с помощью платы Raspberry Pi и языка программирования Python управлять платой Arduino.
Мы будем использовать программное обеспечение PyFirmata чтобы передавать команды плате Arduino с помощью платы Raspberry Pi и скрипта на python. PyFirmata представляет собой пакет библиотек на языке python, который можно установить в Arduino чтобы осуществлять последовательную связь между скриптом на python на любом компьютере и платой Arduino. С помощью этого пакета библиотек можно считывать и записывать информацию на любые контакты платы Arduino. В данном случае мы будем запускать программу на python в Arduino используя Raspberry Pi.
Необходимые компоненты
- Плата Arduino Uno (или любая другая) (купить на AliExpress).
- Плата Raspberry Pi с установленной операционной системой (купить на AliExpress).
- USB кабель для Arduino.
- Светодиод.
В этом проекте мы использовали внешний монитор с HDMI кабелем чтобы соединиться с Raspberry Pi. Если у вас нет лишнего монитора для этих целей вы можете использовать SSH client (Putty) или VNC server чтобы соединиться с Raspberry Pi используя компьютер.
Установка PyFirmata в Arduino используя Raspberry Pi
Чтобы загрузить программное обеспечение PyFirmata в Arduino мы сначала должны установить Arduino IDE в Raspberry Pi. Необходимо выполнить следующую последовательность шагов:
Шаг 1. Соедините Raspberry Pi с сетью интернет. Откройте терминал команд, напечатайте в нем следующую команду и нажмите ввод (enter):
1 |
sudo apt-get -y install arduino python-serial mercurial |
Подождите несколько минут, это займет некоторое время. Приведенная команда установит Arduino IDE на вашу Raspberry Pi.
Шаг 2. Теперь мы должны установить файлы pyFirmata с сервиса github:
1 |
git clone https://github.com/tino/pyFirmata |
Затем необходимо выполнить следующие команды:
1 2 |
cd pyFirmata sudo python setup.py install |
Шаг 3. Мы установили все требуемые файлы. Теперь соедините плату Arduino с Raspberry Pi с помощью USB кабеля и запустите Arduino IDE напечатав "arduino" в окне терминала.
Шаг 4. Затем напечатайте команду "lsusb" чтобы проверить действительно ли Arduino соединена с Raspberry Pi. В Arduino IDE идите в инструменты (tools) и выберите там вашу плату и последовательный порт, к которому она подсоединена.
Шаг 5. Загрузите программное обеспечение PyFirmata в Arduino выбрав пункт меню File -> Examples -> Firmata -> Standard Firmata и затем нажмите кнопку загрузки программы (upload).
Теперь мы успешно установили программное обеспечение PyFirmata в плату Arduino. Теперь мы можем управлять платой Arduino с помощью Raspberry Pi.
Для демонстрации возможности подобного управления мы будем мигать светодиодом в плате Arduino при помощи команд на языке python в Raspberry Pi.
Объяснение программы
Для лучшего понимания работы этого проекта желательно прочитать документацию на программное обеспечение pyFirmata, которое можно найти по этой ссылке.
Откройте ваш текстовый редактор в Raspberry Pi и импортируйте библиотеку pyFirmata.
1 |
import pyfirmata |
Определим контакт Arduino к которому будет подключен светодиод.
1 |
led_pin = 9 |
Теперь мы должны записать имя последовательного порта, к которому будет подключена плата Arduino с использованием функции pyfirmata.Arduino() и инициализируем этот порт на конкретную переменную.
1 2 |
board = pyfirmata.Arduino("/dev/ttyACM0") print "Code is running” |
В цикле while мы будем поочередно устанавливать на контакте, к которому подключен светодиод, напряжение высокого (HIGH) и низкого (low) уровня с использованием функции board.digital[].write() и использованием задержки с помощью функции board.pass_time().
1 2 3 4 5 |
while True: board.digital[led_pin].write(0) board.pass_time(1) board.digital[led_pin].write(1) board.pass_time(1) |
Наш код готов, теперь сохраните его в файл с расширением .py.
Откройте терминал команд и напечатайте в нем blink.py (наш сохраненный файл) чтобы запустить выполнение этого файла в плате Arduino. Убедитесь в том, что плата Arduino соединена с платой Raspberry Pi с помощью USB кабеля.
После этого вы сможете увидеть мигание светодиода на плате Arduino. Полный код программы приведен в конце статьи.
Постепенное угасание яркости свечения светодиода на Arduino с помощью pyFirmata
Чтобы лучше познакомиться с функциями программного обеспечения pyFirmata напишем программу для постепенного угасания яркости свечения светодиода (Fading LED). В этом случае мы в программе будем использовать два цикла – один для увеличения яркости свечения светодиода, а другой – для уменьшения яркости свечения светодиода.
В этой программе мы инициализируем контакты с помощью команды вида led = board.get_pin('d:9:p'), где d обозначает цифровой контакт. Более подробно об этой функции можно прочитать в документации на pyFirmata.
Полный код программы для постепенного угасания яркости свечения светодиода приведен в конце данной статьи.
Надеюсь, если у вас получится все, что написано в данной статье, вы в дальнейшем сможете реализовать еще более "крутые" проекты на основе совместного использования плат Arduino и Raspberry pi. Также на нашем сайте вы можете прочитать статью про взаимодействие Arduino и Raspberry Pi с помощью последовательной связи.
Исходный код программы
Код на Python для мигания светодиодом
1 2 3 4 5 6 7 8 |
import pyfirmata led_pin = 9 board = pyfirmata.Arduino("/dev/ttyACM0") while True: board.digital[led_pin].write(0) board.pass_time(1) board.digital[led_pin].write(1) board.pass_time(1) |
Код на Python для постепенного угасания яркости свечения светодиода
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import time import pyfirmata delay = 0.3 brightness = 0 board = pyfirmata.Arduino("/dev/ttyACM0") led = board.get_pin('d:9:p') while True: # increase for i in range(0, 10): brightness = brightness + 0.1 print "Setting brightness to %s" % brightness led.write(brightness) board.pass_time(delay) # decrease for i in range(0, 10): print "Setting brightness to %s" % brightness led.write(brightness) brightness = brightness - 0.1 board.pass_time(delay) |