Arduinoで超音波距離センサーを精密制御:ステップバイステップガイド
Arduinoを用いた超音波距離測定プロジェクト
超音波距離測定は、近年様々なアプリケーションで有用なツールです。位置決め、位置特定、寸法測定、選別、レベル測定、制御、プロファイリングなどに使用可能。出力値を用いた数学的計算により、速度やその他の物理量測定も可能。ロボティクス分野でも応用されています。
こうした用途を念頭に、超音波センサーは物理的接触なしで短距離を測定する優れたツールです。エコー(反射波)の概念を利用して距離を測定します。本プロジェクトでは、HC-SR04センサーモジュールをArduinoとインターフェース接続し、距離を16×2 LCDに表示する方法を学びます。
- 関連記事:Arduino UNO活用可変電源 ─ 回路とコード
距離測定プロジェクトの回路図

インターフェース接続は非常にシンプル。回路図に従ってください。まず、超音波センサーのTrigとEchoピンをArduino UNOのA4とA5に、VCCとGNDをArduinoの5VとGNDに接続。
距離を16×2 LCDに表示します。LCDのRSとENピンをArduinoのデジタルピン12と11にそれぞれ接続。LCDのD4-D7をArduinoのデジタルピン5-2に接続。LCDコントラスト調整用の10kΩポテンショメーターも回路図通り接続。
- 関連記事:Arduino活用自動ドアベル(物体検知付き)
必要部品
- HC-SR04 超音波センサーモジュール
- Arduino UNO
- 16×2 LCD
- ポテンショメーター
- ジャンパーケーブル・接続ワイヤー
超音波センサーモジュール
使用センサーモジュールはHC-SR04で、非接触型超音波測定デバイスです。この小型モジュールは2cm〜400cmの範囲で距離測定可能。精度は3mmまで対応する高精度センサーです。
センサーは超音波送信機と超音波受信機で構成されます。動作原理はシンプル。まず、IOトリガーが10μsのハイレベル信号を送信。次にセンサーモジュールが40kHzの超音波を8サイクル送信し、パルス信号が返ってくるか検知。信号を受信すると、IOトリガーがハイレベルを維持する時間(送信から受信までの時間)で距離を算出。
距離 = (ハイレベル時間 × 空気中の音速 (340m/s)) ÷ 2
- 関連記事:Arduino活用自動ナイトランプ
タイミング図
前述の通り、モジュールは音のエコーで動作。モジュール起動のため、約10μsのパルスを送信。その後、モジュールが40kHzの超音波8サイクルを送信し、反射をチェック。障害物があれば信号が衝突して受信機へ戻ります。距離は上記式で計算。総時間は障害物までの往復時間なので、障害物までの到達時間は総時間の半分になるため2で割ります。このセンサーのタイミング図は以下の通り:
技術仕様
- 動作電圧:5V
- 動作電流:15mA
- 動作周波数:40kHz
- 測定角度:15°
- 測定範囲:2cm〜400cm
HC-SR04 超音波センサー ピンアウト
- VCC:モジュール電源(通常+5V)
- Trig:モジュール起動用トリガーピン
- Echo:出力ピン。送信機から障害物、障害物から受信機までの信号往路時間、ハイレベルを維持
- GND:メイン回路のグラウンドに接続
前述の通り、モジュールは音のエコー原理で動作。マイクロコントローラーと接続時、まずTrigピンでモジュールを起動し、10μsのハイレベルパルスを送信。その後、エコー受信を待機。マイクロコントローラーで時間を計測し、上記式で距離を算出。
- 関連記事:クロバーサーキットとは? 設計と動作
Arduino UNO
Arduinoは、小規模から大規模な組み込みプロジェクトで広く使用されるオープンソースマイクロコントローラーです。本プロジェクトで使用するのはArduino UNO。安価でインターフェース接続が容易なため選択。ボードは14個のデジタルI/Oピンと6個のアナログピンを提供。マイクロコントローラーはオープンソースなので、ユーザーのニーズに合わせてボードとソフトウェアを変更可能。
- 関連記事:ツェナーダイオード活用シンプル過電圧保護回路
16×2 LCDモジュール
これらのモジュールは、安価でマイクロコントローラーとのインターフェース接続が容易なため、組み込みプロジェクトで広く使用されています。電卓やマルチメーターなどで見かけるタイプのディスプレイです。本プロジェクトで使用するLCDモジュールは、1行16文字表示、2行構成。つまり16列2行。表示される各文字は5×8ピクセル(ピクセルマトリックス)で構成。
全LCDの総ピクセル数を計算すると、5×8×16×2=1,280ピクセルとなり、かなりの数です。LCDに何か表示するには文字位置も指定する必要があり、これは非常に面倒。そこで、HD44780というICを使用して適切な動作を管理します。このICはマイクロコントローラーからデータとコマンドを取得し、処理して所望の出力をLCDに印刷。LCDインターフェースを非常に容易にします。センサーや他モジュールからの出力表示のため、多くのプロジェクトでLCDを使用できます。LCDモジュールの技術仕様を見てみましょう。
- 動作電圧:4.7V〜5.3V
- 消費電流:バックライト未使用時1mA
- 2行、各行16文字
- 各文字は5×8ピクセルマトリックス
- 英数字表示対応(数字、アルファベット、特殊文字も可能)
- グリーン/ブルーバックライトバリエーションあり
LCDのピン構成を見てみましょう。
16×2 LCD ピンアウトと説明
| ピン番号 | 名称 | 説明 |
| 1 | VSS | グラウンド、回路のグラウンドに接続 |
| 2 | VDD | LCD電源(4.7V〜5.3V)、通常5V |
| 3 | VE | LCDコントラスト調整用ピン。ポテンショメーターを接続し、ツマミ調整でコントラスト変更可能 |
| 4 | RS | レジスタセレクト。コマンドレジスタとデータレジスタの切り替え用。マイクロコントローラーに接続 |
| 5 | RW | 読み書き制御。データ書き込み時は一般的にグラウンド接続 |
| 6 | EN | イネーブルピン。マイクロコントローラーに接続、1/0でデータ確認 |
| 7 | データピン (0-7) | マイクロコントローラーからLCDへ8ビットデータ送信用。4ビットモードでも使用可能(データピン4本のみ接続) |
| 8 | A | アノード。LCDバックライト用正極ピン。使用は完全に任意。バックライト不要なら未接続で消費電流を大幅削減可能(仕様参照) |
| 9 | K | カソード。LCDバックライト用負極ピン |
ArduinoとLCDの基本インターフェースを見てみましょう。シンプルなコードでLCDにテキストを表示。まず、RSとENピンをArduinoのデジタルピン12と11に接続。D4-D7ピンをArduinoのデジタルピン5-2に接続。RW、VSS、Kをグラウンド、VDDとAをArduinoの5Vに接続。回路図通り、ポテンショメーターをVEに接続してコントラスト調整。
- 関連記事:IC 4017・555タイマー活用信号機制御電子プロジェクト
コーディング部分へ。まず、LCD用のLiquidCrystal.hライブラリをインクルード。
#include <LiquidCrystal.h>
次の2行で、Arduinoに接続したLCDデータピン用変数を定義し、lcd関数の引数として渡してArduinoからLCDへデータ送信可能にする。
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
setup関数で、lcd.begin()関数でLCDを初期化。16と2を渡すのは、使用LCDが16列2行で全面使用するため。LCDの一部分のみ使用する場合は引数を適宜調整。
次行で'Hello, World!'を表示。任意のメッセージ表示可能だが、表示サイズ超過分は次行へ折り返すため注意。
lcd.begin(16, 2);
lcd.print("Hello, World!");
loop関数で、lcd.setCursor()関数でカーソル位置(0,1)に設定。その後、メッセージ表示経過時間を表示。
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
コード作成後、Arduinoボードへアップロードするとディスプレイにメッセージ表示。ポテンショメーターツマミ回転でコントラスト調整可能。
- 関連記事:IC 555タイマー・非タイマー活用クラップスイッチ回路
超音波センサー距離測定用Arduinoプログラミング
このプロジェクトのコーディング部分は非常に簡単。LCD用ヘッダーファイルインクルードから開始。
#include <LiquidCrystal.h>
次の2行で、ArduinoのピンA4(ピン18)とA5(ピン19)用マクロを定義し、ピン番号代わりに名前で参照可能にする。
#define trig 18
#define echo 19
次の行で、Arduinoに接続したLCD各ピン用変数を定義し、lcd関数に渡してLCD初期化可能にする。
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
距離変数'd'と時間変数't'を定義し、0で初期化。
float t=0, d=0;
setup関数へ。最初にlcd.begin()でLCD初期化、次の2行でトリガーとエコーピンのピンモードを出力と入力に設定。
void setup() {
lcd.begin(16,2);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
}
loop関数へ。まずlcd.clear()でLCDクリア(ループ毎の前回出力影響を防止)。次の6行で、超音波センサーを初期化:10μsのハイレベルパルス送信。その後、センサーが自動的に40kHz超音波8サイクル送信し反射チェック。次の行でセンサーから時間を取得。距離計算。速度がm/s単位なので、cm単位に変換するため10000で割る(※コード内では0.0340/2および0.01330/2で計算)。
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
t = pulseIn(echo, HIGH);
d = t * 0.0340 / 2;
d = t * 0.01330 / 2;
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(d);
lcd.print(" cm");
delay(1000);
}
- 関連記事:自動浴室照明スイッチ回路図と動作
距離測定回路の動作
コード作成後、Arduinoへアップロードすれば準備完了。センサー前方に物体や手をかざし、LCDの距離表示を確認。物体とセンサーの距離を変えると、精度の良い距離が取得できます。
10μsのハイレベルパルス送信でセンサー初期化すると、センサーが40kHz超音波8サイクルを送信。障害物で反射すれば受信機へ戻ります。センサーは、送信機から障害物、障害物から受信機までの超音波信号移動時間を出力。この時間を用いてセンサーと障害物の距離を計算します。

産業技術
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Arduinoで超音波レベーション(浮遊)装置を自作:ステップバイステップガイド
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- Arduino UNOで周波数とデューティサイクルを高精度測定
- Arduino NanoとRDA5807Mで作るコンパクトFMラジオ
- コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
- Arduino UNOで作る静電容量式タッチLEDスイッチ - 簡単DIY
- 距離センサーの仕組みと主要アプリケーション
- Arduinoセンサー:種類、応用、実世界プロジェクト
- PIRセンサー回路の仕組み:設計、動作、実世界の応用