[電子工作]Sipeed Maix Bit(Kendryte K210)でA.I.を体験

ーーーー目次ーーーー

1.Sipeed Maixとは?

2.MaixPyの使い方

 WAVファイルの作成方法

 AVIファイルの作成方法

3.Arduino IDEのMaix環境(Maixduino)の使い方

4.Kendryte SDKの使い方

5.アプリケーション

ーーーーーーーーーー

1.Sipeed Maixとは?

  中国のKendryte(勘智)社が開発したK210というマイコンを搭載し、Sipeed社が開発した評価ボードが

 Maixシリーズです。Maixボードには、どれもカメラI/F、LCD I/F、MicroSDカードを搭載しており、これらの

 機能についてはほぼ共通に使えるようです。それ以外の、マイク、センサー、無線通信などはボード毎に

 異なるので、どれを買うか決める時は精査下さい。

  K210の仕様は次の通りで、組み込み用マイコンとは思えない仕様です。

    ・64bit RISC-Vプロセッサ、キャッシュ付き、400MHz(600MHzまでクロックアップ可能。電圧アップ

     すると800MHzで動作するらしい)を2個

    ・6MBの汎用RAMと2MBのCNN用RAM

    ・音声認識、音声合成用プロセッサAPU

    ・CNNアクセラレータKPU

    ・FFTアクセラレータ

    ・AES、SHA256などのアクセラレータ

 という訳で、A.I.処理に最適なマイコンです。ADCや無線通信は標準で持たないので、外付けが必要です。

  私は、RISC-Vアーキテクチャが発表された時に、単純な命令が動作するところまで自分でRTL設計した

 事があるので、64bitのRISC-Vアーキテクチャのプロセッサだけでもそそられます。

  ところで、CPU設計はどうなったのか?って。32bitの基本関数は動くようになって、割り込み処理の

 実現方法を調査していて、中国で設計されたHummingbirdというプロセッサのRTLがネットに無料で

 落ちているのを見つけて止めました...中国には敵わない...

  ですが、2020年、コロナ禍の中、一先ず完成させました。詳細はこちら

 

  ソフト開発は、ディフォルトでMaixPyというMicroPythonがファームウェアに書かれていました。自分で

 学習データをフラッシュに書き込むことで、カメラから映像を読み込み、顔認識や物体認識し、LCDに

 表示するプログラムをPythonで書けます。QVGA解像度で、約20fpsで動作します。詳細は下記の通り。

  また、Arduino IDEで開発可能で、高速処理を行いたい時は、こちらを使うべきです。

 

  なお、Sipeed社の各種ボードの仕様や回路図は、こちらにあります。

 

 注意.原因不明ですが、Windows10 32bit版をインストールしたノートPCでは、MaixBitのCH552が

     正常に認識されず、使うことができませんでした。(ドライバを手で入れても駄目!)

     Windows10 64bitやLinux(Ubuntu 64bit)では、特にドライバを入れなくても認識されました。

     よって、Windows10 32bitで使おうとしている方は注意が必要です。

 

