Ubuntu Weekly Recipe

第587回RISC-Vベースの“AIoTカメラ”であるM5StickVをUbuntuで使う

M5StickVはRISC-VベースのAIoT(AI+IoT)カメラです。今回はこのM5StickVを使うにあたって、Ubuntu側からファームウェアアップデートや既存のプログラムの実行などを行ってみましょう。

M5StickVの概要

M5StickVはM5Stackが販売している、RISC-VベースのSoCを搭載した小型カメラデバイスです。その大きな特徴は、SoC内にニューラルネットワーク用のアクセラレーターを搭載していることでしょう。これにより親指大サイズのデバイスでありながら、リアルタイムでの顔認識など、高度なAI機能を驚くほど低消費電力で実現できています。

M5StackはもともとスタッカブルなIoTデバイスであるM5Stackや、スティック型のM5StickCなどを販売してきました。これらの従来機がEspressif SystemsのマイクロコントローラーであるESP32を採用しているのに対して、M5StickVはCanaanの64ビットRISC-V SoCであるKendryte K210を採用しています[1]⁠。

さらに親指大サイズの筐体の中にVGAサイズのイメージセンサーと135x240の小型液晶ディスプレイ、ジャイロ、スピーカー、バッテリー等を同梱することで、⁠買って取り出せばすぐ顔認識アプリを動かせる」という素晴らしいユーザー体験を提供できるデバイスとなっているのです。

M5StickVはスイッチサイエンスを始めとして国内のいくつもの店舗で入手可能です。当初の品薄感も少しずつ解消しているようですので、いくつかのサイトを回ってみると良いでしょう。今回はM5StickVを入手できたものとして、まずは実際にそのアプリを体験してみます。

35mmフィルムが入りそうなサイズのケースから、青い筐体を取り出します。microSDカードスロットがある面の、ボタンを2秒程度長押しすると「チーン!」という音とともに画面にロゴが表示されるはずです。あとはカメラのレンズを人の顔に向けます。もし得体の知れないデバイスを他人に向けるのが憚られるようであれば、ディスプレイ上の顔画像でもかまいません。うまく「人の顔」として認識されれば[2]⁠、白い枠が表示されるはずです。カメラの移動に合わせてリアルタイムに顔を認識していくさまに、ひとしきり感動しましょう。

電源を切るにはmicroSDカードスロットのある面のボタンを6秒以上押し続けてください。ちなみに満充電の場合は電源が切れずに再起動してしまうようです。多少放電してから電源を切ると良いでしょう。

ファームウェアのアップデート

M5StickVの初期ファームウェアは、microSDカードとの相性問題などいくつかの不具合・機能不足がありますので、本格的に使う前にファームウェアをアップデートすることをおすすめします。

ファームウェアのアップデートはM5StickVのUSB Type-CポートとPCを接続して行います。データ通信・充電両対応のケーブルが必要です。とりあえずはM5StickVに付属のケーブルを使うと良いでしょう。アップデート用のソフトウェアはWindowsやmacOS、Linux用がそれぞれ用意されています。今回はUbuntuでファームウェアをアップデートする方法を紹介しましょう。

GUI版・CLI版どちらでもアップデートできますので、それぞれの方法を紹介します。

シリアルポートの権限設定

Ubuntuからファームウェアをアップデートするには、シリアルポートへの読み書きの権限が必要です。Ubuntuの場合、M5StickVとPCをUSBケーブルで繋いだら、udevが自動的にシリアルポートデバイスを生成します。このデバイスはdialoutグループに所属するユーザーのみが読み書きできるようになっているため、アップデートするユーザーをdialoutグループに所属させておきましょう[3]⁠。

まず現在のユーザーをdialoutグループに追加します。

$ sudo usermod -a -G dialout $(whoami)

あとは一度ログインしなおせば、変更が反映されます。idコマンドで確認してみてください。ちなみにdialoutグループに追加したあと、次のようにnewgrpコマンドを実行すると、ログインし直さなくても一時的にプライマリーグループをdialoutに変更できます。

$ newgrp dialout

ただし大抵のLinuxディストリビューションでは、プライマリーグループを変えてしまうとファイルの作成時のumask値が変わってしまったり、グループオーナーが通常と異なってしまうため、よくわからないのであればおすすめはしません。どうしてもログインし直すことができない際の回避手段として考えてください。

