【初めてのArduino】初心者キットで作る「なでなで電子ペットくん」|手を近づけると鳴いてしっぽを振る愛らしい工作

初心者キットだけで作る! なでなで電子ペット

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

Lチカは一応やってみたんだけど、そこから先のステップが分からなくて、、初心者キットの部品で「ちょっと感動できる」ような工作ってないの?

今回はキットの中の超音波センサとサーボとブザーを使って、手をかざすと鳴いてしっぽを振る「電子ペット」を作ってみよう!動くと音が出るから、家族にも見せたくなる作品だよ。

今回は、初心者キットを買ったけれどLチカ以降に進めずに止まっている方に向けて、ELEGOOのR3スターターキットに入っている部品だけで作れる「なでなで電子ペットくん」の作り方を紹介したいと思います。

使う部品は超音波センサ1個・パッシブブザー1個・サーボモータ1個とシンプルですが、できあがるのは手を近づけると鳴き声を出ししっぽを振って反応してくれる、ちょっとしたペットのような工作です。

できるだけ短くコンパクトにまとめたので、キットを買って積んだままになっている方も、これから初心者キットの購入を検討している方も、ぜひ最後までご覧ください。

この記事で学べる事
  • 超音波センサ(HC-SR04)で「距離」をArduinoで読み取る方法
  • サーボモータSG90で角度を制御する基本
  • パッシブブザーで鳴き声のような音色を作るコツ
  • センサ入力で出力を切り替える「反応する装置」の作り方

作るもののイメージ

今回作る「なでなで電子ペットくん」は、手を近づけると「キュッキュッ」と鳴き声を出し、しっぽが左右に揺れる装置です。手を離せば静かに眠るように停止します。

仕組みはとてもシンプルで、超音波センサが前に出した手までの距離を常に測り続け、近いと判断したらブザーとサーボへ「動け」と命令を出します。

サーボの先に紙やフェルトでしっぽを付ければ、ぐっとペット感が出るよ。机の上に置いておくと、通りかかった家族や同僚が思わず手を伸ばしたくなるんだ!
この作品の特徴
入力は超音波センサ1個、出力はブザーとサーボの2個だけ。初心者キット定番の3部品で完成までたどり着ける構成です。

必要な物

今回必要なものは、すべてELEGOO R3スターターキット(または同等の初心者キット)に最初から入っている部品です。新しく買い足すものはありません。

必要な部品
  1. Arduino UNO R3互換ボード1個
  2. ブレッドボード1枚
  3. 超音波センサHC-SR04 1個(4本足のあのモジュール)
  4. パッシブブザー1個
  5. サーボモータSG90 1個
  6. オスオスのジャンパーワイヤ8〜10本
  7. USBケーブル(Arduinoとパソコン接続用)1本
  8. (任意)しっぽに使う厚紙やフェルトなど

ここで1つ注意点があります。キットにはアクティブブザーとパッシブブザーの2種類が入っていることが多いので、今回は必ずパッシブブザー(裏面に基板の穴が見えているタイプ)を使ってください。

ブザーって2種類あるんだ。違いはなに?

アクティブは電気を流すだけで「ピー」と一定音で鳴る単機能タイプ、パッシブは周波数を指定して鳴らすタイプだよ。鳴き声のように音色を変えたい今回は、必ずパッシブを使うんだ!

回路の組み立て方

回路は大きく3つのパーツに分かれます。距離を測る部分・鳴き声を出す部分・しっぽを振る部分です。順番にブレッドボードに組んでいきましょう。

全体の接続イメージ

全体の信号の流れを図にすると、以下のようになります。

flowchart LR US[超音波センサHC-SR04] -->|Trig=D7| ARD[Arduino UNO] ARD -->|Echo=D6| US ARD -->|D8| BZ[パッシブブザー] ARD -->|D9| SV[サーボSG90]

Arduinoが超音波センサからの距離を読み取り、近ければブザーとサーボへ出力するという、入力1個・出力2個のシンプルな構成です。

超音波センサ部分の配線

HC-SR04は4本足のモジュールで、ピンはVCC・Trig・Echo・GNDの順で並んでいます。VCCは5V、GNDはGNDへ、TrigとEchoはArduinoのデジタルピンに直結します。

flowchart TD V5[5V] --> VCC[HC-SR04 VCC] D7[Arduino D7] --> TRIG[HC-SR04 Trig] ECHO[HC-SR04 Echo] --> D6[Arduino D6] GNDP[HC-SR04 GND] --> GND[GND]

超音波センサは、Trigピンに短いパルスを出すと音波を発射して、跳ね返ってきた音をEchoピンの「HIGHが続いた時間」として返してくれるんだ。その時間から距離を計算するよ。

ブザー部分の配線

パッシブブザーは片足が「+」になっています。「+」側をArduinoのD8へ、もう片方をGNDへ接続します。

flowchart TD D8[Arduino D8] --> BZP[ブザー プラス側] BZP --> BZM[ブザー マイナス側] BZM --> GND[GND]

サーボ部分の配線

サーボSG90のケーブルは3本で、茶=GND、赤=5V、橙=信号です(色は個体差で黒・赤・黄もあります)。橙の信号線をArduinoのD9に接続します。

flowchart TD V5S[5V] --> SVV[サーボ 赤] D9[Arduino D9] --> SVS[サーボ 橙信号] SVG[サーボ 茶GND] --> GND[GND]

サーボは動作時に瞬間的に大きな電流を要求するので、無理に複数のサーボを同時に動かすと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〜row8HC-SR04VCC・Trig・Echo・GNDの順で4本足を挿す
row11・row12パッシブブザー+側がD8、-側がGND
row15〜row17サーボSG90赤=5V、橙=D9、茶=GND

HC-SR04はピン間隔がブレッドボードの穴ピッチとぴったり同じなので、4本まとめてrow5〜row8に直接挿して使えます。モジュールの送受信器(円柱の目玉)がしっかり前を向くように挿しましょう。

配線する前には必ずUSBケーブルを抜いて、Arduinoの電源を切ってから作業するようにしましょう。電源を入れたまま配線を変えると、ショートして部品やボードを壊す原因になります。

配線時の絶対ルール
配線変更は必ず電源OFFで行う。GND同士は共通、極性のある部品は向きを間違えない。

プログラムの作成

回路が組めたら、次はプログラムを書いていきます。今回のプログラムは「距離を測る→近かったら鳴いてしっぽを振る、遠かったら眠る」という単純な条件分岐です。

プログラムの動作フロー

プログラム全体の流れを、フローチャートにすると以下のようになります。

flowchart TD A[起動] --> B[ピン設定とサーボ初期化] B --> C[距離を測る] C --> D{近い?} D -->|Yes 15cm以下| E[鳴き声 + しっぽ振り] D -->|No| F[ブザー停止 + サーボ中央] E --> C F --> C

このように、センサを読む→判定する→出力する、というループを繰り返すのがマイコンプログラムの基本パターンです。

完成版のコード

以下のコードを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);
  }
}

ポイントは「wagRight」というフラグだよ。これで毎ループごとにサーボの角度を60度と120度で切り替えて、「しっぽが左右に揺れる」動きを作っているんだ。tone関数も2種類の周波数を交互に鳴らして、鳴き声っぽさを出してるよ。

使っている関数の意味

初めて見る関数があるかもしれないので、簡単に整理しておきます。

関数役割
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に最初から入っている標準ライブラリなので、追加インストールは不要です。

動作確認の手順
  1. USBケーブルでArduinoとパソコンを接続する
  2. Arduino IDEで上のコードを書き込む
  3. シリアルモニタを開き、表示される距離の値を確認する
  4. センサの前に手をかざして15cm以内に近づける
  5. 「ピッピッ」と鳴き声が出てサーボが左右に動いたら成功

シリアルモニタで実際の距離の値を確認しながら、自分の使い方に合わせてNEAR_CMの値を調整するのがコツです。机の上に置いて手をかざす場合は15cm前後、もう少し離れた距離で反応させたい場合は25〜30cm程度に増やすと使いやすくなります。

なるほど!しきい値を変えれば「人感センサ的な使い方」もできるんだね。

うまくいかない時のチェックポイント

初心者がつまずきやすいポイントを3つにまとめました。動かないときは、まずここを順番に確認してみてください。

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

特に「電源を入れたまま配線を変える」は絶対にやめてね。ショートして部品が壊れるだけじゃなく、最悪Arduino本体ごとダメになることもあるんだ。

シリアルモニタの値が常に999に張り付いている場合は、超音波センサの配線が間違っているか、センサの目の前に何もない状態(反射が返ってこない)である可能性が高いです。VCCとGNDの取り違えがないかも合わせて見直しましょう。

発展のアイデア

基本動作ができたら、ここからさらに自分なりのアレンジを加えていくのが電子工作の醍醐味です。

改造アイデア
  • サーボの先に厚紙やフェルトでしっぽや耳の形を貼り付ける
  • 近づけば近いほど鳴き声を高くする(周波数をdistanceに連動させる)
  • キット同梱のRGB LEDを足して、近づくと目の色が変わるようにする
  • 距離別に「警戒モード」「甘えモード」など複数の反応パターンを実装する

どれも同じキットの中の部品の組み合わせを変えるだけで実現できる範囲です。1つの作品ができると次のアイデアが自然と湧いてくるので、ぜひ自分なりのカスタマイズを試してみてください。

まとめ

今回は、電子工作の初心者キットに最初から入っている部品だけで作る「なでなで電子ペットくん」について紹介してきました。

使ったのは超音波センサ1個・パッシブブザー1個・サーボモータ1個というシンプルな構成ですが、「手を近づけると鳴いてしっぽを振る」という体験は、初めての電子工作とは思えないほどの満足感をもたらしてくれるはずです。

キットを買ってLチカで止まっていた方も、この作品をきっかけに「センサで状況を読み取って、複数の出力で反応する」というIoT・電子工作の基本パターンを体感できたはずです。ここまで作れたら、あとは部品を入れ替えるだけで無数のガジェットを作れるようになります。

今回学んだこと
  • 初心者キットの部品でも、組み合わせ次第で愛らしいガジェットが作れる
  • 超音波センサとpulseIn関数で距離を数値として読み取る方法
  • サーボモータのattach/write関数で角度を制御する基本
  • 条件分岐で「センサ入力→複数出力」の基本パターンを実装する方法

今後、初心者キットを活かして作れる別のガジェットも紹介していく予定ですので、そちらも合わせてご覧ください。