2.MaixPyの使い方

 (1)MaixPyとは?

   MicroPythonをベースに、Maixシリーズの機能を活かせるように関数を拡張したものがMaixPyです。

   詳細は、こちらをご覧ください。

 

 (2)MaixPy IDEのインストール

   標準のMicroPythonの環境も使えますが、Sipeed社がもっと良いものを準備しています。それが

   MaixPy IDEです。本来は、Sipeed社のダウンロードページからダウンロードするのですが、なぜか

   不安定なので、M5STACK社の方が安定しているようですし、設定の説明も分かりやすい。

   特徴は、カメラ映像とヒストグラムが標準で見れるところ。(Linuxではカメラ映像が出なかった。なぜ?

   USB3.0ポートに接続するとカメラ映像とヒストグラムが表示されましたが、USB2.0ポートでは表示

   できないようです。仕様かバグか、不明。)

 

 (3)MaixPy IDEの使い方

   ツールーSelectBoard でボードを選択。

   左下の鎖ボタンで接続。

   左下の三角ボタンで開始。

   起動プログラムを本体に書き込みたい場合は、ツールーSave open script to board(boot.py)

   を行うと、本体の電源を入れるとそのプログラムが実行されます。

 

 (4)各種サンプルの実行方法

   ・準備

    1.ファームウェアの書き換えや学習データを書き込むため、最初にK-Flash又はKflash_gui

      インストール。Pythonの環境を持つPCなら、次のコマンドでインストール可能。(私はこれ)

        >>pip3 install kflash 又は >>pip install kflash

      *.binや*.kfpkgをコマンドラインから書き込む方法は次の通り。GUIはネットで探して下さい。

        Windows >>kflash -p COM3 -b 115200 ???.bin

        Linux >>kflash -p /dev/ttyUSB0 -b 1500000 ???.bin

         注意.ポート名は、環境に合わせて変更すること。

         注意.Linuxで/dev/ttyUSB0にアクセスできない場合、次のコマンドを実行して、再起動。

              >>sudo usermod -a -G dialout $USER

    2.ここの最新のフォームウェアをK-Flashで書き込む。

      試したところ、サンプル毎に、必要なファームウェアが異なります。

      A.I.を使ったものは「_minimum_with_ide_support」の付いた小さなサイズのもの、

      複雑な画像処理を行うものは「_with_lvgl」の付いた最も大きなサイズのものを

      書き込んで下さい。詳細は、次の3.を参照下さい。

    3.各種サンプルは、ここにあります。但し、A.I.の学習データやNESのROMコードは

      別の場所からダウンロードする必要があります。ファイルのコメントなどを参考に、

      頑張ってネットから探して下さい。

      私が試したところ、必要なファームウェアは次の通り。

        applicationの下:最も大きな「_with_lvgl」の付いたファームウェア

        multimediaの下:最も大きな「_with_lvgl」の付いたファームウェア

        demo_scan_qr_code:最も大きな「_with_lvgl」の付いたファームウェア

        machine_visionの下でA.I.を使うもの:「_minimum_with_ide_support」の付いた小さなファームウェア。

        cameraやlcdを使った単純なもの:どれでもOK

      また、カメラの映像が反転している場合は、次のコマンドを「sensor.run(1)」の前に追加下さい。

        sensor.set_hmirror(1)

        sensor.set_vflip(1)

 

   ・AVIファイルの再生:「_with_lvgl」の付いたファームウェアを書き込めば、microSDカードの

         AVIファイルを再生可能。

     ここの「multimedia/video/demo_video_play.py」を実行すると、microSDカード上の、「badapple.avi」

     というファイルが再生できます。Sipeed社の「badapple_320_240_15fps.avi」をお使い下さい。

     I2SにDACとスピーカを接続すれば、音も再生できます。でも、「badapple」って日本語の

     歌だったのですね。知りませんでした。映像も音も一見の価値があります。

     なお、youtubeの映像をAVIファイルに変換する方法はこちらです。

     注意.映像が出ない場合があります。原因はLCDパネルの初期化が行われていないため。

        よって、LCDパネルを使ったソフトの後なら問題ありませんが、電源入れた直後には

        映像が出ません。次のコマンドをビデオ再生コマンドの前に実行しておく必要があります。

          import lcd

          lcd.init()

 

   ・カメラ映像の録画/再生:「_with_lvgl」の付いたファームウェアを書き込めば、microSDカードに

         AVI形式で映像を保存、再生可能。

     ここの「multimedia/video/demo_video_record.py」を実行すると、100コマ分の映像を保存。

     「multimedia/video/demo_video_play.py」のファイル名を"/sd/capture.avi"に変更すれば、

     保存した映像を再生できます。

 

   ・カメラ映像から顔認識:人の顔を検出して、枠を表示

     ここから「maixpy_yolo2.zip」をダウンロードし、「face_3M.kfpkg」をK-flashで書き込み。

     「maixpy_yolo2.py」をMaixPy IDEで実行。

 

   ・カメラ映像から20class分類:人、いす、TVモニタ、車、犬、猫など20種類のものを見つけ分類

     ここから「maixpy_20class.zip」をダウンロードし、「20class.kfpkg」をK-flashで書き込み。

     「20class.py」をMaixPy IDEで実行。

 

   ・MobileNet:1000種類のものを分類

     ここから「maixpy_mbnet.zip」と「labels.zip」をダウンロードし、「mbnet75.kfpkg」をK-Flashで

     書き込み、「labels.txt」をチップ内のflashメモリかmicroSDカードに置く。

     同じページにサンプルプログラムが書かれているので、エディタにコピー・ペーストし、

     「mobilenetv1_1000class.py」等の名前で保存し、MaixPy IDEで実行。

 

   ・NESのエミュレータ:「_with_lvgl」の付いたファームウェアを書き込めば、NESのゲーム

         が動きます。但し、Maix BitにはDACもスピーカも付いていませんので、音は出ません。

         音を出したい場合は、こちらを参照。

     microSDに*.nesファイルを書き込み、ここの「application/nes_emulator.py」を実行すると

     実行できます。フリーのNESソフトがありますので、これで動作確認して下さい。

     サンプルの「mario.nes」は自分で、ネットから探して下さい。私は、動きました。

     なお、キーボードで操作する場合、MaixPy IDEでboot.pyで保存し、MaixPy IDEを切断し、

     PCと115200bpsでシリアル接続し、W/A/S/D/J/K/enterのキーで遊んで下さい。

     (同時に複数のキーを入力できないので、まともにゲームできないが...)

     PS2のコントローラを接続して、「application/nes_ps2.py」を実行すれば、コントローラで

     操作できるようです。(方法は、ネットで検索下さい。)

   私は、Maix Bitの空き端子にキーを接続し、MaixPyのソースコードを書き換え、キー操作

     できるようにし、更にI2SのDAC、アンプ、スピーカを接続して音も出るようにしました。

 

