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グループに追加します。
あとは一度ログインしなおせば、変更が反映されます。id
コマンドで確認してみてください。ちなみに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版のリンクをクリックすれば入手できます。
同梱されている「kflash_gui
」を実行すれば、カレントディレクトリ配下にあるライブラリをロードし、アップデートツールが立ち上がります。
左上の一番左のボタンは言語切り替えです。とは言え英語と中国語(簡体字)しかサポートしていないので英語のままで問題ありません。真ん中のボタンはテーマです。右端のボタンを押すとバージョンや直近の変更履歴などが掲載されます。いずれのボタンもそこまで使うことはないはずです。
設定が必要なのは「Open File」によるファームウェアファイルの選択と、「Board」での「M5StickV」の選択、さらに「Port」でのシリアルポートデバイスファイルの指定です。それ以外は初期状態のままでかまいません。なお、PortはM5StickVが繋がっていないと選択できません。設定が完了したらウィンドウ下部の「Download」をクリックしてください。
ファームウェアの更新にはそれなりの時間がかかります。しばらくそのままで待ちましょう。
更新が完了したら「Download success」と表示されます。Kflash_GUIを終了してください。
ちなみにシリアルポートへの書き込み権限がない場合は、次のようなエラーダイアログが表示されます。その場合はdialoutグループに所属しているかどうかなど、権限の設定を今一度確認し直してください。
Kflash_GUIの設定は「~/.config/kflash_gui/kflash_gui.conf
」に保存されます。うまく起動できなくなったら、とりあえずこのファイルを削除してみてください。
CLI版によるアップデート
CLI版のKflashはPython 3製のアプリケーションです。ちなみにGUI版も内部ではCLI版を利用しています。このアプリケーションはpip3
コマンドを用いてインストール可能です。
PySerialなど必要なライブラリも一緒にインストールされます。
CLI版のKflashを使う場合は、シリアルポートのデバイスファイルと書き込むファームウェアファイルを指定します。ボード種別は自動判定で大丈夫なようです。シリアルポートのデバイスファイルは、上記だと「/dev/ttyUSB0
」になっています。おそらく大抵の環境はこれで問題ないはずですが、すでに別のUSBシリアルケーブルを繋いでいる場合は「/dev/ttyUSBx
」の「x
」の部分が別の数字になりますので注意してください。
microSDカードを利用する
M5StickVにはmicroSDカードスロットが備わっています。これを利用することでファームウェアを書き換えることなくアプリケーションをインストールしたり、データを保存することが可能になります。
ただしM5StickVにはmicroSDカードとの相性問題が存在します。初期のファームウェアでは動くもののほうが少なかった状況ですが、最近のファームウェアではかなり解消されています。それでもまだ動かないものも存在するようなので、もしうまく認識されないようなら有志が作成した確認リストを参考にしつつ別のmicroSDを試してください。USBで給電しつつ動かすなら問題ないものの、内蔵バッテリーで動かしているときは認識しないなんてケースもあるようです。
microSDカードのフォーマット
M5StickVはexFATにも対応しているものの、FAT32にしておいたほうが動作する可能性が高いようです。うまく認識しないならFAT32にフォーマットしなおしてください。SDXCやSDUCはexFATが採用されているので、とりあえず試してダメだったらFAT32にします。
ちなみに最新のファームウェアなら複数パーティションも正しく認識できるようです。よって大抵の場合、あらためてmicroSDカードをフォーマットしなおす必要はないでしょう。
もし何らかの理由でパーティションをひとつにして、FAT32にしたい場合は第366回で紹介されているDisks(ディスク)を使うか、次の手順でparted
コマンドから設定します。
「修正対象のストレージのデバイスファイル」の指定は慎重に行ってください。間違えるとシステムが起動しなくなります。microSDカードなら、システム内蔵のMMCコントローラー直結の場合は「/dev/mmcblkX
」に、USB-SDカードアダプターを経由する場合は「/dev/sdX
」になることが多いようです。「X
」の部分は数字だったりアルファベットだったりします。とはいえ、どれが正しいかというのを選択する方法も状況によりけりなので、不安ならDisksを使いましょう。
パーティションを作り直したら、mkfs.vfat
コマンドでフォーマットしてください。
ほぼ繰り返しになりますが、「修正対象のパーティションのデバイスファイル」の指定は慎重に行ってください。間違えるとシステムが起動しなくなります。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のそれが優先されますし、トライアンドエラーして動作を確認できることでしょう。
たとえば次のように編集すると、起動時の音が小さくなります。
標準のアプリ以外であれば、Brownieがおすすめです。カメラ上の画像から物体を検知し、ディスプレイのそばにあるAボタンを押すとその内容を読み上げてくれます。
Brownieのインストール方法はリリースページから最新のイメージをダウンロードし、その内容をそのままmicroSDカードに展開するだけです。v1.0.1の場合は20クラスの分類が可能なので、飛行機や猫、鉢植えなどの画像を画面に表示して試すと良いでしょう。
シリアルコンソールによるデバッグ
M5StickVではUSBケーブル越しにシリアルコンソールを取得可能です。Ubuntuならminicomやgkermitなどいくつかのシリアル通信ソフトウェアがありますが、今回はGNU Screenを使うことにします。
screenをインストールしたら、M5StickVをPCに接続し、シリアルコンソールを表示させます。
起動状態でscreenを接続すると、一旦リセットがかかるようです。結果として、screenの画面にはM5StickVの起動ログが表示されています。MaixPyはK210向けにMicroPythonを移植したものです。アプリケーションがPythonスクリプトであることからもわかるように、M5StickVではFreeRTOS上でPythonが動いています。
標準のアプリケーションの場合、「Ctrl-C」を入力するとPythonの対話的なインタプリタ(REPL)に移行します。
あとは普通にPythonのREPLを使う感覚で、トライアンドエラーができます。help()
と入力すると基本的な使い方が表示されます。特にソフトリセットがかかる「Ctrl-D」はよく使うことになるはずです。
他にもhelp(モジュール名)
でモジュールのドキュメントを表示できます。
他にも各種モジュールの使い方はMaixPyの「Modules/Libs」などにまとまっています。
とりあえずディスプレイに何か文字列を表示させたいなら、次のように実行してください。
MicroPythonそのものはほぼPythonそのままです。Ubuntuに標準でインストールされているPython実装(CPython)との違いは、MicroPythonのドキュメントにまとまっていますので、そちらを参照してください。
さらにMircopython-Editorが搭載されているので、microSDカード上のファイルの編集も可能です。
キーバインドはMicropython-Editorのhelp.txtに詳細な記述がありますが、まずは「Ctrl-z」でアンドゥ、「Ctrl-s」で保存、「Ctrl-q」もしくは「Alt-q」で終了ということだけ覚えておけばなんとかなるでしょう。