以前に大学のプレゼンテーションにてArduinoにサーボモータと超音波距離センサ、さらに音圧ブザーを接続してまわりになにかあったら検出するものを作ってみました
前回記載したものと似ていますが、サーボを使って一点だけでなく約150度くらいを検出できるようにしています
メロディは チャルメラ にしていますが、自分が初めて作ったこともあり安定してチャルメラになっていません ”ソラシー ラソ ソラシラソブー”となっています たまにうまくいきますが・・・・ ご了承ください
準備するもの
-
Arduino
-
音圧ブザー
-
超音波距離センサ
-
サーボモーター
Amazonで購入可能です → こちら
-
フレップボードとジャンパワイヤ
プログラム
下記のプログラムをコピーアンドペーストして実行してください↓↓
/*
Create date: 2014/10/08
implementafor: Momiji Miyakawa
*/
#include <Servo.h>
Servo servo;
#define BEAT 300 // 音の長さを指定
#define PINNO 12 // 圧電スピーカを接続したピン番号
#define trigPin 11 //距離センサのピン1
#define echoPin 10 //距離センサのピン2
#define servopin 3 //サーボのピン
#define Find 30 //30cm以内の検出
int distance; //グローバル変数
int i = 0;
int val = 0;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
servo.attach(servopin);
}
//超音波距離センサの関数化
void ehco(){
int duration;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance >= 200 || distance <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distance);
Serial.println(" cm");
}
}
void loop() {
while(i< 120){
delay(10);
val = 150 - i;
servo.write(val);
i++;
ehco();
if(distance < Find){
while(1){
Serial.println("Find!!");
tone(PINNO,392,BEAT) ; // ソ
delay(BEAT) ;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,494,BEAT + BEAT) ; // シ
delay(BEAT + BEAT) ;
//割り込みecho
ehco();
if(distance > Find)break;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,392,BEAT + BEAT) ; // ソ
delay(BEAT + BEAT) ;
delay(50);
//割り込みecho
ehco();
if(distance > Find)break;
tone(PINNO,392,BEAT) ; // ソ
delay(BEAT) ;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,494,BEAT) ; // シ
delay(BEAT) ;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,392,BEAT) ; // ソ
delay(BEAT) ;
tone(PINNO,440,900) ; // ラ
delay(900) ;
//割り込みecho
ehco();
if(distance > Find)break;
}
}
}
i = 0;
while(i < 120){
delay(10);
val = 30 + i;
servo.write(val);
i++;
ehco();
if(distance < Find){
while(1){
// statement
tone(PINNO,392,BEAT) ; // ソ
delay(BEAT) ;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,494,BEAT + BEAT) ; // シ
delay(BEAT + BEAT) ;
//割り込みecho
ehco();
if(distance > Find)break;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,392,BEAT + BEAT) ; // ソ
delay(BEAT + BEAT) ;
delay(50);
//割り込みecho
ehco();
if(distance > Find)break;
tone(PINNO,392,BEAT) ; // ソ
delay(BEAT) ;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,494,BEAT) ; // シ
delay(BEAT) ;
tone(PINNO,440,BEAT) ; // ラ
delay(BEAT) ;
tone(PINNO,392,BEAT) ; // ソ
delay(BEAT) ;
tone(PINNO,440,900) ; // ラ
delay(900) ;
//割り込みecho
ehco();
if(distance > Find)break;
}
}
}
i = 0;
}
# define Find 30
の”30”を弄ることで計測する範囲を変更することができます。
デフォルトでは30cmの範囲にあるものを検出するようになっています
音圧ブザーのピン: 12
超音波距離センサのピン: 10,11
サーボモータのピン: 3