3.Arduino IDEのMaix環境(Maixduino)の使い方

 (1)Maixduinoとは?

   Maixduinoとは、Sipeed社が販売しているK210とESP32の2つのマイコンを搭載しArduino互換の

   コネクタを持つ開発ボードであり、かつ、Arduino IDEを使ったMaixシリーズの開発環境でもあります。

   私のHPでは、後者の開発環境として説明しています。詳細はこちらをご覧ください。

 

 (2)Arduino IDEのインストール

   まず、Arduino IDEをインストールしてください。

   その後、ファイルー環境設定の追加のボードマネージャのURLに

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

   を追加し、ツールーボードのボードマネージャで「maix」等で検索し、インストールします。詳細はこちら

   その後、ツールを次のように設定下さい。

   (Linuxで書き込めない場合は、>>sudo apt install python3-serial もお試し下さい。)

     ボード:Sipeed Maix Bit-Mic Board

     シリアルポート:Maix Bitが繋がっているポートを選択(2つポートが出るので試行下さい)

     書込装置:k-flash

 

   で、いきなりバグや注意点があります!

   1.少なくとも、2020年2月の段階で、カメラを使ったサンプルを実行すると、エラーで

     停止します。原因は、OV2640のライブラリのファイルのタイプミス!

     対策方法は次の通り。

     Windowsの場合、

       C:\Users\xxxxx\AppData\Local\Arduino15\packages\Maixduino\hardware\k210\0.3.11\libraries\Sipeed_OV2640\src

     Linuxの場合、

       ~/.arduino15/packages\Maixduino\hardware\k210\0.3.11\libraries\Sipeed_OV2640\src

     にある、「Sipeed_OV2640.cpp」と「Sipeed_OV2640.h」にタイプミスがあり、それぞれ1箇所ずつ、

     setRotaion→setRotation に書き換えてください。これで、問題なくコンパイルできます。

     しかし、4ヶ月もこのまま、っていうのはどうしたものか...

 

   2.SpeechRecognitionのサンプルを実行しても、音が全く取れません。原因は、

     Maix BitのMEMSマイクはL/R=VDD、他のボードはL/R=GND。つまり、右の音と左の音が

     Maix Bitは他のボードと逆になっているため。

     対策は次の通り。

     Windowsの場合、

       C:\Users\xxxxx\AppData\Local\Arduino15\packages\Maixduino\hardware\k210\0.3.11\libraries\Maix_Speech_Recognition\src

     Linuxの場合、

       ~/.arduino15/packages\Maixduino\hardware\k210\0.3.11\libraries\Maix_Speech_Recognition\src

     にある、「Maix_Speech_Recognition.cpp」で、g_rx_dma_buf[2 * i]→g_rx_dma_buf[2 * i + 1]

     に2箇所変更下さい。

     ついでに、speeking→speaking に直しておくと、他の人に見せる時に恥ずかしくないかも...

 

 (3)ファイルースケッチ例 に様々なサンプルが含まれています。主なものは次の通り。

     ・Maix-KPUーmobilenet_v1:1000種類のものの分類

       上記、対策をすること!

       コメントの通り、ファイルをダウンロードし、展開し、「m.kmodel」を「m」に名前を変え、

       SDカードに書き込む必要があります。

     ・Maix_Speech_Recognition:音声認識のサンプル

       上記、対策を行うこと!

       また、LEDの色が違っているようですので、#include文の後に、次のコマンドを追加。

        #define LED_RED 13

        #define LED_BLUE 14

        #define LED_GREEN 12

 

