スタックチャンを作ってみた

注意

本記事はスタックチャンを作ってみるまでにかかったことを、作ってみて面白かったので記事にしたものです。探りながら進めたので、現状の最良の方法とは限りません。

スタックチャンのまとめた情報としてScrapboxが作られています。そちらの方が最新の可能性があります

scrapbox.io

それを承知の上で参照してください。

スタックチャンとは

スタックチャンとは、M5Stackを使ったシンプルなロボットを作るムーブメントです。この記事が最初のようです。

protopedia.net

会社のSlackの電子工作同好会チャンネルで、スタックチャンを作ってみたいよね、という話になり、私もいつかは作ってみたいと思っていたため、今回作ってみることにしました。

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

スタックチャンのファームウェアは、スタックチャンだと名乗ればスタックチャンのファームウェアだと言えるのだとおもいますが、主に以下の2つがメジャーなようでした。

ししかわさん作成の、ModdableフレームワークJavaScriptを使ったファームウェアフレームワーク)ベースのもの

github.com

@robo8080作成の、ArduinoベースのAIスタックチャン

github.com

主にAIスタックチャンを作ってみたいと思い、作ってみました。まだModdableフレームワークのものはビルドしていないのですが、いずれはしてみたいと思っています。

スタックチャンに必要なもの

スタックチャン自体は、ロボットの概念であるため、M5Stack製品を使った一部の機能を持ったものであっても、スタックチャンだと思えばスタックチャンとなると思われます。

一般的に、サーボを使って動き、ディスプレイを顔に見立てるスタックチャンを作るには、以下のものが必要です。他のものでも可能と思われますが、私の方で確認できたものを挙げています。

  • M5Stack: M5Stack BASIC(マイクなし)、M5Stack Core2
  • サーボモータ SG-90
  • 3Dプリントケース
  • サーボ制御用PCB
  • (任意)リチウムイオン電池(ししかわさん版で利用)、M5GO Bottom2(Core2用バッテリーボトム、タカヲさん版で利用)

一次情報

github.com

3Dプリントケースと、PCBは対応しているモノを使います。

よく使われているのは、以下の2点のようで、どちらもオープンソースハードウェアとして公開していただいています。

ししかわさん作成のm5-pantiltは、使用部品も多く、リチウムイオン電池を接続することもできます。ただし、MBUSを用いるため、Core2においてMBusの小さなPCBに付いているマイクが利用できなくなってしまいます。

タカヲさんの方は非常に部品点数も少なくシンプルです。充電池としてM5GO Bottom2を使います。ただ、USB給電であればM5GO Bottom2がなくても良いようです。

加えて、タカヲさんの方は、PCB、ケースとも販売されており、気軽に入手することができます。

Stack-chan_Takao_Base(完成品) — スイッチサイエンス

Stack-chan_Takao_Base(完成品)www.switch-science.com

タカヲさんのBoothショップ

mongonta.booth.pm

サーボモータ SG-90 は、秋月電子で購入することができます。Amazonやアリエクで購入できるものは互換品であることが多く、私の家も転がっていたSG-90ではケースにハマらないことが発生しました。秋月電子で購入するようにした方が良いようです。

akizukidenshi.com

わたしとしては、どちらが良いのかわからんかったため、両方とも作ってみることにしました。

現在では、作ってみるだけならば入手しやすくシンプルなタカヲさん版をお勧めします。

ししかわさん版を作ってみる

PCBをJLCPCBに発注し、LCSCで部品を注文しました。

MBusピンヘッダに関しては、M5Stack用のものを使用しました(他で入手できた同様のSMDタイプのピンヘッダはプラスチックの部分がM5Stackのものより厚いものしか入手できず、割高ですがM5Stackのものを使用しました)。

M5Stack用2 x 15ピンヘッダ・ソケットセット [A001]www.switch-science.com

ただし、このPCBではうまくいかないことがあり、以下の変更をしました。

  • MBusのピンソケット J2 を、結局使わないので、外す
  • スライドスイッチSW1の位置がケースにあわないので、少し下にずらす

また、実装時に以下を変更しました。

  • Port.A J6のJST_PH_S4B(スルーホール水平ソケット)ソケットが、ケースに干渉したため、JST_PH_B4B(スルーホール垂直ソケット)に変更
  • サーボ接続用のJ3、J4の、JST_EH_B3B(スルーホール垂直ソケット)がサーボの部分に干渉してすぐ抜けた、L字2.54ピンヘッダ1x3(プラスチックが長い方ではなく、短い方に付いているもの)に変更。

変更後のPCB

github.com

ケースは自宅の3Dプリンタ(AnkerM5C)で印刷しました。

他に用意した部品として、以下があります。

組み立て方などは一次情報を参考にしました。

https://github.com/stack-chan/stack-chan/blob/dev/v1.0/case/README_ja.md

github.com

これで組み立てることができました。

サーボの動きを確認する

サーボが動くかどうか検証するのに、タカヲさんがテストファームウェアを作成されています。PlatformIOという普段から使っているVS Codeマイコンファームウェア開発環境を使われているので、さくっと使うことができました。

github.com

まず、これで動くことを確認しました。これで、サーボが正しく動くことを確認できました。

AIスタックチャンを入れてみる

まずはM5Stack BASICで作っていたのですが、その次にマイクの付いたM5Stack Core2でおしゃべりできるAIスタックチャンを作ってみることにしました。

AIスタックチャンのファームウェアは以下にあります。こちらもPlatformIOが使われています。

github.com

音声発話にVOICEVOXの無料で使わせていただけるWeb版のキーの発行方法や、ChatGPTについてもドキュメントで触れられており、簡単に使うことができました。

