初心者キットで作る「なでなで電子ペットくん」


今回は、初心者キットを買ったけれどLチカ以降に進めずに止まっている方に向けて、ELEGOOのR3スターターキットに入っている部品だけで作れる「なでなで電子ペットくん」の作り方を紹介したいと思います。
使う部品は超音波センサ1個・パッシブブザー1個・サーボモータ1個とシンプルですが、できあがるのは手を近づけると鳴き声を出ししっぽを振って反応してくれる、ちょっとしたペットのような工作です。
できるだけ短くコンパクトにまとめたので、キットを買って積んだままになっている方も、これから初心者キットの購入を検討している方も、ぜひ最後までご覧ください。
- 超音波センサ(HC-SR04)で「距離」をArduinoで読み取る方法
- サーボモータSG90で角度を制御する基本
- パッシブブザーで鳴き声のような音色を作るコツ
- センサ入力で出力を切り替える「反応する装置」の作り方
作るもののイメージ
今回作る「なでなで電子ペットくん」は、手を近づけると「キュッキュッ」と鳴き声を出し、しっぽが左右に揺れる装置です。手を離せば静かに眠るように停止します。
仕組みはとてもシンプルで、超音波センサが前に出した手までの距離を常に測り続け、近いと判断したらブザーとサーボへ「動け」と命令を出します。

必要な物
今回必要なものは、すべてELEGOO R3スターターキット(または同等の初心者キット)に最初から入っている部品です。新しく買い足すものはありません。
- Arduino UNO R3互換ボード1個
- ブレッドボード1枚
- 超音波センサHC-SR04 1個(4本足のあのモジュール)
- パッシブブザー1個
- サーボモータSG90 1個
- オスオスのジャンパーワイヤ8〜10本
- USBケーブル(Arduinoとパソコン接続用)1本
- (任意)しっぽに使う厚紙やフェルトなど
ここで1つ注意点があります。キットにはアクティブブザーとパッシブブザーの2種類が入っていることが多いので、今回は必ずパッシブブザー(裏面に基板の穴が見えているタイプ)を使ってください。


回路の組み立て方
回路は大きく3つのパーツに分かれます。距離を測る部分・鳴き声を出す部分・しっぽを振る部分です。順番にブレッドボードに組んでいきましょう。
全体の接続イメージ
全体の信号の流れを図にすると、以下のようになります。
Arduinoが超音波センサからの距離を読み取り、近ければブザーとサーボへ出力するという、入力1個・出力2個のシンプルな構成です。
超音波センサ部分の配線
HC-SR04は4本足のモジュールで、ピンはVCC・Trig・Echo・GNDの順で並んでいます。VCCは5V、GNDはGNDへ、TrigとEchoはArduinoのデジタルピンに直結します。

ブザー部分の配線
パッシブブザーは片足が「+」になっています。「+」側をArduinoのD8へ、もう片方をGNDへ接続します。
サーボ部分の配線
サーボSG90のケーブルは3本で、茶=GND、赤=5V、橙=信号です(色は個体差で黒・赤・黄もあります)。橙の信号線をArduinoのD9に接続します。
サーボは動作時に瞬間的に大きな電流を要求するので、無理に複数のサーボを同時に動かすとArduinoのUSB給電だけでは電圧が落ちて誤動作することがあります。今回はサーボ1個なので問題ありません。
ブレッドボード全体の配線図
ブレッドボードを上から見た図です。左端の赤いライン(+)が5V、青いライン(-)がGNDに接続されていて、中央の数字付きの行はa〜eの5穴が横一列で電気的につながっています。同じ行に部品の足を挿せば、それだけで配線したことになります。
a b c d e
+-------------------+
[+]rail | . . . . . . . . . | 5V
[-]rail | . . . . . . . . . | GND
+-------------------+
row 5 | X . . . . . . . . | US:VCC
row 6 | X . . . . . . . . | US:Trig
row 7 | X . . . . . . . . | US:Echo
row 8 | X . . . . . . . . | US:GND
row 11 | X . . . . . . . . | BZ:+
row 12 | X . . . . . . . . | BZ:-
row 15 | X . . . . . . . . | SV:red
row 16 | X . . . . . . . . | SV:sig
row 17 | X . . . . . . . . | SV:brown
+-------------------+
凡例: X=部品を挿す穴, .=空き穴
US=HC-SR04, BZ=ブザー, SV=サーボ
同じ行のa-eは内部で連結
接続表:
1) 5V -> [+]rail
2) GND -> [-]rail
3) [+]rail -> row5 b (US VCC)
4) D7 -> row6 b (US Trig)
5) D6 -> row7 b (US Echo)
6) row8 b -> [-]rail (US GND)
7) D8 -> row11 b (BZ +)
8) row12 b -> [-]rail (BZ -)
9) [+]rail -> row15 b (SV red)
10) D9 -> row16 b (SV sig)
11) row17 b -> [-]rail (SV brown)
分かりやすく整理すると、各部品の挿し位置と役割は次の通りです。
| 挿し位置 | 部品 | 役割 |
|---|---|---|
| row5〜row8 | HC-SR04 | VCC・Trig・Echo・GNDの順で4本足を挿す |
| row11・row12 | パッシブブザー | +側がD8、-側がGND |
| row15〜row17 | サーボSG90 | 赤=5V、橙=D9、茶=GND |
HC-SR04はピン間隔がブレッドボードの穴ピッチとぴったり同じなので、4本まとめてrow5〜row8に直接挿して使えます。モジュールの送受信器(円柱の目玉)がしっかり前を向くように挿しましょう。
配線する前には必ずUSBケーブルを抜いて、Arduinoの電源を切ってから作業するようにしましょう。電源を入れたまま配線を変えると、ショートして部品やボードを壊す原因になります。
プログラムの作成
回路が組めたら、次はプログラムを書いていきます。今回のプログラムは「距離を測る→近かったら鳴いてしっぽを振る、遠かったら眠る」という単純な条件分岐です。
プログラムの動作フロー
プログラム全体の流れを、フローチャートにすると以下のようになります。
このように、センサを読む→判定する→出力する、というループを繰り返すのがマイコンプログラムの基本パターンです。
完成版のコード
以下のコードをArduino IDEに貼り付けて使用してください。SG90を使うので、標準ライブラリのServoをincludeしています。
// なでなで電子ペットくん
// 入力: 超音波センサ HC-SR04 (Trig=D7, Echo=D6)
// 出力: パッシブブザー (D8), サーボ SG90 (D9)
#include <Servo.h>
const int PIN_TRIG = 7;
const int PIN_ECHO = 6;
const int PIN_BUZZ = 8;
const int PIN_SERVO = 9;
// 近いと判定する距離 (cm)
const int NEAR_CM = 15;
Servo tail;
bool wagRight = true;
// 距離を測る関数 (cm を返す。失敗時は 999)
long readDistanceCm() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long dur = pulseIn(PIN_ECHO, HIGH, 30000UL);
if (dur == 0) return 999;
return dur / 58;
}
void setup() {
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZ, OUTPUT);
tail.attach(PIN_SERVO);
tail.write(90);
Serial.begin(9600);
}
void loop() {
long d = readDistanceCm();
Serial.println(d);
if (d <= NEAR_CM) {
// 近い: 鳴いてしっぽを振る
if (wagRight) {
tail.write(60);
tone(PIN_BUZZ, 880, 120);
} else {
tail.write(120);
tone(PIN_BUZZ, 988, 120);
}
wagRight = !wagRight;
delay(180);
} else {
// 遠い: 静かにする
noTone(PIN_BUZZ);
tail.write(90);
delay(80);
}
}

使っている関数の意味
初めて見る関数があるかもしれないので、簡単に整理しておきます。
| 関数 | 役割 |
|---|---|
| pulseIn(ピン, HIGH, タイムアウト) | 指定ピンがHIGHになっている時間(μs)を測る |
| tone(ピン, 周波数, 長さ) | 指定周波数の音を鳴らす(パッシブブザー用) |
| noTone(ピン) | tone関数による音を止める |
| Servo.attach(ピン) | サーボを指定ピンで使用開始する |
| Servo.write(角度) | サーボを0〜180度の指定角度に動かす |
pulseInで読んだ時間を58で割るとcm単位の距離になります。これは音速340m/sから導かれる定数で、往復分の時間を距離に換算する公式です。
書き込みと動作確認
Arduino IDEの「ツール」→「ボード」で「Arduino Uno」、「ポート」でUSB接続したArduinoを選び、書き込みボタンを押します。ServoライブラリはArduino IDEに最初から入っている標準ライブラリなので、追加インストールは不要です。
- USBケーブルでArduinoとパソコンを接続する
- Arduino IDEで上のコードを書き込む
- シリアルモニタを開き、表示される距離の値を確認する
- センサの前に手をかざして15cm以内に近づける
- 「ピッピッ」と鳴き声が出てサーボが左右に動いたら成功
シリアルモニタで実際の距離の値を確認しながら、自分の使い方に合わせてNEAR_CMの値を調整するのがコツです。机の上に置いて手をかざす場合は15cm前後、もう少し離れた距離で反応させたい場合は25〜30cm程度に増やすと使いやすくなります。

うまくいかない時のチェックポイント
初心者がつまずきやすいポイントを3つにまとめました。動かないときは、まずここを順番に確認してみてください。
- 距離の値がずっと999のまま: HC-SR04のTrig/Echoピンを取り違えていないか、VCCに5Vが来ているか確認
- ブザーが鳴らない、または単音しか鳴らない: アクティブブザーをパッシブブザーと間違えていないか確認
- サーボがガタガタ震えるだけで動かない: 信号線(橙)がD9にちゃんと挿さっているか、GNDがArduinoと共通になっているか確認

シリアルモニタの値が常に999に張り付いている場合は、超音波センサの配線が間違っているか、センサの目の前に何もない状態(反射が返ってこない)である可能性が高いです。VCCとGNDの取り違えがないかも合わせて見直しましょう。
発展のアイデア
基本動作ができたら、ここからさらに自分なりのアレンジを加えていくのが電子工作の醍醐味です。
- サーボの先に厚紙やフェルトでしっぽや耳の形を貼り付ける
- 近づけば近いほど鳴き声を高くする(周波数をdistanceに連動させる)
- キット同梱のRGB LEDを足して、近づくと目の色が変わるようにする
- 距離別に「警戒モード」「甘えモード」など複数の反応パターンを実装する
どれも同じキットの中の部品の組み合わせを変えるだけで実現できる範囲です。1つの作品ができると次のアイデアが自然と湧いてくるので、ぜひ自分なりのカスタマイズを試してみてください。
まとめ
今回は、電子工作の初心者キットに最初から入っている部品だけで作る「なでなで電子ペットくん」について紹介してきました。
使ったのは超音波センサ1個・パッシブブザー1個・サーボモータ1個というシンプルな構成ですが、「手を近づけると鳴いてしっぽを振る」という体験は、初めての電子工作とは思えないほどの満足感をもたらしてくれるはずです。
キットを買ってLチカで止まっていた方も、この作品をきっかけに「センサで状況を読み取って、複数の出力で反応する」というIoT・電子工作の基本パターンを体感できたはずです。ここまで作れたら、あとは部品を入れ替えるだけで無数のガジェットを作れるようになります。
- 初心者キットの部品でも、組み合わせ次第で愛らしいガジェットが作れる
- 超音波センサとpulseIn関数で距離を数値として読み取る方法
- サーボモータのattach/write関数で角度を制御する基本
- 条件分岐で「センサ入力→複数出力」の基本パターンを実装する方法

今日から始める電子工作 