4.Kendryte SDKの使い方

 (1)Kendryte SDKの必要性

   Maix Bitのソフト開発はMaixduinoで良いと思ってましたが、色々とソフトを作ってみると

   動作が怪しかったり、ネット上のコードやサンプルを改変できない場合があります。

   そこで純正の開発ツールであるKendryte SDKをインストールしてみました。これを使い

   I2SもDMAや割り込みを使って期待通りに動作することが確認できました。

   なお、Windowsでは、ファイル名等で問題が発生する場合があるようなので、Linuxを推奨

   致します。

 

 (2)Kendryte SDKのインストール

   ・Ubuntuでバイナリをそのままダウンロードする場合

     >>wget http://dl.cdn.sipeed.com/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz

     >>sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt

 

   ・Linuxでコンパイルし直す場合

     >>sudo apt install gawk

     >>sudo mkdir /opt/kendryte-toolchain

     >>sudo chmod 777 /opt/kendryte-toolchain

     >>git clone --recursive https://github.com/kendryte/kendryte-gnu-toolchain

     >>cd kendryte-gnu-toolchain

     >>git submodule update --init --recursive

     >>sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

     >>./configure --prefix=/opt/kendryte-toolchain --with-cmodel=medany --with-arch=rv64imafc --with-abi=lp64f

     >>make -j8

 

 (3)サンプルコードのコンパイル

   1.kendryte-standalone-sdkをダウンロードし、適当なフォルダーに展開する。

     >>unzip kendryte-standalone-sdk-0.5.6.zip

   2.次の手順で、サンプルのhello_worldがコンパイルできます。

     >>cd kendryte-standalone-sdk-0.5.6

     >>mkdir build

     >>cd build

     >>cmake ../ -DPROJ=hello_world -DTOOLCHAIN=/opt/kendryte-toolchain/bin

     >>make

   3.バイナリをMaixに書き込む

     >>kflash -p /dev/ttyUSB0 -b 1500000 hello_world.bin

        このプログラムの場合、「screen /dev/ttyUSB0 115200」等でシリアルモニタしてresetボタンを

        押すと、次のようなメッセージが出力される。

          Core 0 Hello world

          Core 1 Hello world

   4.その他のサンプルはここからダウンロードし、kendryte-standalone-sdkの中のsrcフォルダにコピー

     すれば、hello_worldと同等にコンパイル可能です。シリアルポートやLCDを使用するものはそのまま

     動作しました。しかし、カメラ、SDカード、I2S等を使用するサンプルは端子番号を直接設定しており

     Maix Bitでは端子番号を変更する必要がありますので、ご注意下さい。Maix Bitの回路図をダウン

     ロードし、それを見ながら変更しましたが、サンプル毎にやり方が異なるので結構面倒でした。

 

 (4)その他のサンプル

   ・MaixPyのビルド

      Kendryte SDKを使えば、MaixPyを自分でカスタマイズしてビルドすることが可能になります。

      ここに説明がありますが、少し間違いがあります。私が行った手順は次の通り。

      (python3や最新のcmakeを別途インストールしておいて下さい。)

        >>git clone https://github.com/sipeed/MaixPy.git

        >>cd MaixPy

        >>git submodule update --recursive --init

        >>cd projects/maixpy_k210

        >>python3 project.py --toolchain /opt/kendryte-toolchain/bin --toolchain-prefix riscv64-unknown-elf- config

        >>python3 project.py clean_conf

        >>python3 project.py build

      そして、Maix Bitに書き込む場合は、

        >>python3 project.py -B bit_mic -p /dev/ttyUSB0 -b 1500000 -S flash

      で行えます。(buildの下の「maixpy.bin」をkflashで書き込んでもOK)

       それで、見つけました! wavの再生関数に間違いが! そこを直したら、見事、ノイズが消えました。

      困るなぁ、こんなミスされては。

 

   ・Genesisエミュレータ

      Genesis(日本名:メガドライブ)エミュレータをK210に移植した方がいました。そのソースコードは

     Kendryte SDKで書かれており、説明通り実行すると無事、コンパイルできました。ROMコードは、

     適当に探して下さい。但し、オープニングが見れるだけで、キー入力も、音も出ません。

      そこで、キー、DAC、アンプ、スピーカー、リチウムイオン電池等を半田付けし、キー入力関数

     とオーディオデータのI2S出力関数を追加して、ちゃんとゲームできるようにしてみました。

     音は悪い(エミュレータの実力か、私のコードが悪いのか?)ですが、楽しめますよ。

 

