코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-04-14 16:43:20
다들 한번 쯤 직접 인테리어를 하거나 방을 꾸민 경험이 있으실겁니다. 줄자로 길이를 재고 가구를 옮기고 청소하고....
해야 할 일이 한 두가지가 아닌데요... 그 중에 가장 손이 많이가는 측정작업을 어떻게 하면 좀 더 편하게 할 수 있을지
고민하였습니다.
높이를 재기 위해 굳이 천장까지 올라갈 필요 없는, 줄자가 짧아서 나머지 길이를 뼘으로 잴 필요를 없는
초음파 자를 만들어 보았습니다^^
초음파 센서를 이용하여 거리 값을 LCD에 출력 함으로써 줄자로 재기 힘들던 공간의 높이와 긴 거리를 측정 할 수 있습니다.
1번 버튼 - 자의 양단 거리를 측정하여 출력합니다.
2번 버튼 - 자의 단방향 거리를 측정하여 출력합니다.
NO | 부품명 | 수량 | 기타 |
1 | Arduino Nano | 1 | |
2 | 초음파 센서 | 2 | HC-SR04 |
3 | 1602 LCD | 1 | |
4 | 버튼 | 2 | |
5 | LED | 3 | 빨강, 노랑, 초록 |
6 | 저항 | 6 | 220R |
7 | 점퍼선 | 다수 |
Arduino Nano | LCD | HC-SR04 | 버튼 |
두둥~!! 웅장한?! 거리스캐너의 모습입니다. 여기저기 들고다니며 측정해야 하는 '자' 이기 때문에
빵판을 벗어나 만능기판에 직접 제작을 해보았습니다~!
위에서 본 모습입니다. 양단의 초음파 센서가 이 프로젝트의 가장 핵심이라고 할 수 있습니다.
좀 더 소형화에 신경써서 더욱 작은 기판에 구성할 수 있었지만... 납땜 실력 때문에 여유있게...구성하였습니다 ㅎㅎ
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int trig1 = 6;
int trig2 = 7;
int echo1 = A0;
int echo2 = A1;
int LED1 = 8;
int LED2 = 9;
int LED3 = A2;
int Button1 = 13;
int Button2 = A3;
int state1 = 0;
int state2 = 0;
long distance;
long duration1;
long duration2;
long value1;
long value2;
void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(trig1, OUTPUT);
pinMode(trig2, OUTPUT);
pinMode(Button1, INPUT);
pinMode(Button2, INPUT);
pinMode(echo1, INPUT);
pinMode(echo2, INPUT);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Push the Button");
Serial.begin(9600);
}
void loop()
{
state1 = digitalRead(Button1);
state2 = digitalRead(Button2);
if(state1 == HIGH)
{
digitalWrite(LED3,HIGH);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Scanning...");
Ultrasonic1();
Ultrasonic2();
distance = value1+value2+16;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dual MODE");
lcd.setCursor(0, 1);
lcd.print(distance.DEC);
lcd.setCursor(3, 1);
lcd.print("cm");
}
else if(state2 == HIGH)
{
digitalWrite(LED3,HIGH);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Scanning...");
Ultrasonic1();
distance = value1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Single MODE");
lcd.setCursor(0, 1);
lcd.print(distance,DEC);
lcd.setCursor(3, 1);
lcd.print("cm");
}
else
{
digitalWrite(LED1,HIGH);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
}
}
void Ultrasonic1()
{
digitalWrite(trig1,LOW);
delayMicroseconds(2);
digitalWrite(trig1,HIGH);
delayMicroseconds(5);
digitalWrite(trig1,LOW);
duration1 = pulseIn(echo1,HIGH);
value1 = microsecondsToCentimeters(duration1);
delay(100);
}
void Ultrasonic2()
{
digitalWrite(trig2,LOW);
delayMicroseconds(2);
digitalWrite(trig2,HIGH);
delayMicroseconds(5);
digitalWrite(trig2,LOW);
duration2 = pulseIn(echo2,HIGH);
value2 = microsecondsToCentimeters(duration2);
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds/29/2;
}
이것 저것 많이 들어간 것 같지만, 소스코드는 상당히 단순합니다.
1번 센서값을 받는 Ultrasonic1(); 과 2번 센서값을 받는 Ultrasonic2(); 그리고 거리환산 함수를 별도로 만들어주고
Loop문 안에서 버튼 조건에 따라 별도로 만든 함수를 포함시켜주는 단순한 원리입니다.
한가지 주의 하셔야 할 부분은 1번 버튼이 눌렸을 경우 출력할 distanse 식에 +16이 포함 되어 있는데 이는 두 개의
초음파 센서 사이의 공백 거리를 직접 자로 측정하여 넣은 값 입니다.
간단한 소스이니 추가적으로 버튼을 더 만들어 단 방향 측정을 추가하거나, 측정된 거리 값을 LCD뿐만 아니라
블루투스를 이용하여 스마트 폰에 저장하는 등 추가적인 기능을 넣으면 더욱 쓸만한 도구가 되지 않을까 합니다^^
SaBo