品切れになる前に!防災用品を備えよう!
\ 防災用品の準備はできていますか? /
この記事内には、プロモーションが含まれます。
こんにちは、せでぃあ(@cediablog)です。
ArduinoプログラミングLESSON13は「超音波センサーによる距離測定」です。
超音波センサーを使った対象物までの測定距離(cm)を、4桁7セグメントディスプレイに表示させるプログラミングの作り方を紹介します。
本LESSON記事は、プログラミングの学習と電子パーツ「超音波センサー」の知識を習得するプログラムになっています。
小学生、中学生も安心してプログラミングができるように、スクラッチでのプログラミング方法についても動画付きで紹介しています。
LESSON12の配線状態から始めると配線変更が少なく済みますよ!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらも紹介しています
超音波センサーはmBlockのアップロードモード「オン」で制御させます
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
mBlockを使った4ケタ7セグメントディスプレイ制御プログラムについては、こちらの記事にて詳しく説明しています。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
超音波センサー(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本ずつ配線用のピンが搭載されており、上記のようになっています。
ピンの役割は大きく分けると「電源用」と「距離測定用」の2つになります。
タイムチャートからこのような動作になります。
今回の説明する「ディスプレイに超音波センサーによる検出距離(cm)を表示させる」は、以下になります。
まずは動画を見て、今回のLESSON13で実行させたい動作内容を確認してください。
また、mBlockを使ったプログラミングをするためには準備作業が必要です。
動画にて準備作業に必要な手順をくわしく説明しています。
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です
プログラムが完成したら動作確認を行います。
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能面は同じです
キットに含まれる機器は、カソードコモンの4桁7セグメントLEDディスプレイとなります。
220Ωの抵抗を使用し、各セグメントLEDに接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
VF(順電圧):1.85V
IF(順電流):20mA
LEDを点灯させるために接続する抵抗の選び方については、こちらの記事で詳しく説明しています。
超音波センサーの詳細については、本記事冒頭にて解説しています。
ジャンパー線を21本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
配線数が多いので、1本ずつ落ち着いて配線してください
4ケタ7セグメントLEDや抵抗、ジャンパー線はArduinoのソケットやブレッドボード穴に差し込むだけでOKです。
抵抗は極性がありませんのでどちら側のピンを挿入してもOKです。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、LESSON13の制御動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:ブロックによるビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが巻末に記載されているので、関数を調べるときに重宝します!(私も所有しています)
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 |
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
マイクロ秒単位で指定したい場合は、delayMcroseconds(時間)を使います。
指定した入力ソケット番号の「HIGHまたはLOW」になってから、反対の状態「HIGHならLOWに変化したとき」になるまでの時間をマイクロ秒単位で計測します。
タイムアウト時間は指定を省略可能(デフォルト値:1秒)で、この時間を超えた時点で0が返ってきます。
超音波センサーからのエコー信号入力時間計測で、この関数を使用します
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
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が起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
容量の関係で画像が複数に分かれていますが、すべてつなげて作成してください
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
主要なプログラム箇所について、解説します。
このブロックはとても便利なブロックで、超音波センサーの「Trig」「Echo」への接続ソケット番号を指定するだけで、超音波センサーが検出した対象物までの距離(〇〇.〇〇cm)が返ってきます。
内部的には「距離(cm)=時間×1/58(≒0.017)」で計算しています
上記ブロックプログラムで実行している内容を説明します。
4ケタそれぞれに表示させる数字を切り出すプログラムを解説します。
各ケタの数字を切り出す考え方の基本は以下になります。
4ケタ目の抽出から順に考えていくと、イメージしやすいと思います。
割り算した結果の「余り」を切り捨てる方法は、演算ブロックの「切り下げ」機能を使います。
LESSON12の4ケタ7セグメントディスプレイ表示内容との相違点として、「小数点表示=ドット表示」制御があります。
今回は13番ソケットとドット表示(DP)を接続しています。
「〇〇.〇〇」という表示にするため、3ケタ目表示のみ13番ソケット出力を高=HIGHにしています。
上記項目について確認していきましょう。
今回超音波センサーに接続している0,1番ソケットは、プログラムデータ転送時の通信線にも使われるため、データ転送時はこれら2本の線を抜いておくことをおすすめします
超音波センサーの前に障害物を配置し、ディスプレイに数値が表示されるか確認してください。
ディスプレイ表示は「〇〇.〇〇(cm)」となります。
ドット表示が正しい位置で点灯していることを確認してください。
最小検出距離は2cmのため、これ以上離した位置で障害物との距離を計測してください。
超音波センサーの前に障害物を配置し、近づけたり遠ざけたりしてディスプレイに表示される数値が変化するか確認してください。
表示されている距離が、ある程度確からしいことを確認してください。
小学生のお子様には断然、ビジュアルプログラミングがおすすめです!
超音波センサーはプログラム学習ロボットmBotにも使われています!
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
この記事が気に入ったら
フォローしてね!
コメント