5.アプリケーション

 (1)Maixカメラ

   Maix Bit Suitを使って、カメラを作ってみました。と言っても、カメラとLCDパネルも付いてますので、

   やったことは、単3形リチウム2次電池と充電基板を接続しただけ。一応、この構成で、A.I.物体認識

   を実行し続けて2時間余り動作しました。

 

 (2)Maixオーディオプレイヤ

    Maix BitにはオーディオDACやアンプが付いていませんので、サンプルソフトを実行しても音無し。

   残念なので、I2S対応DACとアンプを繋いでみました。が、実はノイズ対策に非常に苦労しました。

   でもDACの電源ノイズ以外は、ソフトの問題だったようです。注意点は次の通り。

 

   1.I2Sのデータフォーマットには、I2S、MSB-Justified(Left-Justified)、LSB-Justified(Right-Justified)

     の3通りがあり、チップ毎に対応/非対応が異なる。また、マイコンのソフトも、DACに合わせて

     変更する必要がある。なお、MaixシリーズはLSB-Justified(Right-Justified)が標準。

   2.オーディオ用スピーカーと圧電ブザーでは、駆動方法が異なるようです。(電流駆動と電圧駆動?)

     上の写真はインピーダンス8Ωのスピーカーを使っており、大きな音を出すためオーディオ用アンプ

     を使用しています。逆に、オーディオ用アンプで圧電ブザーは鳴りませんでした。

   3.ノイズ対策が必須。主なものでも、I2Sのタイミング、電源、アンプの周辺回路、ノイズフィルタなど、

     色々とあります。上の写真の基板にESP32を接続すると電源ノイズ対策だけでクリアな音が出る

     ようになりました。ノイズに最も効いたのはDACの電源で、Maixduinoのように専用レギュ

     レータを搭載するのが良いです。なお、Maix BitのMaixPyで音楽を再生すると大きなノイズが

     発生しますが、ソフトの問題と考えます。(詳細は下記参照)

 

    ちなみに、上の写真で、表面実装のICを無理やり実装していますが、これがPT8211という他のMaixボード

   で使用されているI2SのDACです。それに、LM386互換のオーディオアンプを2つ、インピーダンス8Ωの

   28mm径スピーカーを2つ実装しています。後は、ノイズと音量調整のための可変抵抗、各種コンデンサ

   だけのシンプルな回路です。こんな回路でも、ESP32ではクリアで結構良い音がしました。

    しかし、Maix BitでMaixPyのWAV再生関数を使うと、右の音だけ極端にノイズが多いです。

   別のチップを使ったI2Sオーディオアンプ基板(MSB-Justifiedだったので使ってません)でも、やはり片方

   だけノイズだらけでした。

   Kendryte SDKのサンプルソフトで確認したところ、K210に問題はなく、ソフトの問題のようです。

   play_pcmというサンプルは音楽データがコードに埋め込まれていて問題なく再生できました。また、

   sd_cardというサンプルにはSDカードのwav再生機能があり、44.1KHzのwavもきれいに再生できました。

    それで、MaixPyのソースコードを調べると、オーディオデータのボリューム調整を行っている部分に

   間違いがありました。直したら、見事、ノイズが消えました。

    なお、Maix BitのI2Sオーディオ回路図は次の通り。

     maix_audio.pdf(20'5/10更新)

 

Arduinoの紹介はこちら。 

 

「ESP32の使い方」はこちら。

 

「Tang Primer:中国製FPGAでRISC-Vの設計に挑戦」はこちら。