😼

NECO MIMI スタックチャンを作ったお話

2024/02/13に公開

みんな、こんにちは!この記事は2024年2月10日にM5Stackユーザミーティング金沢#2のLTでボクが発表した内容を読みやすくまとめたものだよ。

Githubで公開されているスタックチャンのデータを基にオリジナルのスタックチャンを作ってみたよ!というお話だよ。

対象読者

  • M5Stackやスタックチャンに興味がある
  • カワイイものに興味がある

自己紹介

バーチャルエンジニアのなななだよ。2023年6月頃からX(Twitter)で情報発信を始めたよ。X(@nananauno)を中心に色々やっているからフォローしてもらえると嬉しいな!

ボクが2023年の半年にやったことをざっくり説明すると:

  • 6月頃、M5Stack core2を買ったよ
  • 8月頃、M5Stack Japan Creativity Contest 2023に応募したよ
  • 11月頃、Maker Faire Shenzhen 2023へ行って、その次の日にM5Stack社を訪問してJimmyさんにいいね!を伝えたよ

LT発表時点でのボクのM5Stack歴は8ヶ月ぐらいなんだけど、M5Stackの魅力にハマちゃって半年で色々やってきたよね。2023年にやったことは以下のnoteの記事にまとめているから、興味があったら是非見てね。
https://note.com/nananauno/n/n4d255107c5c2
https://note.com/nananauno/n/n955a0b137015

スタックチャンって?

M5Stackを知っているみんなはスタックチャンのことを良く知っているみたいだけど、知らないみんなのために、スタックチャンについて説明しておくね。

スタックチャンはししかわさん (@meganetaaan/@stack_chan) が作ったスーパーカワイイ手乗りロボットなんだけど、スタックチャンの筐体の3Dプリンター用データ、回路図、ソフトがGitHubでオープンになっているから、誰でもスタックチャンを作れるようになっているよ。

https://github.com/meganetaaan/stack-chan

スタックチャンを作っているみんなが使っているソフトは@robo8080さんが作ったAIスタックチャンが良く使われているように感じるよ。AIスタックチャンはChatGPTとVOICEVOXを使っていて、スタックチャンがずんだもんの声(デフォルト設定時)で受け答えしてくれるよ。

https://github.com/robo8080/AI_StackChan2

スタックチャンを作るために必要なデータは全てGitHubで公開されているから、やる気さえあれば、誰でも作れるようになっているよ。

スタックチャンを作ろうと思ったきっかっけ

自己紹介のところで、Maker Faire Shenzhen 2023に行ってきたと書いたんだけど、この時のMaker Faireで、ししかわさんが中心となって、スタックチャンコミュニティで集めたスタックチャンが展示されていたよ。ボクも実際にMaker Faire Shenzhenに行ったときにこの展示を見て、自分でも作りたいなって思ったのがきっかけだよ。


Maker Faire Shenzhen 2023で展示されていたスタックチャン

NECO MIMI スタックチャンって?

NECO MIMI スタックチャンはGitHubで公開されているデータを基にボクが作ったスタックチャン用のネコミミ型基板で、シリアルサーボを駆動するための回路とネコミミ部分に14個のNeoPixelが搭載されているよ。基板はM5Stackにスタック可能なモジュールの形になっているよ。

GitHubで公開されているデータだけでスタックチャンを作るだけでも十分楽しいんだけど、どうせ作るなら自分だけのスタックチャンを作りたいと思ったよ。そして、どうせ作るならカワイイ!要素を追加したいよね。カワイイ!要素って何?って考えた時、やっぱりそれはネコミミなんじゃないかなって思ったよ。ネコミミは何に着けても可愛くなるから、元からカワイイ!スタックチャンに着けるともっと可愛くなるんじゃないの?っていう安直な考えと、勢いで製作を始めたよ。

概要

こちらが、ボクが作ったNECO MIMI スタックチャン。今回作ったのは、ネコミミ型の基板とそれを収めるためのモジュール部分だよ。モジュールはM5Stackにスタック可能なモジュールになっているよ。

ブロック図

