Arduinoで超音波センサHC-SR04による距離測定する【ブロックプログラミングLesson13】
こんにちは、せでぃあ(@cediablog)です。
ArduinoプログラミングLESSON13は「超音波センサーによる距離測定」です。
超音波センサーを使った対象物までの測定距離(cm)を、4桁7セグメントディスプレイに表示させるプログラミングの作り方を紹介します。
本LESSON記事は、プログラミングの学習と電子パーツ「超音波センサー」の知識を習得するプログラムになっています。
小学生、中学生も安心してプログラミングができるように、スクラッチでのプログラミング方法についても動画付きで紹介しています。
LESSON12の配線状態から始めると配線変更が少なく済みますよ!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらも紹介しています
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
- 超音波センサー(HC-SR04)とはどんな機器なのか
- Arduino IDEでのプログラミング方法
- mBlockを使ったビジュアルプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
mBlockを使った4ケタ7セグメントディスプレイ制御プログラムについては、こちらの記事にて詳しく説明しています。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
超音波センサー(HC-SR04)について
超音波センサー(HC-SR04)の概要説明
超音波センサー(HC-SR04)とは、超音波を使って対象物までの距離を測定することができる電子機器です。
2つのスピーカーを搭載し、1つのスピーカーから超音波を出力して対象物にぶつかって反射した音波をもう1つのスピーカーで受信させる使い方をします。
主要なスペックは以下の通りです。
電源電圧 | DC5V |
動作時電流 | 2cm |
動作周波数 | 40kHz |
最大計測範囲 | 4m |
最小計測範囲 | 2cm |
有効角度 | 15° |
トリガー入力パルス幅 | 10μs |
4ケタ7セグメントLEDディスプレイについて知りたい方は、こちらのLESSON12記事を参照してください。
超音波センサーを用いた距離測定方法
超音波センサーを用いた距離測定方法は以下となります。
- 超音波センサーから対象物に向けて超音波を発信する
- 超音波が対象物に衝突し反射する
- 超音波センサーが反射した超音波を受信する
- 超音波発信開始~受信までの時間に音速を掛け合わせて距離を算出する
距離=速さ×時間 の計算ですね!
求めたい距離は「片道分」のため、算出された距離を2で割って求めます
距離算出式について
実際にプログラム内で指定する計算式について、説明します。
距離(cm)=(音速340(m/s)×100)×(時間(μs)÷1000000)÷2
求める距離(cm)の単位に合わせて、音速は×100、時間は÷1000000の計算が必要です。
これをまとめると、下記式になります。
距離(cm)=0.017(cm/μs)×時間(μs)
正確には音速(m/s)=331.5+0.6T(℃)で算出されます
今回は音速=340m/s(15℃環境相当)で算出します
ピン割り当て
上下に6本ずつ配線用のピンが搭載されており、上記のようになっています。
- Vcc:+電源(5V)
- Trig:超音波発信トリガー入力
- Echo:超音波発信トリガー入力~受信まで出力ON
- GND:-電源(GND)
ピンの役割は大きく分けると「電源用」と「距離測定用」の2つになります。
HC-SR04のタイムチャート
タイムチャートからこのような動作になります。
- トリガー入力ピンに10μsのパルス入力を受け付ける
- 40kHzのパルスを8回出力すると同時にエコー出力信号をONする
- 超音波の1パルス目を入力した時点で、エコー出力信号をOFFする
ディスプレイに超音波センサー検出距離を表示させる動作の説明
今回の説明する「ディスプレイに超音波センサーによる検出距離(cm)を表示させる」は、以下になります。
- 固定した超音波センサーと障害物の距離に応じて、距離(cm)を算出する
- ディスプレイには「〇〇.〇〇」(cm)の表示がされる
- 超音波センサーHC-SR04の機器説明
- 超音波センサー検出距離に応じた、4ケタ7セグメントLEDディスプレイ表示動作
- mBlockを使ったプログラミングの解説
まずは動画を見て、今回のLESSON13で実行させたい動作内容を確認してください。
また、mBlockを使ったプログラミングをするためには準備作業が必要です。
動画にて準備作業に必要な手順をくわしく説明しています。
超音波センサー検出距離表示回路の作り方
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です
プログラムが完成したら動作確認を行います。
- 超音波センサーと障害物の距離に応じてディスプレイ表示が変化するか?
- 超音波センサに近づくと表示距離は小さくなり、遠ざかると大きくなるか?
超音波センサー検出距離のディスプレイ表示回路で使うもの
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- 4桁7セグメントLEDディスプレイ
- 抵抗(220Ω)×8本
- 超音波センサーHC-SR04
- ジャンパー線(オスーオス)×21本
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能面は同じです
4桁7セグメントLEDディスプレイ【キット】
キットに含まれる機器は、カソードコモンの4桁7セグメントLEDディスプレイとなります。
抵抗(220Ω)【キット】
220Ωの抵抗を使用し、各セグメントLEDに接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
VF(順電圧):1.85V
IF(順電流):20mA
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
超音波センサーHC-SR04【キット】
超音波センサーの詳細については、本記事冒頭にて解説しています。
ジャンパー線(オスーオス)【キット】
ジャンパー線を21本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
配線数が多いので、1本ずつ落ち着いて配線してください
- 4桁7セグメントLEDをブレッドボードに差し込む
- 超音波センサーをブレッドボードに差し込む
- 220Ω抵抗をブレッドボードに差し込む
- ジャンパー線をブレッドボードとArduinoソケットに差し込む
- ジャンパー線をブレッドボード内で配線する
4ケタ7セグメントLEDや抵抗、ジャンパー線はArduinoのソケットやブレッドボード穴に差し込むだけでOKです。
抵抗は極性がありませんのでどちら側のピンを挿入してもOKです。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
プログラミングのやり方
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、LESSON13の制御動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:ブロックによるビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
Arduino IDEプログラミング
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが巻末に記載されているので、関数を調べるときに重宝します!(私も所有しています)
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON13 */
/* 作成者:せでぃあ https://cediablog.com */
/* 超音波センサ × 4ケタ7セグメントディスプレイ */
int TRIG_SOCKET = 0; //超音波センサTRIG接続ソケット番号
int ECHO_SOCKET = 1; //超音波センサECHO接続ソケット番号
int SEG_A_SOCKET = 2; //セグメントA(7)の出力ソケット番号
int SEG_B_SOCKET = 3; //セグメントB(6)の出力ソケット番号
int SEG_C_SOCKET = 4; //セグメントC(4)の出力ソケット番号
int SEG_D_SOCKET = 5; //セグメントD(2)の出力ソケット番号
int SEG_E_SOCKET = 6; //セグメントE(1)の出力ソケット番号
int SEG_F_SOCKET = 7; //セグメントF(9)の出力ソケット番号
int SEG_G_SOCKET = 8; //セグメントG(10)の出力ソケット番号
int SEG1_SOCKET = 9; //4桁目のセグメント点灯出力ソケット番号
int SEG2_SOCKET = 10; //3桁目のセグメント点灯出力ソケット番号
int SEG3_SOCKET = 11; //2桁目のセグメント点灯出力ソケット番号
int SEG4_SOCKET = 12; //1桁目のセグメント点灯出力ソケット番号
int SEGDP_SOCKET = 13; //セグメントDP(3)の出力ソケット番号
int SEGNUM; //セグメント点灯数字
int SEGNUM1; //セグメント1桁目点灯数字
int SEGNUM2; //セグメント2桁目点灯数字
int SEGNUM3; //セグメント3桁目点灯数字
int SEGNUM4; //セグメント4桁目点灯数字
float DURATION; //超音波センサ検出時間
float DISTANCE; //超音波センサ検出距離
void setup() {
// put your setup code here, to run once: プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(TRIG_SOCKET, OUTPUT); //0番ピンは出力として使用
pinMode(ECHO_SOCKET, INPUT); //1番ピンは入力として使用
pinMode(SEG_A_SOCKET, OUTPUT); //2番ピンは出力として使用
pinMode(SEG_B_SOCKET, OUTPUT); //3番ピンは出力として使用
pinMode(SEG_C_SOCKET, OUTPUT); //4番ピンは出力として使用
pinMode(SEG_D_SOCKET, OUTPUT); //5番ピンは出力として使用
pinMode(SEG_E_SOCKET, OUTPUT); //6番ピンは出力として使用
pinMode(SEG_F_SOCKET, OUTPUT); //7番ピンは出力として使用
pinMode(SEG_G_SOCKET, OUTPUT); //8番ピンは出力として使用
pinMode(SEG1_SOCKET, OUTPUT); //9番ピンは出力として使用
pinMode(SEG2_SOCKET, OUTPUT); //10番ピンは出力として使用
pinMode(SEG3_SOCKET, OUTPUT); //11番ピンは出力として使用
pinMode(SEG4_SOCKET, OUTPUT); //12番ピンは出力として使用
pinMode(SEGDP_SOCKET, OUTPUT); //13番ピンは出力として使用
}
void loop() {
// put your main code here, to run repeatedly: プログラム起動後ループ処理される回路
digitalWrite(TRIG_SOCKET , LOW); //計測前にトリガー信号をOFFする
delayMicroseconds(2); //2マイクロ秒ウェイト
digitalWrite(TRIG_SOCKET , HIGH); //超音波トリガー信号をONさせる
delayMicroseconds(10); //10マイクロ秒ウェイト
digitalWrite(TRIG_SOCKET , LOW); //超音波トリガー信号をOFFさせる
DURATION = pulseIn(ECHO_SOCKET , HIGH); //エコー入力時間(マイクロ秒)を測定
DURATION = DURATION / 2; //往復時間を2で割って、片道時間に
DISTANCE = DURATION * 340 * 100 / 1000000; //音速を掛けてcm単位にする
DISTANCE = DISTANCE * 100; //ディスプレイ表示用に12.34⇒1234に変換
SEGNUM4 = DISTANCE / 1000; //4桁目(DIG1)数字の抽出
SEGNUM3 = (DISTANCE - SEGNUM4*1000) /100; //3桁目(DIG2)数字の抽出
SEGNUM2 = (DISTANCE - SEGNUM4*1000 - SEGNUM3*100) / 10; //2桁目(DIG3)数字の抽出
SEGNUM1 = DISTANCE - SEGNUM4*1000 - SEGNUM3*100 - SEGNUM2*10; //1桁目(DIG4)数字の抽出
for(int i = 1; i <= 4; i++){ //1~4桁の数字表示を順番に出力する
if(i == 1){ //1桁目(DIG4)の数字表示出力
SEGNUM = SEGNUM1; //セグメント表示数字に1桁目数字を代入
digitalWrite(SEG1_SOCKET , HIGH); //4桁目(DIG1)表示OFF
digitalWrite(SEG2_SOCKET , HIGH); //3桁目(DIG2)表示OFF
digitalWrite(SEG3_SOCKET , HIGH); //2桁目(DIG3)表示OFF
digitalWrite(SEG4_SOCKET , LOW); //1桁目(DIG4)表示ON
digitalWrite(SEGDP_SOCKET , LOW);
}else if(i == 2){ //2桁目(DIG3)の数字表示出力
SEGNUM = SEGNUM2; //セグメント表示数字に2桁目数字を代入
digitalWrite(SEG1_SOCKET , HIGH); //4桁目(DIG1)表示OFF
digitalWrite(SEG2_SOCKET , HIGH); //3桁目(DIG2)表示OFF
digitalWrite(SEG3_SOCKET , LOW); //2桁目(DIG3)表示ON
digitalWrite(SEG4_SOCKET , HIGH); //1桁目(DIG4)表示OFF
digitalWrite(SEGDP_SOCKET , LOW);
}else if(i == 3){ //3桁目(DIG2)の数字表示出力
SEGNUM = SEGNUM3; //セグメント表示数字に3桁目数字を代入
digitalWrite(SEG1_SOCKET , HIGH); //4桁目(DIG1)表示OFF
digitalWrite(SEG2_SOCKET , LOW); //3桁目(DIG2)表示ON
digitalWrite(SEG3_SOCKET , HIGH); //2桁目(DIG3)表示OFF
digitalWrite(SEG4_SOCKET , HIGH); //1桁目(DIG4)表示OFF
digitalWrite(SEGDP_SOCKET , HIGH);
}else if(i == 4){ //4桁目(DIG1)の数字表示出力
SEGNUM = SEGNUM4; //セグメント表示数字に4桁目数字を代入
digitalWrite(SEG1_SOCKET , LOW); //4桁目(DIG1)表示ON
digitalWrite(SEG2_SOCKET , HIGH); //3桁目(DIG2)表示OFF
digitalWrite(SEG3_SOCKET , HIGH); //2桁目(DIG3)表示OFF
digitalWrite(SEG4_SOCKET , HIGH); //1桁目(DIG4)表示OFF
digitalWrite(SEGDP_SOCKET , LOW);
}
if(SEGNUM == 0){ //セグメントディスプレイ表示「0」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , HIGH); //セグメントEの出力をON
digitalWrite(SEG_F_SOCKET , HIGH); //セグメントFの出力をON
digitalWrite(SEG_G_SOCKET , LOW); //セグメントGの出力をOFF
}
else if(SEGNUM == 1){ //セグメントディスプレイ表示「1」
digitalWrite(SEG_A_SOCKET , LOW); //セグメントAの出力をOFF
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , LOW); //セグメントDの出力をOFF
digitalWrite(SEG_E_SOCKET , LOW); //セグメントEの出力をOFF
digitalWrite(SEG_F_SOCKET , LOW); //セグメントFの出力をOFF
digitalWrite(SEG_G_SOCKET , LOW); //セグメントGの出力をOFF
}
else if(SEGNUM == 2){ //セグメントディスプレイ表示「2」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , LOW); //セグメントCの出力をOFF
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , HIGH); //セグメントEの出力をON
digitalWrite(SEG_F_SOCKET , LOW); //セグメントFの出力をOFF
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
else if(SEGNUM == 3){ //セグメントディスプレイ表示「3」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , LOW); //セグメントEの出力をOFF
digitalWrite(SEG_F_SOCKET , LOW); //セグメントFの出力をOFF
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
else if(SEGNUM == 4){ //セグメントディスプレイ表示「4」
digitalWrite(SEG_A_SOCKET , LOW); //セグメントAの出力をOFF
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , LOW); //セグメントDの出力をOFF
digitalWrite(SEG_E_SOCKET , LOW); //セグメントEの出力をOFF
digitalWrite(SEG_F_SOCKET , HIGH); //セグメントFの出力をON
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
else if(SEGNUM == 5){ //セグメントディスプレイ表示「5」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , LOW); //セグメントBの出力をOFF
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , LOW); //セグメントEの出力をOFF
digitalWrite(SEG_F_SOCKET , HIGH); //セグメントFの出力をON
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
else if(SEGNUM == 6){ //セグメントディスプレイ表示「6」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , LOW); //セグメントBの出力をOFF
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , HIGH); //セグメントEの出力をON
digitalWrite(SEG_F_SOCKET , HIGH); //セグメントFの出力をON
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
else if(SEGNUM == 7){ //セグメントディスプレイ表示「7」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , LOW); //セグメントDの出力をOFF
digitalWrite(SEG_E_SOCKET , LOW); //セグメントEの出力をOFF
digitalWrite(SEG_F_SOCKET , LOW); //セグメントFの出力をOFF
digitalWrite(SEG_G_SOCKET , LOW); //セグメントGの出力をOFF
}
else if(SEGNUM == 8){ //セグメントディスプレイ表示「8」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , HIGH); //セグメントEの出力をON
digitalWrite(SEG_F_SOCKET , HIGH); //セグメントFの出力をON
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
else if(SEGNUM == 9){ //セグメントディスプレイ表示「9」
digitalWrite(SEG_A_SOCKET , HIGH); //セグメントAの出力をON
digitalWrite(SEG_B_SOCKET , HIGH); //セグメントBの出力をON
digitalWrite(SEG_C_SOCKET , HIGH); //セグメントCの出力をON
digitalWrite(SEG_D_SOCKET , HIGH); //セグメントDの出力をON
digitalWrite(SEG_E_SOCKET , LOW); //セグメントEの出力をOFF
digitalWrite(SEG_F_SOCKET , HIGH); //セグメントFの出力をON
digitalWrite(SEG_G_SOCKET , HIGH); //セグメントGの出力をON
}
delay(5); //0.005秒ウェイト
}
}
上記が超音波センサーの検出距離に応じた、4ケタ7セグメントディスプレイ表示回路のプログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
プログラムのボリュームは大きいけど、落ち着いてプログラミングしよう
命令語の解説
今回のプログラムで使用した命令文について、解説します。
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
またアナログ出力値は「0~255」の整数を扱いますので、同じく「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
pinMode(入出力番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
digitalWrite(入出力ソケット番号,HIGHまたはLOW)
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
マイクロ秒単位で指定したい場合は、delayMcroseconds(時間)を使います。
pulseIn(入力ソケット番号,HIGHまたはLOW,タイムアウト時間(マイクロ秒))
指定した入力ソケット番号の「HIGHまたはLOW」になってから、反対の状態「HIGHならLOWに変化したとき」になるまでの時間をマイクロ秒単位で計測します。
タイムアウト時間は指定を省略可能(デフォルト値:1秒)で、この時間を超えた時点で0が返ってきます。
超音波センサーからのエコー信号入力時間計測で、この関数を使用します
if else文
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
if( 条件 ){
条件成立時に実行する文 ;
} else {
条件不成立時に実行する文 ;
}
比較演算子
比較演算子 | 説明 |
---|---|
A == B | AとBが等しい場合に成立 |
A != B | AとBが等しくない場合に成立 |
A < B | AがBより小さい場合に成立 |
A <= B | AがB以下の場合に成立 |
A > B | AがBより大きい場合に成立 |
A >= B | AがB以上の場合に成立 |
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
mBlockプログラミング
ここからは、mBlockを使ったプログラムの作り方を解説します。
- デバイスにArduino Uno R3を追加する
- 接続モードを「アップロードモードON」にする
- mBlockプログラムを作成する
- プログラムをArduino本体に転送する
これらの基本操作方法については、こちらの記事を参照してください。
動画を参考にプログラミングしてみよう
変数の作り方
今回演算処理した値を代入するための変数が必要になります。
mBlockでの変数作成方法について紹介します。
①カテゴリエリアの「変数」をクリックします。
②ブロックエリアの「変数を作る」をクリックします。
③変数名をキーボード入力します。
④「このスプライトのみ」を選択します。
⑤「はい」をクリックしてウインドウを閉じます。
作った変数がブロックとして表示されたら、作成完了です。
mBlockを使ったプログラム内容
今回は超音波センサーというマイクロ秒単位での信号やりとりが必要な電子機器を制御するため、必ず「アップロードモード オン」にてプログラムを作成してください。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
容量の関係で画像が複数に分かれていますが、すべてつなげて作成してください
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
mBlockプログラムの解説
主要なプログラム箇所について、解説します。
超音波センサー制御ブロックの使い方
このブロックはとても便利なブロックで、超音波センサーの「Trig」「Echo」への接続ソケット番号を指定するだけで、超音波センサーが検出した対象物までの距離(〇〇.〇〇cm)が返ってきます。
内部的には「距離(cm)=時間×1/58(≒0.017)」で計算しています
超音波センサー検出距離を変数に代入するまでの流れ
上記ブロックプログラムで実行している内容を説明します。
- 超音波センサーとの距離(〇〇.〇〇cm)が返ってきます
- 一度整数表示にするために、100を掛け合わせます
- これ以降は整数で扱うため、整数に変換をします
- 変数「超音波センサ検出距離」に変換後の値を代入します
各ケタの数字切り出しプログラムの解説
4ケタそれぞれに表示させる数字を切り出すプログラムを解説します。
各ケタの数字を切り出す考え方の基本は以下になります。
- 4ケタ目(千の位):値を1000で割って余りを切り捨てる
- 3ケタ目(百の位):値から千の位の数値を除いて100で割り、余りを切り捨てる
- 2ケタ目(十の位):値から千と百の位の数値を除いて10で割り、余りを切り捨てる
- 1ケタ目(一の位):値から千と百と十の位の数値を除く
4ケタ目の抽出から順に考えていくと、イメージしやすいと思います。
割り算した結果の「余り」を切り捨てる方法は、演算ブロックの「切り下げ」機能を使います。
小数点「ドット」表示について
LESSON12の4ケタ7セグメントディスプレイ表示内容との相違点として、「小数点表示=ドット表示」制御があります。
今回は13番ソケットとドット表示(DP)を接続しています。
「〇〇.〇〇」という表示にするため、3ケタ目表示のみ13番ソケット出力を高=HIGHにしています。
動作確認方法
- 超音波センサーと障害物の距離に応じてディスプレイ表示が変化するか?
- 超音波センサに近づくと表示距離は小さくなり、遠ざかると大きくなるか?
上記項目について確認していきましょう。
今回超音波センサーに接続している0,1番ソケットは、プログラムデータ転送時の通信線にも使われるため、データ転送時はこれら2本の線を抜いておくことをおすすめします
超音波センサーと障害物の距離に応じてディスプレイ表示が変化するか?
超音波センサーの前に障害物を配置し、ディスプレイに数値が表示されるか確認してください。
ディスプレイ表示は「〇〇.〇〇(cm)」となります。
ドット表示が正しい位置で点灯していることを確認してください。
最小検出距離は2cmのため、これ以上離した位置で障害物との距離を計測してください。
超音波センサに近づくと表示距離は小さくなり、遠ざかると大きくなるか?
超音波センサーの前に障害物を配置し、近づけたり遠ざけたりしてディスプレイに表示される数値が変化するか確認してください。
表示されている距離が、ある程度確からしいことを確認してください。
LESSON13:超音波センサーを使った距離測定のまとめ
- 超音波センサーは発信機と受信機をもつ電子機器
- mBlockで超音波センサーを扱う場合は「アップロードモード オン」必須
- mBlockでは「超音波センサーブロック」を配置するだけで、計測距離が得られる
小学生のお子様には断然、ビジュアルプログラミングがおすすめです!
超音波センサーはプログラム学習ロボットmBotにも使われています!
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント