以前amazonで購入していたこちらの超音波センサーの使い道が無いかを考えていたのですが、まずは動作確認を兼ねて、フルカラーLEDとの組み合わせで「距離によって色が変わるもの」を作ってみました。
実際の動作
実際の動作はこんな感じです(クリックするとVineに飛び再生されます)
)
今後
ネットに繋いで在席中かどうかの確認をリアルタイムに行えるデバイスにしていくつもりです。
ソースコード
こちらでも公開してます。
https://github.com/takuya-andou/UltraSonic-and-FullColorLED
const int LED_R=9; //LED 赤
const int LED_G=11; //LED 緑
const int LED_B=10; //LED 青
const int echoPin=8; // Echo Pin
const int trigPin=7; // Trigger Pin
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop() {
/* The following trigPin/echoPin cycle is used to determine the
distance of the nearest object by bouncing soundwaves off of it. */
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
//Calculate the distance (in cm) based on the speed of sound.
distance = duration/58.2;
if (distance >= maximumRange || distance <= minimumRange){
/* Send a negative number to computer and Turn LED ON
to indicate "out of range" */
Serial.println("-1");
}
else {
if(distance<=10){
analogWrite(LED_R, 150);
analogWrite(LED_G, 255);
analogWrite(LED_B, 255);
}
else if(distance<=30){
analogWrite(LED_R, 150);
analogWrite(LED_G, 150);
analogWrite(LED_B, 255);
}
else{
analogWrite(LED_R, 255);
analogWrite(LED_G, 150);
analogWrite(LED_B, 255);
}
Serial.println(distance);
}
//Delay 50ms before next reading.
delay(50);
}
ソースコードの解説
1~9行目
const int LED_R=9; //LED 赤
const int LED_G=11; //LED 緑
const int LED_B=10; //LED 青
const int echoPin=8; // Echo Pin
const int trigPin=7; // Trigger Pin
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance
ここはArduinoと接続しているPin番号を指定してます。
また、超音波センサーの計測距離を0~200cmに絞ってます。
11~18行目
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
初期化の部分です。
シリアルモニタを使って距離を確認できるようにシリアル通信の部分も初期化しておきます(シリアルモニタで確認しない場合は不要です)
残りは超音波センサーの入出力、LEDはそれぞれ出力として初期化しておきます。
20~39行目
void loop() {
/* The following trigPin/echoPin cycle is used to determine the
distance of the nearest object by bouncing soundwaves off of it. */
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
//Calculate the distance (in cm) based on the speed of sound.
distance = duration/58.2;
if (distance >= maximumRange || distance <= minimumRange){
/* Send a negative number to computer and Turn LED ON
to indicate "out of range" */
Serial.println("-1");
}
超音波センサーで距離を計測している部分です。
trigPinから超音波を発生してから、echoPinで受け取るまでの時間によって距離を計算しています。
40~56行目
else {
if(distance<=10){
analogWrite(LED_R, 150);
analogWrite(LED_G, 255);
analogWrite(LED_B, 255);
}
if(distance>10 and distance<30){
analogWrite(LED_R, 150);
analogWrite(LED_G, 150);
analogWrite(LED_B, 255);
}
if(distance>30){
analogWrite(LED_R, 255);
analogWrite(LED_G, 150);
analogWrite(LED_B, 255);
}
フルカラーLED光らせている部分です。
今回は
- 10cm以下の場合は赤色
- 10~30cmの場合は黄色
- 30cm以上の場合は緑色
という3パターンに分けています。
58~63行目
Serial.println(distance);
}
//Delay 50ms before next reading.
delay(50);
}
シリアルモニタに距離を表示して、50ミリ秒待機した後、次の距離計測になります。