Начало работы с платой Maixduino на базе Sipeed M1 и Grove AI HAT для Raspberry Pi


В прошлом году был выпущен процессор Kendryte K210 с ядром RISC-V и с ускорителями искусственного интеллекта для машинного зрения и слуха. Вскоре после этого был запущен модуль Sipeed M1 с процессором за 10 долларов.

Затем, в том же году, появились платы для разработки с модулем Sipeed M1, такие как Maixduino или Grove AI Hat. Компания Seeed Studio прислала нам последние две платы для обзора. Итак, начнем с того, что покажем полученные устройства, а затем рассмотрим, как начать работу с кодами MicroPython и Arduino. Обратите внимание, что мы будем использовать Ubuntu 18.04, но также возможна разработка с Windows.

Распаковка

Мы получили две коробки — одна с комплектом Maixduino и другая «Grove AI HAT для граничных вычислений».

Grove AI HAT для граничных вычислений

Начнем со второго. Плата представляет собой Raspberry Pi HAT с модулем Sipeed M1, 40-контактным разъемом Raspberry Pi, 6-ью разъемами Grove, а также разъемами для камеры и дисплея. Порт USB-C используется для программирования и питания в автономном режиме.

Есть также разъемы для платы, во время распаковки их не видно. 

На нижней стороне нет ничего, кроме нумерации выводов ввода-вывода и места крепления камеры.

Позже мы также получили камеру для платы.

Комплект Maixduino

Вторая коробка включает в себя плату, совместимую с Maixduino Arduino, с модулем Sipeed M1 и модулем ESP32. Камера уже подключена к плате, и 2,4-дюймовый цветной дисплей (разрешение QVGA) также является частью комплекта.

На нижней стороне платы находится подписи-названия выводов разъемов, а также изображение блок-схемы платы.

Начало работы с Maixduino Kit с использованием MicroPython

Начнем с Maixduino, попробуем следовать инструкциям из Вики и других Интернета-ресурсов, поскольку иногда он бывает неполным или неточным.

Существует 4 метода разработки/SDK :

  • MaixPy (MicroPython)
  • Maxduino (Arduino)
  • Kendryte SDK, официальный SDK Kanji, предоставляющий базовый API
  • RT_Thread — поддержка RT-Thread

Мы будем использовать первый. 

Но, сначала давайте подключим кабель USB тип C и посмотрим, что произойдет.

Появляется приветствие «Welcome to MaixPy», написанное на красном фоне.

Обновление прошивки

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

Мы просто используем последнюю доступную версию.

	
 wget   - r   -- no - parent   http : / / dl .sipeed .com / MAIX / MaixPy / release / master / maixpy_v0 . 4.0_39_g083e0cc / 

В каталоге четыре файла:

  • elf_maixpy_v0.4.0_39_g083e0cc.7z — файл elf, используется для отладки при сбое
  • maixpy_v0.4.0_39_g083e0cc_m5stickv.bin — для AI-камеры M5Stack M5StickV
  • maixpy_v0.4.0_39_g083e0cc_minimum.bin — минимальный набор прошивок MaixPy, не поддерживаемый IDE MaixPy, не содержит алгоритмы, связанные с OpenMV
  • maixpy_v0.4.0_39_g083e0cc.bin — полная версия прошивки MaixPy (MicroPython + API OpenMV + встроенная среда графического интерфейса LittlevGL)

Используем их позже, но прежде чем двинуться дальше, самостоятельно добавим  dialout и установим некоторые правила udev, чтобы иметь доступ к / dev / ttyUSB? как обычный пользователь:

sudo usermod -a -G dialout $(whoami)

Создаем файл /etc/udev/rules.d/50-usbuart.rules со следующей строкой:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666"

Теперь загружаем последнюю версию программы kflash_gui для вашей операционной системы (Linux или Windows). Мы получили версию 1.5.3, распаковали ее и запустили:

