Sipeed M1 dockを動かしてみた

# はじめに

Seeed studioからK210というKPU(AIアクセラレータ付き)のマイコンボード「[Sipeed M1 dock suit](https://www.seeedstudio.com/Sipeed-M1-dock-suit-M1-dock-2-4-inch-LCD-OV2640-K210-Dev-Board-1st-RV64-AI-board-for-Edge-Computing.html)」が発売されているので、試してみました。
マイコンボード自体の詳しい説明は公式ドキュメントもありますので省きますが、主に下記のような特徴を持つK210と呼ばれるモジュールにブレークアウトボードをくっつけた基板に、OV2640カメラと2.4インチLCDをセットにしたキットがSipeed M1 dock suitです。

- RISC-V×2で構成されるCPU
- CNNアクセラレータであるKPU
- ハードウェアFFTに対応したAPU
- そのほかGPIO、SPI、I2CなどのIOを持つ

今回はSeeed studioの公式サイトから直輸入で購入しましたが、注文から到着までおよそ2週間でした。ChinaPost経由でボコボコの箱が届きましたが、中身は無事でした笑
技適マークの関係でWiFi無しモデルを選択しましたが、WiFi付きモデルも存在します。
一つ18.9ドルととてもお安いです。
Tiny-yoloを10fps以上の速度で動かせる(後述)モジュールとしては、消費電力や価格の面でコストパフォーマンスが非常に良いのではないでしょうか。TPUやNCSなどのUSBアクセラレータタイプのモジュールと比較しても、シングルボードですべて完結するので楽ちんです。

購入時送料の関係からマイクアレイやステレオカメラ、一回り小さな開発キットを購入しましたので、別の機会に記事を書きたいと思います。
ちなみに単体のマイクを買ってあとから気づきましたが、M1 dockにはマイクが内蔵されていました。

- Sipeed 6+1 Microphone Array for Dock/Go/Bit
- Sipeed I2S Microphone for MAIX Dev. Boards
- Sipeed MAIX Binocular Camera for Dock/Go/Bit
- Sipeed MAix BiT Kit for RISC-V AI+IoT


※こちらの記事を参考にさせていただき、試しています。
https://qiita.com/Ke_N_551/items/55c6442a53ffc0072363

# ハードウェアセットアップ

パッケージは下の写真のような物品で構成されています。M5stackの箱によく似た感じ。

![P_20190511_115640_vHDR_Auto-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/1bb31f87-cff1-6559-55f2-d20e50387100.jpeg)



ハードウェアのセットアップは、LCDとカメラのフレキケーブルを接続すればおしまい。簡単ですね。フレキケーブルを接続する面に、シリコンマイクやTFカード(microSDカード)スロットが見えます。

![P_20190511_115939_vHDR_Auto-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/d942af9f-5b98-2942-e905-48a2e947d3e0.jpeg)


同時に購入したMAIX BiT kitと比較すると、モジュール部分がシールドで覆われたものか否か等微妙に構成が異なるようです。

![P_20190512_115325_vHDR_Auto-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/5d7acfe0-4cb5-3c23-48ac-0b8a722d6d0c.jpeg)

ちなみにケースは[Thingiverseより拝借](https://www.thingiverse.com/thing:3377443)しました。が、精度の問題か微妙にはまらないので、そのうち作り直そうと思っています。

# ファームウェアの準備

[公式の手順](https://maixpy.sipeed.com/en/get_started/upgrade_firmware.html)に従います。この記事では、Ubuntu16.04で試した内容を記載しています。

## USBシリアル接続環境の準備

M1 dockではCH340をUSBシリアル用チップとして使っていますので、ドライバをインストールしておきます。ドライバのインストールがうまくいっていれば、USB接続時に/dev/ttyUSB*で認識されるはずです。参考までに、lsusbの結果を張り付けておきます。

    $ lsusb
    Bus 001 Device 008: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

うまく接続されていれば、青い画面が表示されるはずです。

![P_20190511_130052_vHDR_Auto-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/e063045b-4de4-a4a9-c95a-a3efdfdcf4fa.jpeg)


## ファームウェアの焼きこみ

ファームウェア焼きこみ用のツールが用意されていますので、そちらを使えるようにします。
Python3およびpyserialの環境構築を忘れずに。

    $ git clone https://github.com/sipeed/kflash.py

続いて、焼きこみ用のファームウェアとサンプルで利用するモデルをダウンロードしておきます。2019年5月11日現在で最新の、[v0.3.1](http://dl.sipeed.com/MAIX/MaixPy/release/maixpy_v0.3.1/)の中から

- maixpy_v0.3.1_full.bin
- face_model_at_0x300000.kfpkg

の二つをダウンロードしました。続けて2つのファイルをフラッシュしてあげると、MicroPythonプログラム側からモデルを読み込めるようになります。
下記のように、それぞれ「Rebooting...」まで行けば書き込み完了です。

    $ sudo python3 kflash.py -p /dev/ttyUSB0 -b 2000000 -B dan maixpy_v0.3.1_full.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 
    [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 
    Programming BIN: |=============================================| 100.0% 67kiB/s
    [INFO] Rebooting... 


    $ sudo python3 kflash.py -p /dev/ttyUSB0 -b 2000000 -B dan face_model_at_0x300000.kfpkg 
    [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 facedetect.kmodel into 0x00300000 
    Programming BIN: |=============================================| 100.0% 71kiB/s
    [INFO] Rebooting...


# サンプルプログラムの実行

シリアル接続すると、MAIXPYというMicroPythonのカスタマイズが動作します。
正しく起動していれば、下記のようにプロンプトが表示されるはずです。うまく表示されない場合は、RSTボタンやCtrl+C入力を試してみると良いでしょう。

    [MAIXPY]Pll1:freq:398666666                                                     
    [MAIXPY]Pll2:freq:45066666                                                      
    [MAIXPY]cpu:freq:416000000                                                      
    [MAIXPY]kpu:freq:398666666                                                      
    [MAIXPY]Flash:0xc8:0x17                                                         
    heap0=0x801c97b8                                                                
    [MaixPy] sd_init | SD_CMD0 is FF                                                
                                                                                    
     __  __              _____  __   __  _____   __     __                          
    |  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /                          
    | \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /                           
    | |\/| |   / /\ \     | |     > <   |  ___/    \   /                            
    | |  | |  / ____ \   _| |_   / . \  | |         | |                             
    |_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|                             
                                                                                    
    Official Site : https://www.sipeed.com                                          
    Wiki          : https://maixpy.sipeed.com                                       
                                                                                    
    MicroPython v0.3.1 on 2019-04-27; Sipeed_M1 with kendryte-k210                  
    Type "help()" for more information.                                             
    >>>

基本的にはPythonと同様にプログラミングできるのですが、利用できるモジュールは下記の通り確認ができます。

    >>> help('modules')                                                             
    KPU               fpioa_manager     os                uhashlib                  
    Maix              gc                pye_mp            uheapq                    
    __main__          hashlib           random            uio                       
    _boot             heapq             re                ujson                     
    _thread           image             sensor            uos                       
    _webrepl          json              socket            urandom                   
    array             lcd               struct            ure                       
    audio             lvgl              sys               usocket                   
    binascii          lvgl_helper       time              ustruct                   
    board             machine           touchscreen       utime                     
    builtins          math              ubinascii         utimeq                    
    cmath             math              ucollections      uzlib                     
    collections       micropython       ucryptolib        video                     
    cpufreq           nes               uctypes           websocket                 
    errno             network           uerrno            zlib                      
    Plus any modules on the filesystem  

[プログラムを実行する方法](https://maixpy.sipeed.com/en/get_started/edit_file.html)はいくつもありますが、今回はプロンプトから直接コードを入力して実行する方法をとりました。
プロンプト上でCtrl+Eを押すと、コピペモードになりますので、下記のコードを貼り付けて実行しました。コピペ後、Ctrl+Dを押すと即座にプログラムが実行されます。

    import sensor
    import image
    import lcd
    import KPU as kpu
    import utime
    
    lcd.init()
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.set_hmirror(0)
    sensor.run(1)
    task = kpu.load(0x300000) # you need put model(face.kfpkg) in flash at address 0x300000
    # task = kpu.load("/sd/face.kmodel")
    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)
    prev_time = utime.ticks_us()
    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())
            now_time = utime.ticks_us()
            print("FPS:" + str(1000000/utime.ticks_diff(now_time, prev_time)) + " Detections:" + str(len(code)))
            prev_time = now_time
        a = lcd.display(img)
    a = kpu.deinit(task)

基本的には[サンプルプログラム](https://github.com/sipeed/MaixPy_scripts/blob/master/machine_vision/demo_find_face.py)をそのまま動かしているのですが、フレームレートを測定するためのコード(7,25,26行目)と画面反転を正すためのコード(11行目)を入れています。
ちなみに、print文の動作が緩慢なので23行目をコメントアウトしています。

余談ですが、OpenMVのポーティングであるimageモジュールやカメラを扱うためのsensorモジュールなど、K210ボード用のライブラリがありますので、[ドキュメント](https://maixpy.sipeed.com/en/libs/machine_vision/)を一読されると色々できて楽しいと思います。(NES game emulatorとかライブラリ化されてる…笑)

さて、実際に実行すると下記のようにプロンプト表示がされます。
安定して11FPSを超えていることがわかります。

    FPS:11.60375497510995 Detections:6   
    FPS:11.60564034120583 Detections:6                                           
    FPS:11.60725685698699 Detections:6                                           
    FPS:11.59864063931707 Detections:6                                           
    FPS:11.86718249353239 Detections:5                                           
    FPS:11.60510160266453 Detections:5                                           
    FPS:11.59272440616269 Detections:5 

![P_20190512_105059_vHDR_Auto_HP-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/ca320d6d-db40-b42a-7df0-b4e438249607.jpeg)

認識対象は、Googleで「顔」と画像検索させた結果です笑
推論実行時の消費電力は0.24Aでしたので、5V動作で1.2W程度と非常に優秀です。
Ctrl+Cを押すと、プログラムが終了してプロンプトに戻ってきます。


# 今後

そのうち、下記を試してみたいと思います。

- 他の学習済みモデルの変換と実行
- GPIOの利用
- ステレオカメラモジュールの利用

それでは！