距離によって色が変わるデバイスを作ってみた(Arduino+超音波センサー+フルカラーLED)

以前amazonで購入していた[こちらの超音波センサー](http://amzn.to/1SPg9CG)の使い道が無いかを考えていたのですが、まずは動作確認を兼ねて、フルカラーLEDとの組み合わせで「距離によって色が変わるもの」を作ってみました。
##実際の動作
実際の動作はこんな感じです（クリックするとVineに飛び再生されます）
[![距離によって色が変わる](http://v.cdn.vine.co/r/videos/87AC1E42F61267014444240850944_4311ecffa86.1.1.4283454139876191271.mp4.jpg)](https://vine.co/v/e9aMMhPJAjO))

##今後
ネットに繋いで在席中かどうかの確認をリアルタイムに行えるデバイスにしていくつもりです。

##ソースコード
こちらでも公開してます。
https://github.com/takuya-andou/UltraSonic-and-FullColorLED

```UltraSonic-and-FullColorLed.ino
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ミリ秒待機した後、次の距離計測になります。