tar xvf kflash_gui_v1.5.3_linux.tar.xz 
cd kflash_gui
./kflash_gui

Теперь мы можем открыть файл прошивки, выбрать Sipeed Maixduino, а также последовательный порт. Для этого заглянем в журнал ядра (dmesg), чтобы узнать:

[ 8446.580336] usb 1-2.4: new full-speed USB device number 11 using xhci_hcd
[ 8448.559536] usb 1-2.4: New USB device found, idVendor=0403, idProduct=6010, bcdDevice= 5.00
[ 8448.559540] usb 1-2.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 8448.559542] usb 1-2.4: Product: Sipeed-Debug
[ 8448.559545] usb 1-2.4: Manufacturer: Kongou Hikari
[ 8448.559546] usb 1-2.4: SerialNumber: 414E10D04D
[ 8449.173986] usbcore: registered new interface driver usbserial_generic
[ 8449.174005] usbserial: USB Serial support registered for generic
[ 8449.187366] usbcore: registered new interface driver ftdi_sio
[ 8449.187376] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 8449.187447] ftdi_sio 1-2.4:1.0: FTDI USB Serial Device converter detected
[ 8449.187473] usb 1-2.4: Detected FT2232C
[ 8449.582711] usb 1-2.4: FTDI USB Serial Device converter now attached to ttyUSB0
[ 8449.582772] ftdi_sio 1-2.4:1.1: FTDI USB Serial Device converter detected
[ 8449.582840] usb 1-2.4: Detected FT2232C
[ 8450.094673] usb 1-2.4: FTDI USB Serial Device converter now attached to ttyUSB1

Мы мельком просмотрели и заметили только последнюю строку с ttyUSB1, где имеются некоторые ошибки …

Попытаемся проделать тоже самое с помощью утилиты командной строки Python, и те же результаты:

jaufranc@CNX-LAPTOP-4:~/edev/Kendryte/kflash_gui/kflash_py$ ./kflash.py -b 1500000 -p /dev/ttyUSB1 -B goE ../../dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.4.0_39_g083e0cc/maixpy_v0.4.0_39_g083e0cc.bin
[INFO] COM Port Selected Manually:  /dev/ttyUSB1 
[INFO] Default baudrate is 115200 , later it may be changed to the value you set. 
[INFO] Trying to Enter the ISP Mode... 
**
Greeting fail, check serial port (Attempting to use a port that is not open)

Мы задали вопрос компании Seeed Studio, и нам посоветовали использовать другой порт, и это сработало!

Глядя на журнал ядра выше, мы видим, что ttyUSB0 и ttyUSB1 заданы Maixduino, и оглядываясь назад, это, вероятно, объясняется тем, что мы можем получить доступ к процессорам ESP32 и Kendryte K210 через разные последовательные порты через один USB-кабель.

Однако, когда мы подключаемся к / dev / ttyUSB0 через Minicom (115200 8N1), кажется, что проблема с прошивкой:

[MAIXPY]Pll0:freq:832000000             
[MAIXPY]Pll1:freq:398666666             
[MAIXPY]Pll2:freq:45066666              
[MAIXPY]cpu:freq:416000000              
[MAIXPY]kpu:freq:398666666              
[MAIXPY]Flash:0xc8:0x17
open second core...
gc heap=0x801702e0-0x801f02e0
[MaixPy] init end
Traceback (most recent call last):                                              
  File "_boot.py", line 17, in <module>                                         
NameError: name 'time' isn't defined                                            
MicroPython v0.4.0-39-g083e0cc-dirty on 2019-08-13; Sipeed_M1 with kendryte-k210
Type "help()" for more information.

MaixPy версии 0.4.0, которую мы использовали, является предварительной версией прошивки, поэтому переходим на MaixPy 0.3.2, которая считается стабильной версией. На этот раз мы используем инструмент командной строки:

