UIFlowとは

M5Stack系列がサポートしている開発環境の1つ。主な特徴は以下の通り。

  • Web上でコーディングから書き込みまでできる。
  • ビジュアルプログラミング言語Blockly及びMicroPythonをサポートしている。

HuskyLensとは

AI処理向けのSoC Kendryte K210 を搭載したAIカメラモジュール。顔認識、オブジェクト追跡、オブジェクト認識、ライン追跡、色認識、タグ(AprilTag)認識などの機能が実装されている。接続インタフェースはUART及びI2C。

MicroPython環境でHuskyLensを使う

Pythonで実装されたHuskyLensとの通信用ライブラリは、RaspberryPiでの利用向けに公開されている。

MicroPython上でHuskyLensを使う場合、基本的にはここから必要な処理をコピペして使えば良さそうなのだが、一部 MicroPython(on ESP32) でサポートされていないモジュールを利用している箇所があるため、その部分を書き換える必要がある。ただし、今回はUARTでの通信を前提とする。

環境

  • UIFlowファームウェア : ver1.4.5.1
  • HuskyLens用Pythonライブラリ : 2020/06/28時点の最新

書き換えが必要な箇所

UART通信用オブジェクト生成部分

書き換え前

self.huskylensSer = serial.Serial(port=comPort, baudrate=speed)

書き換え後例

self.serial = machine.UART(1, tx=32, rx=33)
self.serial.init(9600, bits=8, parity=None, stop=1)

MicroPythonではmachineモジュールがもつクラスUARTを使ってUART通信バスにアクセスできる。ピン番号やボーレートは自分の環境に合わせて設定する。

参考 : クラス UART -- 二重シリアル通信バス — MicroPython 1.12 ドキュメント

16進数文字列からバイナリデータへの変換部分

書き換え前

def cmdToBytes(self, cmd):
  return bytes.fromhex(cmd)

書き換え後例

import ubinascii

def cmdToBytes(self, cmd):
  return ubinascii.unhexlify(cmd)

MicroPythonにはbytes.fromhex()は実装されていないらしい。実行しようとしたら そんな関数はない と怒られた。代わりにMicroPythonでも標準でサポートされているubinasciiモジュールを使う。

参考 : ubinascii -- バイナリ/ASCII 変換 — MicroPython 1.12 ドキュメント

バイナリデータから16進数文字列への変換部分

書き換え前

commandSplit = self.splitCommandToParts(byteString.hex())

書き換え後例

commandSplit = self.splitCommandToParts(ubinascii.hexlify(byteString))

bytes.hex()も同様に実装されていないらしいので、代わりにubinasciiモジュールを使う。ただし、ubinascii.hexlify()は戻り値が文字列ではなく、バイト列であるため注意。

受信データと文字列の比較部分

書き換え前

if(commandSplit[3] == "2e"):
  return "Knock Recieved"

書き換え後

if(commandSplit[3] == b'2e'):
  return "Knock Recieved"

先ほどの書き換えの影響で、commandSplitには文字列ではなくてバイト列が格納されている。そのため比較部分もバイト列と比較するようにする。

アフィリエイト