🍣

スタックチャン で始める M5Stack

2023/02/11に公開

※この記事の内容は 2023 年 2 月時点のものです。

スタックチャン とは?

スタックチャン

スタックチャン は、M5Stack に 2 つのモーターとボディをまとったシンプルなコミュニケーションロボットで、M5Stack のネットワーク機能や各種センサーなどを組み合わせることで様々な顔を持たせることができます。

つまるところ、顔(画面)の動く M5Stack です。せっかくならかわいいほうが良いじゃないですか。と、ただ面白そうと思って買ってみたはよいけれど、なかなか一歩目が踏み出せずにいる私は思ったのです。この子となら歩んでいけるのではないかと。

スタックチャン のハードウェア作成

必要なもの

以下のものを使用しました。

組み立て

スタックチャン M5GoBottom版 組み立て方法【その2 ケースセットの組み立てと完成まで】 を参考にすることで、間違えることなく組み立てることができました。感謝!

ハンダ付けもない工作なのですが、動くまではハラハラですね!

動作テスト

stack-chan-tester - GitHub で、組み立てた スタックチャン が正常に動作するか確認します。stack-chan-tester のビルド、書き込みには Arduino IDE が必要です。

※補足) M5Burner にも公開されたようですので、「Stackchan-tester-core」または「Stackchan-tester-core2」をビルド不要で書き込むこともできます。この場合、サーボは Port.A に接続されている必要があります(2023-02-11 現在)。

以下は Arduino IDE で M5Stack のファームウェアをビルドする一般的な手順ですが、簡単に書いておきます。

セットアップ

  1. Arduino IDE を起動
  2. メニュー: Arduino > Settings...
  3. Additional Boards Manager URLs に以下を設定して「OK」
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  4. メニュー: Tools > Board > Board Manager...
  5. 「esp32」を検索して「Install」
  6. メニュー: Tools > Board > ESP32 Arduino > M5Stack-Core2 (機種名) を選択

プロジェクトのビルド、書き込み

  1. メニュー: File > Open...
  2. プロジェクトの .ino ファイルを開く
  3. メニュー: Tools > Manage Libraries...
  4. 必要なライブラリを検索して「Install」
  5. 「→」アイコン(Upload) をクリック

スタックチャン 公式ファームウェアを使う

スタックチャン を動かすには、通常の M5Stack の開発と同じように Arduino IDE や PlatformIO といった開発環境を使い、C++ でモーターを制御するファームウェアを作れば良いのですが、スタックチャン 公式ファームウェア Stack-chan - GitHub も用意されています。こちらを使うと、Moddable SDK を用いた JavaScript によるプログラムで制御できるというものです。

なのでまずはこちらを、、と思って取りかかったのですが、見事にハマりまくりました(笑)。なんとか動かすことまでできたので、その手順をメモします。開発用 PC は macOS、Homebrew はインストールされている前提です。

まずファームウェアをビルドするには、ESP-IDF および Moddable SDK が必要になります。これらを自動でセットアップする手順や Docker イメージもあるようですが、うまくいかなかったので、自前でセットアップをおこないました。

ESP-IDF のインストール

参考) Get Started - ESP-IDF

ESP-IDF は M5Stack で使われているマイコン ESP32 で動作するファームウェアを開発するための開発環境です。Moddable SDK を使う上で最新版(v5)ではうまくいかなかったため、v4.4.3 を使用しました。

その前に、ビルドに必要なパッケージをインストールしておきます。

brew install cmake ninja dfu-util python3

以下のコマンドで GitHub から ESP-IDF を適当な場所にダウンロードし、インストールします。インストールに失敗する場合、Python のバージョンや環境に不足がないか確認してみてください。(実行例)

git clone -b v4.4.3 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32

インストールしたディレクトリの export.sh を実行すると、この ESP-IDF を使用するために必要な環境変数が設定され、使えるようになります。この設定はそのシェル上でのみ有効ですので、都度実行して有効化する必要があります。(実行例)

. ./export.sh

Moddable SDK のインストール

参考) Moddable SDK – Getting Started

Moddable SDK は、JavaScript で書かれたコードをマイコン上で実行させるためのビルド環境です。ビルドには Xcode が必要なので、事前にインストールしておきましょう。