sudo apt update 
sudo apt install python3 python3-pip 
sudo pip3 install pyserial 
sudo pip3 install pyelftools
wget http://dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.3.2_x/maixpy_master_2019_07_19_04_42_40_9f3862f.bin
./kflash.py -b 1500000 -p /dev/ttyUSB0 -S 1 -B goE maixpy_master_2019_07_19_04_42_40_9f3862f.bin 
[INFO] COM Port Selected Manually:  /dev/ttyUSB0 
[INFO] Default baudrate is 115200 , later it may be changed to the value you set. 
[INFO] Trying to Enter the ISP Mode... 
*
[INFO] Greeting Message Detected, Start Downloading ISP 
Downloading ISP: |=============================================| 100.0% 10kiB/s
[INFO] Booting From 0x80000000 
[INFO] Wait For 0.1 second for ISP to Boot 
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Baudrate:  1500000 
[INFO] Baudrate changed, greeting with ISP again ...  
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Flash:  On-Board 
[INFO] Initialization flash Successfully 
Programming BIN: |=============================================| 100.0% 52kiB/s
[INFO] Rebooting... 

Давайте посмотрим вывод с последовательной консоли:

>>> 
[MAIXPY]Pll0:freq:832000000
[MAIXPY]Pll1:freq:398666666
[MAIXPY]Pll2:freq:45066666
[MAIXPY]cpu:freq:416000000
[MAIXPY]kpu:freq:398666666
[MAIXPY]Flash:0xc8:0x17
open second core...
gc heap=0x8016d4e0-0x801ed4e0
[MaixPy] init end
 
 __  __              _____  __   __  _____   __     __
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /                           
| |\/| |   / /\ \     | |     > <   |  ___/    \   /                            
| |  | |  / ____ \   _| |_   / . \  | |         | |                             
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|                             
                                                                                
Official Site : https://www.sipeed.com                                          
Wiki          : https://maixpy.sipeed.com                                       
                                                                                
MicroPython 9f3862f on 2019-07-19; Sipeed_M1 with kendryte-k210                 
Type "help()" for more information.

Все хорошо. Давайте попробуем получить больше информации с help():

>>> help();                                                                     
Welcome to MicroPython on the Sipeed Maix!                                      
                                                                                
For generic online docs please visit https://maixpy.sipeed.com                  
                                                                                
Official website : http://www.sipeed.com                                        
                                                                                
Control commands:                                                               
  CTRL-A        -- on a blank line, enter raw REPL mode                         
  CTRL-B        -- on a blank line, enter normal REPL mode                      
  CTRL-C        -- interrupt a running program                                  
  CTRL-D        -- on a blank line, do a soft reset of the board                
  CTRL-E        -- on a blank line, enter paste mode                            
                                                                                
For further help on a specific object, type help(obj)                           
For a list of available modules, type help('modules')                           
>>> help('modules')                                                             
KPU               hashlib           random            uheapq                    
Maix              heapq             re                uio                       
__main__          image             sensor            ujson                     
_boot             json              socket            uos                       
_webrepl          lcd               struct            urandom                   
audio             machine           sys               ure                       
binascii          math              time              usocket                   
board             math              touchscreen       ustruct                   
builtins          micropython       ubinascii         utime                     
cmath             modules           ucollections      utimeq                    
collections       nes               ucryptolib        uzlib                     
errno             network           uctypes           video                     
fpioa_manager     os                uerrno            zlib                      
gc                pye_mp            uhashlib                                    
Plus any modules on the filesystem                                              
>>> 

Появляется список модулей, и мы можем, используя help (‘<module_name>’) получить список функций для каждого модуля. Это не самый удобный способ обучения, поэтому давайте вернемся к Wiki и проверим образец, чтобы сделать снимок и показать его на дисплее:

import   sensor 
 import   image 
 import   lcd 
 
 lcd . init ( ) 
 sensor . reset ( ) 
 sensor . set_pixformat ( sensor . RGB565 ) 
 sensor . set_framesize ( sensor . QVGA ) 
 sensor . run ( 1 ) 
 while   True : 
     img = sensor . snapshot ( ) 
     lcd . display ( img ) 

