C言語の勉強を始めたから、何か作ってみたいけど何がいいんだろう…。
いつかはロボットとかも動かしてみたいけど、まずは手軽に試したいな。
という方に向けて、本記事では実機(機材)が無くても手軽に組み込みソフトを体験できる題材を紹介します。
組み込みソフトとは、LEDやボタンといった「モノを動かす」ソフトのことです。
実機(Raspberry Pi PicoやArduino)を持っていなくても、ブラウザ上で電子回路をシミュレートできるWokwiというツールを使います。実機がなくても、コードを書いて電子工作を試せる便利なサービスです。
この記事では、Wokwi上で「反応速度ゲーム」をClaudeに相談しながら作ってみた過程をそのまま紹介します。
- Wokwiを使えば、実機がなくても組み込みソフトを試せること
- 組み込み特有のGPIO(入出力)やタイマー処理の基本
- AIと組み込みソフトを作るときの進め方
なぜ「反応速度ゲーム」にしたのか
組み込み初心者がいきなり複雑なものを作ろうとすると詰まってしまうので、シンプルなお題にしました。
反応速度ゲームを選んだ理由はこちらです。
- LED(出力)とボタン(入力)という、組み込みの基本要素がどちらも体験できる
- 「光ったらボタンを押す」というルールが単純で分かりやすい
- タイマー処理(反応時間の計測)という、組み込みならではの要素も学べる
以前別記事で書いたじゃんけんゲームと同じく、C言語・組み込みを学び始めた方にちょうどいい難易度の題材です。
じゃんけんゲームの記事はこちらです。

今回使うツール・環境
- Windows 11
- Claude(AI):仕様決め・コード作成の相談相手
- Wokwi:ブラウザ上で電子回路をシミュレートできる無料サービス。実機がなくても、LEDやボタンを使った回路を試せる
実機を用意しなくても始められるので、電子工作が初めての方にも試しやすいと思います。
ソースコードもWowkiに直接書けばよいので、Visual Studio等のコードを書いたり実行するツールも不要です。
Claudeと一緒に仕様を決めてみた
反応速度ゲーム:AI(Claude)に基本仕様を相談
いきなりコードを書き始める前に、「どんな仕様にするか」をAIと相談しました。

仕様を考える前に、どのような環境を想定しているかを確認してくれました。
今回はWokwiというツールを使用するので、そのように回答します。
すると、その前提で仕様を提案してくれました。


反応速度ゲーム:AI(Claude)に設計図の作成も依頼
以前じゃんけんゲームを作成した時はフローチャートも提示してくれましたが、今回は特にありませんでした。
せっかくなので、状態遷移図とフローチャートもリクエストしてみます。




このように、状態遷移図とフローチャートも作成してくれました!
図にするとやっぱり分かりやすいですね。
反応速度ゲーム:AI(Claude)提案の基本仕様で気になる点を指摘
このままでもゲームの作成は出来そうですが、ちょっと気になったところがありました。
以下の図の赤枠のところで、ボタンが押されると次の状態に進んで、計測した時間を表示してくれます。
「ボタンが押されない間はずっと待つ」という仕様なのですが、
「ボタンが押されないまま1分経ったら自動でゲーム終了」というような処理が無く、ずーーーーっと待ちぼうけになってしまいます。

この仕様が意図的なのか、AIがうっかりしているのか知りたくなり、ちょっと確認してみました。

するとこんな回答が返ってきました。
AIのうっかりではなく、意図的にこの仕様になっているようです。
そのうえで、仕様を変更するか確認されました。

今回はシンプルに①のままいくことにしました。これで仕様が決まりました!
今回作る反応速度ゲームの仕様まとめ
今回AI(Claude)と相談して決めた反応速度ゲームの仕様は以下になります。
| 項目 | 内容 |
|---|---|
| 動作環境 | Wokwi上のArduino Unoシミュレーター |
| 使用パーツ | LED+抵抗(220Ω)、プッシュボタン、 |
| ゲームの流れ | 1~5秒のランダムな待ち時間の後にLEDが点灯 → ボタンを押すまでの時間を計測 |
| 結果表示 | 反応時間(ミリ秒)をシリアルモニタに表示 |
| フライング判定 | LED点灯前にボタンを押したら「フライング」と表示して、やり直し |
反応速度ゲームのソースコード作成
AI(Claude)に相談して、サクッとソースコードと配線図を作成してもらいました。
とりあえず、作成してもらったソースコードと配線図をそのまま使用して動かしてみます!


Wokwiでの回路作成・実行手順
実行手順(ログイン不要、コピペ2回でOK)
Wowkiはユーザー登録することで等ができるようになります。
しかし、ブラウザ上で動作確認するだけであればログイン不要です。
なんとコピペを2回するだけで準備完了しました!慣れれば1分もあればできそうです。
- Wowki で 対象マイコンのページを開く(https://wokwi.com/projects/new/arduino-uno)
- ソースコードを貼り付け
- 配線図の内容を貼り付け
- ブラウザ上でシミュレータ実行
実際の操作画面のキャプチャを貼りながら説明します。
手順①Wowki で 対象マイコンのページを開く
まずはWowkiのサイト(https://wokwi.com/)にアクセスします。

少し下にスクロールすると「Start from Scratch」という章があります。
今回の対象マイコンが「Arduino Uno」なので、対象のアイコンをクリックします。

このように、対象のマイコンのページが開きます

手順②ソースコードを貼り付け
画面左側は3つのタブに分かれています。
1番左側のタブ「sketch.ino」のソースコードを、今回作成したものに上書きします。

👇Claudeが作成した「reaction_game.ino」の中身をコピペ

手順③配線図の内容を貼り付け
続いて真ん中のタブ「diagram.json」の内容を、今回作成したものに上書きします。

👇Claudeが作成した「diagram.json」の中身をコピペ

手順④ブラウザ上でシミュレータ実行
コードの貼り付けだけで、配線も完了しました!
右上:LED+抵抗
右下:プッシュボタン
が配置されています。

いざ実行です。実行する時は「Simulation」タブの三角マークを押します。

すると…
数秒してから赤色LEDが光りました!
親切なことに、右下に「今だ!ボタンを押して!」というメッセージが表示されています。笑

LEDが光ってから、以下に早く青色のプッシュボタンを押すか、というゲームです。
急いで青色のプッシュボタンを押すと、「反応時間:338ms」と表示されました。
バッチリ遊べます。

フライング判定もテストしてみます。
LEDが点灯する前にボタンを押すと、「フライング!早すぎます。」とコメントしてくれました。

コードの解説
LEDの点灯・消灯をどう制御しているか
LEDの制御はdigitalWrite()関数で行っています。setup()でpinMode(LED_PIN, OUTPUT)としてピン8を出力用に設定しておき、あとは
digitalWrite(LED_PIN, HIGH)→ LEDを点灯digitalWrite(LED_PIN, LOW)→ LEDを消灯
の2行だけでON/OFFを切り替えています。
- ゲーム開始直後と
setup()ではLEDを消灯(LOW) - ランダム待機が終わって反応時間の計測を始める瞬間に点灯(
HIGH) - ボタンが押されて計測が終わったら再び消灯(
LOW)
という流れになっています。
ボタンの入力をどう読み取っているか(チャタリング対策)
チャタリングとは「ボタンを押した瞬間に電気的な接触が細かくON/OFFを繰り返してしまう現象」のことです。
ボタンの状態はdigitalRead(BUTTON_PIN)で読み取っています。pinMode(BUTTON_PIN, INPUT_PULLUP)を使っているため、
- ボタンを押していない →
HIGH - ボタンを押した →
LOW
という関係になります。そのため、コード中ではdigitalRead(BUTTON_PIN) == LOWが「ボタンが押された」という条件になっています。
チャタリング対策としては、waitForButtonRelease()という関数を用意しています。
void waitForButtonRelease() {
while (digitalRead(BUTTON_PIN) == LOW) {
delay(10);
}
delay(50); // チャタリング対策
}ボタンが押されたことを検知したあと、この関数で「ボタンが完全に離されるまで」待ち、さらに離れた後も50ミリ秒待つことで、チャタリングによる誤判定(1回の操作を複数回押したと誤認識してしまうこと)を防いでいます。
反応時間をどう計測しているか(タイマー処理)
時間の計測にはmillis()関数を使っています。millis()は「Arduinoが起動してから何ミリ秒経過したか」を返す関数です。
LEDを点灯させた瞬間に、その時刻をstartTimeとして記録します。
digitalWrite(LED_PIN, HIGH);
unsigned long startTime = millis();そして、ボタンが押された瞬間の時刻からstartTimeを引くことで、反応にかかった時間(ミリ秒)を求めています。
unsigned long reactionTime = millis() - startTime;delay()を使わずにwhileループとmillis()の差分でタイマーを実現しているのがポイントです。
delay()だとその間ボタンの状態を確認できませんが、この書き方であればボタンが押された瞬間を逃さず検知できます。
フライング判定のロジック
LEDが光る前の待機中にも、実は裏でずっとボタンの状態をチェックしています。
unsigned long waitTime = random(1000, 5001);
unsigned long waitStart = millis();
bool falseStart = false;
while (millis() - waitStart < waitTime) {
if (digitalRead(BUTTON_PIN) == LOW) {
falseStart = true;
break;
}
}random(1000, 5001)で決めたランダムな待機時間(1~5秒)が経過するまでの間、whileループでボタンの状態を監視し続けます。
もしその間にボタンが押されたら、falseStartをtrueにしてループを抜け、LEDを点灯させずに「フライング! 早すぎます。」と表示してそのラウンドをやり直します(returnでloop()の先頭に戻ります)。
逆に、待機時間が経過してもボタンが押されなければ、正常にLEDを点灯させて次のステップ(反応時間の計測)へ進みます。
Claudeと反応速度ゲームを作成して気づいたこと
今回Claudeと反応速度ゲームを作成して、気づいたことを書いていきます。
- AIを活用することで、爆速でアプリ作成ができる
- Wokwiのシミュレーターを使うことで、実機が無くても組み込み開発の体験ができる
- ソースコードを書く前に仕様を固めるのは大切
AIを活用することで、爆速でアプリ作成ができる
普段なら「LEDとボタンで反応速度を測るゲームを作りたい」という漠然としたアイデアから、実際に動くコードにたどり着くまでには、仕様を考えて、資料を調べて、配線を検討して……と何日かかかっていたと思います。
しかし今回はClaudeとの会話だけで、待ち時間を含めても30分くらいでアプリを作成することができました。
特によかったのは、「ボタンが押されなかった場合、無限ループしてしまうが問題ないか?」のような、実装しながら気づくような細かい疑問をその場で相談し、選択肢を提示してもらいながら決められた点です。
自分だけだとどうするか悩んで固まってしまいそうでしたが、対話しながら手を動かせるスピード感は、AIを使った開発ならではだと感じました。
Wokwiのシミュレーターを使うことで、実機が無くても組み込み開発の体験ができる
今回はArduino実機やLED、抵抗、ブレッドボードなどを一切用意せず、Wokwiのシミュレーター上だけで開発を進めました。
配線についてもdiagram.jsonというテキストベースのファイルで部品と接続を定義してもらえたので、「LEDをピン8に、ボタンをピン2に接続する」という配線作業すら、コードを書くのと同じ感覚で進められました。
組み込み開発は「まず部品を買い揃える」というハードルがどうしても発生しがちですが、Wokwiを使えばアイデアを思いついたその場でブラウザだけで動作確認まで完結します。
実機を買う前にアイデアを試したり、コードの動作を検証したりする用途として、非常に相性が良いと感じました。
ソースコードを書く前に仕様を固めるのは大切
今回、いきなりコードを書き始めるのではなく、まず「状態遷移図」と「フローチャート」を作ってもらい、ゲームの流れを図として可視化してから実装に入りました。
この順番にしたことで、「ボタンが押されなかったらどうなるか」といった、コードを書きながらだと見落としがちな仕様の抜け漏れを、設計段階で洗い出すことができました。
また、先に流れが図として固まっていたおかげで、実際のコードも設計通りにすんなりと書いてもらえましたし、動作の検証をする時も仕様/設計通りかの確認がしやすかったです。
まとめ
- Wokwiを使えば、実機がなくても組み込みソフトの基本(GPIO・タイマー処理)を体験できる
- 反応速度ゲームは組み込み入門にちょうどいい題材
- AIと仕様を相談しながら進めると、初めての分野でもスムーズに進められる
最後まで読んでいただき、ありがとうございました。
C言語の基礎からおさらいしたい方は、以下の記事もぜひ参考にしてみてください。




コメント