Arduino и python: управление платой с помощью оболочки языка

Управление Arduino с помощью оболочки Python

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

Наиболее эффективным и простым в изучении языком программирования в современном мире является python. Имея миллионы приложений и максимально удобный интерфейс, мы можем с ним почти все.

В этой статье я попытался объединить среду Arduino с оболочкой Python.

Из комплектующих нам понадобятся только Arduino Uno (Genuino Uno) и Arduino IDE.

Установка Python

Сначала, вам нужно будет скачать python на свой компьютер, чтобы продолжить работу с платой.

Выполните следующие шаги, которые я привел ниже.

Упомянутые ниже шаги применимы только для пользователей Windows, работающих на 32-битной или 64-битной ОС. Процедура установки для MAC и Linux отличается.

Нам нужно скачать среду с официального сайта “Питона” отсюда.

    Нажмите на 32-битный Python-2.7.9, что установит 32-битный Python IDLE на ваш компьютер.

Импорт Pyserial

Теперь вам нужно будет импортировать модуль Pyserial в ваш IDLE.

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

Нажмите на Pyserial Windows (ссылка), чтобы загрузить PySerial. В результате вы получите исполняемый exe-файл, который можно установить напрямую. Не меняйте никаких настроек во время установки. Оставьте его в каталоге по умолчанию и с настройками по умолчанию.

Теперь давайте проверим, правильно ли установлен PySerial. Для этого снова откройте Python Shell и введите:

import serial

Если библиотека была успешно установлена, вы не должны получить никаких сообщений об ошибках.

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

Коды проекта

Вы можете скопировать коды для проекта ниже.

Код Python :

Код Ардуино #1:

Код Ардуино #2:

Мы также отправили приветственное сообщение на python с помощью последовательной вывод, как показано в коде Python #2:

Внутри функции цикла loop мы читаем любые данные, поступающие последовательно, и присваиваем значение переменной «data». Теперь, основываясь на значении этой переменной («data»), мы переключаем встроенный светодиод, как показано в коде Python #1.

Вышеупомянутые фрагменты кода будут написаны в Arduino IDE. Вышеупомянутый код должен быть написан на Python в режиме ожидания для Windows. Затем вам просто нужно загрузить код Ардуино (выше) в вашу оболочку python для управления встроенным светодиодом на вашем Arduino.

Python & Arduino. Просто, быстро и красиво

Оборудование


Недавно я заполучил очень интересную плату: Arduino SS Micro. Эта плата, внешне напоминающая Digispark Attiny 85, тем не менее является китайской версией Arduino Micro, с выведенным выходом USB.

Подробно рассказывать о ней я не буду, ведь это уже сделал пользователь YouTube с ником iomoio, и его обзор можно посмотреть здесь.

Как мне кажется — это довольно крутое и удобное устройство для небольших домашних проектов, ведь у проводов есть супер-свойство: теряться в самый неподходящий момент.

В качестве управляющего компьютера был использован MacBook Pro с операционной системой macOS Mojave, но не надо закрывать статью, если вы используете Windows или Linux — всё описанное в статье будет работать без изменений на любой операционной системе.

Скетч для Arduino

В качестве примера будет использоваться скетч, включающий и выключающий светодиод, по команде из Serial-порта.

Светодиод в Arduino SS Micro висит на порте SS, и поэтому он автоматически выключается. Не смотря на это, стандартный пример Blink — мигающий светодиод работает.

Если вы будете использовать другую Arduino — не забудьте сменить пин светодиода.

Код для компьютера

Одним из достоинств Python, кроме его кроссплатформенности — наличие гигантского числа библиотек. Нам понадобятся:

  • PySerial — библиотека для работы с Serial-портом
  • PyQT5 — библиотека для создания графического интерфейса

Установка

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

Для удобства создания GUI можно установить программу QTDesigner.

Интерфейс

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

Исходный код

Вся работа с устройством происходит благодаря библиотеке PySerial. Но есть несколько нюансов. Например, как узнать, в какой из портов подключено устройство?

На всем прекрасно известном сайте stackoverflow, пользователь с ником Thomas предложил уже готовое решение, которое я и использовал.