Фактический выход в терминале:

 >>>   import  sensor                                                                
 >>>   import  image                                                                 
 >>>   import  lcd                                                                   
 >>>   lcd .init ( )                                                                   
 >>>   sensor .reset ( )                                                               
 init  i2c2                                                                        
 [ MAIXPY ] :   find   ov2640                                                            
 >>>   sensor .set_pixformat ( sensor .RGB565 )                                          
 True                                                                             
 >>>   sensor .set_framesize ( sensor .QVGA )                                            
 >>>   sensor .run ( 1 )                                                                
 True                                                                             
 >>>   while   True :                                                                  
 . . .       img = sensor .snapshot ( )                                                    
 . . .       lcd .display ( img )          
 . . . 

Мы действительно можем видеть выход камеры на прикрепленном дисплее.

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

Мы хотели использовать последнюю версию MaixPy IDE 0.2.4, для которой требовалось встроенное ПО 0.4.0 или выше. Нам не повезло с 0.4.0.39. Мы обратили внимание на то, что новая версия была построена 16 августа, поэтому сохраняем ее:

 . / kflash .py   - b   1500000   - p   / dev / ttyUSB0   - B   goE   - S   1   maixpy_v0 . 4.0_44_g95f00f0.bin  
 [ INFO ]   COM  Port  Selected  Manually :    / dev / ttyUSB0  
 [ INFO ]   Default   baudrate  is   115200   ,   later  it  may  be  changed  to   the  value  you  set .  
 [ INFO ]   Trying  to   Enter  the  ISP  Mode . . .  
 * 
 [ INFO ]   Greeting  Message  Detected ,   Start  Downloading  ISP  
 Downloading  ISP :   |= === === === === === === === === === === === === === === == |   100.0 %   10kiB / s 
 [ INFO ]   Booting  From   0x80000000  
 [ INFO ]   Wait   For   0.1   second  for   ISP  to   Boot  
 [ INFO ]   Boot  to   Flashmode  Successfully  
 [ INFO ]   Selected  Baudrate :    1500000  
 [ INFO ]   Baudrate  changed ,   greeting  with  ISP  again   . . .   
 [ INFO ]   Boot  to   Flashmode  Successfully  
 [ INFO ]   Selected  Flash :    On - Board  
 [ INFO ]   Initialization  flash  Successfully  
 Programming  BIN :   |= === === === === === === === === === === === === === === == |   100.0 %   52kiB / s 
 [ INFO ]   Rebooting . . .  

На этот раз плата загрузилась. Устанавливаем и запускаем MaixPy IDE в Ubuntu 18.04:

mkdir MaixPy-IDE
cd MaixPy-IDE
wget http://dl.sipeed.com/MAIX/MaixPy/ide/_/v0.2.4/maixpy-ide-linux-x86_64-0.2.4-installer-archive.7z
7z x maixpy-ide-linux-x86_64-0.2.4-installer-archive.7z
./setup.sh
./bin/maixpyide.sh

Последняя строка запускает IDE с программой hello world по умолчанию.

Теперь мы должны выбрать Maixduino в Инструменты-> Выбрать плату :

Нажимаем на значок зеленой скрепки в левом нижнем углу идентификатора и выбираем /dev/ttyUSB0, чтобы подключиться к плате, и как только это будет сделано, нажимаем кнопку «Play» внизу, чтобы загрузить и запустить пример Hello World на Maixduino.

В верхней правой зоне показан фактический буфер кадра, а также три зоны под гистограммами R, G и B.

Основной особенностью процессора K210 является его KPU AI/ ускоритель машинного зрения. Есть документация.

Сначала давайте загрузим модели:

wget -r --no-parent http://dl.sipeed.com/MAIX/MaixPy/model/

Есть три:

ls 
 face_model_at_0x300000 .kfpkg    mobilenet_0x300000 .kfpkg 
 mobilenet_7_5_224_tf .h5 