以下のコマンドで GitHub から適当な場所にダウンロードします。

git clone https://github.com/Moddable-OpenSource/moddable

ダウンロードしたディレクトリにパスを通しておきます。~/.bash_profile などに追記しておくと良いでしょう。

export MODDABLE="${HOME}/moddable"
export PATH="${MODDABLE}/build/bin/mac/release:$PATH"

ビルドします。(実行例)

cd moddable/build/makefiles/mac
make

これでインストール完了です。パスが通っていれば使えます。

スタックチャン ファームウェアのビルド

参考) Getting Started - stack-chan

ここまで準備ができたら、ようやく スタックチャン ファームウェアです。

以下のコマンドで GitHub からダウンロードします。

git clone --recursive https://github.com/meganetaaan/stack-chan.git

ファームウェアディレクトリに移動して、必要なライブラリを npm からダウンロードします。(実行例)

cd stack-chan/firmware
npm install

stack-chan/firmware/manifest.json を書き換えて、設定をおこないます。これを正しく設定しないとウンともスンとも言わずハマります。ここはデバイスの構成によって変わったりすると思うのですが、私の場合は以下のように設定しました(実はよく分かってません..)。ドキュメントは準備中のようです(#44)。

    ...
    "platforms": {
        "esp32/m5stack_core2": {
            "config": {
                "driver": {
                    "type": "pwm",
                    "pwmPan": 13,
                    "pwmTilt": 14
                },
                ...
            }
        }
    }

ファームウェアをビルドし、M5Stack に書き込みます。(実行例)

npm run build --target=esp32/m5stack_core2
npm run deploy --target=esp32/m5stack_core2

スタックチャン に顔が表示されれば成功です!

Mod の作成

ようやく JavaScript によるプログラム (Mod) の作成です。

firmware/mods/ 配下に Mod のサンプルがいくつか置いてあるのですが、準備が必要だったり Core2 ではボタンが使えないため、動作確認のためのシンプルなものを作りました。以下、首を左右に振るだけの Mod です。firmware/mods/ 配下に test/ というディレクトリを作り、設定とソースを記述します。

firmware/mods/test/manifest.json

{
    "include": [
        "$(MODDABLE)/examples/manifest_mod.json"
    ],
    "modules": {
        "*": "./mod"
    }
}

firmware/mods/test/mod.js

import Timer from 'timer'

let x = 2.0
let y = 2.0
let z = 0.2

function onRobotCreated(robot) {
    const targetLoop = () => {
        trace(`looking at: [${x}, ${y}, ${z}]\n`)
        robot.lookAt([x, y, z])
        y = -y
    }
    Timer.repeat(targetLoop, 5000)
}

export default {
    onRobotCreated
}

以下のコマンドで Mod を書き込み、動作させます。

npm run mod --target=esp32/m5stack_core2 ./mods/test/manifest.json

Installing mod...complete と表示されれば書き込みは成功です。表示されず反応がない場合は、接続や設定を確認してみてください。PC には Moddable SDK の xsdebug というデバッガーのウインドウが起動し、ログが出力されます。ログは trace() 関数で出力できます。

デバッグを終了する場合は Ctrl+C で止めます。デバッグを止めても書き込んだ Mod は動作を続けます。Mod のアンインストールは現状できない(#104)ようです。

制御の方法

参考) API - stack-chan

Mod が起動すると、export した onRobotCreated() という関数が呼ばれ、Robot のインスタンスがもらえます。

顔を動かすには、取得した Robot インスタンスに対して lookAt([x, y, z]) メソッドを呼びます。引数に指定した座標の方向に向くよう、自動的にモーターが制御されて ロボットチャン の顔が動きます。ロボットチャン から見て前方が X 座標、左(向かって右)が Y 座標、上が Z 座標となります。

さいごに

ここまでで、スタックチャン の組み立てから、ようやく首を動かすところまでできました。

JavaScript で簡単!といきたいところですが、基礎知識もないまままだ情報も少なく、なかなか難しかったです。同じように初めての方の参考になれば幸いです。

次は普通にファームウェアを作っていきたいと思います!

Discussion