Кроме этого необходимо хранить список доступных скоростей:

А теперь соберём вместе дизайн(созданный в QtDesigner и сконвертированный с помощью утилиты pyuic5 в .py файл), функции для сканирования портов и основной код программы.

Основной класс, содержащий в себе всю логику программы

Переменные self.Port и self.Speed — это выпадающие списки, содержащие в себе значения доступных портов и скоростей.

При нажатии на кнопку self.ConnectButton вызывается функция connect, в которой производится попытка подключения к заданному порту с заданной скоростью. Если подключение успешно, то кнопка окрашивается в зелёный цвет, и меняется надпись.

Функция send отправляет в наш порт байтовую строку — заставляющую включить режим мигания.

Таким образом можно управлять различными устройствами, подключёнными к USB.

Данная статья является вводной и обзорной, более полную информацию можно найти например тут:

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Знакомство с платой MicroPython

MicroPython – проект, ставящий перед собой целью портирование Python на микроконтроллеры STM. В ноябре прошлого года Damien George, британский физик-теоретик, увлекающийся электроникой и робототехникой, опубликовал на Kickstarter проект платы с микроконтроллером STM, писать код для которой возможно на языке Python. Проект резко набрал популярность и сборы в 6 раз превысили ожидаемые. За полгода автору удалось сделать и отослать поддержавшим его проект энтузиастам рабочие прототипы, а также запланировать новый цикл производства для тех, кто заинтересован в получении платы. Проект получил довольно большое количество разработчиков как версии Python для микроконтроллеров STM, так и для библиотек для работы с внешними устройствами.

Каковы преимущества платы MicroPython? Во-первых, цена оригинальной платы сравнима с ценами на о ригинальные платы Arduino – и это при кардинально различающихся возможностях. Во-вторых, Python – язык более высокоуровневый и простой, чем Wiring для Arduino или же C для AVR, что, несомненно, является плюсом для начинающих. После нового цикла производства, когда платы будут доступны всем желающим, ожидается ещё больший приток популярности и дальнейшее увеличение ниши MicroPython в электронных проектах. В-третьих, для использования программного обеспечения MicroPython необязательно иметь оригинальную плату – можно скомпилировать ПО под другой подходящий МК от STM (об этом расскажу позднее) или даже использовать как минималистичную и очень быструю версию Python на ПК. На данный момент заявлена начальная поддержка для плат NetDuino Plus 2, STM Discovery STM32F407 и Teensy 3.1. Более актуальный список поддерживаемых плат доступен здесь.

Как можно увидеть, плата имеет огромное количество GPIO и различных интерфейсов. К примеру, можно сравнить её с платой Arduino Uno:

Arduino Uno MicroPython
Цена 20EUR (оригинальная) 30EUR (оригинальная)
Платформа AVR STM
Язык программирования Wiring, C, Assembler (AVR) Python, C, Assembler (STM)
Размер 2,7*2,1inch 1,7*1,6inch
ROM для кода 16/32k 91к + расширение SD-картами
GPIO/ADC/DAC 20/8/0 38/16/2
Интерфейсы UART (объед. с USB), SPI, I 2 C, 6xUART, 2xSPI, 2xI 2 C, 2xCAN
Плюсы из коробки 1xLED 2xLED, кнопка и I 2 C-акселерометр
Дополнительно Унифицированные слоты расширения USB-OTG, USB-UART/HID/storage

При большей цене плата MicroPython выигрывает по размерам, памяти для кода и интерфейсам. Плюс – планируется плата-переходник с контактов PyBoard на шилды для Arduino, чтобы использовать уже существующие модули расширения. Энтузиасты пишут модули для работы с популярными внешними устройствами, написано уже многое.

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

Unboxing, или самая бесполезная часть


Плата была упакована хорошо, в отдельной коробочке с антистатическими вкладками и даже двумя наклейками в комплекте. Правда, кабеля не было, но я взял из своих запасов. Тут в ыяснилось, что очень многие USB-microUSB кабели – крайне чувствительные к движениям и постоянно норовят прервать соединение. Пришлось найти короткий с толстой изоляцией, отлично подошёл и до сих пор работает без каких-либо проблем.

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