«Модель лица» — это предварительно обученная крошечная модель Yolo-v2 для обнаружения (человеческих) лиц, а две другие являются мобильными сетями. Мы будем запускать демонстрацию Yolo-V2.

Мы можем вернуться к kflash_gui, загрузить модель и нажать «Загрузить», чтобы перенести ее на плату.

Теперь мы можем написать (скопировать/вставить) код Yolo2 в IDE:

import sensor
import image
import lcd
import KPU as kpu
 
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
task = kpu.load(0x300000)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print(i)
            a = img.draw_rectangle(i.rect())
    a = lcd.display(img)
a = kpu.deinit(task)

Первая часть до sensor.run (1) предназначена для настройки камеры, как мы это делали в предыдущем примере, а часть KPU запускается тремя строками:

task   =   kpu .load ( 0x300000 )  
 anchor   =   ( 1.889 ,   2.5245 ,   2.9465 ,   3.94056 ,   3.99987 ,   5.3658 ,   5.155437 ,   6.92275 ,   6.718375 ,   9.01025 )  
 a   =   kpu .init_yolo2 ( task ,   0.5 ,   0.3 ,   5 ,   anchor ) 

Первая строка загружает модель, которую мы только что прошили по адресу 0x300000. Вторая строка определяет якоря для Yolo V2. Это предопределенная ширина и высота для «приставок» Yolo. Более подробную информацию о значении якорей Yolo можно найти на Github. Третья строка запускает Yolo в KPU с пятью параметрами:

  • kpu_net : сетевой объект kpu
  • threshold : предел вероятности
  • nms_value : предел box_iou 
  • anchor_num : количество якорей
  • anchor : параметры привязки, определенные ранее

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

Но действительно ли это работает?

Да. Распознавание выполняется в среде IDE со скоростью около 11 кадров в секунду, но оно будет быстрее при работе в автономном режиме. Поэтому мы добавили код, который нашли в демо-версии MaixPy Dock от Тициано Фиорензани, показывающей fps в левом верхнем углу экрана:

