はじめに
2026年の夏休みの自由研究として、今話題(?)の Vibe Coding(AIに主導させるコーディング) を試してみました。
人間が一切コードを書くことなく、AI(Gemini,Copilot,ChatGPT / Antigravity,Cursor)に仕様策定から設計・コーディングまでを丸投げし、Pimoroni製Tiny2040 (Flash8MB)(本家PicoはFlash2MB) + I2Sデバイス で音声を鳴らすことができました!
作成したハードウェア


左から動作用ボタン電池(LIR2032)(写真はTiny2040から取外した状態)・RTC(DS3231)・ミニブレッドボード(スイッチ2個)・Pico・Pimoroni製Tiny2040・DAC(MAX98357A)・スピーカ(8オーム 1W)

今回は短時間の実験用途なので、充電ボタン電池 LIR2032(3.7V / 45mAh)で動作を確認しました。動きました、音鳴りました。
リポジトリ(GitHub): I2S_MAX98357A_PCM5102
(※このリポジトリのREADMEもすべてAIに出力してもらったものです!)
(動画) 16kHz / 4bit IMA ADPCM形式の音声データ(数10秒の定例文と、現在時刻)を再生している様子
Vibe Codingでやってみてどうだったか?
今回は「人間はソースコードを直接編集しない」と決め、プロンプトの作成と改良に集中しました。
人間が行うのは 要件提示・プロンプト作成・AIの出力確認・実機での動作確認 だけです。
人間がプロンプトを作り、Gemini / Copilot / ChatGPTのレビューをそれぞれ受けて修正してを繰り返してプロンプトを練り上げました。その後、VS CodeのCopilotに仕様と設計をまとめさせ、人間が「充分でしょ」と判断したところで実装を依頼しました。
トラブル発生:容量不足をAIが解決できずに作業が無限ループに
ここで問題が発生しました。元の音声データ(mp3)をwavに変換してTiny2040のFlashに書き込むのですが、Flashメモリのサイズが8MBしかないのに、Copilotが合計8MB超えのwavファイル群を無理やり書き込もうとして連続失敗。
Copilotはなぜか「小さいサイズから書きこんでみる」「順番を変えてみる」といった無駄な抵抗を繰り返し、容量不足の根本エラーから抜け出せなくなってしまいました。
一旦Copilotに作業をを止めさせ、変換データのサイズを表にまとめるよう解析させていたところで……なんと GitHub Copilot Pro+(月額$39)の上限(7000 AI credit) に引っかかってしまいました。
Antigravityへの切り替えで突破
これ以上のCopilotのプランは高額な上、同じアプローチで堂々巡りになっている現状を考慮して、開発エージェントを Google Antigravity(Google AI Pro 5TB / 月額2,900円)に切り替えました。
Antigravityで作業を再開し、「未使用のmp3の変換を止めれば容量に収まること」を確認させ、コード修正を指示。無事、意図通りに動作するようになりました! AIが作成したレポートは こちら。
GitHubのREADMEも含めてAIが出力してくれたのですが、全体が非常にきれいにまとまっていて驚きです。自分で一から書いたら、とんでもない時間がかかった挙げ句にバグだらけになっていたと思います。
改めてREADME等を読むと人間として微調整したくなる部分もありますが、「AI任せ」という今回のコンセプトが面白かったので、あえてそのままにしています。
ハードウェア・音質の検証 🎶
私は今までスピーカーを鳴らす技術はハードルが高そうに感じていましたが、I2Sの存在を知り「これならできそう。Picoのような小型マイコンでもいけるのでは?」と今回挑戦してみました。
フォーマット比較:
音声データであれば 16kHz / 4bit IMA ADPCM で十分実用的な音質でした。
容量面:
IMA ADPCM / 16kHz / 4bitならデータサイズを大幅に抑えられるため、PicoのオンボードFlashのみ(外付けSDカードやFlashメモリなし)でも色々遊べそうです。
ハマったところ(PCM5102のシルク印刷の罠)
取り組み始めてからほんの数時間で音が出たのですが、1点ハマった罠がありました。
I2Sのモジュールを2種類買いました。そのうちの1つ、PCM5102 の基板上のシルク印刷に不備があったのです。

H1L, H2L, H3L, H4L という設定用のジャンパ部分の印刷だけが 180度回転 していました。「そんなことあるのか!?」と疑いつつ、Amazonのレビューを確認すると同じ目に遭っている人がちらほら……。
詳細はリポジトリの CONNECTIONS.md に記載していますので、これから触る方はご注意ください。
逆に、アンプ内蔵の MAX98357A は配線もシンプルで非常に扱いやすく、あっという間に「あれ?もう鳴った!」という状態でした。モノラルですが、おすすめです。
そういえば
開発中に、ちょいちょい機能を足してました。例えば音声の再生速度を変えられるようにしたり、ボリューム変えられるようにしたり。
その実機確認を人間がしていた時、再生速度が変わらずAIに指摘をしたら「単体テストはOKでした」と、返事がありました。
「はぁ?」と感じて「自分で再生速度2倍にしてみ?で、再生時間測ってみ?」(実際の指示はもうちょっと丁寧)とやり返したら「あ、バグってました」と。意外とAIもバグります。
更に続きがあって、その後に再生速度を1.3倍に手動で変更したのですが、何かの時に、しれっと手動で変える前の値の1倍にAIが戻してきたんです。
コードレビュー時に気づきましたが、何で勝手に変えるのか不思議です。「Config.txtの値は勝手に変えるな。テストで変えたければ確認しろ」とプロンプトに入れたほうが良いと思います。
次のステップ
プロンプト作成方法のまとめ:
色々コツがありそうです。
AIとのコミュニケーションのコツのまとめ:
AIが確認を求めてきた時に、逐次答えるか・ある程度は任せるかを選択できます。人間がどんな指示をしても、たいてい数秒でAIから返事が来ます。私は大量の質問に答えていくのに疲れていき、そのうち適当になりました。
これがトラブルのもと。気づくと膨大な変更をAIがしていて、発散。やり直しさせる羽目に。で、AI Credit大量消費...
テストの自動化:
テスト実行時にボタン操作を自動化し、カメラ画像をAIで認識して合否判定する仕組みを構築中です。(人がボタンを押さなくても、勝手にテストが進むのを見て「AIすごい…こわ…」となっています 😅

ストリーミング再生:
16kHz/4bitで十分と分かったので、次は Raspberry Pi Pico W (Flash 2MB)を駆使したり、Wi-Fi 経由の音声ストリーミング再生などにも挑戦してみたいと思います。