デジたま2 the AI と"2"がついているという事は"1"があるという事が予想されると思いますが、前作の デジたま は過去に某センサーのコンテストで作った物です。
センサーのコンテストという事もあり、様々なセンサーの入力により生まれる動物が変わるようにしていましたが、センサーからの動物への関連付けルールがうまく決まらず苦労しました。 おまけにキャラクターも手作りであったため、10種類程度が限度でした。
"前作" の完成から数年、世の中の状況は変わり、入力ルールと一緒に AIに頼めば動物を選択することはたやすくなり、画像生成 AIを使えば、様々な動物のイラストを出力するのも簡単という時代になりました。
話しかけた言葉によって動物を選び、さらに画像AIで選ばれた動物の絵が出力されるように生まれ変わりました。
生成AI オンラインハッカソン4 by #protopedia があったので、玉子のハードウェア以外の部分をやってみたところ、いい感じでした。 その時の発表画像は こんな感じ! 賞は取れませんでしたが・・・
といういう訳で AI を利用して進化して爆誕したのが、今回の デジたま2 the AI です。
前回は大きなディスプレイ用の卵と、センサが入った卵を別にしていましたが、温めている感が損なわれていました。そこで、今回はよりリアルな体感を得るために卵型デバイス側でキャラクタが表示されるようにしました。
卵型の容器の中に出来る限り大きく画面を収めるには画面自体が楕円である方がいいという事で、楕円形の LCD を探しました。唯一出てきた製品を使いました。 これがなかなか大変で、8bit パラレルデータと制御線4本+リセット1本の13端子も必要でした。
LCDのコントローラーである ILI9335 としては SPI モードにも対応しているので端子は足りると思っていたのですが、回路設計を進めていくとその機能をわざわざ殺してパラレルでしか接続できないインターフェースとなっていることが判明しました。当初は「卵デバイスに納めるにはなるべく小さいマイコンボードが必要。」と言うわけで、当初はSpresenseで開発を進めていましたが端子数不足により断念し、RaspberryPi Pico Wで一から設計をやり直す羽目になりました。それでも端子は足りず IOエキスパンダーを使う羽目に・・・
ラズパイ Pico というそこそこ大きいマイコンやその周辺の制御部品も多く、LCDは配線数が多いことを考えるとオリジナル基板を作った方がいいということになりました。
そして卵内に入れることが出来る最大サイズにするには、ほぼ LCDと同じ形のオリジナル基板を作ると、卵筐体にぴったし入るということになり、卵型基板を設計しました。
こんな感じです。
楕円形のLCDが入るギリギリのサイズにまで小さくしつつ、沢山の部品がすべて収まるように詰め込んでいます。
仕様が固まる前から制作がスタートしていた事も関係し、試作回数も増えて卵の殻でいっぱいになってしまったりしつつ改良を加えていきました。
液晶やそのコネクタ基板を支える部分、ボードを支える部分、サーボモーターで小窓を開く仕組み、背面のバッテリー格納スペース、卵を持ちあげるだけでスイッチが押される!仕組み等工夫が満載です。
お陰様で知恵の輪の様な組み立て工程になりましたが最後は大分マシにはなってます。 因みにリーダーの所から帰ってくる卵は必ずバラバラになって帰ってきます。 リーダー曰くは「分解はリーダーの大切なお仕事だから…」 (いやいや分解はリーダーの単なる趣味かと)
サーバー側は、卵スタンドとラズパイのケースを兼ねています。
スタンドも何種類か制作し気分やシーンにより変えられるようにしました。
ソフトの方も苦労はいっぱいあります。 先ずは卵側 LCD 制御用プログラムです。 ILI9335 という 8bits / 16bits パラレルインタフェースの液晶ですが、ライブラリが全くないうえに、サンプルプログラムすらありませんでした。 データシートを読み込んでから、実績のない物を一から組み込みました。しかも、SPI 接続の IOエキスパンダーを挟むこともあり、ライブラリに全く頼れない状況でした。
その次は、RTOS の導入です。非同期で動くべきタスクが多々あり、RTOS でいくつかのタスクに分けタスク間の通信はMessengerQueue を使用しましたが結構ガチの組み込みソフト構成です。 複雑ではないですが、ベースが無いのでひたすらがりがりコーディングする感じでした。メモリをいっぱい使うとハングアップするという謎な現象に終盤近くまで悩まされましたが、この辺の制御が原因でした。
そして、卵とサーバー間の通信も苦労しました。ラズパイと接続できる BluetoothUART で開発を進めていたのですが、不安定極まりなく環境によって繋がらないことも、データ欠損、接続断等トラブルの嵐でした。 そこで最終的には TCPによるソケット通信を使用しました。
気が付くと総行数 4800行程の規模のソース
実現した機能自体は余り多くありませんが、そのシステム全体を構築するために使用した技術は多岐にわたり半端ない点が最大のアピールポイントかと思います。 RTOS やデバイス制御等組み込み技術から、API 等のクラウド連携 IoT技術要素、AIの連携に関する技術や、様々な動きで演出する卵のスーパーメカから、オリジナル基板の設計製作まで、よくこの人数で実現できたなという程でした。人数が少ないので複数個所の担当を受け持ちつつリーダーの無茶ブリにも耐えながら、常に人手不足に追われながらもよく頑張ってくれました。
話しかけた言葉によって、たまごから生まれるものが決まる。そして何が出てくるかわからないというわくわく感を追求しました。 その為に、ネット系のプロトコルスタックが得意なラズパイをサーバーに、デバイスのリアルタイム制御に向いているラズパイ Picoを組み合わせ色々と試行錯誤しました。 "つくろか3" に向けて開発しましたが、展示会場がハッカソン会場の様に最後まで色々試行錯誤しているしている状況でした。
ここでは一旦完成ですが、まだ作るところは残っていますので、今後も開発を継続して発展させていこうと考えています。 次の展示に向けて頑張って開発をしていきます。
今決まっている予定はまだありませんが、ターゲットは Maker Faire Kyoto 2025 、それ以前にもあれば随時ここに載せていきたいと思います。
ヒーローズリーグには間に合いませんでしたが、最新版は音声も再生できる様になっていますので、鼓動音等の効果音といった演出も可能かと・・・
ユーザーインターフェースである卵と、ネットを連携するためのラズパイ5(4や3でも可) サーバー、クラウドの各種サービス(AI 周りや TTSの三部構成で、こんな感じのシーケンスで連携させています。
ユーザーが卵に向かって話しかけます。
音声をサーバー側に入力します。
サーバー側から Google TextToSpeech に音声を投げてテキストに変換します。
Google から発話内容のテキストが返ってきます。
このタイミングで数回サーバーから状態通知を飛ばして卵内の LED をイルミネーション動作を変更し、ドキドキ感を演出します。
話した内容を基に、動物を選択するプロンプトをOpenAI API で投げます。
AIが考えた動物が返ってきます。
動物の画像がサーバーに返ってきます。
動物の画像をディスプレイのサイズに縮小しつつ転送しLCDに描画します。
窓を開けて、生まれた感を演出します。
ユーザーはLCDに描画された動物がみれます。
卵は主にデバイス制御に使い液晶やセンサ等リアルタイム性が求められる部分を担っています。 Raspberry Pi Pico W と下記の部品で構成されています。
生成された画像はRaspberry Pi 5を通じて卵型デバイスに戻り、LCDに表示されます。 卵型デバイスはサーボモーターやLEDで演出を行い、キャラクターが生まれたことをユーザーに知らせます。
部品 | スペックor型番 | 備考 |
---|---|---|
Raspberry Pi Pico W | 卵デバイス全体の制御 | |
メイン基板 | 自作基板 | Raspberry Pi Pico Wと周辺回路を接続 |
LCD接続サブ基板 | 自作基板 | LCDとメイン基板を接続するための中継基板 |
楕円形LCDモジュール | TSE8H0888FPC-A2-E | コントローラーILI9335 |
マイク | ワイヤレスマイク | |
サーボモータ | SG90 | メイン基板に接続 |
マイクロスイッチ | メイン基板に接続 | |
LED | NeoPixel Ring - 12連 | メイン基板に接続 |
バッテリ | CR123 16340 | |
本体ケース | 3Dプリンタで作成 | |
LCDホルダー | 3Dプリンタで作成 | |
ハッチ | 3Dプリンタで作成 | |
スイッチカバー | 3Dプリンタで作成 |
Arduino pico 環境で C++ で作成しています。 ネット連携はラズパイサーバー側に任せ、データだけを受け取る方式です。その為サーバーとのデータや制御コマンドの送受信を行うために、WiFi を使用したTCPソケット通信を使っています。 非同期で動くべきタスクが多々あり、RTOS でいくつかのタスクに分けタスク間の通信はMessengerQueue を使用しました。結構ガチの組み込みソフト構成です。 FreeRTOSではタスクの並列動作、タスク間同期の為の通信(キュー)、定周期処理の駆動、排他処理用等の基本的な機能を使用しています。 以下の様なタスク構成で動作しています。
ラズパイを使ったサーバーは主にクラウドとの橋渡しを担っています。Picoだけではネット連携の為のリソースやプロトコルスタックの不足があるため用いています。
主にラズパイ5とワイヤレスマイクのレシーバーとUSBサウンドカード、そしてそれらを入れるケースの構成です。(VNCやSSH 等でつないでいるのでディスプレイすらない)
ラズパイには音声入力用の信号線がありませんので、主に音声入力用に USBサウンドカード(Linux対応を謡った) を取り付け、そこのミニジャックにマイクからのアナログ音声信号を入力しています。
部品 | スペックor型番 | 備考 |
---|---|---|
Raspberry Pi 5 | サーバとして使用 | RasPi4でも可 |
USBサウンドカード | https://item.rakuten.co.jp/bestclick/p0841/?s-id=ph_pc_itemname | |
ワイヤレスマイク | ||
卵デバイス用スタンド | 3Dプリンタで作成 | |
Raspberry Pi 5 ケース | 3Dプリンタで作成 |
Python3 で作成しています。
卵からコマンドを受け、応答コマンドを送信する方式で連携しています。コマンド周りはオリジナルのプロトコルを設計して使用しています。 前述の通り、卵デバイスとの制御コマンドの送受信は WiFiを使った TCPソケット通信を使用しています。 開発デバッグ用にキーボード操作で卵からのコマンドを直接入力する事も可能にしています。 音声録音処理や、各種クラウドの API の呼び出しもPythonのライブラリを使って行っています。
こちらも同じく非同期で動くところがあるので、以下の様な thread を使ってキューでスレッド間の通信を行っています。
クラウド側は、音声からテキストの変換に Google の TextToSpeech サービス、動物選択の為に OpenAI の API 、画像生成に DALL-E3 を使い連携しています。
最新版では動物のイメージ色を一緒に聞いて、その色で LED を点滅させる演出などもしています。