import KPU as kpu
 
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
task = kpu.load(0x300000) #使用kfpkg将 kmodel 与 maixpy 固件打包下载到 flash
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
clock = time.clock()
while(True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        fps = clock.fps()
        img.draw_string(2,2, ("%2.1ffps" % (fps)), color=(0,128,0), scale = 4)
        for i in code:
            print(i)
            a = img.draw_rectangle(i.rect())
    a = lcd.display(img)
    print (clock.fps())
a = kpu.deinit(task)

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

Обнаружение/отслеживание лица выполняется со скоростью от 15 до 18 кадров в секунду, и наш друг-панда не был обнаружен, но это, вероятно, скорее функция, чем ошибка, так как модель должна быть обучена на обнаружение человеческих лиц. В наши предыдущие попытки, панда, периодически, обнаруживалась, но не так хорошо, как человеческое лицо.

Вы можете использовать функции ESP32, такие как WiFi и/или Bluetooth, но, к сожалению, для этого нет документации. Мы обратились к руководству ESP32 Micropython для настройки WiFi, но он не работал:

>>> import network
>>> sta_if = network.WLAN(network.STA_IF); sta_if.active(True) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>                                           
AttributeError: 'module' object has no attribute 'WLAN'

Мы полагаем, это нормально, так как мы запускаем это в K210 вместо ESP32. Мы надеялись, что разработчики как-то адаптировали его. Взглянув в раздел help, реализовано лишь несколько функций:

>>> help(network)
object <module 'network'> is of type module
  __name__ -- network
  ESP8285 -- <class 'ESP8285'>
  ESP32_SPI -- <class 'ESP32_SPI'>
  route -- <function>

Невозможно использовать /dev/ttyUSB1 для подключения к ESP32, поэтому может потребоваться немного больше работы ..

Если вы хотите обучать и запускать свои собственные модели на Maixduino, используя Keras, сообщение на форуме содержит рекомендации, как это сделать.

Начало работы с Grove AI HAT

Автономный режим

Давайте переключимся на другую плату: Grove AI HAT, которая работает как в автономном режиме, так и подключенная к Raspberry Pi. Мы обратились к Wiki в, где показано, как использовать плату в автономном режиме с Arduino IDE, пропустив материал GPIO/Grove и переходя непосредственно к разделу камера, дисплей и компьютерное зрение.

Подключаем камеру типа «рыбий глаз», вставляем контактный разъем и позаимствуем дисплей из комплекта Maixduino. Обратите внимание, что вы также можете использовать камеру Maixduino с Grove AI HAT, но, обнаружение лиц и отслеживание не работают.

Мы предполагаем, что вы уже установили Arduino IDE на свой хост-компьютер. Для справки, мы используем Arduino 1.8.9 в Ubuntu 18.04.

Сначала нам нужно перейти в File-> Preferences и отредактировать «URL-адреса диспетчера дополнительных плат» со следующим URL-адресом, чтобы добавить поддержку плат Seeed Studio:

https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json

Также обратите внимание на путь «Дополнительные настройки можно редактировать прямо в файле», так как позже мы увидим этот каталог.

Теперь перейдите в Tools-> Board-> Boards Manager и найдите «k210». Нажмите «Установить», когда увидите «Grove AI HAT for Edge Computing от Seeed Studio».

Через некоторое время у вас все получится, и вы можете выбрать Seeed K210 Pi и убедиться, что выбран «k-flash» программатор и / dev / ttyUSB0, как показано ниже.

Теперь установите автономный SDK Kendryte в свой рабочий каталог:

git clone https://github.com/kendryte/kendryte-standalone-demo

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

cd kendryte-standalone-demo/face_detect/kfpkg 
$HOME/.arduino15/packages/Seeeduino/tools/kflash/1.3.0/kflash.py -n -p /dev/ttyUSB0 -b 2000000 -B dan face_detect.kfpkg

Вот вывод последней команды, если все идет по планам:

[INFO] ANSI colors not used 
[INFO] COM Port Selected Manually:  /dev/ttyUSB0 
[INFO] Default baudrate is 115200 , later it may be changed to the value you set. 
[INFO] Trying to Enter the ISP Mode... 
.
[INFO] Greeting Message Detected, Start Downloading ISP 
[INFO] CH340 mode 
Downloading ISP: |=============================================| 100.0% 10kiB/s
[INFO] Booting From 0x80000000 
[INFO] Wait For 0.1 second for ISP to Boot 
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Baudrate:  2000000 
[INFO] Baudrate changed, greeting with ISP again ...  
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Flash:  On-Board 
[INFO] Initialization flash Successfully 
[INFO] Extracting KFPKG ...  
[INFO] Writing face_detect.bin into 0x00000000 
Programming BIN: |=============================================| 100.0% 65kiB/s
[INFO] Writing detect.kmodel into 0x00a00000 
Programming BIN: |=============================================| 100.0% 79kiB/s
[INFO] Rebooting... 

Теперь вернитесь в свой рабочий каталог и создайте папку и пустую схему с тем же именем, в нашем случае «face_detect»:

mkdir   face_detect 
 cd   face_detect / 
 touch   face_detect .ino 

Скопируйте содержимое face_detect из SDK:

	
 cp   . . / kendryte - standalone - demo / face_detect / *   - rf   . 

Теперь откройте face_detect.ino в Arduino IDE. Это автоматически откроет кучу других файлов, включая board_config.h, который нам нужно изменить, чтобы включить датчик OV2640 и плату LICHEEDAN, как показано ниже.

Вы можете перейти на main.c для изучения кода, но для его понимания потребуется немного больше усилий, чем для примера Maixduino MicroPython. Если вы просто хотите попробовать, вы можете проверить, компилируется ли он. У нас было несколько предупреждений из-за неиспользованных переменных:

sketch/ov5640.c: In function 'ov5640_init':
sketch/ov5640.c:266:14: warning: unused variable 'reg' [-Wunused-variable]
     uint16_t reg = 0;
              ^~~
At top level:
sketch/ov5640.c:258:16: warning: 'ov5640_rd_reg' defined but not used [-Wunused-function]
 static uint8_t ov5640_rd_reg(uint16_t reg)
                ^~~~~~~~~~~~~
sketch/ov5640.c:248:13: warning: 'hal_delay' defined but not used [-Wunused-function]
 static void hal_delay(uint32_t delay)
             ^~~~~~~~~
sketch/region_layer.c: In function 'do_nms_sort':
sketch/region_layer.c:312:56: warning: passing argument 4 of 'qsort' from incompatible pointer type [-Wincompatible-pointer-types]
         qsort(s, boxes_number, sizeof(sortable_box_t), nms_comparator);
                                                        ^~~~~~~~~~~~~~
In file included from sketch/region_layer.c:1:
/home/jaufranc/.arduino15/packages/Seeeduino/tools/riscv64-unknown-elf-gcc/8.2.0/riscv64-unknown-elf/include/stdlib.h:140:72: note: expected '__compar_fn_t' {aka 'int (*)(const void *, const void *)'} but argument is of type 'int (*)(void *, void *)'
 void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t _compar);
                                                          ~~~~~~~~~~~~~~^~~~~~~
sketch/region_layer.c: In function 'region_layer_output':
sketch/region_layer.c:351:14: warning: unused variable 'boxes_number' [-Wunused-variable]

Но скомпилировано нормально:

Sketch uses 511916 bytes (6%) of program storage space. Maximum is 8388608 bytes.

Теперь мы можем загрузить схему прямо из IDE:

[INFO] ANSI colors not used 
[INFO] COM Port Selected Manually:  /dev/ttyUSB0 
[INFO] Default baudrate is 115200 , later it may be changed to the value you set. 
[INFO] Trying to Enter the ISP Mode... 
.
[INFO] Greeting Message Detected, Start Downloading ISP 
[INFO] CH340 mode 
 
Downloading ISP: |===----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 1.5% 
 
...
Downloading ISP: |=========================================================================================================================================================================================================----| 98.5% 10kiB/s
 
Downloading ISP: |=============================================================================================================================================================================================================| 100.0% 10kiB/s
[INFO] Booting From 0x80000000 
[INFO] Wait For 0.1 second for ISP to Boot 
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Baudrate:  2000000 
[INFO] Baudrate changed, greeting with ISP again ...  
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Flash:  On-Board 
[INFO] Initialization flash Successfully 
 
Programming BIN: |======================================================================================================-------------------------------------------------------------------------------------------------------| 50.0% 
 
Programming BIN: |=============================================================================================================================================================================================================| 100.0% 67kiB/s
[INFO] Rebooting... 

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

Дисплей был вверх ногами. Исправлено небольшое изменение в коде (см. Строку 5 ниже):

#if BOARD_LICHEEDAN
    #if OV5640
        lcd_set_direction(DIR_YX_RLUD);
    #else
        lcd_set_direction(DIR_YX_LRUD);
    /*    lcd_set_direction(DIR_YX_RLDU);*/
    #endif
#else

Это похоже на демонстрацию Maixduino выше, но вместо того, чтобы полагаться на MicroPython, мы сделали это в Arduino IDE.

Grove AI HAT и Raspberry Pi 4

Поскольку у нас есть плата HAT, было бы стыдно, если бы мы не использовали ее с платой Raspberry Pi. Поэтому, вставляем плату в Raspberry Pi 4 SBC. Убедитесь, что перемычка RPI 5В на верхней части платы Grove AI HAT установлена ​​в положение ON.