Уже работающие возможности

  • Интерактивная консоль Python через виртуальный последовательный порт через USB. Это отличная помощь в разработке, которая, естественно, не могла не появиться на этой плате. Все те возможности, которые поддерживаются скриптами, а также новые возможности платы, которые порой появляются при обновлении прошивки, можно перед этим испытать в консоли. USB – хардварный, на самом чипе STM, без посредников типа FT232.
  • Встроенный акселерометр. Да, это то, с чем можно работать, достав плату из коробки, то, что связывает плату с внешним миром. Что-то похожее я встречал разве что в более специфичных проектах, вроде Arduino Esplora, и это, как по мне, помогает оценить возможности платы, даже ничего не припаивая.
  • USB storage для скриптов. Не нужно подключать карту для более простых проектов – 100 килобайтов для кода к вашим услугам, и они доступны как простая папка с файлами при подключении к компьютеру. Последним порой не могут похвастаться даже самые новые смартфоны 😉
  • USB HID как приятное дополнение. Пока поддерживается только имитация мыши, клавиатура ожидается в скором времени – и, несомненно, ей найдётся применение. Также скоро обещают сделать USB-OTG – это резко расширит возможности платы, хоть и потребуется дополнительная рабочая сила для разработки драйверов.
  • Обновление через USB. Для плат STM это довольно стандартная возможность, но не везде она сделана так, чтобы использовать её было реально удобно.
  • Доступные модули для SPI/I2C/UART/ADC/DAC. В сочетании с интерактивной консолью – можно считать это частичной заменой Bus Pirate (популярный инструмент, использующийся в том числе как консоль для работы с различными протоколами). Конечно, в плане функций Bus Pirate является ещё много чем, но если можно использовать уже существующий инструмент для выполнения части задач – почему бы и нет?
  • Логические уровни – 3.3В, но все GPIO пины, кроме двух, принимают 5В. К слову, на плате установлен линейный регулятор с низким падением напряжения, минимальное напряжение на его входе – 3.6 вольт, что позволяет запитать плату от одной 3.7В LiIon/LiPo батареи или трёх AAA/AA.

Подключил к ноутбуку с Linux, сразу же появился последовательный порт, плюс внешний диск – память самой платы. В памяти хранятся скрипты, readme и драйвер для Windows, что довольно удобно и напоминает USB 3G-модемы.

К несчастью, когда я начал работу с интерактивной консолью, появились проблемы: используя примеры с официального сайта, я н аткнулся на кучу исключений там, где их не должно было быть. Оказалось, что нужно было просто-напросто обновить прошивку. Это оказалось сделать очень просто – замкнуть на плате два контакта, подключить плату к компьютеру и скормить свежескачанный сегодняшний образ прошивки специальной программе.

А на этом месте поподробнее.

Инструкция для Windows есть здесь, а для Linux потребуются следующие манипуляции:

  1. Скачать файл последней прошивки отсюда
  2. Установить утилиту dfu-util (в Debian/Ubuntu находится в пакете dfu-util)
  3. Замкнуть на PyBoard контакты DFU и 3V3
  4. Подключить PyBoard к компьютеру
  5. Запустить команду

После прошивки и переподключения платы прошивка будет обновлена. В моём случае – после перепрошивки всё заработало нормально.

Оказалось, что плате не нравится горячее извлечение. Если быть точным, то не нравится это встроенной памяти, файловая система которой – FAT. После одного извлечения список файлов перестал читаться, но всё прошло после проверки файловой системы на ошибки. Windows чаще всего предлагает сделать это автоматически, а в Linux всё решается одним запуском fsck. Однако же мне удалось один раз в силу забывчивости потерять пару скриптов, которые набросал на скорую руку и которые просто не успели синхронизироваться с файловой системой из-за внезапного извлечения. При использовании советую учитывать этот маленький нюанс и “извлекать” встроенную память перед отсоединением кабеля.

​ Написание первого скрипта

Тут всё очень просто. Подключаю плату как диск:

Для начала работы нужно изменить файл boot.py. Это файл, в котором хранятся настройки для запуска платы. В принципе, там можно хранить и код самой программы, но лучше использовать для этого файл main.py, который мы и подключим, раскомментировав следующую строку:

Отлично. Теперь открываем файл main.py:

Пишем в нём самый простой код, который зажигает два светодиода и попеременно мигает ими по очереди с интервалом в одну секунду. led.toggle() обозначает переключение состояния светодиода на противоположное. Сохраняем, перезапускаем – мигает.

К слову, хорошая коллекция демо-скриптов есть в этом репозитории на GitHub.

Сброс к заводским настройкам

У PyBoard есть две функции на случай возникновения проблем – безопасный режим (игнорирование файлов boot.py&main.py) или же сброс к чистой ФС. Первый способ полезен, когда из-за бесконечного цикла в коде/неправильного режима USB проблему трудно исправить, но она в целом несущественна. Второй способ полезен в случае каких-либо серьёзных проблем, вроде повреждений ФС, но полностью уничтожает данные на ней. Для перехода к этим функциям отключаем плату от компьютера, затем зажимаем кнопку USR (левая) и подключаем обратно. После этого, всё ещё держа кнопку USR, щёлкаем кнопкой RST (правая) и дожидаемся момента, когда будут мигать оранжевый и зелёный светодиоды:

  • Для безопасного режима отпускаем кнопку USR в момент, когда будет гореть только оранжевый светодиод. Он мигнёт 4 раза, после этого будет активирован безопасный режим, во время которого можно подключиться к последовательному порту или примонтировать файловую систему.
  • Для сброса к заводским настройкам отпускаем кнопку USR в момент, когда будут гореть и оранжевый, и зелёный светодиоды. Они мигнут 4 раза, после этого загорится красный светодиод. Когда он потухнет, сброс закончится. Для того, чтобы продолжить работу с платой, просто щёлкните кнопкой RST.

Последняя заметка – имеющуюся у меня плату не удастся просто так подключить к какому-нибудь устройству. Почему? Не напаяны контакты. Это можно и нужно исправить, официальный совет – напаять контактные группы типа “мама” так, чтобы контакты приходились на лицевую сторону платы, к примеру, так:

Так я и сделаю, только контакты возьму более доступные для меня. В итоге получилось:

Выбор контактов обусловлен тем, что так труднее что-то закоротить, когда плата MicroPython не вставлена в какую-либо, но подключена к питанию, как и тем, что ответные контактные группы дешевле – а именно их потребуется больше всего, чтобы создавать различные шилды. Зачем напаивать контакты так, чтобы они приходились на лицевую часть? Всё очень просто.

Полезна ли мне эта плата как разработчику? Да, несомненно. У меня е сть проекты, где Raspberry Pi/любой другой SoM на Linux/OpenWRT – оверкилл, а Arduino – уже недостаточно, к примеру – обработка данных с датчиков положения и корректировка положения в пространстве, синтез звука, контроль большого числа устройств на I 2 C/SPI или же устройств с высокой скоростью передачи и т.п. В процессе работы оказалось, что эта плата – отличный инструмент для прототипирования благодаря простому ЯП и возможности интерактивной отладки – теперь, прежде чем создавать библиотеку Arduino для какого-то нового проекта, я создаю модуль Python для MicroPython и проверяю на нём, так как таким образом уменьшается число ошибок при конвертации данных из даташита в код. В следующих статьях я обязательно расскажу и об этом подходе.

Думаю, что после следующего цикла производства я возьму себе ещё пару таких плат – или же, в крайнем случае, STM32F407 Discovery, на которую уже портировали MicroPython. Если я выберу последний вариант, то однозначно поделюсь статьёй на тему установки и настройки, а пока инструкции можно в сокращённом виде увидеть здесь . В следующий раз расскажу о стандартных возможностях MicroPython, его взаимодействии со внешним миром и написании собственных модулей для работы с устройствами.

Python для микроконтроллеров. Учимся программировать одноплатные компьютеры на языке высокого уровня

Содержание статьи

С чего все началось?

Все началось с кампании на Kickstarter. Дэмьен Джордж (Damien George), разработчик из Англии, спроектировал микроконтроллерную плату, предназначенную специально для Python. И кампания «выстрелила». Изначально была заявлена сумма в 15 тысяч фунтов стерлингов, но в результате было собрано в шесть с половиной раз больше — 97 803 фунта стерлингов.

А чем эта плата лучше?

Автор проекта приводил целый ряд преимуществ своей платформы в сравнении с Raspberry Pi и Arduino:

Мощность — MP мощнее в сравнении с микроконтроллером Arduino, здесь используются 32-разрядные ARM-процессоры типа STM32F405 (168 МГц Cortex-M4, 1 Мбайт флеш-памяти, 192 Кбайт ОЗУ).

Простота в использовании — язык MicroPython основан на Python, но несколько упрощен, для того чтобы команды по управлению датчиками и моторами можно было писать буквально в несколько строк.

Отсутствие компилятора — чтобы запустить программу на платформе MicroPython, нет необходимости устанавливать на компьютер дополнительное ПО. Плата определяется ПК как обычный USB-накопитель — стоит закинуть на него текстовый файл с кодом и перезагрузить, программа тут же начнет исполняться. Для удобства все-таки можно установить на ПК эмулятор терминала, который дает возможность вписывать элементы кода с компьютера непосредственно на платформу. Если использовать его, тебе даже не придется перезагружать плату для проверки программы, каждая строка будет тут же исполняться микроконтроллером.