NECO MIMI基板のブロック図だよ。シリアルサーボの回路はGitHubで公開されているデータをそのまま使用しているよ。ボクが追加したのはネコミミ部分に搭載した14個のNeoPixelとI2Sマイクの部分だよ。M5Stack core2には元々PDMマイクが搭載されているんだけど、スタックチャンを作るために底のパネルを外すとPDMマイクが搭載された小基板も一緒に取れてしまうから、AIスタックチャンの音声入力用にI2SマイクをNECO MIMI基板に取り付けられるようにしたよ。

外観

NECO MIMIスタックチャンの外観はこんな感じだよ。どこから見てもカワイイ!

動作デモはこんな感じだよ。スタックチャンの感情に合わせてネコミミ部分のNeoPixelの色やパターンが変化するようになっているよ。

https://twitter.com/nananauno/status/1757057308465692834

もう少し詳しく

ここからはNECO MIMIスタックチャンについてもう少し詳しく説明していくよ。

NeoPixel

NECO MIMIスタックチャンのネコミミ部分には片側7個の合計14個のNeoPixelが搭載されているよ。このNeoPixelの回路と部品は2023年にM5Stackさんが発売したNECO UNITの回路と部品を参考にしているよ。

https://www.switch-science.com/products/9128

NECO UNITで参考にしたところは以下の2点だよ。

  • NeoPixelのモジュール WS2812C-2020
  • パスコン

WS2812C-2020
WS2812C-2020はWorldsemiさんが製造しているマイコン内蔵のRGB LEDモジュールだよ。NeoPixel stripで良く使われているWS2812Bは5mm四方のモジュールだけど、WS2812C-2020は2mm四方のモジュールで、より小さなパッケージになっているよ。NECO MIMI基板のネコミミはスペースも限られているから、できるだけ多くのLEDを搭載するために、このWS2812C-2020を使用したよ。

パスコン
WS2812C-2020はマイコン内蔵のRGB LEDモジュールだから、ノイズ対策用にモジュールの近くにバイパスコンデンサ(パスコン)を配置する必要があるんだけど、このパスコンの配置方法もNECO UNITを参考にしているよ。一般的に1つのICに対して1つのパスコンを配置するけど、NECO MIMI基板のネコミミ部分はスペースも限られているし、できるだけ部品点数も減らしたかったよ。そんな時にNECO UNITの回路図を見ると35個のNeoPixelに対して、パスコンは17個しか使われていなくて、だいたい2個のNeoPixelに対して1個のパスコンになっていたよ。NECO MIMI基板もこれを参考に、14個のNeoPixelに対して8個のパスコンにしているよ。今のところ回路は動作しているよ。

モジュール製作

NECO MIMI基板はM5Stackにスタック可能なモジュールとして製作したよ。どうしてモジュールの形にしたのかというと、それは「M5Stackだから」という理由だよ。M5Stackのコンセプトとしてスタックしていくことでどんどん拡張していけるという部分、これはM5Stackの大きな特徴だから、ボクもこのM5Stackの大きな特徴を継承したかったというのが1つの大きな理由だよ。

もう1つの理由として、モジュール型以外にも以下のような方法も考えていたんだけど、NECO MIMI基板を最終的にはみんなに幅広く使ってもらえるようにしたかったから、既存のボディを活かせるように、M5Stackの間に挟んでそのまま使えるモジュールの形にしたよ。


左:頭に取り付け、右:既存のボディを改造

モジュールは手元にあったM5StackのExtPort MODULEのサイズを実測して、Fusionで設計、JLCさんの3Dプリントサービスで印刷という感じで製作したよ。


JLCさんで印刷したパーツ

3Dプリントした後に気がついたんだけど、M5Stackさんの製品のメカ的な寸法などはGitHubで公開されていて、わざわざ実測する必要はなかったよ。もし、これから自分だけのモジュールを作りたいみんなは是非オープンなデータを使って時間を節約してね。

https://github.com/m5stack/M5_Hardware