Первое, что нам показалось интересным, — это разработка кода непосредственно на Raspberry Pi 4. Поэтому, устанавливаем Arduino 1.8.9 для Arm 32-bit и загружаем URL-адрес платы Seeed Studio на основе приведенных выше инструкций.

Но, когда мы попытались установить «Grove AI HAT для Edge Computing от Seeed Studio», мы быстро столкнулись с препятствием:

Сообщение выше: «Инструмент kflash недоступен для вашей операционной системы», а также «Инструмент kendryte-standalone-sdk недоступен для вашей операционной системы». Не удивительно, что инструменты Kendryte K210 (пока) недоступны для Arm.

В качестве примечания, используя Raspberry Pi 4 с 1 ГБ, запускать Chromium было бы не очень хорошей идеей, даже с одной вкладкой и Android IDE, поскольку памяти недостаточно, и он полностью заполнит 512 МБ на карте microSD. Даже с ZRAM нет никакой надежды, поэтому, если вы когда-нибудь рассматривали возможность запуска Arduino IDE на Raspberry Pi 4 (например, для плат Arduino), а также просматривали документацию, приобретайте версию RAM объемом 2 ГБ или 4 ГБ.

Тем не менее, еще один способ использования Grove AI HAT с Raspberry Pi — это отображение данных. Как объясняет Seeed Studio в своем демонстрационном руководстве по подсчету лиц . Давай попробуем.

Установили Arduino IDE и установили демо-прошивку face. Теперь мы можем просто установить программу Face Count на Raspberry Pi:

cd ~
git clone https://github.com/LynnL4/face-detected.git
cd face-detected
sudo chmod -R 777 installer
cd installer
sudo ./setup.sh

Однако, при запуске возникает ошибка:

sudo   . / face - detected .sh  
 Segmentation  fault 

Давайте посмотрим на setup.sh:

#!/bin/bash 
 #start pi spi 
 pwds = / boot / config .txt 
 sudo  sed   - i   's/dtparam=spi=off//g'   $pwds 
 sudo  sed   - i   's/dtparam=spi=on//g'   $pwds 
 sudo  sed   - i   '$a dtparam=spi=on'   $pwds 
 #reboot后生效 
 CurDir = $PWD "/face-detected.desktop" 
 ExecDir = $PWD "/face-detected.sh" 
 IconDir = $PWD "/Pyte_Data/icon.png" 
 sudo  sed   - i   "4c Exec=$ExecDir"   $CurDir 
 sudo  sed   - i   "5c Icon=$IconDir"   $CurDir 
 sudo  cp   $CurDir   / usr / share / applications / face - detected .desktop 
 cp   $CurDir   / home / pi / Desktop / face - detected .desktop 

Мы видим, как Grove AI HAT связывается с платой Raspberry Pi через SPI,  и изменяется файл /boot/config.txt. Поэтому перезагружаем систему, но проблема та же. Каталог установщика содержит множество бинарных библиотек, которые были протестированы на Raspberry Pi 3 B + с Debian Wheezy, поэтому переход на Raspberry Pi 4 с Debian Buster, вероятно, привел к ошибкам. Мы сообщили об этом в Seeed Studio, и они изучают это.

Завершим обзор демонстрацией видео по распознаванию лиц, запущенной на Grove AI HAT, к которой снова присоединились несколько «друзей».

Все работает примерно так, как и ожидалось. Отфильтровалось большинство наших друзей, не являющихся людьми, и получилось до 3-4 лиц одновременно с фотографии.

Покупка плат, дисплеев и камер

Хотелось бы поблагодарить Seeed Studio за отправку платы и предоставленной нам возможности поэкспериментировать с платформами Kendryte K210/Sipeeed M1 с использованием MicroPython и Arduino. Если вы хотите воспроизвести наш опыт, вы можете купить Grove AI Hat за 28,90 долларов, камеру «рыбий глаз» OV2640 за 7,60 долларов и/или комплект Maixduino с платой, дисплеем и камерой за 23,90 долларов.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

5 1 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments