간단하지만 정말 유용하고 참신한 아이템이네요~
코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
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
사보님 거리측정이 최대 어느정도 까지 할수 있나요? 거리범위좀 알고 싶어요
그리고 본모습 사진을 보면 버튼옆에 파란색작은거하고 LED옆 큰 은색같은 둥근게 어떤건가요?
아직 홈페이지에 댓글알림 기능이 없어서 확인을 못했네요... 거리는 초음파 센서모듈의 종류에 다라 달라지는데 제가 만든건 약 2m정도밖에 되지 않습니다.
파란색소자는 가변저항이고, 둥근 은색은 1.5V 코인셀 배터리입니다. 휴대용이라 소형 배터리를 내장시켜서 만들었습니다.
소스의 경우 어떤 에러가 뜨는지 질문게시판에 올려주시면 답변 드리겠습니다.
duration2 = pulseIn(echo2,HIGH);
value2 = microsecondsToCentimeters(duration2);
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds/29/2;
}
완성은 다했습니다 현재 코드부분을 정확히 알고 싶은데요 이 소스를 보면 정확히 이해가 안가서요 정확히 설명좀 해주시면 안될까요?
@토레형
duration2 = pulseIn(echo2,HIGH); 트리거에서 초음파 펄스가 발생하고 에코에서 받아들이는 시간을 수치화 하여 duration2 라는 변수에 저장합니다.
value2 = microsecondsToCentimeters(duration2); duration2라는 변수에 저장된 수치를 cm 거리로 환산하여 value2라는 변수에 저장합니다.
long microsecondsToCentimeters(long microseconds) -> 이 함수는 마이크로 초 시간을 입력으로 받아 거리로 환산하는 함수입니다. 이 함수는 저도 처음에 다른 예제에서 끌어와서 사용했습니다. 사실 이부분은 여러가지 수식이 내포되어 있지만 최종적으로 수식을 간소화 해서 입력받은 마이크로 초 시간을 29로 나누고 그것을 또 2로 나눈 값이 거리값이 되는 것으로 알고있습니다.
소스가 오류가나는데 어떻하나요 !? ㅠㅠ
In file included from C:\Program Files\Arduino\libraries\LiquidCrystal\src/LiquidCrystal.h:5:0,
from sketch_oct31b.ino:1:
sketch_oct31b.ino: In function 'void loop()':
C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Print.h:29:13: error: expected unqualified-id before numeric constant
#define DEC 10
^
sketch_oct31b.ino:57:24: note: in expansion of macro 'DEC'
컴파일 오류 발생.
이렇게 떠요
In file included from C:\Users\unso9\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.14\cores\arduino/Stream.h:26:0,
from C:\Users\unso9\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.14\cores\arduino/HardwareSerial.h:29,
from C:\Users\unso9\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.14\cores\arduino/Arduino.h:232,
from sketch\sketch_oct12a.ino.cpp:1:
C:\Users\unso9\OneDrive\Documents\Arduino\sketch_oct12a\sketch_oct12a.ino: In function 'void loop()':
C:\Users\unso9\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.14\cores\arduino/Print.h:29:13: error: expected unqualified-id before numeric constant
#define DEC 10
^
C:\Users\unso9\OneDrive\Documents\Arduino\sketch_oct12a\sketch_oct12a.ino:57:24: note: in expansion of macro 'DEC'
lcd.print(distance.DEC);
^
exit status 1
보드 Arduino Nano 컴파일 에러.
이런 오류가 나는데 어떻게 해야하죠
unso99@naver.com 메일로 보내주세요 ㅠㅠㅠ
미키 2015-04-20 10:19:48
좋은 프로젝트 올려주셔서 감사합니다.