苦労ポイント
モジュールの製作はNECO MIMI基板を作る時に、一番苦労したところだよ。M5Stackの一般的なモジュールは基板が本体側に入り込むような設計になっていて、同じようにNECO MIMI基板を本体側に入り込ませてしまうと、ネコミミ部分を外に出すためにはM5Stackのボディを削る必要があるよ。ボディを削るのはあり得ないから、NECO MIMI基板をモジュール側に1mm下げることにしたよ。ただ、1mm下げたことでまた別の問題が出てきて、M-BUS用のピンヘッダがM5Stack本体のM-BUS用のピンソケットに届かないという問題が出てきたよ。(正確にはギリ届くんだけど、接触不良になる可能性がとても高い)


ネコミミを外に出そうとするとM5Stackのボディを削る必要があるよ


基板の位置をモジュール側にずらすことで、モジュール側からネコミミを出すようにしたけど…

これを解決するために、淘宝で最適な高さのピンヘッダを探したよ。淘宝ってホントに何でもあって、4.8mmという中途半端な高さだけど、今回のNECO MIMI基板に最適なピンヘッダを見つけることができたよ。

I2Sマイク

I2Sマイクは、最初にも書いているけど、M5Stack core2の底面パネルを外してしまうとPDMマイクが搭載された小基板も取れてしまうから、AIスタックチャンで音声入力するためにNECO MIMI基板側にI2Sマイクを取り付けられるようにしたよ。ただ、よくよく考えてみるとI2SマイクよりもPDMマイクにしてM5Stack core2のPDMマイクと同じピン割り当てにしておけばソースコードを変更することなくマイクに対応できることに後から気がついたよ。だから、このI2SマイクはPDMマイクに変更する予定だよ。

マイクをNECO MIMI基板側に取り付けられるようにした理由として、AIスタックチャンを使いたいというのもあるんだけど、もう1つ外部の環境音に合わせてスタックチャンを踊らせたいという理由もあるよ。実験的にBUS MODULEにI2Sマイクを取り付けて、外部の音に合わせてNeoPixelを光らせるということをやって、あとはサーボモーターも音に合わせて動作できれば、スタックチャンが踊ってくれそうだよね。

https://x.com/nananauno/status/1738974098003501180?s=20

あと、マイクの取り付け方法として、面白いやり方を見つけたから紹介しておくね。@washishiさんが作ったフレキ基板で、M5Stack core2から取り外したPDMマイク/IMUの小基板をスタックチャンの基板に取り付けられるようになっているよ。これは、M5Stack core2から取り外した小基板をそのまま活用できるところがいいよね。

https://x.com/washishi/status/1715507835692585290?s=20

ファームウェア

最後にNECO MIMIスタックチャンのファームウェアのお話だよ。ファームウェアは@robo8080さんのAIスタックチャン2 RT版をベースに、NeoPixel部分に対応するためのコードを追加したよ。RT版を使用した理由は、RT版はソースコードを変更せずにシリアルサーボを動かすことができるからだよ。

https://github.com/robo8080/AI_StackChan2_RT

NECO MIMIスタックチャン用に感情に合わせてNeoPixelの色とパターンを変化させる処理を追加したよ。

NeoPixelの処理は別タスクとして作成しているよ
NeoPixelの処理は専用のループを用意して、loop関数とは別の関数で処理しているよ。loop関数では色々な処理が行われているから、ここでNeoPixelの処理を書いてしまうとNeoPixelを光らせるタイミングの制御が難しくなってしまうよ。別タスクにすることでNeoPixelの制御に専念することができるよ。

以下のコードはxTaskCreatePinnedToCoreというESP32のAPIを呼び出してneo_loopという関数を別のタスクとして作成しているよ。

void setup()
{#ifdef NECOMIMI
  FastLED.addLeds<NEOPIXEL, NEO_PIN_DIN>(neco_leds, NEO_NUM_LEDS);
  FastLED.setBrightness(60);
  xTaskCreatePinnedToCore(neo_loop, "neo_loop", 40000, NULL, 1, &neo_thp[1], 0);
#endif
}

M5Avatarから感情を取得してNeoPixelの色とパターンを変化させているよ
以下のコードは、NECO MIMI基板のNeoPixelを制御するためのneo_loopという関数だよ。M5Avatarのライブラリからスタックチャンの現在の感情を定期的に取得して、感情に合わせてNeoPixelの色とパターンを制御しているよ。

