TECH BLOG



2022/9/10

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


M5Stack界隈で爆発的な人気を誇る、スタックチャンを作ってみました。

スタックチャンの画像

スタックチャンとは

スタックチャンとは、オープンソースの手乗りサイズロボットです。
詳細は下記のサイトをご覧ください。

オープンソースなので、設計データはgithubで公開されております。
3Dプリンタ用のデータ、回路/基板の設計資料、ソフトウェアなど、作製に必要なデータが全て揃っています。

このスタックチャンのコンセプトに大勢の方が賛同しており、各々が独自のスタックチャンを産み出し、コミュニティを盛り上げています。
twitterで #スタックチャン を検索してみてください。
きっと作りたくなると思います。

我が家のスタックチャン

4年位前に買って、そのまま眠っていたM5Stack Grayを使っています。
我が家のスタックチャンは仕事を与えられ、毎日子供と一緒に働いています。

1. こどもの宿題のお手伝い

計算ドリルにかかった時間を測ってあげます。

 

2. 明日の天気予報

天気と気温と降水確率を教えてくれます。

3. かわいくしゃべる

かわいいです。

ハードウェア部分の作り方

ハードの主な作り方は2通りあるかと思います。

  1. スタックチャンのgithubから設計情報を入手して、基板発注、部材集め、3Dプリントなど自分で作る
  2. 有志の方のキット販売を利用する

本ページでは1でも2でもなくて、以下の方法で作っています。
※ちょっと特殊で、参考にならない気もします。


材料

本ページで使った材料一式は下記になります。
(このピンヘッダはデフォルトのスタックチャン基板には使えません)

材料 購入先 リンク
M5Stack 秋月電子など  
ユニバーサル基板 秋月電子など  
電源用コネクタ(PHコネクタ B2B-PH-K-S) 秋月電子など  
メカスイッチ 秋月電子など  
MOSFIT(IRLML6402) 秋月電子など  
抵抗 1kΩ 秋月電子など  
コンデンサ 100uF 10V 秋月電子など  
ピンヘッダ 秋月電子など  
サーボモータ SG92R Amazonなど  
リチウムポリマーバッテリー400mA 千石電商など  
M2ねじ 千石電商など  
スタックチャンケース 3Dプリンタで出力 ---

ケース

以下のgithubにある3Dプリンタ用ファイルを、3Dプリンタで出力します。
使用するサーボモータによって、プリントするファイルが異なりますのでご注意ください。

がしかし、普通の人は3Dプリンタを持っていないと思います。
私は、近所のワーキングスペースに3Dプリンタがあったので、そこでプリントしました。

3Dプリントしてくれるサービスなどもあるようです。

基板

ユニバーサル基板をケースに入るサイズで切り出して、部品を回路通りにはんだ付けします。
結構大変です。
(プリント基板発注した方がよかったと今では思っています。)
回路図は こちら。

スタックチャン基板の画像3

メカスイッチの部分は、ケースに穴をあけて外からON/OFFできるようにしています。

ソフトウェア部分について

ソフトウェアはArduinoで作製しています。
ソースコードをGithubにまるっと上げていますので、宜しければ参照ください。

ちなみに、オリジナルのスタックチャンはModdableというJavaScriptで組み込みプログラミングができるツールで作成されています。
こちらもgithubにあがっています。

しゃべる

AquesTalkという音声合成ライブラリを使用してしゃべっています。
AquesTalkによる音声出力、およびM5Stack-Avatarによる顔の表示は、こちらでまとめています。

しゃべる内容については、ソースコードを変えなくても内容変更できるよう、Googleスプレッドシートにしゃべる内容を記載して、SSSAPIというwebサービスでAPI化して取り込んでいます。
スプレッドシートを書き換えてあげると、しゃべる内容も変わります。
(起動時に読み込んでいるので、スプレッドシートを変えたらスタックチャンを再起動しています)

天気予報

以下の処理を実施しています。

wifi接続、天気予報API取得については、こちらでまとめています。

画像の表示については、こちらにまとめています。

タイマー

ボタンを押してから最初の30秒と、あとは1分おきに経過時間をしゃべってお知らせしてくれます。
millis()関数を使って経過時間を測っています。

char talk[50]; // AquesTalk用
unsigned long startTime = millis();

while(true)
{
  unsigned long collapseTime = millis() - startTime;

  if (collapseTime / 1000 == 30)  // 30秒
  {
    playAquesTalk("<NUMK VAL=30 COUNTER=byo->/ke-ka.");
  }
  else if ((collapseTime / 1000) % 60 == 0 && collapseTime / 1000 != 0)  // 1分おき
  {
    int minutes = collapseTime / 60000;
    sprintf(talk, "<NUMK VAL=%d COUNTER=funn>/ke-ka.", minutes);
    playAquesTalk(talk);
  }

  M5.update();
  if (M5.BtnA.wasClicked() || M5.BtnB.wasClicked() || M5.BtnC.wasClicked())
  {
    int finishTimeMinute = collapseTime / 60000;
    int finishTimeSecond = (collapseTime / 1000) % 60;

    playAquesTalk("kaka'tta/jikannwa");
    waitAquesTalk();
    if (finishTimeMinute > 0)
    {
      sprintf(talk, "<NUMK VAL=%d COUNTER=funn>", finishTimeMinute);
      playAquesTalk(talk);
      waitAquesTalk();
    }
    sprintf(talk, "<NUMK VAL=%d COUNTER=byo->", finishTimeSecond);
    playAquesTalk(talk);
    waitAquesTalk();
    playAquesTalk("dayo");
    waitAquesTalk();
    delay(200);

    playAquesTalk("o_tsukaresamade'shi'ta-");
    waitAquesTalk();

    startTime = millis();
    break;
  }
}

まとめ

スタックチャンを作って、少し実用的な機能を実装してみました。
子供には好評で、特にタイマーは良く使ってくれています。

オープンソースなハードウェアというのはあまり見かけないのですが、作ってみてとても楽しかったです。
勉強にもなりますし、こういうプロダクトがもっと増えるといいですね。




コメント(githubのアカウントが必要です)


Tech Blog Index

2023/02/27
  ・ TVON時間カウンタ作成

2022/09/09
  ・ スタックチャンを作ってみた

2022/04/30
  ・ 日輪刀をプログラミング

2022/02/16
  ・ Statiqでブログ作成


Sponsor