こんにちは、岸田です。最近発売となったM5GOという商品があります。「M5Stackと何が違うんだろう……?」だとか、「調べても全然情報が出てこなくてこまるなぁ……」という声がどこからともなく聞こえてくる(気がする)ので、スイッチサイエンスでもいろいろセットアップやサンプルの紹介などをしてみようと思います。
M5GOは、一見するとブロックと接続できそうな溝がついた、少し大きめのM5Stackのように思われます。実は、M5StackはArduino IDEやesp-idfなどローカルのPC上での開発環境が基本となっているのに対して、M5GOははじめからM5cloudのような、WEBブラウザベースの開発環境が用意されている点が違います。言ってしまえば、最初から書き込まれているファームウェアが異なります。基本的にはM5Cloudのような環境で開発を行うのですが、M5GOではさらに、M5GOのIoTスターターキットに含まれているセンサ類のサンプルコードが標準で提供され、より「つなげて実行するだけ」にフォーカスした構成になっています。
目次
- 外観
- セットアップ
- サンプルを実行してみる
- ファームウェアをアップデートする
- 少し前に買った方や、アップデートした記憶がない方は先にこちらを読むことをおすすめします。
- もっと使いこなす
外観
箱と開けた様子。いろいろと部品が入っています。
M5Stack Gray と並べてみました。正面から見ると色以外は同じように見えますが、後ろ側が特に異なります。
側面からみると、M5GOのほうが分厚く、M5Stackにみられた横向きのピンソケットはGROVEコネクタに置き換えられています。その実、M5Stackのように下部モジュールを取り外すには底面のネジを外す必要があります。
同梱のセットアップガイド。(セットアップ完了後は)「m5go.comに接続してね!」と表記されているように見えますが、実際はデバイスIDを含むURLにアクセスする必要があるため、そのIDを知らない限りプログラムの転送はできません。詳しくは後述します。
セットアップ
まず電源をいれると、こんな画面になります。ここでしばらく待っていると、サンプルのじゃんけんプログラムが読み込まれます。まずはM5GOを手元のWi-Fi アクセスポイントに接続させるためにセットアップが必要になります。じゃんけんプログラムが呼ばれる前に、右側のボタンを押しましょう。
押すと、「スマートフォンのWi-FiをSSID: M5GO-7eb4につなげてね!」と出ます。ここで、スマートフォンのWi-Fi設定を開きます。今回はスマフォでセットアップしていますが、Wi-Fiが搭載されているPCでも大丈夫でしょう。
先程のSSIDが表示されていますね。接続します。
スマートフォンが接続されると、M5G側にQRコードが表示されます。このコードを読むと、「http://192.168.4.1」と出ます。スマートフォンのブラウザでこのURLを開きましょう。
スマートフォン側では、アクセスポイントとパスワードの入力画面が出ます。このあたりはM5Cloudのファームウェアとよく似ていますね。SSIDを選んで、パスワードを入力します。
Wi-Fiの設定が終わると、M5Goが再起動します。古いファームウェアの場合、再びじゃんけんプログラムが呼ばれる前に、今度は左側のボタン(Guide)を押します。新しいファームウェアでは、この画面はスキップされてGuideを押した後の画面に直接移るようです。
ここでSkipを選ぶと、センサ類の確認をせずに直接Wi-Fiへ接続します。今回は、動作確認も含めてNextを選びました。以降は、Nextを押すと次の機能に移ります。
内蔵機能のテストができます。スピーカーやマイクの音量チェックに…
ジャイロセンサによる傾き検知。スイッチサイエンスで購入したもので、もし反応しないようであれば、こちらよりご連絡ください。
カラーLEDのテスト。内部にフルカラーLEDが入っているのは、M5Stackと違いますね。
Env. SENSORを側面のPORT Aに接続すると、温湿度・気圧が読めます。
Motion Sensorを上面のPORT Bに接続すると、動体検知ができます。
RGB LEDを接続。
IR REMOTEは、赤外線リモコンの信号をやり取りできます。
ANGLE Sensorは、ツマミの位置に従って数値や側面の発光量が変わります。
全センサモジュールの動作確認もできたことなので、Wi-Fiに接続しましょう。
すると、Wi-Fiにアクセス中……と表示され、暫く待つとQRコードが表示されます。
このQRコードは、「http://io.m5go.com/#/デバイスID」という内容で、このアドレスをWEBブラウザで開くことで開発環境に入ることができます。いまのところURLを知っていれば誰でもアクセスできるようなので、気をつけましょう。
アクセスすると、開発用のポータルサイトが開きます。都合上、パソコンのブラウザ画面をキャプチャしていますが、スマートフォンでも同様に操作が可能です。引き続き、内容を見てみましょう。
ちなみに、記事執筆時点で付属のガイドやQRコードの横に書かれている m5go.com にアクセスすると、 m5go.com/#/ にリダイレクトされます。ページの見た目は「http://io.m5go.com/#/デバイスID」にアクセスしたときとよく似ていますが、デバイスID欄が空なので、どのM5GOにも接続していません。io.m5go.com と同じようにデバイスIDをURLに付け足すと、手元のM5GOとの接続が確立します。このあたりは、アップデートで挙動が変わるようなので、QRコードで表示されているURLをブックマークしておくとよいでしょう。
サンプルを実行してみる
Lessonをクリックし、1-1 HelloWorldの右の三角アイコンをクリックします。
すると、M5GOの画面に、HelloWorldと表示されました。あっけないですが、ブラウザ上のクリックをトリガーとしてM5GOにスクリプトがWi-Fi経由で転送され、実行されたということです。スクリプトそのものは、先程の三角アイコンの横の <> というアイコンを押すことで見れます。
1-2 Draw Panda は……
パンダが描かれます。
画面を戻って、Blockyを選ぶと、おなじみの画面が出てきます。いい感じに組んであげると、文字表示もすぐにできます。
Live Codeを選ぶと、micro pythonスクリプトを書いて即座に実行できます。
例えば、次のようなコードを書いて、右下の再生ボタンを押してみましょう。
from m5stack import * import sys, time, _thread, machine def clock(): rtc = machine.RTC() sys.tz('JST-9') print("Synchronize time from NTP server ...") lcd.println("Synchronize time from NTP server ...") rtc.ntp_sync(server="ntp.nict.jp") lcd.clear() lcd.setBrightness(200) lcd.font(lcd.FONT_7seg, fixedwidth=True, dist=16, width=2) while True: d = time.strftime("%Y-%m-%d", time.localtime()) t = time.strftime("%H:%M:%S", time.localtime()) lcd.print(d, lcd.CENTER, 50, lcd.ORANGE) lcd.print(t, lcd.CENTER, 130, lcd.ORANGE) time.sleep(1) _thread.start_new_thread('Clock', clock, ())
すると、画面がデジタル時計に変わります。もちろん、NTPサーバーから時刻を取得しているのでずれはありません。
このように、ブラウザでガンガンプログラムを書いて、オンラインでコードをアップデートしていくことができます。Arduinoのようなスケッチのコンパイル&書き込み待ちもありません。どんどん書いていけます。無線LANにつながってさえいれば良いので、まさにおうちIoTみたいな使い方に適していますね。ちなみに、実行時のログ(micro pythonで記述したprint("hogehoge")
)はシリアルポート経由で確認できるので、どうにもバグが取れないというときは有線接続してデバッグもできます。あまり配線とかはんだ付けとかせずに、できればPythonとかでサクッとセンサとかGROVEを使いたいなぁ、なんてときにM5GOはぴったりですね。
使い方や使ってみた様子は以上です。以下は、参考資料としてお読みください。
ファームウェアをアップデートする
ファームウェア更新は以下のように行います。
- Flash Download Toolsをダウンロードする
- 起動後、「ESP32 DownloadTool」を選択する
- M5GOのリポジトリをクローンしてくる
- 以下の設定で書き込む
ファームウェアを書き換えると、Wi-Fi設定が初期化されるので、再びセットアップしましょう。
ファームウェアのバージョン確認方法は、Wi-Fiに接続後、M5GOをUSBケーブルでPCに接続した状態(MicroPythonが有効な状態)で、以下のコマンドをシリアルモニタ等から送ってください。ちなみに、7月頭に更新された v0.15 となっているファームウェアを書き込むと、 0.2.0 という応答になります。
>>> from M5GO import VERSION >>> print(VERSION) 0.10
もっと使いこなす
M5GOで実行されているMicroPythonと、PCとの間でファイルのやり取りができるツールがあります。このツールを使うと、M5GO内部にスクリプトをダウンロードしたり、書き換えたりできます。今回は、Windowsでこのツールの実行環境を用意してみます。
今回使うツールは、Python3を利用するので、導入しましょう。PowerShellなどからpipでパッケージがインストールできるようになったら、pip install adafruit-ampy
と入力し、ampyというツールをインストールします。
PS > ampy Usage: ampy [OPTIONS] COMMAND [ARGS]... ampy - Adafruit MicroPython Tool Ampy is a tool to control MicroPython boards over a serial connection. Using ampy you can manipulate files on the board's internal filesystem and even run scripts. Options: -p, --port PORT Name of serial port for connected board. Can optionally specify with AMPY_PORT environemnt variable. [required] -b, --baud BAUD Baud rate for the serial connection (default 115200). Can optionally specify with AMPY_BAUD environment variable. -d, --delay DELAY Delay in seconds before entering RAW MODE (default 0). Can optionally specify with AMPY_DELAY environment variable. --version Show the version and exit. --help Show this message and exit. Commands: get Retrieve a file from the board. ls List contents of a directory on the board. mkdir Create a directory on the board. put Put a file or folder and its contents on the... reset Perform soft reset/reboot of the board. rm Remove a file from the board. rmdir Forcefully remove a folder and all its... run Run a script and print its output.
認識されているポート番号を実行時に引数にとってあげると、M5GOにアクセスできます。
PS > ampy -p COM11 ls flash
環境変数に、ポート番号を保存しておくと、省略できます。
PS > $env:AMPY_PORT="COM11" PS > ampy ls flash
先程から見えている flash
が、M5GO内蔵のSPI FLASHです。このディレクトリの中を覗くと、保存されているファイルが見えます。
PS > ampy ls /flash utils.mpy wificonfig.mpy res boot.py m5stack.mpy img examples M5GO.mpy lib wifisetup.mpy fonts wificonfig.json _main.py
例えば、先程の時計スクリプトをローカル上で編集し、直接M5GOに転送してあげることができます。下の画像は、VisualStudio Codeで編集したスクリプトを、ampyで転送したときの画面です。このとき、M5GOは上の方でオンラインでスクリプトを転送したときと同じように動いています。
ゴリゴリ開発したり、オリジナルのM5GOへとカスタマイズするときに重宝しそうです。
筆者注:バグなど、記事作成時点で以下の不具合を確認しています。
- ファームウェアのバージョンが0.11以下では、rtc.ntp_syncの引数にタイムゾーンが設定できない(
rtc.ntp_sync(server="ntp.nict.jp", tz='JST-9')
とできない)というバグがあるため、こちらを参照して動くようにしてあります。バージョン0.2.0では、この問題はおきないようです。 - サンプルの、 2-1 Meteorological station を実行するとOSError: I2C bus error (6) というログが出て、センサの値が読めない状況になります。