avatar.getExpression()を呼び出すと、現在のスタックチャンの感情を取得できるから、この値に基づいてNeoPixelの色とパターンを制御するための関数を呼び出しているよ。

// Process NeoPixels on NECO MIMI board.
void neo_loop(void *args){
  Expression exp; // expression from m5avatar

  while(1){
    exp = avatar.getExpression();
    Serial.printf("[NECO]exp:%d\n",exp);
switch(exp){
      case Expression::Happy:   neo_fade(208); break;
      case Expression::Neutral: neo_random(CRGB::Green,5); break;
      case Expression::Doubt:   neo_move_fade(CRGB::Yellow); break;
      case Expression::Angry:   neo_fade(0); break;
      case Expression::Sad:     neo_fade(142); break;
      case Expression::Sleepy:  neo_fade(64); break;
      default: neo_blink(CRGB::Blue);
    }
    delay(1);
  }
}

今後の妄想

NECO MIMIスタックチャンはまだ完成していなくて、今後やっていきたいことを書いておくよ。

  1. 基板をもう少し整える(PWMサーボ対応、PDMマイク)
  2. 環境音に合わせて踊らせたい
  3. スイッチサイエンスさんで販売したい

1つ目は、現在の基板はボクがやりたいことをとりあえず詰め込んだ基板で、色んな人に使ってもらうことを想定していないから、PWMサーボ用のピンを出したり、PDMマイクを搭載できるようにすることで、もっと幅広く使ってもらえるようにできたらいいなと思っているよ。

2つ目は、I2Sマイクのお話で書いているけど、最終的には外部の音を取り込んで、音に合わせて踊れるようにしたいな。

3つ目は、ボクが作ったNECO MIMI基板を色んな人に使ってもらいたいから、スイッチサイエンスさんで販売できるようにしたいな。RT版/M5公式版が登場したらそれに取り付けができるようにしたいと思っているよ。

まとめ

スタックチャンは何をしてもカワイイ!ということを改めて認識したよ。

少しだけ真面目なお話をすると、今回、ボクが自分のオリジナルスタックチャン作りを通して感じたことは、

  1. 必要なものは全てオープンですぐに作れる
  2. JLCさん等の製造受託ありがたい
  3. スタックチャンまだまだ可能性を秘めている

スタックチャンを作るために必要なデータは全てGitHubで公開されているから、やる気さえあれば誰でも作ることができる状態になっていて、これはとっても幸せなことだよね。また、JLCさんのような製造受託サービスも個人レベルでのものづくりを後押ししてくれているよ。3Dプリンターが普及してきているとはいえ、みんなが持っているわけではないから、低コストで製造してくれるサービスが普及しているのはとっても恵まれた環境だよね。
最後にスタックチャンはまだまだ可能性を秘めていると感じたよ。既にたくさんの方々が自分だけのスタックチャンを作ってXなどで情報発信がされているし、ボクのスタックチャンもネコミミを取り付けただけでももっと可愛くなるなら、今後も色々なカワイイスタックチャンが登場する可能性は大いにあるよね。M5公式スタックチャンが登場も控えているし、今後も色々な発展をしそうだよね。とっても楽しみ!

スタックチャンに興味が出てきたら

ボクのこの記事を見てスタックチャンに少しでも興味が出てきたら、是非M5Avatarを使って欲しいよ。サーボモータは買う必要は無いから、まずはM5Avatarのライブラリを使って数行のサンプルコードをお手元のM5Stackに書き込んでみてね。M5Avatarはスタックチャンの顔をLCDに表示するためのライブラリで、このライブラリを使うだけで、お手元のM5Stackを簡単にスタックチャンにすることができるよ。

https://github.com/meganetaaan/m5stack-avatar

@robo8080さんのAIスタックチャンもM5Burnerから簡単に書き込むことができるんだけど、こちらはSDカードやChatGPTとVOICEVOXのAPIキーを取得する必要があるから、少しだけ手間が増えるよ。最初の1歩として、追加で準備が不要なM5Avatarをオススメするよ。M5Avatarを使った次の日にはサーボモーターを注文していると思うよ。

是非、みんなも自分だけのスタックチャンを作ってみてね!
じゃあ、またね!

Discussion