Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Плата разработчика MAIXDUINO для приложений AI + IoT

Обзор / Характеристики

Приложения с использованием искусственного интеллекта набирают всё большую популярность в повседневной жизни, и в разнообразных сферах профессиональной деятельности. Наиболее востребованными для большинства таких устройств являются функции машинного зрения и машинного слуха. Одним из доступных, для рядового разработчика решений, является выпускаемая компанией Seeed Studio отладочная плата Sipeed Maixduino, основанная на модуле искусственного интеллекта SiPEED M1, и модуле интернета вещей ESP32-WROOM-32. Отличительной особенностью данной платы от подобных других, является форм-фактор отладочной платы Arduino UNO, и частичная совместимость с платформой Ардуино. Частичная потому, что аппаратно она намного мощнее и более функциональнее, чем Arduino UNO, а программная реализация немного отличается от стандартного написания скетча для той же Arduino UNO, и об этом мы поговорим немного позже.

Так как плата Maixduino в первую очередь предназначена для отработки программ машинного слуха и машинного зрения, то на ней, кроме всего прочего, уже имеется цифровой микрофон с ЦАП и усилителем звука, слот для установки карты памяти, и к ней так же подключается матрица видеокамеры и жидкокристаллический экран:

Внешний вид и устройство платы MAIXDUINO

Внешний вид и устройство платы MAIXDUINO

 

Технические особенности платы MAIXDUINO

Технические особенности платы MAIXDUINO

 

В официальной технической документации так же имеется принципиальная схема отладочной платы MAIXDUINO:

Принципиальная схема платы MAIXDUINO

Принципиальная схема платы MAIXDUINO

 

Sipeed Maix-1 является готовым модулем искусственного интеллекта, имеющем в своём составе чип Kendryte K210, FLASH-память и трёхканальный DC-DC преобразователь:

Структурная схема модуля SiPEED M1

Структурная схема модуля SiPEED M1

 

Модуль сверху защищён металлической крышкой и имеет 72 вывода по всему периметру, а кроме этих выводов, по углам расположены 4 контактные площадки, 3 - для соединения с землёй, а четвёртая - для подключения антенны в версии модуля с чипом Wi-Fi, который в нашем случае отсутствует:

Внешний вид модуля SiPEED M1 Назначение выводов модуля SiPEED M1

Внешний вид и назначение выводов модуля SiPEED M1

 

В официальной технической документации так же имеется таблица с названиями каждого вывода модуля:

Таблица с названиями выводов модуля Sipeed Maix-1

Таблица с названиями выводов модуля Sipeed Maix-1

 

Сам чип Kendryte K210 представляет собой целую систему на одном кристалле, и имеет широкие возможности и богатый функционал. Система содержит в себе центральный процессор (CPU) с двумя 64-битными ядрами, и отдельными аппаратными блоками, для произведения операций с плавающей точкой (FPU) для каждого ядра. Так же для каждого ядра, имеется по два буфера памяти, отдельно для данных и для инструкций. Базовая частота процессора 400 МГц, но она может быть изменена в меньшую или большую сторону, путём настройки и установки делителей. Кроме центрального процессора, в системе имеется так же KPU - процессор искусственного интеллекта, или аппаратный ускоритель свёрточных нейронных сетей (CNN accelerator), который обеспечивает машинное зрение для распознавания лиц и объектов в режиме реального времени. Отдельно имеется звуковой процессор (APU), имеющий 8 входных каналов, и обеспечивающий машинный слух, для распознавания направления и определения характера источника звука в режиме реального времени. В системе встроена общая оперативная память, и оперативная память для блока искусственного интеллекта. Кроме всего этого, система имеет богатую периферию в виде модулей шифрования (AES и SHA256), быстрого преобразования Фурье (FFT), и различных протоколов связи, таких как DMA, DVP, OTP, JTAG, UART, SPI, I2C, I2S и другие. Подробные характеристики чипа можно посмотреть в официальной технической документации на него:

Упрощённая структурная схема чипа K210

Упрощённая структурная схема чипа K210

 

На плате MAIXDUINO, кроме основного модуля SiPEED M1, установлен так же дополнительный модуль ESP32-WROOM-32, который позволяет обеспечивать беспроводную связь по Wi-Fi и Bluetooth, для реализации функционирования интернета вещей (IoT). Данный модуль так же выполнен на печатной плате небольших размеров с защитным экраном с одной стороны. Выводы модуля (всего 38 выводов) расположены по трём краям платы, а четвёртый край занимает антенна, выполненная печатным способом. Основой модуля является чип ESP32-D0WDQ6, к которому подключена SPI флэш-память на 4 МБ и кристалл на частоту 40 МГц. Модуль так же имеет богатую периферию и широкие возможности, но в составе платы MaixDuino задействованы не все из них:

Технические характеристики модуля связи ESP32-WROOM-32

Технические характеристики модуля связи ESP32-WROOM-32

 

Расположение выводов модуля связи ESP32-WROOM-32

Расположение выводов модуля связи ESP32-WROOM-32

 

Дополнительную информацию по модулю ESP32-WROOM-32 можно посмотреть в официальной технической документации на него. Там же представлены принципиальная схема и назначение выводов модуля:

Принципиальная схема модуля связи ESP32-WROOM-32

Принципиальная схема модуля связи ESP32-WROOM-32

 

Периферийная схема модуля связи ESP32-WROOM-32

Периферийная схема модуля связи ESP32-WROOM-32

 

Назначение выводов модуля связи ESP32-WROOM-32

Назначение выводов модуля связи ESP32-WROOM-32

 

Сам чип ESP32-D0WDQ6, на котором основан модуль связи, представляет собой комбинированное решение Wi-Fi и Bluetooth с частотой 2,4 ГГц, с использованием сверхнизкого энергопотребления. В составе чипа имеется микроконтроллер с двух-ядерным 32-битным микропроцессором Xtensa® LX6, оперативной памятью 520 KB, 34 программируемыми GPIO и 12-битным АЦП. Кроме этого имеется много аппаратных интерфейсов связи, таких как SPI, I²S, I²C, UART, CAN 2.0 и IR, но из всех этих интерфейсов, на плате MaixDuino задействована малая их часть. Подробную информацию о чипе ESP32-D0WDQ6 можно посмотреть в официальной технической документации на него, где так же приведена его упрощённая структурная схема:

Блок-схема чипа ESP32-D0WDQ6

Блок-схема чипа ESP32-D0WDQ6

Заказ и распаковка

Заказывалась плата MaixDuino в интернет-магазине AliExpress, в самом начале разгара пандемии нового короно-вируса COVID-19, и из за этого товар находился в пути очень долгое время. При заказе был выбран комплект платы вместе с простой видеокамерой и жидкокристаллическим экраном. На момент написания статьи сумма заказа составляла $27.04 с учётом стоимости доставки товара:

https://aliexpress.ru/item/33035403341.html

Комплект поставки: плата разработчика с видеокамерой и экраном

 

Товар прибыл запечатанным в стандартном пакете, внутри которого находилась пластиковая коробочка с плотно упакованным содержимым, которое дополнительно было защищено пупырчатым полиэтиленом. Экран и плата завёрнуты по отдельности, что исключает как наружные, так и внутренние повреждения:

Стандартный пакет с товаром Пластиковая коробочка с содержимым