Низкая стоимость — в сравнении с Raspberry Pi платформа PyBoard несколько дешевле и, как следствие, доступнее.

  • Открытая платформа — так же как и Arduino, PyBoard — открытая платформа, все схемы будут находиться в открытом доступе, что подразумевает возможность спроектировать и создать подобную плату самому в зависимости от потребностей.
  • И что, только официальная плата?

    Нет. При всех своих достоинствах PyBoard (так называется плата от разработчика MicroPython) — довольно дорогое удовольствие. Но благодаря открытой платформе на многих популярных платах уже можно запустить MicroPython, собранный специально для нее. В данный момент существуют версии:

    • для BBC micro:bit — британская разработка, позиционируется как официальное учебное пособие для уроков информатики;
    • Circuit Playground Express — разработка известной компании Adafruit. Это плата, включающая в себя светодиоды, датчики, пины и кнопки. По умолчанию программируется с помощью Microsoft MakeCode for Adafruit. Это блочный (похожий на Scratch) редактор «кода»;
    • ESP8266/ESP32 — одна из самых популярных плат для IoT-разработки. Ее можно было программировать на Arduino C и Lua. А сегодня мы попробуем установить на нее MicroPython.

    Плата ESP8266

    Подготовка к работе

    Перед тем как писать программы, нужно настроить плату, установить на нее прошивку, а также установить на компьютер необходимые программы.

    Все примеры проверялись и тестировались на следующем оборудовании:

    • плата NodeMCU ESP8266-12E;
    • драйвер моторов L293D;
    • I2C-дисплей 0,96″ 128 × 64;
    • Adafruit NeoPixel Ring 16.

    Прошивка контроллера

    Для прошивки платы нам понадобится Python. Точнее, даже не он сам, а утилита esptool, распространяемая с помощью pip. Если у тебя установлен Python (неважно, какой версии), открой терминал (командную строку) и набери:

    После установки esptool надо сделать две вещи. Первое — скачать с официального сайта версию прошивки для ESP8266. И второе — определить адрес платы при подключении к компьютеру. Самый простой способ — подключиться к компьютеру, открыть Arduino IDE и посмотреть адрес в списке портов.

    Для облегчения восприятия адрес платы в примере будет /dev/ttyUSB0 , а файл прошивки переименован в esp8266.bin и лежит на рабочем столе.

    Открываем терминал (командную строку) и переходим на рабочий стол:

    Форматируем флеш-память платы:

    Если при форматировании возникли ошибки, значит, нужно включить режим прошивки вручную. Зажимаем на плате кнопки reset и flash. Затем отпускаем reset и, не отпуская flash, пытаемся отформатироваться еще раз.

    И загружаем прошивку на плату:

    Взаимодействие с платой

    Все взаимодействие с платой может происходить несколькими способами:

    • через Serial-порт;
    • через web-интерпретатор.

    При подключении через Serial-порт пользователь в своем терминале (в своей командной строке) видит практически обычный интерпретатор Python.

    Подключение через SerialPort

    Для подключения по Serial есть разные программы. Для Windows можно использовать PuTTY или TeraTerm. Для Linux — picocom или minicom. В качестве кросс-платформенного решения можно использовать монитор порта Arduino IDE. Главное — правильно определить порт и указать скорость передачи данных 115200.

    Кроме этого, уже создано и выложено на GitHub несколько программ, облегчающих разработку, например EsPy. Кроме Serial-порта, он включает в себя редактор Python-файлов с подсветкой синтаксиса, а также файловый менеджер, позволяющий скачивать и загружать файлы на ESP.

    EsPy IDE

    Но все перечисленные способы хороши лишь тогда, когда у нас есть возможность напрямую подключиться к устройству с помощью кабеля. Но плата может быть интегрирована в какое-либо устройство, и разбирать его только для того, чтобы обновить программу, как-то неоптимально. Наверное, именно для таких случаев и был создан WebREPL. Это способ взаимодействия с платой через браузер с любого устройства, находящегося в той же локальной сети, если у платы нет статического IP, и с любого компьютера, если такой IP присутствует. Давай настроим WebREPL. Для этого необходимо, подключившись к плате, набрать

    Появится сообщение о статусе автозапуска WebREPL и вопрос, включить или выключить его автозапуск.

    После ввода q появляется сообщение о выставлении пароля доступа:

    Вводим его, а затем подтверждаем. Теперь после перезагрузки мы сможем подключиться к плате по Wi-Fi.

    Так как мы не настроили подключение платы к Wi-Fi-сети, она работает в качестве точки доступа. Имя Wi-Fi-сeти — MicroPython-******, где звездочками я заменил часть MAC-адреса. Подключаемся к ней (пароль — micropythoN ).

    Открываем WebREPL и нажимаем на Connect. После ввода пароля мы попадаем в тот же интерфейс, что и при прямом подключении. Кроме этого, в WebREPL есть интерфейс для загрузки файлов на плату и скачивания файлов на компьютер.

    WebRERL

    Среди файлов, загруженных на плату, есть стандартные:

    • boot.py — скрипт, который загружается первым при включении платы. Обычно в него вставляют функции для инициализации модулей, подключения к Wi-Fi и запуска WebREPL;
    • main.py — основной скрипт, который запускается сразу после выполнения boot.py , в него записывается основная программа.

    Начинаем разработку

    Hello world

    Принято, что первой написанной на новом языке программирования должна быть программа, выводящая Hello world. Не будем отходить от традиции и выведем это сообщение с помощью азбуки Морзе.

    Итак, что же происходит? Сначала подключаются библиотеки: стандартная Python-библиотека time и специализированная machine. Эта библиотека отвечает за взаимодействие с GPIO. Стандартный встроенный светодиод располагается на втором пине. Подключаем его и указываем, что он работает на выход. Если бы у нас был подключен какой-нибудь датчик, то мы бы указали режим работы IN.

    Следующие две функции отвечают за включение и выключение светодиода на определенный интервал времени. Наверное, интересно, почему я сначала выключаю светодиод, а потом включаю? Мне тоже очень интересно, почему сигнал для данного светодиода инвертирован. Оставим это на совести китайских сборщиков. На самом деле команда pin.off() включает светодиод, а pin.on() — отключает.

    Ну а дальше все просто: заносим в переменную Hello_world нашу строчку, записанную кодом Морзе, и, пробегаясь по ней, вызываем ту или иную функцию.

    Продолжение доступно только участникам

    Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

    Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

    Источники:

    http://habr.com/ru/post/443326/

    http://cxem.net/arduino/arduino131.php

    http://xakep.ru/2018/01/25/python-for-microcontrollers/

    http://xn--18-6kcdusowgbt1a4b.xn--p1ai/%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA-%D0%BE%D1%81%D0%B2%D0%B5%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE/

    Ссылка на основную публикацию