UnitV をゲットしました! ーエッジAI活用への道 11ー
素晴らしい金魚水槽システムを目指して歩んできたこの道。
これまではSipeed Maixduino での構築を目指しておりました。
夢は大きく#エッジAI活用への道 #Maixduino pic.twitter.com/rX7ABKuoEU
— HomeMadeGarbage (@H0meMadeGarbage) September 29, 2019
MaixduinoはK210に加えてESP32が搭載されており無敵のマイコンだと思うのですが、Pythonでのマイコン操作になれていないためどうしてもUDPでのデータ受信や映像のストリーミングができず頓挫しておりました。
そんなおりに大変良い製品の発売がM5Stack社より発表されました。
これは動画の取得はUART? SPI? https://t.co/I1h5sZFJMt
— HomeMadeGarbage (@H0meMadeGarbage) December 6, 2019
K210とカメラのみというシンプルなユニットのUnitVです。
画像認識はこいつに任せて、あとの機能は外部に搭載してハイテク金魚水槽システムの実現を目指すことにします。
目次
UnitVの購入
初めてAliExpressでお買いモノしました。
きたー! pic.twitter.com/xdBwaOFFoI
— HomeMadeGarbage (@H0meMadeGarbage) January 14, 2020
初期設定
以下を参考に各種設定しました。
UnitV Quick Start
ファームウェアは M5StickV_Firmware_1022_beta.kfpkg を Kflash_GUIで書き込みました。
プログラミングは MaixPy IDE で実施するのですがバージョンはv0.2.4じゃないとうまくいかないようです。
オリジナル金魚モデルで画像認識
早速、依然作ったオリジナル金魚モデルで画像認識を試してみました。
結論から申しますと全く問題なくUnitVでも動作いたしました。
Maixduinoの時と同様に、作った金魚認識モデル(kmodelファイル)を書き込みます。
コードはYolo-digit-detector/micropython_code/racoon_detector.py を使用します。MaixPy IDEで書き込みました。
また画面方向調整のためコードに以下の挿入・変更施しました。
1 2 3 4 |
sensor.set_vflip(1) sensor.set_hmirror(1) classes = ["goldfish"] |
動作
Maixduinoと同じように動きました。
LCDはないのでMaixPy IDEの画面で動作確認しました。
無事にオリジナル金魚モデル動きました。#UnitV
あとはこれをどうやって下界にだすの? pic.twitter.com/8eST6sbM2r— HomeMadeGarbage (@H0meMadeGarbage) January 14, 2020
UnitVにはNeopixelが搭載されておりますので夜間撮影時の照明となるか試してみました。
内蔵LEDが夜間の照明になるかなと思ったけど、金魚が驚くのでやめておこう。#UnitV pic.twitter.com/JzRIp5eH1d
— HomeMadeGarbage (@H0meMadeGarbage) January 14, 2020
照明として使えそうですが、ちょっと金魚がビックリしてますねw
シリアル通信
今後UnitVを外部端末と接続して色々するための準備として、まずはUARTでのデータ送信を試してみました。
UnitVに付属されてきた4ピンケーブルでM5StickCに接続して通信してみました。
動作
UnitVのボタンA, Bを押すとLEDの色が変わり、UARTでデータをM5StickCに送信します。
データを受けたM5StickCはデータに応じて画面が変わります。
シリアル通信を学習しました。
かわいい
M5StickC <-UART– UnitV pic.twitter.com/ITPkK0ksXP— HomeMadeGarbage (@H0meMadeGarbage) January 15, 2020
UnitVコード(MaixPy IDE)
UnitVでUART送信します。demo_uart.py を参考にコーディングしました。
ボタンA, Bを押すとLEDの色を変えて それぞれ文字A, Bを送信します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from machine import UART from board import board_info from fpioa_manager import fm from Maix import GPIO from modules import ws2812 class_ws2812 = ws2812(8, 1) fm.register(35, fm.fpioa.UART1_TX, force=True) fm.register(34, fm.fpioa.UART1_RX, force=True) fm.register(18, fm.fpioa.GPIO1) ButonA=GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP) fm.register(19, fm.fpioa.GPIO2) ButonB=GPIO(GPIO.GPIO2, GPIO.IN, GPIO.PULL_UP) uart = UART(UART.UART1, 115200,8,0,0, timeout=1000, read_buf_len=4096) while(1): if ButonA.value() == 0: uart.write('A\n') b = class_ws2812.set_led(0,(50,0,10)) b=class_ws2812.display() time.sleep(0.5) if ButonB.value() == 0: uart.write('B\n') b = class_ws2812.set_led(0,(0,50,50)) b=class_ws2812.display() time.sleep(0.5) |
M5StickCコード(Arduino IDE)
UnitVからの文字を受けてLCDの背景色を変えて、文字を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <M5StickC.h> void setup() { M5.begin(); M5.Axp.ScreenBreath(13); M5.Lcd.setTextSize(10); Serial.begin(115200); Serial2.begin(115200, SERIAL_8N1, 32, 33); } void loop() { if (Serial2.available()) { int inByte = Serial2.read(); M5.Lcd.setCursor(20, 60); if(inByte == 'A') { M5.Lcd.setTextColor(BLACK, MAGENTA); Serial.println("A"); M5.Lcd.fillScreen(MAGENTA); M5.Lcd.print("A"); } if(inByte == 'B'){ M5.Lcd.setTextColor(BLACK, CYAN); Serial.println("B"); M5.Lcd.fillScreen(CYAN); M5.Lcd.print("B"); } } } |
参考
おわりに
エッジAI活用への道はこのたび方向転換しUnitVの導入の検討を開始しました。
さてうまくいくのでしょうか?道は続きます。
ではまた