Стандартный пакет и пластиковая коробочка с товаром

 

Отдельно завёрнутый в полиэтилен экран Отдельно завёрнутая в полиэтилен плата

Отдельно завёрнутые в полиэтилен экран и плата

 

Как и на обычной отладочной плате Arduino UNO, по длинным краям платы MAIXDUINO установлены разъёмы типа "мама" с выводами питания и GPIO. Кроме этого, рядом с выводами питания, имеется ещё и дополнительный разъём для подключения громкоговорителя, за которым установлены 4 индикаторных светодиода, для индикации обмена данными платы с компьютером. Большую центральную часть платы занимает главный модуль SiPEED M1, а ближе к короткому краю платы установлен дополнительный модуль для беспроводной связи ESP32-WROOM-32, печатная антенна которого выделяется на фоне основной платы. Между модулями установлен MEMS-микрофон:

Внешний вид платы Maixduino со стороны расположения радиокомпонентов Внешний вид платы Maixduino со стороны расположения радиокомпонентов

Внешний вид платы Maixduino со стороны расположения радиокомпонентов

 

В углу платы находятся индикаторный светодиод питания, и две кнопки без фиксации - одна для произведения сброса, другая для запуска микропрограммы, которая в большинстве случаев запускается и так, без нажатия этой кнопки. Рядом с кнопками установлен разъём для подключения основного питания, за которым следует интерфейс жидкокристаллического экрана, и разъём для связи с компьютером, в качестве которого, непонятно зачем, использован USB type C, хотя плата работает через переходник с USB-C на USB-A и вполне можно было применить разъём USB-B micro. Другое дело, если бы с обеих концов кабеля был бы необходим USB-C, но это не так. Кстати, самого кабеля в комплекте нет, и его нужно приобретать отдельно. На противоположном краю платы, рядом с печатной антенной модуля связи, имеется интерфейс DVP, к которому уже была подключена видеокамера из комплекта, имеющая на себе защитную плёнку:

Внешний вид платы Maixduino со стороны интерфейса LCD Внешний вид платы Maixduino со стороны интерфейса DVP

Внешний вид платы Maixduino со стороны интерфейсов

 

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

Вид платы со стороны шелкографии

Обозначение выводов и нанесённая структурная схема платы MAIXDUINO

 

Кроме собственно платы и видеокамеры, в приобретённом комплекте имеется жидкокристаллический экран типа ST7789, с разрешением 320 X 240 пикселей, который имеет защитную плёнку и так же как и видеокамера, подключается к плате посредством плоского гибкого шлейфа:

Жидкокристаллический экран разрешением 320 X 240 пикселей Жидкокристаллический экран с плоским гибким шлейфом

Жидкокристаллический экран ST7789 для платы MAIXDUINO

 

Первое включение и быстрая проверка

Один важный момент - при подключении видеокамеры или экрана к плате, нужно обязательно обратить внимание на правильность подсоединения шлейфа устройства к разъёму на плате, так как эти разъёмы не симметричны, а подключить к ним можно как в правильном, так и в перевёрнутом состоянии, что может привести к короткому замыканию отдельных контактов, или что ещё хуже, к повреждению микросхемы того или иного устройства, и выходу его из строя. Для осуществления правильного подсоединения, как на плате, рядом возле разъёмов, так и на самом гибком шлейфе подключаемого устройства, имеется нумерация выводов, которую нужно совместить друг с другом. При том если подключение выполнено верно, то видеокамера будет смотреть в сторону, противоположную стороне с расположенными радиокомпонентами, а экран наоборот, лицевой стороной будет обращён в сторону расположения деталей. Правильное подключение можно видеть на фотографии ниже, сделанной во время первого включения платы. При этом на красном фоне отображается надпись "Welcome to MaixPy", свидетельствующая о загруженном в главный модуль платы, интерпретатора Python:

Правильное подключение видеокамеры и жидкокристаллического экрана

Первое включение платы разработчика Maixduino

Первое включение платы разработчика Maixduino

 

Что бы не повредить шлейф, да и сам экран, последний вскоре был приклеен на двухсторонний скотч, к задней стороне отладочной платы. При этом был образован небольшой зазор между экраном и платой, в целях предотвращения короткого замыкания токопроводящих участков платы задней металлической стороной экрана. При таком расположении видеокамера и экран направлены в одну сторону, и можно производить съёмку самого себя, а загнув так же и шлейф видеокамеры, можно снова направить их в противоположные стороны, снимая объекты по направлению взгляда, как фотоаппаратом:

Приклеивание двухстороннего скотча к экрану Образование зазора между экраном и платой

Приклеивание экрана к плате на двухсторонний скотч

Приклеивание экрана к плате на двухсторонний скотч

 

Прямо из коробки, на плате уже было установлено программное обеспечение (интерпретатор MaixPy) ранней версии, и был загружен демонстрационный скрипт, для вывода изображения с видеокамеры в режиме реального времени, прямо на жидкокристаллический экран. Данный скрипт запускается нажатием и удержанием кнопки "BOOT" на плате, сразу после нажатия на кнопку "RESET", находящуюся рядом. При этом контроллер перезагружается и запускает выполнение программы этого скрипта:

Запуск демонстрационного скрипта с выводом изображения видеокамеры на экран

Запуск демонстрационного скрипта с выводом изображения с видеокамеры на экран

 

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

Прежде чем перейти к написанию программ, проведём внешнее сравнение плат Maixduino и Arduino UNO. По форме и размерам они сильно схожи, немного отличается расположение разъёмов питания и USB, a по боковым разъёмам они идентичны. Правда у платы MAIXDUINO имеется незначительное отличие в боковом разъёме питания - отсутствует контакт "IOREF", служащий на плате Arduino UNO для указывания величины напряжения высокого уровня на портах ввода-вывода:

Визуальное сравнение плат Maixduino и Arduino UNO

Визуальное сравнение плат Maixduino и Arduino UNO

 

Далее будет пошагово описано, как быстро и просто можно начать работу с платой разработчика MAIXDUINO, в знакомой и доброй Arduino IDE, а так же в ещё лучшей фирменной MaixPy IDE. Первая, как уже всем известно, имеет компилятор и в память устройства загружает исполняемый код программы, а вторая позволяет писать скрипты на языке Python и запускать их прямо из среды, или загружать в память устройства, с последующей интерпретацией встроенным программным обеспечением платы.

 

Разработка программ для платы MAIXDUINO в среде Arduino

Если с физическим устройством платы всё понятно, и её технические характеристики стоят на довольно высоком уровне, то с программной частью всё не так гладко, по крайней мере в Arduino IDE. Сама плата называется MaixDuino, и на физическом уровне, по размерам и по расположению выводов, она имеет совместимость с платой Arduino UNO, но во время написания самых простых тестовых скетчей для неё, да и при загрузке некоторых скетчей из примеров её собственного ядра возникли проблемы, но обо всём по порядку. Да, для работы с платой в среде Ардуино, имеется ядро с библиотеками и примерами работы, которое нужно предварительно установить. Делается это довольно просто, стандартным и известным всем "Ардуинщикам" способом добавления поддержки новых плат в среду разработки. Для этого в среде Arduino IDE нужно перейти на вкладку "File >> Preferences >> Settings" и в поле "Additional Boards Manager URLs" добавить адрес ресурса:

http://dl.sipeed.com/MAIX/Maixduino/package_Maixduino_k210_index.json

Далее нужно открыть вкладку "Tools >> Board: >> Boards Manager..." и в поле поиска ввести и найти "Maixduino", после чего надо нажать "Install" и дождаться успешной загрузки и установки пакета для поддержки плат Sipeed Maix.

При подключении платы к компьютеру посредством переходника USB-C на USB-A, все драйверы для неё установились автоматически. Если этого не произошло, то их можно скачать с официального сайта https://www.ftdichip.com/Drivers/VCP.htm

Сначала проверку платы планировалось производить на имеющейся операционной системе Windows 8.1 X86, и в диспетчере устройств плата определилась как "USB Serial Converter A" и "USB Serial Converter B", и добавилось два порта "USB Serial Port", так как на плате установлен двойной USB-TTL UART Serial Adapter на микросхеме CH552. При этом первый порт используется для связи с главным модулем SiPEED M1, а второй для связи с модулем ESP32-WROOM-32:

USB Serial Converter и USB Serial Port

Отображение платы MaixDuino в диспетчере устройств

 

После запуска Arduino IDE, для работы с платой, на вкладке "Tools >> Board:" нужно выбрать "Sipeed Maixduino Board", указать порт в разделе "Tools >> Port:" и выбрать "k-flash" в качестве программатора в пункте "Tools >> Programmer:". Остальные пункты можно не трогать, если их значения такие, как на картинке ниже:

Установка необходимых значений для работы с платой Maixduino

Установка необходимых значений для работы с платой Maixduino

 

Если для простых плат Arduino, да и не только, на которых не имеется дополнительной периферии, первой демонстрационной программой является мигание встроенным или отдельно подключённым светодиодом, то для платы с установленным, или же просто подключённым экраном, как устройством вывода информации, хорошим началом будет заливка экрана цветом, и отображение текста с различными геометрическими фигурами. В примерах библиотеки ядра Maixduino как раз имеется подобный вариант для работы с жидкокристаллическим экраном из комплекта, и далее была произведена попытка загрузки имеющегося примера, но оказалось что используемая версия Windows не подходит для этого, о чём свидетельствует сообщение с ошибкой компиляции:

This version of %1 is not compatible with the version of Windows

This version of %1 is not compatible with the version of Windows

 

Это стало небольшой проблемой на пути освоения описываемой платы, и далее был использован ноутбук с установленной операционной системой Windows 10 x64, который пришлось иногда заимствовать на время изучения и проведения экспериментов. Так вот на компьютере с указанной операционной системой, при подключении к нему платы, драйверы так же установились без проблем, но номера портов уже оказались другими. Заострение внимания на этом факте происходит потому, что в дальнейшем, во всех программах для работы с платой, нужно будет указывать соответствующий COM-порт, и первый из них - это основной, а второй - для модуля связи. Нумерация и количество портов на Вашем устройстве может отличаться, просто нужно смотреть, какие порты появляются при подключении именно платы MAIXDUINO:

Отображение портов MaixDuino в диспетчере устройств Win10

Отображение портов MaixDuino в диспетчере устройств Win10

 

В среде Ардуино нужно произвести действия, описанные выше, после которых можно начинать работу с платой. В первую очередь, как и прежде, была проверена возможность компиляции и загрузки демонстрационного скетча работы с экраном. Компиляция исходного текста происходит не очень быстро, но загрузка занимает всего несколько секунд, после чего контроллер перезагружается и начинается выполнение программы, в данном случае отображение на экране текста и простейших фигур. Более наглядно этот процесс можно посмотреть в прикреплённом в конце статьи видеоролике:

Работа демонстрационного скетча для экрана

Работа демонстрационного скетча для экрана

 

Казалось бы всё хорошо и очень просто, но всё только начиналось. И если демонстрационный скетч для экрана скомпилировался и заработал с первого раза, то это было просто удачное совпадение, так как с другими примерами из библиотеки возникли затруднения. Да и не только с готовыми примерами, при попытке работы с Maixduino, как с обычной платой Ардуино, возникли проблемы, не оглашённые в документации ядра, о них просто умалчивается. Хотя в документации на плату имеется таблица соответствия её выводов, с выводами модулей, установленных на ней, и их функциональное назначение. Также из этой таблицы можно понять, какими выводами модули соединены друг с другом, и по какому интерфейсу связи они взаимодействуют:

Таблица назначения выводов платы`MAIXDUINO, и её отдельных модулей

Таблица назначения выводов платы`MAIXDUINO, и её отдельных модулей

 

Из таблицы видно, что все цифровые выводы платы принадлежат чипу K210, а аналоговые выводы A0 - A5 соединены с чипом ESP32. Так же модули Maix-1 и WROOM-32 имеют связь между собой через интерфейсы UART и SPI. Всё это ничего, но хотелось проверить, какова программная реализация элементарных функций портов ввода-вывода. Как известно, на обычной плате Ардуино, например на той же Arduino UNO, аналоговые выводы можно использовать как цифровые, начиная отсчёт с 14, так как обычная нумерация цифровых выводов заканчивается на 13, и по традиции к тринадцатому выводу часто подключён штатный индикаторный светодиод, которым можно помигать. На рассматриваемой плате встроенного светодиода нет, но можно помигать дополнительным, подключив его по всем правилам, с ограничительным резистором, к любому выводу платы.

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

Тестовая программа переключения уровня одновременно на всех выводах

Тестовая программа переключения уровня одновременно на всех выводах

 

Контроль производился стрелочным измерительным прибором, в виду большей инерционности цифрового, и как и ожидалось, при исполнении программы, уровень сигнала переключался на выводах платы 0 - 13, а на аналоговых выводах A0 - A5, физически подключённых к выводам чипа ESP32, никаких переключений не наблюдалось. При этом было замечено, что переключения происходили и на дополнительных выводах платы "SDA" и "SCL", a в такт переключениям мигал светодиод "TX-K210" и жидкокристаллический экран:

Контроль уровня сигнала стрелочным измерительным прибором

Контроль уровня сигнала стрелочным измерительным прибором

 

Мигание жидкокристаллического экрана и светодиода "TX-K210"

 

И столько странно ни то, что переключения уровней отсутствовали на выводах A0 - A5, а то, что экран мигал в такт переключениям, при том, что при низком уровне он включался, а при высоком выключался. Так же вёл себя и указанный светодиод, но с ним всё понятно, так как он служит для индикации передачи данных по шине UART, и подключён к выводу "1" платы.

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

Замер уровня сигнала на физическом выводе платы

Отображение значения высокого уровня на выводе 16 Отображение значения низкого уровня на выводе 16

Проверка соответствия физического вывода отображаемому

 

В ходе эксперимента с переключением уровней сигнала на выводах 0 - 19 выяснилось следующее:

  • физически выводы 0 - 13 соответствуют программным;
  • при этом низкий уровень на выводе "1" зажигает светодиод "TX-K210";
  • выводы "SDA" и "SCL" на плате, управляются номерами "14" и "15" соответственно;
  • экран отключается при подаче высокого уровня на вывод "17";
  • на выводах A0 - A5 никаких переключений не происходит.

 

На плате указано, что на все цифровые выводы, можно выводить аналоговое значение, с помощью широтно-импульсной модуляции сигнала (ШИМ или PWM - pulse-width modulation). Для совместимости с платформой Arduino, в функции analogWrite(), по умолчанию используются 8-битные значения, но функцией analogWriteResolution(), для платы Maixduino, можно устанавливать разрешение счётчика модулятора от 1 до 32 бит. Для проверки генерации сигнала на всех цифровых выводах, была написана небольшая программа, устанавливающая модулированный сигнал с разрешением 12 бит, на выводах от 0 до 15, включая выводы "SDA" и "SCL", с заполнением от 15% до 90%, таким образом увеличивая его на 5% от одного вывода к другому. На экране платы при этом, для справки, отображается информация о заполнении сигнала на соответствующих выводах:

  analogWriteResolution(12);

  byte pinNum = 0;
  int pin_level = 15;          // duty = 15%
  for (int h = 40; h < 240; h+=50) {
    for (int w = 45; w < 250; w+=65) {
      // write the level to the pin:
      analogWrite(pinNum, 4095/100*pin_level);
      lcd.fillRect(w, h, 42, 28, COLOR_BLUE);
      lcd.setCursor(w+4, h+8);
      lcd.print(pin_level);
      lcd.print("%");
      pinNum++;
      pin_level+=5;           // increase duty 5%
      }
    }

 

Генерация модулированного сигнала и отображение коэффициента заполнения

Генерация модулированного сигнала и отображение коэффициента заполнения

 

Генерация ШИМ-сигнала на выводах платы, контролировалась мультиметром Aneng AN870, обзор на который был сделан в ранней статье. К сожалению он не смог измерить коэффициент заполнения 15%, установленном на выводе "0", но это уже особенность данного измерительного прибора, хотя частота сигнала была измерена и отображалась устойчиво. Генерации почему-то не оказалось на выводах 12 - 13, и на последних выводах "SDA" и "SCL". На всех остальных, частота модулированного сигнала составила 200 кГц, а коэффициент заполнения примерно соответствовал заданному в программе:

Частота ШИМ-сигнала 200 кГц Коэффициент заполнения ШИМ-сигнала 20% Коэффициент заполнения ШИМ-сигнала 25%

Коэффициент заполнения ШИМ-сигнала 30% Коэффициент заполнения ШИМ-сигнала 35% Коэффициент заполнения ШИМ-сигнала 40%

Коэффициент заполнения ШИМ-сигнала 45% Коэффициент заполнения ШИМ-сигнала 50% Коэффициент заполнения ШИМ-сигнала 55%

Коэффициент заполнения ШИМ-сигнала 60% Коэффициент заполнения ШИМ-сигнала 65% Коэффициент заполнения ШИМ-сигнала 70%

 

Убедившись в невозможности подавать логические уровни на аналоговые выводы, и в генерации ШИМ-сигнала только на цифровых выводах 0 - 11, было решено также проверить возможность считывания логических уровней с выводов 0 - 19. Для этого так же была написана небольшая программка, с графическим отображением уровней логических сигналов на всех выводах одновременно:

Программа для проверки логических уровней на выводах

Программа для проверки логических уровней на выводах

 

Программа работает следующим образом: последовательно проверяются состояния всех выводов, и если на каких-то выводах обнаружен низкий уровень, то кружочек с номером вывода закрашивается в голубой цвет, а если уровень сигнала на выводе высокий, то происходит закрашивание в красный цвет. В программе все выводы подтянуты к высокому логическому уровню, и во время тестирования, с помощью мультиметра в режиме измерения силы тока, каждый вывод поочерёдно замыкался на общий провод, таким образом подавая на него низкий логический уровень сигнала. Так же можно видеть, что на выводе 17, отвечающем за экран, постоянно присутствует низкий уровень. Ну а подача низкого уровня на выводы A0 - A5, как и ожидалось, к сожалению ни к какому результату не привела. В видео к статье показан весь процесс тестирования и проверки цифровых входов:

Поочерёдная подача низкого уровня сигнала на все выводы

Постоянный низкий уровень сигнала на выводе 17

Графическое отображение уровня сигнала на выводах платы

 

Ну и на последок осталось попробовать определить уровень подаваемого аналогового сигнала на выводах A0 - A5, для измерения которого эти выводы как раз и предназначены. Для этого они должны работать как входы, а значение уровня сигнала на них определяется функцией analogRead(), в которую передаётся номер вывода, а сама функция возвращает данные типа int:

Текст программы измерения и вывода на экран уровня аналогового сигнала

Текст программы измерения и вывода на экран уровня аналогового сигнала

 

Но к большому разочарованию, даже и эта функция для платы Maixduino, в Arduino IDE не реализована, и она просто возвращает номер вывода, который в неё был передан. Вот такие вот сюрпризы поджидали нас в среде разработки Ардуино. Это конечно вина разработчиков ядра Maixduino, которые не учли и не реализовали возможность считывания аналоговых значений на аналоговых входах платы.

Это были элементарные стандартные функции Ардуино, и простейшие примеры для работы с ними. Если они не работают должным образом, то может быть примеры из библиотеки ядра покажут себя с хорошей стороны. И далее был испробован пример для работы с видеокамерой, который по задумке должен выводить данные с неё прямо на жидкокристаллический экран.

Пример называется "selfie" и находится в пункте "Sipeed_OV2640", но при попытке скомпилировать скетч, была выдана ошибка "cannot declare variable 'camera' to be of abstract type 'Sipeed_OV2640'". При поиске решения на страничке ядра github.com/sipeed/Maixduino выяснилось, что это ошибка в исходном тексте библиотеки, и для её устранения нужно отредактировать два файла, которые находятся в каталоге ядра:

Исходные файлы библиотеки Sipeed_OV2640 ядра Maixduino

Исходные файлы библиотеки Sipeed_OV2640 ядра Maixduino

 

В файле "Sipeed_OV2640.h", в строке 57, а в файле "Sipeed_OV2640.cpp", в строке 724, нужно изменить имя функции "setRotaion" на "setRotation". Все изменения в файлах библиотеки нужно производить текстовым редактором, корректно отображающим переход строки, таким как например Notepad++, а перед изменением рекомендуется сделать резервную копию файлов и закрыть все окна среды разработки Ардуино:

Редактирование файла "Sipeed_OV2640.h" Редактирование файла "Sipeed_OV2640.cpp"

Редактирование и корректировка файлов библиотеки "Sipeed_OV2640"

 

В файле реализации можно заметить и другие неточности, уже отмеченные как "FIXME", но после внесённых изменений скетч был успешно скомпилирован и загружен в память главного модуля платы Maixduino:

Стандартный пример работы с видеокамерой ядра Maixduino

Стандартный пример работы с видеокамерой ядра Maixduino

 

Но после перезагрузки и запуска программы на устройстве, экран попросту оказался залитым красным цветом без какого-либо намёка на изображение, а если дотронуться до камеры рукой, то на экране начинают отображаться помехи, будто где-то нарушен контакт, и какой-то сигнал проходит с искажениями. При этом в мониторе последовательного порта происходит оповещение об успешной инициализации модуля камеры, за которым следуют сообщения "snap fail", означающие неудачный захват кадра:

Заливка экрана красным цветом при запуске Отображение помех после касания модуля камеры пальцем

Просмотр событий в мониторе последовательного порта

Запуск и неправильная работа примера библиотеки Sipeed OV2640

 

Не нужно пугаться, это не поломка видеокамеры или неправильное её подключение. Выяснилось, что в комплекте с платой Maixduino идёт одиночная видеокамера GC0328, а библиотека Sipeed, хотя и может определять и инициализировать её, но рассчитана она именно на работу с видеокамерой OV2640. Существует два выхода - или отдельно покупать камеру OV2640, или писать библиотеку для GC0328. И оказывается один добрый человек уже сделал это, и выложим исходный код в свободном доступе по адресу github.com/fukuen/Maixduino_GC0328

В библиотеке нет примера работы, но можно немного изменить пример "Sipeed OV2640" и использовать его. Нами же был добавлен изменённый пример, и готовую библиотеку Maixduino_GC0328 с ним можно скачать и сразу использовать, просто добавив её в среду разработки через менеджер библиотек. После этого в примерах появится пункт "Maixduino_GC0328 >> selfie", в котором все значения Sipeed_OV2640 заменены на Maixduino_GC0328:

Пример работы с видеокамерой GC0328 через плату Maixduino

 

После успешного запуска программы, на экран было выведено изображение с модуля камеры, в режиме реального времени. Изображение получилось довольно чёткое и насыщенное, но к сожалению видеокамера, которой производилась съёмка платы, не смогла полностью передать реальную картину, хотя во время съёмки и было применено освещение такой же цветовой температуры, что и у излучения экрана, а баланс белого и экспозиция были настроены на это излучение, при отображении на экране белого полотна стола. Снятое видео можно посмотреть в самом конце статьи:

Демонстрация работы видеокамеры GC0328 с платой Maixduino

Демонстрация работы видеокамеры GC0328 с платой Maixduino

 

Для полноты картины, кроме всего прочего, остаётся проверить работу модуля связи ESP32, а точнее работу платы с этим модулем, так как отдельная работа этого модуля другая тема, а вот как он будет отвечать на команды от главного модуля - это уже вопрос. В библиотеке ядра имеются примеры для работы с Wi-Fi, но ни один пример не дал положительного результата, и во всех случаях модуль связи не отвечал на запросы от главного контроллера.

Тогда, что бы исключить влияние физических факторов на программные, было решено проверить модуль связи отдельно, для чего был взят пример из библиотеки ESP32, которую предварительно нужно установить вместе с ядром ESP32. Как это сделать, было рассмотрено в статье про M5StickC. В настройках нужно выбрать плату "FireBeetle-ESP32" и указать второй COM-порт, который был назначен во время установки драйвера. Данная плата подходит для выбора, так как на ней установлен такой же модуль "ESP32-WROOM-32", и с ним можно работать так же, как и на плате Maixduino:

Установка параметров для модуля связи ESP32-WROOM-32

Установка параметров для модуля связи ESP32-WROOM-32

 

Напоминаю, что это не работа с модулем ESP32 через плату Maixduino, а прямое обращение к нему в обход главного модуля Maix-1. После запуска программа циклически производит сканирование эфира на наличие Wi-Fi сетей, и в мониторе последовательного порта отображает идентификаторы доступных, и их уровень сигнала в децибелах:

Демонстрация работы примера из библиотеки ESP32

Демонстрация работы примера из библиотеки ESP32

 

Получается что сам модуль связи ESP32-WROOM-32 работоспособен, но с ним не получилось связаться через модуль SiPEED-M1, и к моменту написания статьи, на страничке ядра Maixduino было много вопросов на этот счёт, но не предлагалось никакого простого рабочего решения этой проблемы. Кроме упомянутой и испробованной периферии, на плате Maixduino ещё имеется и микрофон, но для него, к этому моменту, так-же не существовало никакого примера под среду Ардуино.

Для расширения объёма памяти, на плате имеется простейший слот, в который можно установить карту памяти типа MicroSD, предварительно отформатированную под файловую систему FAT. На операционной системе Windows это делается следующим образом:

  • карта памяти, через подходящий переходник, подключается к компьютеру;
  • в проводнике, на подключённом диске, правой кнопкой выбирается пункт "Format...";
  • в открывшемся маленьком окне, в разделе "File system", выбирается "FAT";
  • размер кластера лучше выбирать минимально возможный, так как он хорошо подходит для небольших файлов;
  • в поле ввода можно указать желаемое имя/название будущего диска;
  • так как объём памяти используемого диска небольшой, то было выбрано полное форматирование;
  • в конце нажимаем кнопку "Start", подтверждаем удаление всех данных на диске и ждём завершения процесса;
  • после успешного форматирования будет выведено соответствующее сообщение:

Параметры форматирования карты памяти Отформатированная под систему FAT карта памяти

Как отформатировать карту памяти, для использования на плате MAIXDUINO


Теперь карту памяти можно вставить в слот на плате Maixduino и использовать по назначению в случае необходимости. В ходе тестирования и экспериментов была использована карта памяти объёмом 1 ГБ. Карты памяти с объёмом больше 4 ГБ могут не форматироваться под файловую систему FAT. В таком случае понадобится произвести процедуру урезания объёма памяти, с помощью встроенной в Windows утилиты DISKPART, или с помощью сторонних программ. На самой плате карта устанавливается без особых усилий, контактами вниз, в предназначенный для неё слот возле разъёма видеокамеры. Предварительно на неё был записан сконвертированный видеоролик-интро канала "Паяльник TV", который нам пригодится в дальнейшем для воспроизведения на экране платы. Во время конвертирования был выбран формат файла ".AVI" с разрешением в 320х240 пикселей.

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

Установленная в слот карта памяти MicroSD Приклеенный на двухсторонний скотч модуль видеокамеры

Установленная в слот карта памяти и приклеенный к ней модуль видеокамеры

Article2

Обновление встроенного программного обеспечения

Для того, что бы писать и загружать программы (скрипты) через фирменную среду разработки, на главный модуль необходимо установить микропрограмму - интерпретатор языка MicroPython, которая называется MaixPy. Рекомендуется устанавливать последнюю версию, и постоянно обновлять её, так как в противном случае среда разработки не сможет работать с Вашей платой.

Так же следует установить встроенное программное обеспечение на модуль связи, если оно по каким-то причинам не установлено, или обновить его, если имеются проблемы при работе с Wi-Fi или Bluetooth. Нам его нужно устанавливать в любом случае, так как мы проверяли работу модуля связи напрямую, через загрузку в него скетча Ардуино, н поэтому имеющаяся микропрограмма была перезаписана исполняемым кодом указанного скетча.

Для загрузки прошивки в модуль ESP32 была использована программа "Flash download tools" версии 3.6.6, а последняя версия самой прошивки была скачана по адресу github.com/sipeed/Maixduino_esp32_fimware/releases. На момент написания статьи последней была версия "maixduino_esp32_firmware_v1.4.1_0x0.bin". Готовую прошивку  в память модуля можно так же загрузить программой "esptool". 

Запустив программу "Flash download tools", нужно выбрать "ESP32 DownloadTool", после чего откроется окно, для загрузки исполняемого кода программы в память модуля. В этом окне нужно выбрать файл прошивки и указать адрес, с которого должна быть произведена запись. В данном случае, для используемой прошивки, начальным адресом является 0x0. Программа позволяет одновременно записывать несколько файлов, но так как наша прошивка состоит только из одного, то флажок нужно установить только перед ним. Далее частоту кристалла нужно указать 40 МГц, режим памяти - QIO, а её размер 32 Мбит (4 Мбайт). Так же нужно выбрать используемый COM-порт (следующий после порта главного модуля), и задать скорость передачи данных 115200 бод. Начало процесса записи осуществляется нажатием на кнопку "START", статус которого отображается на ярком зелёном фоне, а прогресс - на полосе в самой нижней части программы. Если во время записи возникнут ошибки, можно попробовать предварительно очистить память, нажав кнопку "ERASE", и дождавшись окончания процесса стирания:

Начальное окно выбора типа системы Окно программы ESP32 DownloadTool

Правильная установка параметров в программе Flash download tools

 

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

Ведение учёта происходящих событий в программе Flash download tools

Ведение учёта происходящих событий в программе Flash download tools

 

Для работы платы со средой MaixPy IDE, на главном модуле нужно установить интерпретатор скриптового языка MicroPython, который так и называется - MaixPy. Для этого нужно скачать программу-установщик "kFlash GUI" с официальной страницы github.com/sipeed/kflash_gui/releases и собственно сам интерпретатор, на странице dl.sipeed.com/MAIX/MaixPy/release

Рекомендуется скачивать последнюю версию интерпретатора, так как более ранняя версия может не работать с новой версией среды разработки. Собственно сама прошивка имеет расширение ".bin", и в каждой версии имеется несколько вариантов, и на начальном этапе, что бы избежать потерю некоего функционала, лучше скачивать и устанавливать полный пакет. Для примера, прошивка с добавлением суффикса "_minimum" является урезанной, и от её установки лучше пока воздержаться, а установить вариант без суффиксов. Кроме прошивки, для скачивания бывает доступно несколько дополнительных файлов. Файл "elf" в нормальной работе не участвует, и используется только для отладки. а к примеру файл "face_model_at_0x300000" является моделью лица, загружаемой по адресу 0x300000.

Программа kflash_gui является кроссплатформенной, и может работать на таких системах, как Windows, Linux, MacOS или даже Raspberry Pi. Мы же используем ОС Windows 10, и для работы с программой, нужно распаковать архив с ней в удобное место, и запустить файл "kflash_gui.exe". Программа имеет простой и понятный интерфейс, и в ней несложно разобраться. Перед непосредственно прошивкой, хорошо бы полностью очистить память модуля, и для этого в правом верхнем углу выбираем "Erase", а в разделе "Mode" - "Chip erase". Далее так же нужно выбрать тип прошиваемой платы, и указать параметры соединения, как на картинке ниже. После этого нажимаем кнопку "Erase" и ждём завершения процедуры полного стирания памяти. При успешном завершении должно появиться сообщение "Erase success", и произойти перезагрузка модуля:

Установка параметров для полной очистки памяти Завершение процесса полного стирания памяти

Как произвести полную очистку памяти главного модуля Maixduino

 

Для записи данных в память, в правом верхнем углу нужно выбрать "Firmware" и указать файл прошивки. Можно выбрать несколько файлов для загрузки в память, и указать адрес в пространстве для каждого из них. Это может быть исходный код интерпретатора, с добавлением различных готовых обученных моделей. Из нескольких файлов можно собрать единый пакет с расширением ".kfpkg", и в дальнейшем всё загружать одним файлом, без указания адресов каждый раз. На странице проекта dl.sipeed.com/MAIX/MaixPy/release/maixpy_v0.3.0 как раз имеется такой демонстрационный пакет вместе с необходимыми скриптами. После выбора этого пакета, нужно нажать кнопку "Download", и начнётся загрузка интерпретатора и всех имеющихся моделей в память модуля:

Выбор пакета и указание параметров загрузки Загрузка пакета в память главного модуля

Как одним файлом загрузить прошивку и модели в память главного модуля Maixduino

 

Но так как загруженный пакет содержит в себе интерпретатор более ранней версии, то последняя версия MaixPy IDE не будет работать с платой, и поэтому версию встроенного программного обеспечения необходимо так же обновить. Можно произвести обновление прошивки сразу, после загрузки пакета, но во избежание ошибок всё же лучше предварительно удалить исполняемый код старой версии. Для этого в программе "kflash_gui" снова выбираем "Erase", а в разделе "Mode" уже "Partial erase", для частичной очистки области памяти, которую можно указать вручную, или выбрать в разделе "Load Template" указав "MaixPy FS" и нажав кнопку "Load", после чего будет выбрана необходимая область памяти, размеров в 3 MB. Далее, как и прежде нажимаем кнопку "Erase", но теперь уже будет очищена область памяти, отведённая под исполняемый код интерпретатора, оставив ранее загруженные модели в памяти контроллера:

Установка параметров для очистки области памяти Завершение процесса частичного стирания памяти

Как очистить определённую область памяти главного модуля Maixduino

 

Для обновления встроенного программного обеспечения платы Maixduino, был выбран полный вариант одной из последних версий прошивки, которую обычным способом нужно указать с нулевого адреса памяти. Все остальные действия остаются прежними, которые были описаны немного ранее, при загрузке демонстрационного пакета. Только теперь в память будет записан всего лишь один файл, а сама запись произойдёт намного быстрее. Вообще загрузка данных в память главного модуля происходит so скоростью 49 kiB/s, и занимает время не более одной минуты:

Выбор прошивки и указание параметров загрузки Завершение процесса загрузки прошивки в память главного модуля

Как обновить встроенное программное обеспечение главного модуля Maixduino

 

После успешного завершения всех необходимых действий, и обновления прошивки главного модуля платы Maixduino, вместе с загруженными в память различными демонстрационными моделями, можно перейти к написанию собственных, или загрузке готовых скриптов посредством терминала, или среды разработки MaixPy IDE. При включении же самой платы, на экране, на красном фоне, отображается приветствие и версия встроенного интерпретатора:

Первый запуск платы с обновлённой версией встроенного интерпретатора

Первый запуск платы с обновлённой версией прошивки

 

Разработка программ для платы MAIXDUINO в среде MaixPy IDE

По сравнению со средой разработки Arduino, среда MaixPy IDE представляет намного больший интерес, как в плане программного функционала, так и в плане поддержки и готовых рабочих примеров. После установки интерпретатора MaixPy, на плату можно загружать исполняемые скрипты, которые не нужно компилировать. Среда разработки намного упрощает процесс написания и загрузки этих скриптов. Так же можно производить некоторые дополнительные действия и операции, такие как загрузку файлов, или просмотр и анализ изображения с видеокамеры. Скачать последнюю версию среды разработки можно по адресу dl.sipeed.com/MAIX/MaixPy/ide/ где имеются варианты под все популярные операционные системы. Единственное, что среда разработки не работает на 32-разрядных системах, и для тестирования был использован вариант для Windows, установленный на операционной системе Windows 10 x64.

При первом запуске MaixPy IDE, в левом поле редактора исходного кода, сразу открывается ознакомительный скрипт helloworld_1.py, где в самом начале, в комментариях, описано что нужно сделать, для проверки этого скрипта с имеющейся платой. Очень удобно, что во время работы в среде, при наведении курсора на текст какого-либо модуля или функции, появляется всплывающая подсказка о назначении и синтаксисе работы с ними:

Первый запуск среды разработки MaixPy IDE Всплывающая подсказка о назначении и синтаксисе модуля sensor

Первый запуск и ознакомление со средой разработки MaixPy IDE

 

Перед подключением к плате и началом работы с ней, через меню в верхней части окна программы, нужно открыть раздел "Tools >> Select Board", и указать тип своей платы, "Sipeed Maixduino" в нашем случае:

Выбор платы через раздел "Tools > Select Board"

Выбор используемой платы через раздел "Tools >> Select Board"

 

Слева от редактора кода, имеется основная панель для работы с платой, где для связи с ней нужно нажать пока ещё зелёную кнопку "Connect", имеющую вид цепи из двух колец-звеньев. Далее будет предложено указать COM-порт главного модуля платы. Плата при этом уже должна быть подключено к компьютеру посредством кабеля USB. После этого начнётся процесс подключения программы к плате, и при успешном подключении зелёная кнопка "Connect", сменится красной кнопкой "Disconnect" завершения сеанса связи с платой, в виде перечёркнутого звена цепи, а в нижней строке статуса отобразится версия установленного на плате интерпретатора:

Зелёная кнопка "Connect" для связи с платой Выбор COM-порта главного модуля платы

Процесс подключения к плате Красная кнопка "Disconnect" для завершения сеанса связи

Как подключиться к плате Maixduino из программы MaixPy IDE

 

Теперь, как установилась связь с платой, становится возможным прямой запуск написанных скриптов, или их загрузка в программную память контроллера, для дальнейшего автономного исполнения, на что указывает ставшая активной, и принявшая зелёный цвет круглая кнопка "Start" с треугольником по центру:

Активное состояние подключения и связь с платой Maixduino

Активное состояние подключения и связь с платой Maixduino

 

Если нажать эту кнопку "Start", то начнётся выполнение открытого скрипта, а вместо неё появится красная кнопка "Stop" с крестом посередине, нажав на которую, можно остановить выполнение запущенной программы. В данном случае происходит работа скрипта helloworld_1.py, который выводит изображение с видеокамеры, прямо на жидкокристаллический экран. Так же появляется гистограмма изображения в правой части окна среды разработки, и само изображение в области "Frame Buffer", прямо над гистограммой. Если при этом нажать кнопку "Record", находящуюся в правом углу над окном изображения, то начнётся запись видеофайла в контейнер ".mp4", которую в дальнейшем можно сохранить на компьютер. Из полезной информации, отображается продолжительность захваченного видео, его размер, и текущая частота кадров, а цветовую модель гистограммы можно устанавливать RGB, CMYK и другие:

Работа скрипта helloworld_1.py и вывод изображения с видеокамеры Работа скрипта helloworld_1.py и запись видео с камеры

Работа скрипта helloworld_1.py и вывод изображения с видеокамеры

 

Кроме прямого запуска скрипта из под среды разработки, его так же можно сохранить в программной памяти главного модуля платы, что бы в дальнейшем автономно производить его запуск, без подключения к MaixPy IDE. Для этого из навигационного меню нужно войти в раздел "Tools" и выбрать пункт "Save open script to board(boot.py)", после чего, для уменьшения размера конечного файла, будет предложено удалить комментарии и конвертировать пробелы. Согласившись начнётся процесс отправки скрипта, после успешного завершения которого будет выведено соответствующее сообщение и скрипт в памяти контроллера сохранится под именем "boot.py", который будет автоматически запускаться при каждом включении платы. Для запуска в автономном режиме, нужно разорвать связь с платой, нажав кнопку "Disconnect" и отключить её от компьютера, подав питание от отдельного источника. На экране платы, в режиме реального времени, будет отображаться захваченная картинка с модуля видеокамеры. Записанное камерой платы видео, вставлено в видеоролик к статье:

Выбор пункта "Save open script to board(boot.py)" в разделе "Tools" Предложение удалить комментарии и конвертировать пробелы

Процесс загрузки скрипта в программную память контроллера Сообщение об успешном завершении процесса загрузки скрипта

Как из MaixPy IDE загрузить написанный скрипт на плату Maixduino

 

Работа скрипта в автономном режиме без подключения к компьютеру

Работа скрипта в автономном режиме без подключения к компьютеру

 

В среде разработки одновременно можно работать с несколькими скриптами, открывая другой, не закрыв активный. Для примера и демонстрации работы машинного зрения, был открыт скрипт, идущий вместе с версией прошивки "maixpy_v0.3.0". В левой верхней части области редактора, в выпадающем списке, можно видеть перечень открытых документов, среди которых значится и только что открытый скрипт "03_facedetect.py", примера определения лица (не путать с опознаванием), для работы которого, в область памяти контроллера, предварительно должна быть загружена соответствующая модель "facedetect.kmodel" по адресу 0x00280000, которую мы уже загрузили ранее, вместе с указанной версией прошивки. Если запустить выполнение данного скрипта, то программа будет определять черты лица на изображении, и обводить его прямоугольной рамкой. Всё это, как и прежде, выводится на жидкокристаллический экран, и на область кадрового буфера в самой среде разработки. Так же можно наблюдать цветовую гистограмму под этой областью:

Открывание демонстрационного скрипта 03_facedetect.py Демонстрация работы программы определения лица в MaixPy IDE

Демонстрация работы программы определения лица в MaixPy IDE

 

Но до этого, при первом запуске программы, оказалось, что изображение отображается перевёрнутым. По задумке разработчика, это видимо сделано для определённых типов плат, где конструктивно видеокамера устанавливается в перевёрнутом положении, чтобы корректно отображать картинку при съёмке. Но так как в нашем случае это не так, то эта функция была отключена. Она задаётся прямо в тексте скрипта, в седьмой строчке, установкой "sensor.set_vflip(1)", и для её отключения нужно передать значение "0". Так же, на время съёмок, была добавлена функция "sensor.set_hmirror(1)", задающая зеркальное отражение изображения, так как в таком виде легче было производить съёмку самого себя от первого лица. Во время редактирования скрипта, номера изменённых строк, выделяются красной чертой, а после сохранения изменений, она заменяется на зелёную. Так же, как и прежде, при наведении курсора на функцию, всплывают подсказки по её назначению с примером использования:

Отключение функции sensor.set_vflip Включение функции sensor.set_hmirror

Как отключить переворот и установить зеркальное отображение изображения

 

Кроме запуска из среды MaixPy IDE, программу определения лица так же можно загрузить на плату и запускать её автономно. При этом качество изображения на жидкокристаллическом экране оказалось даже выше, а алгоритм определения лица работал намного лучше. Так лицо определялось при закрывании рукой глаза, рта, или другой небольшой части лица. Видеокамера, которой производилась съёмка, не очень хорошо передала реальную картину, но результат можно свободно наблюдать и сделать свои выводы по поводу работы алгоритма. Ну а для лучшего понимания, снятое видео можно посмотреть в конце статьи:

Демонстрация работы алгоритма определения контуров лица

Демонстрация работы алгоритма определения контуров лица

 

Далее был испробован ещё один пример из области машинного зрения, называющийся "20class_detect.py", который, по загруженной в область памяти "0x300000", обученной модели "20class.kmodel", может определять различные объекты, такие как велосипед, стул, собаку, кошку и другие - всего 20 объектов.

Для исследования, с интернета были скачаны фотографии всех 20 объектов, а некоторые в нескольких вариантах, с различными позициями. При наведении видеокамеры на экран с картинками, происходит определение объекта, и заключение его в прямоугольную рамку с обозначением вероятности совпадения. Некоторые предметы опознаются хорошо, с большой долей вероятности, а некоторые и вовсе были спутаны с другими. Например на лошадь и овцу иногда писалось, что это собака, а человек с расправленными руками определялся как аэроплан. Собака вообще определялась лучше всех, и в положении стоя, и сидя, и даже только мордочка. Опознавание происходило и предметов во множественном числе, и каждый экземпляр заключался в свою рамку. Полное видео определения всех имеющихся объектов находится в конце статьи:

Определение единственного объекта Определение множественных объектов

Демонстрация работы алгоритма определения различных объектов

 

И наконец в работе был испробован ещё один скрипт машинного зрения, который показал себя с весьма хорошей стороны. Скрипт обрабатывает изображение с видеокамеры, и определяет на нём QR-код, информацию с которого отображает на экране и в окне терминала среды разработки. Для проверки работы данного скрипта, был сгенерирован и распечатан QR-код с адресом сайта "Паяльник".

Примечательной особенностью работы скрипта является то, что код корректно определяется с любой позиции и расстояния, главное что бы его было хорошо видно в кадре. Во время проверки, лист с напечатанным кодом постепенно поворачивался на 180° вокруг своей оси, но это никак не влияло на определение зашифрованной информации, хотя то же самое была задумано проверить на современном смартфоне, но он отказался определять код, пока тот не принял правильное положение. Так что верное определение сильно порадовало, так как не всегда имеется возможность знать верх и низ наклеенного на какой-либо предмет кода, а здесь можно сканировать как угодно. Это хорошо видно в снятом и прикреплённом видеоматериале:

Скрипт определения QR-кода и расшифровки информации с него

Определение QR-кода в одной из позиций Определение QR-кода в другой позиции

Определение и расшифровка одного и того же QR-кода в различных позициях

 

Теперь настало время использовать записанный ранее на карту памяти видеофайл и попытаться воспроизвести его, выведя изображение на жидкокристаллический экран. Для этого, в демонстрационном скрипте проигрывания видео, нужно всего лишь указать имя файла в строке 31. Воспроизведение происходит один раз, после запуска скрипта, по завершению которого, на экран выводится красная заставка интерпретатора. Во время воспроизведения, картинка на экране отображается замедленно, а сопровождающий звук воспроизводился прерывисто и с дефектами, как будто не хватает скорости чтения или обработки. Для прослушивания звука был применён миниатюрный громкоговоритель со своим разъёмом, от старого телефонного аппарата. Разъём не подошёл, но его шаг оказался таким же, и на время воспроизведения он просто прикладывался к разъёму на плате. Всё это можно увидеть и услышать в прилагаемом видео-обзоре в конце статьи, ну а на фото ниже видно последний кадр проигрываемого видеофайла на экране платы:

Скрипт воспроизведения видеофайла с карты памяти

Последний кадр проигрываемого видеофайла на экране платы Подключение миниатюрного громкоговорителя к звуковому выходу платы

Воспроизведение видеофайла со звуком с карты памяти на экране платы MAIXDUINO

 

Для проверки встроенного микрофона платы, был взят скрипт из стандартных примеров, который производит запись звукового файла на карту памяти. В скрипте можно указать частоту дискретизации и продолжительность записи, но самой приемлемой оказалась установленная по умолчанию частота 16000 Гц, при которой запись производится без дефектов и искажений. На более низкой частоте теряется высокочастотный спектр сигнала, а на более высокой - такое ощущение, будто не хватает скорости обработки информации, и запись происходит прерывисто, с потерей участков звуковой информации, хотя конечная продолжительность соответствует установленной. Сам микрофон, как видно, работает нормально, а записи на различных частотах дискретизации можно послушать в прикреплённом файле. Так же тестовая звуковая запись вставлена в видео к статье. Единственное, что в настройках скрипта задана двухканальная, стерео запись звука, но в записанном файле почему-то присутствует только один, левый канал:

Скрипт для записи звука со встроенного микрофона платы на карту памяти

Записанный звуковой файл с частотой дискретизации 16000 Гц

Запись звука со встроенного микрофона платы MAIXDUINO на карту памяти MicroSD

 

Для полной проверки всех периферийных устройств, имеющихся на плате MAIXDUINO, остаётся протестировать модуль связи ESP-32, который нам никак не удалось задействовать в среде разработки Arduino. Для устройства Bluetooth этого модуля, здесь так же не нашлось рабочего скрипта, но для устройства Wi-Fi имеется несколько примеров работы, и один из них был успешно использован нами.

Скрипт очень простой, но главное, что он показывает работоспособность модуля связи. При его запуске, происходит сканирование эфира на точки доступа, и в окне терминала среды разработки MaixPy IDE, отображается информация о доступных в поле досягаемости устройства, такая как идентификатор и тип шифрования:

Сканирование эфира и отображение информации о доступных точках доступа Wi-Fi

Сканирование эфира и отображение информации о доступных точках доступа Wi-Fi

 

К модулю ESP-32, так же относятся аналоговые входы, вместе с вычислением значений на них. Они имеют разрешение 12 бит (интервал 0 - 4095), а в качестве опорного - используется напряжение 3,3 В (измеряемые значения 0 - 3,3 В). Всего на плате MAIXDUINO шесть аналоговых входов (A0 - A5), и функция обращения к ним возвращает список значений на всех одновременно. Далее эти значения можно выводить вместе строкой, или выбирать одно необходимое из списка.

Для демонстрации был переписан стандартный скрипт примера работы с аналогово-цифровым преобразователем. В него была добавлена функция изъятия значения по индексу, а так как планировалось производить измерения, на последнем по счёту, аналоговом входе A5, то значение индекса было взято "-1" (в языке Python можно использовать отрицательный индекс). Далее полученное значение пересчитывается в напряжение и округляется до одного знака после десятичной точки, а полученный результат выводится в окно терминала среды разработки и на жидкокристаллический экран платы. На картинке ниже можно видеть процесс измерения ЭДС одного электрохимического элемента питания типа AAA:

Скрипт измерения значения напряжения на аналоговом входе A5

Отображение значения напряжения на аналоговом входе A5
Как произвести измерение аналогового значения на входе A5 платы MAIXDUINO

 

Мы прошли долгий и довольно сложный путь детального ознакомления с недорогой и доступной платой для разработки устройств искусственного интеллекта и/или интернета вещей. Главное её преимущество - это аппаратная поддержка необходимых вычислений, без которых немыслима нормальная обработка звуковой и графической информации в режиме реального времени.

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

Всё это конечно занимает много времени и нужно запастись терпением. Автором была сделана попытка представить плату и её возможности наиболее наглядно, а далее каждый сам должен решить для себя, нужно ему это или нет. Кто-то может открыть для себя новый интерес и в будущем даже внести собственный вклад в развитие технологий искусственного интеллекта, набирающие всё большую популярность и необходимость.

 

Полезные ссылки и дополнительные материалы:

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
USB-реле (2 канала) МиниПК MK809V - 4 ядра, Android 4.4.2
вверх