Python для микроконтроллера — CircuitPython

Python — один из самых популярных языков в мире, и если вы его ещё не знаете, обязательно следует с ним познакомиться. А уж если вы заглянули на RobotClass, то изучение python правильно будет совместить с изучением электроники.

Сам по себе язык Python невозможно заставить работать на таком слабом вычислительном устройстве, как микроконтроллер. Одна из причин — мало памяти для хранения инфраструктуры языка. Чтобы решить эту задачу была разработана специальная версия языка — MicroPython (ссылка в конце урока).

MicroPython позволяет запускать Python-скрипты на микроконтроллерах esp8266, esp32, stm32, nRF и пр. А вот на Arduino с микроконтроллером atmega328 этот язык уже не заработает.

CircuitPython

Специально для образовательных целей компания Adafruit доработала язык MicroPython и выпустила свою версию его под названием CircuitPython. Главной ценностью этой версии является наличие огромного количества совместимых библиотек, которые позволяют работать с привычными нам датчиками, дисплеями, драйверами и прочими радостями.

Так же как и свой прародитель CircuitPython может работать на множестве разных микроконтроллеров. Далее мы будем ориентироваться именно на язык CircuitPython.

Микроконтроллер с CircuitPython

Чтобы микроконтроллер умел работать с CircuitPython на нём уже должна быть установлена специальная инфраструктура (прошивка). Для примера, подключим отладочную плату Графит-S2 к компьютеру через USB кабель и посмотрим на реакцию. Работать будем в ОС Windows.

После подключения в списке доступных дисков появится новый накопитель с именем CIRCUITPY.

Зайдём в этот накопитель и увидим такую структуру папок.

Структура папок CIRCUITPYTHON

Самое важно здесь — это папка lib и файл скрипта code.py (в Python программы часто называют скриптами). В папке хранятся дополнительные библиотеки, которые необходимы для работы программы. Файл code.py хранит скрипт на языке Python, который запускается каждый раз когда мы его сохраняем на накопитель, или когда подаём питание на отладочную плату, или нажимаем кнопку сброса.

Кроме того, в списке устройств появится новый COM порт. С помощью этого виртуального порта можно будет работать с интерпретатором языка Python. Об этом чуть позже.

COM порт для работы с CIRCUITPYTHON REPL

Среда разработки Mu

Итак у нас есть доступ к программе на Python, скорее бы уже что-нибудь написать. Но пока ещё одна остановка.

Редактировать программу можно и в обычном текстовом редакторе, однако удобнее для этого использовать так называемые IDE (это как Arduino IDE для Arduino). Помимо текстового редактора IDE имеют набор полезных функций: систему проверки кода, функцию загрузки на контроллер, терминал для связи с контроллером. А для Python будет ещё важным иметь возможность работать с интерпретатором языка (REPL).

Для CircuitPython (и для MicroPython тоже) имеется удобная среда Mu.

https://codewith.mu/

В Mu есть всё самое необходимое для успешного начала работы с CircuitPython. Теперь приступим к программированию.

REPL — интерпретатор языка Python

Если отладочная плата подключена к компьютеру, редактор Mu автоматически её увидит и в нижнем правом углу окна появится иконка микросхемы без красного крестика. Если так, то значит всё хорошо и можно работать дальше.

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

Жмём кнопку Последовательный. В нижней части редактора откроется консоль интерпретатора. Если на плате уже работает какая-то программа, нам следует прервать её выполнение комбинацией Ctrl+С. В результате появится приглашение нажать любую кнопку для активации командной строки REPL (Press any key to enter REPL). Жмём любую кнопку. Результат:

CIRCUITPYTHON REPL

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

Вводим команды друг за другом, каждый раз нажимая Enter. Сначала присваиваем число 5 переменной a. Затем число 6 для b. Затем складываем их и результат присваиваем переменной c. Наконец, выводим результат функцией print.

CircuitPython арифметика

Работает! Ну а теперь будем управлять светодиодом. Для этого нам потребуется подключить библиотеку board, которая специфична для каждой отладочной платы. Именно эта библиотека знает как пронумерованы контакты на плате, и какие у них есть синонимы.

Чтобы посмотреть все доступные контакты, используем функцию dir.

CircuitPython REPL board

Над понимать, что это все возможные имена контактов вместе с синонимами. Физических контактов меньше. Например, D13, LED и L — это одно и то же.

Следующий шаг — настройка контакта. Так же как и при работе с Arduino нам следует определить, в каком направлении будет работать контакт: на ввод или на вывод. Для этого подключим из библиотеки digitalio два класса: функцию DigitalInOut и Direction:

from digitalio import DigitalInOut, Direction

Создаём объект класса DigitalInOut, указывая за какой контакт он будет отвечать. Мы будем работать со светодиодом на контакта D13. Его и пишем, вернее его синоним.

led = DigitalInOut(board.LED)

Устанавливаем направление. В нашем случае это OUTPUT.

led.direction = Direction.OUTPUT 

Наконец, зажигаем светодиод присваивая led.value значение True (истина, как HIGH на Arduino). Вот что у нас получилось:

CircuitPython REPL DigitalInOut

Посмотрите на светодиод, он горит!

Мигаем светодиодом на CircuitPython

Что ж, с интерпретатором познакомились. Это удобный инструмент, если нужно быстро что-нибудь проверить. В реальной задаче, конечно, программисты сначала пишут полный код программы, а потом его запускают целиком.

Напишем программу для мигания светодиодом. Прямо как на старой доброй Ардуино (урок про светодиод).

Жмём кнопку Загрузить и выбираем файл code.py на накопителе CIRCUITPY. Пишем код.

import time
import board
from digitalio import DigitalInOut, Direction

led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.1)
    led.value = False
    time.sleep(1.0)

Добавилась библиотека time, из которой мы используем функцию sleep для организации паузы. Это аналог delay в Arduino IDE, только в sleep указываются секунды, а в delay — миллисекунды.

Сразу после настройки контакта, мы запускаем бесконечный цикл. В Arduino IDE таким циклом была функция loop().

while True:

Обратите внимание, всё что внутри цикла имеет отступ слева на равно число пробелов. Это одна из особенностей языка Python, в нём нет привычных фигурных скобок.

О тонкостях языка Python поговорим в других уроках. А теперь жмём в редакторе кнопку Сохранить и программа сразу начинает выполняться на микроконтроллере — светодиод начинает мигать!

Полезные ссылки

Официальный сайт MicroPython: https://micropython.org

Среда разработки Mu: https://codewith.mu/


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован.