目次
ライブラリ付属のスケッチ例動作確認
動画内で使用したライブラリ「HCSR04 ultrasonic sensor」に付属しているスケッチ例の動作確認のために、ブレッドボード回路に合わせて変更したスケッチです。
スケッチ変更は以下の2点です。
- オブジェクト生成時のトリガーピンとエコーピンの接続端子を(5,6)から(2, 3)に変更
- delayの引数を60から200に変更
#include <HCSR04.h>
HCSR04 hc(2, 3); //initialisation class HCSR04 (trig pin , echo pin)
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(hc.dist()); // return curent distance in serial
delay(200); // we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.
}
距離に応じたLED制御のスケッチ
/*
Arduino ライブラリとは?(製作編)
距離に応じてLEDを制御する
*/
#include <HCSR04.h>
#define TRIG_PIN 2 // トリガーピンの接続端子
#define ECHO_PIN 3 // エコーピンの接続端子
#define NEAR 10.0 // この値以下だったら「近い」判定(単位:cm)
#define MID 30.0 // この値以下だったら「中間」判定(単位:cm)
// LED接続端子
#define LED_NEAR 4 // 近い
#define LED_MID 6 // 中間
#define LED_FAR 8 // 遠い
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN); // 距離センサーオブジェクト生成
void setup(){
// シリアルモニタ初期化
Serial.begin(9600);
// 端子設定
pinMode(LED_NEAR, OUTPUT);
pinMode(LED_MID, OUTPUT);
pinMode(LED_FAR, OUTPUT);
}
void loop() {
// 距離測定&シリアルモニタ表示
float distance = kyoriSensor.dist();
Serial.println(distance);
if( distance > 0.0 ) { // 測定できた時の処理
if( distance <= NEAR ){ // 近い場合
digitalWrite(LED_NEAR, HIGH);
digitalWrite(LED_MID, LOW);
digitalWrite(LED_FAR, LOW);
} else if( distance <= MID ) { // 中間の場合
digitalWrite(LED_NEAR, LOW);
digitalWrite(LED_MID, HIGH);
digitalWrite(LED_FAR, LOW);
} else { //それ以外の場合
digitalWrite(LED_NEAR, LOW);
digitalWrite(LED_MID, LOW);
digitalWrite(LED_FAR, HIGH);
}
} else {
digitalWrite(LED_NEAR, HIGH);
digitalWrite(LED_MID, HIGH);
digitalWrite(LED_FAR, HIGH);
}
// 時間待ち
delay(200);
}
距離に応じたスピーカー制御(改善前)
距離に応じたスピーカー制御をする場合、センサーからの距離を5cmごとに区切ると、一番近いブロックの音がでにくくになります。
これは、センサーから2cmまでの距離は測定保証していないためです。
このスケッチは5cmごとに区切って音を出すようにしているため、センサーに一番近い音(ド)がでにくくなっています。
/* Arduino ライブラリとは?(製作編)
距離に応じてスピーカを制御する(ブロック位置の調整なし)
*/
#include <HCSR04.h>
#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子
#define SPEAKER_PIN A0 // スピーカー接続端子
#define BLOCK_LENGTH 5 // 1ブロックの長さ(単位:cm)
// ド〜ドの音程の周波数
// ド レ ミ ファ ソ ラ シ ド
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// HC-SR04のオブジェクト生成
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN);
void setup(){
// シリアルモニタ初期化
Serial.begin(9600);
}
void loop() {
// 距離測定&シリアルモニタ表示
float distance = kyoriSensor.dist();
Serial.println(distance);
if( distance > 0.0 ) { // 測定できた時の処理
// どのブロックに障害物があるか計算
//(計算結果は整数にするため結果を代入する変数はint型にする)
int block = distance / BLOCK_LENGTH;
// ブロック位置に対応する音程を鳴らす
if( block>=0 && block<=7 ) {
tone(SPEAKER_PIN, note[block]);
} else {
noTone(SPEAKER_PIN);
}
} else {
noTone(SPEAKER_PIN);
}
// 時間待ち
delay(200);
}
距離に応じたスピーカー制御(改善後)
上のスケッチでは一番近い音程が出しにくいため、一番近いブロックはセンサーから2ブロック分、つまり10cmまでをドの音に割り当てました。
/* Arduino ライブラリとは?(製作編)
距離に応じてスピーカを制御する(ブロック位置の調整あり)
*/
#include <HCSR04.h>
#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子
#define SPEAKER_PIN A0 // スピーカー接続端子
#define BLOCK_LENGTH 5 // 1ブロックの長さ(単位:cm)
// ド〜ドの音程の周波数
// ド レ ミ ファ ソ ラ シ ド
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// HC-SR04のオブジェクト生成
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN);
void setup(){
// シリアルモニタ初期化
Serial.begin(9600);
}
void loop() {
// 距離測定&シリアルモニタ表示
float distance = kyoriSensor.dist();
Serial.println(distance);
if( distance > 0.0 ) { // 測定できた時の処理
// どのブロックに障害物があるか計算
//(計算結果は整数にするため結果を代入する変数はint型にする)
int block = distance / BLOCK_LENGTH;
// ブロック位置に対応する音程を鳴らす
if( block==0 || block==1 ){
tone(SPEAKER_PIN, note[0]);
} else if( block>=2 && block<=8 ) {
tone(SPEAKER_PIN, note[block-1]);
} else {
noTone(SPEAKER_PIN);
}
} else {
noTone(SPEAKER_PIN);
}
// 時間待ち
delay(200);
}
別ライブラリでの実装例
今回使用した「HCSR04 ultrasonic sensor」を使うと、tone関数で発生している音がプツプツ切れることがわかりました。
これは、ライブラリ側の制御が tone関数 の信号発生に影響していることが原因です。
そこで、別のライブラリを使用したところ、音の途切れがなくなりました。ライブラリとスケッチは以下になります。
使用したライブラリ
「Bifrost library for HC-SR04」というライブラリを使用しました。
スケッチ
スケッチは、使用するライブラリに合わせて以下の2点変更しています。
- ヘッダファイル名
- メソッド呼び出し
/* Arduino ライブラリとは?(製作編)
距離に応じてスピーカを制御する(他のライブラリを利用)
*/
#include <hcsr04.h>
#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子
#define SPEAKER_PIN A0 // スピーカー接続端子
#define BLOCK_LENGTH 5 // 1ブロックの長さ(単位:cm)
// ド〜ドの音程の周波数
// ド レ ミ ファ ソ ラ シ ド
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// HC-SR04のオブジェクト生成
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN);
void setup(){
// シリアルモニタ初期化
Serial.begin(9600);
}
void loop() {
// 距離測定&シリアルモニタ表示
float distance = kyoriSensor.distanceInMillimeters() / 10.0;
Serial.println(distance);
if( distance > 0.0 ) { // 測定できた時の処理
// どのブロックに障害物があるか計算
//(計算結果は整数にするため結果を代入する変数はint型にする)
int block = distance / BLOCK_LENGTH;
// ブロック位置に対応する音程を鳴らす
if( block==0 || block==1 ){
tone(SPEAKER_PIN, note[0]);
} else if( block>=2 && block<=8 ) {
tone(SPEAKER_PIN, note[block-1]);
} else {
noTone(SPEAKER_PIN);
}
} else {
noTone(SPEAKER_PIN);
}
// 時間待ち
delay(200);
}