ファームウェアのダウンロード

ファームウェアはM5StickV Quick Startの「Download」にある「click to download firmware」をクリックするとダウンロードできます。9月20日時点での最新版はFirmware_0830です。ファイル名はM5StickV_Firmware_0830_beta.kfpkg「beta」が付いていますが、どうやらこれが正式版のようです。

ちなみにFirmware_0813からフォーラムに変更点が記載されるようになったようです。最新のファームウェアをインストールする前に確認すると良いでしょう。

GUI版によるアップデート

GUI版のアップデートツールである「Kflash_GUI」はQtで作られたソフトウェアです。ソフトウェアアーカイブの中に必要なライブラリは一通り同梱されているので、アーカイブをダウンロードして展開すればすぐに使えるはずです。

Kflash_GUIはM5StickV Quick Startの「Flash」にあるLinux版のリンクをクリックすれば入手できます。

$ cd ~/ダウンロード
$ tar xvf kflash_gui_v1.5.3_linux.tar.xz
$ cd kflash_gui/

同梱されているkflash_guiを実行すれば、カレントディレクトリ配下にあるライブラリをロードし、アップデートツールが立ち上がります。

$ ./kflash_gui
図1 アップデートツールが立ち上がった直後
画像

左上の一番左のボタンは言語切り替えです。とは言え英語と中国語(簡体字)しかサポートしていないので英語のままで問題ありません。真ん中のボタンはテーマです。右端のボタンを押すとバージョンや直近の変更履歴などが掲載されます。いずれのボタンもそこまで使うことはないはずです。

図2 必要な情報の設定
画像

設定が必要なのは「Open File」によるファームウェアファイルの選択と、⁠Board」での「M5StickV」の選択、さらに「Port」でのシリアルポートデバイスファイルの指定です。それ以外は初期状態のままでかまいません。なお、PortはM5StickVが繋がっていないと選択できません。設定が完了したらウィンドウ下部の「Download」をクリックしてください。

図3 ファームウェアの更新
画像

ファームウェアの更新にはそれなりの時間がかかります。しばらくそのままで待ちましょう。

図4 ファームウェアの更新完了
画像

更新が完了したら「Download success」と表示されます。Kflash_GUIを終了してください。

ちなみにシリアルポートへの書き込み権限がない場合は、次のようなエラーダイアログが表示されます。その場合はdialoutグループに所属しているかどうかなど、権限の設定を今一度確認し直してください。

図5 書き込み権限がない場合のエラーダイアログ
画像

Kflash_GUIの設定は~/.config/kflash_gui/kflash_gui.confに保存されます。うまく起動できなくなったら、とりあえずこのファイルを削除してみてください。

CLI版によるアップデート

CLI版のKflashはPython 3製のアプリケーションです。ちなみにGUI版も内部ではCLI版を利用しています。このアプリケーションはpip3コマンドを用いてインストール可能です。

$ sudo apt install python3-pip
$ sudo pip3 install kflash

PySerialなど必要なライブラリも一緒にインストールされます。

CLI版のKflashを使う場合は、シリアルポートのデバイスファイルと書き込むファームウェアファイルを指定します。ボード種別は自動判定で大丈夫なようです。シリアルポートのデバイスファイルは、上記だと/dev/ttyUSB0になっています。おそらく大抵の環境はこれで問題ないはずですが、すでに別のUSBシリアルケーブルを繋いでいる場合は/dev/ttyUSBxxの部分が別の数字になりますので注意してください。

$ kflash -p /dev/ttyUSB0 ~/ダウンロード/M5StickV_Firmware_0830_beta.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] Automatically detected goE/kd233

[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 Flash:  On-Board
[INFO] Initialization flash Successfully
[INFO] Extracting KFPKG ...
[INFO] Writing maixpy.bin into 0x00000000
Programming BIN: |===========================================================================================================| 100.0% 9kiB/s
[INFO] Writing m5stickv_resources.img into 0x00d00000
Programming BIN: |===========================================================================================================| 100.0% 10kiB/s
[INFO] Writing facedetect.kmodel into 0x00300000
Programming BIN: |===========================================================================================================| 100.0% 9kiB/s
[INFO] Rebooting...

microSDカードを利用する

M5StickVにはmicroSDカードスロットが備わっています。これを利用することでファームウェアを書き換えることなくアプリケーションをインストールしたり、データを保存することが可能になります。

ただしM5StickVにはmicroSDカードとの相性問題が存在します。初期のファームウェアでは動くもののほうが少なかった状況ですが、最近のファームウェアではかなり解消されています。それでもまだ動かないものも存在するようなので、もしうまく認識されないようなら有志が作成した確認リストを参考にしつつ別のmicroSDを試してください。USBで給電しつつ動かすなら問題ないものの、内蔵バッテリーで動かしているときは認識しないなんてケースもあるようです。

microSDカードのフォーマット

M5StickVはexFATにも対応しているものの、FAT32にしておいたほうが動作する可能性が高いようです。うまく認識しないならFAT32にフォーマットしなおしてください。SDXCやSDUCはexFATが採用されているので、とりあえず試してダメだったらFAT32にします。

ちなみに最新のファームウェアなら複数パーティションも正しく認識できるようです。よって大抵の場合、あらためてmicroSDカードをフォーマットしなおす必要はないでしょう。

もし何らかの理由でパーティションをひとつにして、FAT32にしたい場合は第366回で紹介されているDisks(ディスク)を使うか、次の手順でpartedコマンドから設定します。

$ sudo parted (修正対象のストレージのデバイスファイル)
(parted) mklabel msdos
(parted) mkpart
パーティションの種類?  primary/プライマリ/extended/拡張? primary
ファイルシステムの種類?  [ext2]? fat32
開始? 0%
終了? 100%

「修正対象のストレージのデバイスファイル」の指定は慎重に行ってください。間違えるとシステムが起動しなくなります。microSDカードなら、システム内蔵のMMCコントローラー直結の場合は/dev/mmcblkXに、USB-SDカードアダプターを経由する場合は/dev/sdXになることが多いようです。Xの部分は数字だったりアルファベットだったりします。とはいえ、どれが正しいかというのを選択する方法も状況によりけりなので、不安ならDisksを使いましょう。

パーティションを作り直したら、mkfs.vfatコマンドでフォーマットしてください。

$ sudo mkfs.vfat (修正対象のパーティションのデバイスファイル)
mkfs.fat 4.1 (2017-01-24)

ほぼ繰り返しになりますが、「修正対象のパーティションのデバイスファイル」の指定は慎重に行ってください。間違えるとシステムが起動しなくなります。microSDカードなら、システム内蔵のMMCコントローラー直結の場合は/dev/mmcblkXp1に、USB-SDカードアダプターを経由する場合は/dev/sdX1になることが多いようです。Xの部分は数字だったりアルファベットだったりします。とは言え、どれが正しいかというのを選択する方法も状況によりけりなので、不安ならDisksを使いましょう[4]⁠。

microSDカードにアプリをインストール

M5StickVはアプリケーションとして内蔵Flash上のboot.pyを起動しますが、もしmicroSD上にboot.pyがあるとそちらを優先します。よって任意のアプリケーションを動かしたいのであれば、まずはmicroSDカード上にインストールしてテストすることになります。

Flash上のboot.pyがどんな内容かはこちらのスクリプトboot_py変数の中身を参照してください。boot_py変数の中身をそのままboot.pyとしてmicroSDの先頭パーティションに保存すれば、microSDのそれが優先されますし、トライアンドエラーして動作を確認できることでしょう。

たとえば次のように編集すると、起動時の音が小さくなります。

$ sed -i "s/player.volume(100)/player.volume(50)/" boot.py

標準のアプリ以外であれば、Brownieがおすすめです。カメラ上の画像から物体を検知し、ディスプレイのそばにあるAボタンを押すとその内容を読み上げてくれます。

Brownieのインストール方法はリリースページから最新のイメージをダウンロードし、その内容をそのままmicroSDカードに展開するだけです。v1.0.1の場合は20クラスの分類が可能なので、飛行機や猫、鉢植えなどの画像を画面に表示して試すと良いでしょう。

シリアルコンソールによるデバッグ

M5StickVではUSBケーブル越しにシリアルコンソールを取得可能です。Ubuntuならminicomやgkermitなどいくつかのシリアル通信ソフトウェアがありますが、今回はGNU Screenを使うことにします。

$ sudo apt install screen

screenをインストールしたら、M5StickVをPCに接続し、シリアルコンソールを表示させます。

$ screen /dev/ttyUSB0 115200
[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=0x8016fbe0-0x801efbe0
[MaixPy] init end

 __  __              _____  __   __  _____   __     __
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /
| |\/| |   / /\ \     | |     > <   |  ___/    \   /
| |  | |  / ____ \   _| |_   / . \  | |         | |
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|

M5StickV by M5Stack : https://m5stack.com/
M5StickV Wiki       : https://docs.m5stack.com
Co-op by Sipeed     : https://www.sipeed.com

[MAIXPY]: result = 0
[MAIXPY]: numchannels = 1
[MAIXPY]: samplerate = 44100
[MAIXPY]: byterate = 88200
[MAIXPY]: blockalign = 2
[MAIXPY]: bitspersample = 16
[MAIXPY]: datasize = 158760
init i2c2
[MAIXPY]: find ov7740

起動状態でscreenを接続すると、一旦リセットがかかるようです。結果として、screenの画面にはM5StickVの起動ログが表示されています。MaixPyはK210向けにMicroPythonを移植したものです。アプリケーションがPythonスクリプトであることからもわかるように、M5StickVではFreeRTOS上でPythonが動いています。

標準のアプリケーションの場合、⁠Ctrl-C」を入力するとPythonの対話的なインタプリタ(REPL)に移行します。

MicroPython v0.4.0-46-gf46e4c423-dirty on 2019-08-30; M5StickV with Kendryte K210
Type "help()" for more information.
>>>
>>>

あとは普通にPythonのREPLを使う感覚で、トライアンドエラーができます。help()と入力すると基本的な使い方が表示されます。特にソフトリセットがかかる「Ctrl-D」はよく使うことになるはずです。

>>> 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(モジュール名)でモジュールのドキュメントを表示できます。

>>> help(lcd)
object <module 'lcd'> is of type module
  __name__ -- lcd
  init -- <function>
  deinit -- <function>
  width -- <function>
  height -- <function>
  type -- <function>
  freq -- <function>
  set_backlight -- <function>
  get_backlight -- <function>
  display -- <function>
  clear -- <function>
  direction -- <function>
  rotation -- <function>
  mirror -- <function>
  draw_string -- <function>
  XY_RLUD -- 0
  YX_RLUD -- 32
  XY_LRUD -- 64
  YX_LRUD -- 96
  XY_RLDU -- 128
  YX_RLDU -- 160
  XY_LRDU -- 192
  YX_LRDU -- 224
  BLACK -- 0
  NAVY -- 15
  DARKGREEN -- 992
  DARKCYAN -- 1007
  MAROON -- 30720
  PURPLE -- 30735
  OLIVE -- 31712
  LIGHTGREY -- 50712
  DARKGREY -- 31727
  BLUE -- 31
  GREEN -- 2016
  CYAN -- 2047
  RED -- 63488
  MAGENTA -- 63519
  YELLOW -- 65504
  WHITE -- 65535
  ORANGE -- 64800
  GREENYELLOW -- 45029
  PINK -- 63519

他にも各種モジュールの使い方はMaixPy「Modules/Libs」などにまとまっています。

とりあえずディスプレイに何か文字列を表示させたいなら、次のように実行してください。

>>> import lcd
>>> lcd.draw_string(0, 0, "Test", lcd.WHITE, lcd.BLACK)

MicroPythonそのものはほぼPythonそのままです。Ubuntuに標準でインストールされているPython実装(CPython)との違いは、MicroPythonのドキュメントにまとまっていますので、そちらを参照してください。

さらにMircopython-Editorが搭載されているので、microSDカード上のファイルの編集も可能です。

>>> os.listdir("/")
['flash', 'sd']
>>> os.getcwd()
'/sd'
>>> os.listdir()
['boot.py']
>>> pye("boot.py")

キーバインドはMicropython-Editorのhelp.txtに詳細な記述がありますが、まずは「Ctrl-z」でアンドゥ、⁠Ctrl-s」で保存、⁠Ctrl-q」もしくは「Alt-q」で終了ということだけ覚えておけばなんとかなるでしょう。

おすすめ記事

記事・ニュース一覧