注意
本記事はスタックチャンを作ってみるまでにかかったことを、作ってみて面白かったので記事にしたものです。探りながら進めたので、現状の最良の方法とは限りません。
スタックチャンのまとめた情報としてScrapboxが作られています。そちらの方が最新の可能性があります
それを承知の上で参照してください。
スタックチャンとは
スタックチャンとは、M5Stackを使ったシンプルなロボットを作るムーブメントです。この記事が最初のようです。
会社のSlackの電子工作同好会チャンネルで、スタックチャンを作ってみたいよね、という話になり、私もいつかは作ってみたいと思っていたため、今回作ってみることにしました。
スタックチャンのファームウェア
スタックチャンのファームウェアは、スタックチャンだと名乗ればスタックチャンのファームウェアだと言えるのだとおもいますが、主に以下の2つがメジャーなようでした。
ししかわさん作成の、Moddableフレームワーク(JavaScriptを使ったファームウェアフレームワーク)ベースのもの
@robo8080作成の、ArduinoベースのAIスタックチャン
主にAIスタックチャンを作ってみたいと思い、作ってみました。まだModdableフレームワークのものはビルドしていないのですが、いずれはしてみたいと思っています。
スタックチャンに必要なもの
スタックチャン自体は、ロボットの概念であるため、M5Stack製品を使った一部の機能を持ったものであっても、スタックチャンだと思えばスタックチャンとなると思われます。
一般的に、サーボを使って動き、ディスプレイを顔に見立てるスタックチャンを作るには、以下のものが必要です。他のものでも可能と思われますが、私の方で確認できたものを挙げています。
- M5Stack: M5Stack BASIC(マイクなし)、M5Stack Core2
- サーボモータ SG-90
- 3Dプリントケース
- サーボ制御用PCB
- (任意)リチウムイオン電池(ししかわさん版で利用)、M5GO Bottom2(Core2用バッテリーボトム、タカヲさん版で利用)
一次情報
3Dプリントケースと、PCBは対応しているモノを使います。
よく使われているのは、以下の2点のようで、どちらもオープンソースハードウェアとして公開していただいています。
- ししかわさん作成のケース
- ケースデータ: https://github.com/stack-chan/stack-chan/tree/dev/v1.0/case/case_SG90
- PCB(いわゆるスタックチャン基板): m5-pantilt https://github.com/stack-chan/stack-chan/tree/dev/v1.0/schematics/m5-pantilt
- タカヲさん作成のケース
ししかわさん作成の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ショップ
サーボモータ SG-90 は、秋月電子で購入することができます。Amazonやアリエクで購入できるものは互換品であることが多く、私の家も転がっていたSG-90ではケースにハマらないことが発生しました。秋月電子で購入するようにした方が良いようです。
わたしとしては、どちらが良いのかわからんかったため、両方とも作ってみることにしました。
現在では、作ってみるだけならば入手しやすくシンプルなタカヲさん版をお勧めします。
ししかわさん版を作ってみる
PCBをJLCPCBに発注し、LCSCで部品を注文しました。
- IRML6402TR https://www.lcsc.com/product-detail/MOSFETs_UMW-Youtai-Semiconductor-Co-Ltd-IRLML6402_C347504.html
- SS54 https://www.lcsc.com/product-detail/Bipolar-Transistors-BJT_Foshan-Blue-Rocket-Elec-BC857_C7429742.html
- PMEG3030EP https://www.lcsc.com/product-detail/Schottky-Barrier-Diodes-SBD_Nexperia-PMEG3030EP-115_C255587.html
- 他、スライドスイッチ、抵抗、コンデンサ、各ソケット
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
ケースは自宅の3Dプリンタ(AnkerM5C)で印刷しました。
他に用意した部品として、以下があります。
- リチウムイオン電池: DTP443442 https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5GHY
- M3x20mmネジ(ケースとM5Stackの下部2本のネジ止め)
- M3x15mmネジ(ケースとM5Stackの上部2本のネジ止め)
組み立て方などは一次情報を参考にしました。
https://github.com/stack-chan/stack-chan/blob/dev/v1.0/case/README_ja.md
これで組み立てることができました。
#スタックチャン 組み立てた。サーボが動くところまで確認。サーボの接続に、フットプリント通りEHソケット使ったら干渉してすぐ抜ける。L字ピンヘッダにして刺した方がよさそう。あと、M-Busのソケットも実装したけれど、要らなかった。 pic.twitter.com/v39VPfieLf
— 74th (@74th) March 20, 2024
M5StackCore2でAIスタックチャン作ってみた
— 74th (@74th) April 6, 2024
USB繋いでるのに、バッテリー繋がないと電源不安定なの何でだろうか pic.twitter.com/PRLPBKeaWN
サーボの動きを確認する
サーボが動くかどうか検証するのに、タカヲさんがテストファームウェアを作成されています。PlatformIOという普段から使っているVS Codeでマイコンファームウェア開発環境を使われているので、さくっと使うことができました。
まず、これで動くことを確認しました。これで、サーボが正しく動くことを確認できました。
AIスタックチャンを入れてみる
まずはM5Stack BASICで作っていたのですが、その次にマイクの付いたM5Stack Core2でおしゃべりできるAIスタックチャンを作ってみることにしました。
AIスタックチャンのファームウェアは以下にあります。こちらもPlatformIOが使われています。
音声発話にVOICEVOXの無料で使わせていただけるWeb版のキーの発行方法や、ChatGPTについてもドキュメントで触れられており、簡単に使うことができました。
WiFiやAPIキーの設定は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"
また、サーボのピンは直接指定するようにしました。
#define SERVO_PIN_X 27 //Core2 PORT A #define SERVO_PIN_Y 19
しかし、AIスタックチャンで喋るようになりましたが、どうもマイクが聞き取れません。一時、胴体無しで動かしていたときに、マイクが動いていたため、マイクが壊れてしまったかと思いました。これをXにポストしたところ、拾っていただき、m5-pantiltを使うとマイクが使えないことを教えていただきました。マイクはMBusに付けるPCBに含まれているため、それを外してしまうと使えないということでした。
うちのStackChan、マイク壊れたっぽいので、Streamlit経由でお話ししてる pic.twitter.com/8ksHB2WXo6
— 74th (@74th) June 15, 2024
Core2のマイクは裏蓋(Core2と書かれた基板)についているので、スタックチャン基板使うタイプだと併用できないんですよね。。。
— タカヲ(Takao) (@mongonta555) June 15, 2024
なお、マイクがなくてもHTTP経由でスタックチャンに話しかけることができます。この機能を使って遊んでいました。
http://192.168.xxx.xxx/chat?text=こんにちは
そこで、用意していたタカヲさん基板でAIスタックチャンを作り直してみることにしました。
タカヲさん版ケースとPCBを使ってみる
PCBはJLCPCBで注文し、部品はLCSCで注文しました。
- USBソケット(背面から充電する場合のみ): https://www.lcsc.com/product-detail/USB-Connectors_SHOU-HAN-TYPE-C-6P-LCH10-5_C5187471.html
- 100uFコンデンサ: https://www.lcsc.com/order/detail/08EB0BB6338E247F8EEA3EABAD40EFE4
- 0604 5.1kΩ 抵抗は既に持っていた
LCSCでUSBソケットを注文しましたが、上記部品は若干フットプリントが異なりますが、無理矢理さしたら刺せました。USBソケットを除き、入手しやすい部品で構成され、スルーホール部品も使えるようになっているので、やりやすいです。後から気づきましたが、USBソケットは背面から電源を挿したい場合のみ必要で、M5Stack側面USBでも大丈夫そうで、無くても良さそうです。
スライドスイッチは秋月で買えるものを利用しました(LCSCでジャストのものを見つけられなかった)。
- 小型スライドスイッチ 1回路2接点 SS12D01G4 https://akizukidenshi.com/catalog/g/g112723/
組み立て方は、ブログに詳細に書かれているため、そちらを確認して組み立てました。
ファームウェアの設定も、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
M5StackCore2を、タカヲ版ボディと基板に載せ替えて、AIスタックチャン誕生した! pic.twitter.com/kqjH0q56SB
— 74th (@74th) June 16, 2024
また、タカヲさん版は「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のピンを変更する
CoreS3SEの方に、AIスタックチャンを入れてみた。
— 74th (@74th) June 16, 2024
m5stack/M5Unified@0.1.16 を指定して、サーボの設定を適切にしたら、動いてお顔は出てしゃべるようになったが、マイクが聞こえてない様子。 pic.twitter.com/AbMtJgVaCE
なお、タカヲさんに残ったm5-pantileを使ってM5StackCoreS3SEを使うと完全体になるよと、そそのかしていただいたので、トライしてみていました。
スタックチャン基板の方はCoreS3SEにすると完全体に!(ΦωΦ)←M 5Stackの回し者
— タカヲ(Takao) (@mongonta555) June 15, 2024
M5StackCoreS3S3を既に持っていたので、すぐトライすることができました(トラックパッド化検証用のつもりだった)。
!!!! pic.twitter.com/E1d96QzEBH
— 74th (@74th) June 15, 2024
StackChanが増えた!!!
これで、わが家にAIスタックチャンが加わりました。BASIC、Core2、CoreS3と3体のスタックチャンがいるお家になりました。
今後のスタックチャンへの展望
この後スタックチャンでやりたいことと言えば以下のことがあります。