はじめに

今回も前回に引き続きモーターを使った電子工作について解説しますが、今回はモーターの動作を制御するための入力装置として「超音波センサ」を使用します。

超音波センサは、短い超音波を発信して、その超音波の反射時間によって距離を検出します。123d Circuitsで使用できるParallax社製のセンサでは約2cm~3mの範囲で距離を測定可能です。特徴は対象物(物体)の特性にあまり影響されずに距離を測定できることです。光センサなどは物体の色や表面の材質などによって反射率が変わるなどの影響を受けます。

Parallax社 超音波距離センサモジュール(秋月電子)

超音波センサの動作を確認してみよう

それでは、さっそく超音波センサの動作を確認してみましょう。まず、123d Circuitsで壁などの障害物に一定距離近づいたらLEDを点灯するシミュレーションを行います。今回使用する部品は、以下の5点です。抵抗は忘れずに数値を設定しておきましょう。

実体配線図は、以下のとおりです。

配線が終了したら、画面上部の「Code Editor」をクリックして、以下のスケッチを記述します。

const int pingPin = 2;
const int ledPin = 13;
unsigned long duration;
int cm;

void setup()
{
  pinMode(pingPin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  //ピンをOUTPUTに設定(パルス送信のため)
  pinMode(pingPin, OUTPUT);
  //LOWパルスを送信
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);  
  //HIGHパルスを送信
  digitalWrite(pingPin, HIGH);  
  //5uSパルスを送信してPingSensorを起動
  delayMicroseconds(5); 
  digitalWrite(pingPin, LOW); 
  
  //入力パルスを読み取るためにデジタルピンをINPUTに変更(シグナルピンを入力に切り替え)
  pinMode(pingPin, INPUT);   
  
  //入力パルスの長さを測定
  duration = pulseIn(pingPin, HIGH);  

  //パルスの長さを半分に分割
  duration=duration/2;  
  //cmに変換
  cm = int(duration/29); 

  if(cm <= 50) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
  
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(100);
}

このスケッチで使用している関数について簡単に説明します。

delayMicroseconds(μs)
パラメータとして指定された時間(マイクロ秒単位)でプログラムを一時停止する。数ミリ秒以上の停止の場合はdelay関数を使用。
【パラメータ】
μs(マイクロ秒):一時停止する時間をマイクロ秒で指定

pulseIn(pin、value)
ピンへ入力されるパルスの値を読み込む。ここでは入力されるパルスの長さを測定している。
【パラメータ】pin:パルスを入力するピンの番号
value:測定するパルスの種類。HIGHまたはLOW
【例】valueをHIGHに指定した場合 [ pulseIn(pin, HIGH) ]
・pulseIn関数はpinへの入力がHIGHになるタイミングで時間の計測を開始
・pinの値がLOWになるタイミングで計測を停止
・LOWに戻ったらそれまでの時間をマイクロ秒単位で返すことでパルスの長さを測定

パルス入力(トリガ)は5μs(最小2µs) となっているので、delayMicroseconds(5)と指定して5マイクロ秒ほど停止させます。そのままの数値をシリアルモニタで表示させると分かりづらいので、cm(センチメートル)の単位に変換します。

duration=duration/2;    //パルスの長さを半分に分割
cm = int(duration/29);   //cmに変換

超音波は物体からの跳ね返り(往復)を考慮する必要があるので、検出した値を2で割ります。また音速(約340m/sec)だと1cm進むのに29μsec(マイクロ秒)かかるため、29で割るとcmが算出できます。

それではシミュレーションしてみましょう。「Code Editor」の「Upload & Run」もしくは画面上部の「Start Simulation」をクリックします。●をマウスで動かして、センサとの距離が近くなるとLEDが点灯するのを確認できると思います。

続いて、Arduino Unoの実機で動作を確認します。ただし、ここではParallax社製の超音波センサよりも安価な「HC-SR04」を使用します。

超音波距離センサ HC-SR04(秋月電子)

HC-SR04は2cm〜400cmの範囲で距離の測定が可能です(2cmより近い距離は検出不可)。Parallax社製の超音波センサとはピンの本数が異なります。

SIGピンはなくTrig(トリガー)とEchoピンがあります。Parallax社製の超音波センサはSIGでパルスの送受信を1つのピンで行っていましたが、HC-SR04ではそれぞれTrig(パルスの送信)とEcho(パルスの読み込み)で行っています。VccはParallax社製と同様にArduino Unoの5Vに接続します。

それでは、Arduino Unoの実機に配線してみましょう。

配線が終了したら、Arduino IDEに以下のスケッチを記述します。Arduino IDEのインストールおよび使用方法は第4回(https://thinkit.co.jp/article/10874)の解説を参照してください。

const int trigPin = 2;
const int echoPin = 4;
const int ledPin = 13;

void setup()
{
  pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  unsigned long duration;
  int cm;
  //ピンをOUTPUTに設定(パルス送信のため)
  pinMode(trigPin, OUTPUT);
  //LOWパルスを送信
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  //HIGHパルスを送信
  digitalWrite(trigPin, HIGH);
  //10uSパルスを送信してPingSensorを起動
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  //入力パルスの長さを測定
  duration = pulseIn(echoPin, HIGH);

  //パルスの長さを半分に分割
  duration=duration/2;
  //cmに変換
  cm = int(duration/29);

  //対象物が近づいたらHIGHで出力
  if(cm <= 40){
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(100);
}

スケッチを記述できたら、設置位置を地面から少し高くしておきましょう。超音波の測定角度が15度なので、地面から少し高くしておかないと下側の対象物(地面)を検知してしまいます。

準備ができたら、Arduino IDEの画面左上にある矢印アイコン(マイコンボードに書き込み)をクリックしてみましょう。対象物を近づけるとLEDが点灯し、離すと消灯します。

Arduino IDE上で [ツール] → [シリアルモニタ]を確認すると、対象物との距離が表示されます。

おわりに

今回は超音波センサを使用しました。前回の最後にデモで紹介したDCモーターを使用したビークルに超音波センサを搭載して、障害物の検出をトリガーとしてビークルの進行方向を制御することができます。こちらの詳細は本連載の最後のほうで紹介する予定です。

次回は、省電(人感)センサとLED、100円ショップのツリーを利用してクリスマスツリーの作成をしていきたいと思います。次回もお楽しみに!

本連載の電子工作キットを販売しています!

本連載で紹介した電子工作をスグに試せる電子工作キットを販売しています。
記事内の画像や説明だけではもの足りない、という方は、本キットを通してお手元で確認してみてはいかがでしょうか。きっと、電子工作の楽しさをもっと実感できるはずです!

電子工作キットは、下記のWebサイトから購入できます!

商品サイトはこちら→→https://blooomin.stores.jp/

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30