github.com

WiFiAPIキーの設定はSDCard経由でもできますが、私の場合は直接ファームウェアに埋め込むようにしています(SDカードの準備が面倒なため)

// #define USE_SDCARD
#define WIFI_SSID "SET YOUR WIFI SSID"
#define WIFI_PASS "SET YOUR WIFI PASS"
#define OPENAI_APIKEY "SET YOUR OPENAI APIKEY"
#define VOICEVOX_APIKEY "SET YOUR VOICEVOX APIKEY"
#define STT_APIKEY "SET YOUR STT APIKEY"

https://github.com/robo8080/AI_StackChan2/blob/dfd8ba2709f59b13cacd442aa8c4a27fb3a241de/M5Unified_AI_StackChan/src/main.cpp#L41-L46

また、サーボのピンは直接指定するようにしました。

#define SERVO_PIN_X 27  //Core2 PORT A
#define SERVO_PIN_Y 19

https://github.com/robo8080/AI_StackChan2/blob/dfd8ba2709f59b13cacd442aa8c4a27fb3a241de/M5Unified_AI_StackChan/src/main.cpp#L48-L59

しかし、AIスタックチャンで喋るようになりましたが、どうもマイクが聞き取れません。一時、胴体無しで動かしていたときに、マイクが動いていたため、マイクが壊れてしまったかと思いました。これをXにポストしたところ、拾っていただき、m5-pantiltを使うとマイクが使えないことを教えていただきました。マイクはMBusに付けるPCBに含まれているため、それを外してしまうと使えないということでした。

なお、マイクがなくてもHTTP経由でスタックチャンに話しかけることができます。この機能を使って遊んでいました。

http://192.168.xxx.xxx/chat?text=こんにちは

そこで、用意していたタカヲさん基板でAIスタックチャンを作り直してみることにしました。

タカヲさん版ケースとPCBを使ってみる

PCBはJLCPCBで注文し、部品はLCSCで注文しました。

LCSCでUSBソケットを注文しましたが、上記部品は若干フットプリントが異なりますが、無理矢理さしたら刺せました。USBソケットを除き、入手しやすい部品で構成され、スルーホール部品も使えるようになっているので、やりやすいです。後から気づきましたが、USBソケットは背面から電源を挿したい場合のみ必要で、M5Stack側面USBでも大丈夫そうで、無くても良さそうです。

スライドスイッチは秋月で買えるものを利用しました(LCSCでジャストのものを見つけられなかった)。

組み立て方は、ブログに詳細に書かれているため、そちらを確認して組み立てました。

raspberrypi.mongonta.com

ファームウェアの設定も、PORT_Aをコメントアウトして、PORT_Cを使うようにするだけでした。

//#define PORT_A
#define PORT_C
#if defined (PORT_A)
  #define SERVO_PIN_X 33  //Core2 PORT A
  #define SERVO_PIN_Y 32
#elif defined (PORT_C)
  #define SERVO_PIN_X 14  //Core2 PORT C (INTERNAL UART2)
  #define SERVO_PIN_Y 13
#endif

また、タカヲさん版は「M5GO Bottom2とよばれていた」と書かれていたため、M5GO Bottom2(大容量バッテリーボトム)が必須なのかと思いましたが、なくてもUSB給電のみとなりますが使えるようです。試しに、ボトムを外してPort.Aと、PCBを繋いでみて、ファームウェア#define PORT_Aを有効かさせて、動かすことができました。

ウェイクワードを「スタックチャン」に設定して、「スタックチャン。日本のタクシーを呼べるアプリには何がある?」と質問して答えさせることができました。

M5StackCoreS3SEを使ってみようとしたが、まだうまくいっていない

M5StackシリーズのESP32-S3を使った強化版であるM5StackCoreS3が出ており、最近CoreS3からカメラ等の一部の機能を除いてお安くしたM5StackCoreS3SEというのが出ています。1万円越えのCoreS3に比べて、CoreS3SEは6500円ほどなので、非常に価格的にも魅力的です。

こちらでAIスタックチャンを動かそうと、以下のことをしてみたのですが、結果として、マイクのみ動かすことができませんでした。時間ができたらちょっと追求してみます。

  • PlatformIOでenv:esp32-s3-devkitc-1のenvに切り替える
  • platfomio.iniのlib_depsに書かれているライブラリm5stack/M5Unifiedのバージョンをm5stack/M5Unified@0.1.16に指定する。
  • m5-pantiltを使うようにSERVO_PIN_X、SERVO_PIN_Yのピンを変更する

なお、タカヲさんに残ったm5-pantileを使ってM5StackCoreS3SEを使うと完全体になるよと、そそのかしていただいたので、トライしてみていました。

M5StackCoreS3S3を既に持っていたので、すぐトライすることができました(トラックパッド化検証用のつもりだった)。

StackChanが増えた!!!

これで、わが家にAIスタックチャンが加わりました。BASIC、Core2、CoreS3と3体のスタックチャンがいるお家になりました。

今後のスタックチャンへの展望

この後スタックチャンでやりたいことと言えば以下のことがあります。

  • 薄紫色のフィラメントを買ったので、その色のボディを作る
  • VOICEVOXが無償Web版を使わせていただいているのが、ありがたいですが、申し訳ない感じがするので、自宅サーバ内にVOICEVOXを建てて、利用するようにする。
  • ChatGPT APIやVOICEVOXへの操作を、M5Stack内でやると応用が若干難しいので、自宅サーバに逃がして、応用が利くようにする。
  • 会社で、スタックチャン制作会をやる