프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

거리 스캐너 만들기

2015-04-14 16:43:20

다들 한번 쯤 직접 인테리어를 하거나 방을 꾸민 경험이 있으실겁니다. 줄자로 길이를 재고 가구를 옮기고 청소하고....

해야 할 일이 한 두가지가 아닌데요... 그 중에 가장 손이 많이가는 측정작업을 어떻게 하면 좀 더 편하게 할 수 있을지

고민하였습니다.

높이를 재기 위해 굳이 천장까지 올라갈 필요 없는, 줄자가 짧아서 나머지 길이를 뼘으로 잴 필요를 없는

초음파 자를 만들어 보았습니다^^

 

 

개요

 

초음파 센서를 이용하여 거리 값을 LCD에 출력 함으로써 줄자로 재기 힘들던 공간의 높이와 긴 거리를 측정 할 수 있습니다.

1번 버튼 - 자의 양단 거리를 측정하여 출력합니다.

2번 버튼 - 자의 단방향 거리를 측정하여 출력합니다.

 

 

 

동영상 미리보기

 

 

시작 전 개념 이해하기

 

LCD 출력

초음파 센서

버튼

풀다운

 

부품리스트

 

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

초음파, lcd, 버튼, 거리, 줄자
profile

미키 2015-04-20 10:19:48

좋은 프로젝트 올려주셔서 감사합니다.

profile

APPLE 2015-04-20 21:17:15

간단하지만 정말 유용하고 참신한 아이템이네요~

profile

Klant 2015-04-22 10:11:02

줄자를 이용할 때 항상 줄자가 휘거나 고정이 안되서 불편했는데 정말 워너비 아이템이네요ㅎㅎ

profile

토레형 2015-05-22 00:04:30

사보님 거리측정이 최대 어느정도 까지 할수 있나요? 거리범위좀 알고 싶어요
그리고 본모습 사진을 보면 버튼옆에 파란색작은거하고 LED옆 큰 은색같은 둥근게 어떤건가요?

profile

토레형 2015-05-22 00:37:46

제가 이프로젝트 구현좀 할려고하는데 질문을 계속드려도 되는지요?

profile

토레형 2015-05-24 14:01:40

사보님 이 소스 에러 뜨는데 어떻게 해요?.....

profile

SaBo 2015-05-31 21:48:57

아직 홈페이지에 댓글알림 기능이 없어서 확인을 못했네요... 거리는 초음파 센서모듈의 종류에 다라 달라지는데 제가 만든건 약 2m정도밖에 되지 않습니다.
파란색소자는 가변저항이고, 둥근 은색은 1.5V 코인셀 배터리입니다. 휴대용이라 소형 배터리를 내장시켜서 만들었습니다.

소스의 경우 어떤 에러가 뜨는지 질문게시판에 올려주시면 답변 드리겠습니다.

profile

토레형 2015-06-01 16:10:32

duration2 = pulseIn(echo2,HIGH);
value2 = microsecondsToCentimeters(duration2);
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds/29/2;
}
완성은 다했습니다 현재 코드부분을 정확히 알고 싶은데요 이 소스를 보면 정확히 이해가 안가서요 정확히 설명좀 해주시면 안될까요?

profile

SaBo 2015-06-02 21:26:39

@토레형
duration2 = pulseIn(echo2,HIGH); 트리거에서 초음파 펄스가 발생하고 에코에서 받아들이는 시간을 수치화 하여 duration2 라는 변수에 저장합니다.

value2 = microsecondsToCentimeters(duration2); duration2라는 변수에 저장된 수치를 cm 거리로 환산하여 value2라는 변수에 저장합니다.

long microsecondsToCentimeters(long microseconds) -> 이 함수는 마이크로 초 시간을 입력으로 받아 거리로 환산하는 함수입니다. 이 함수는 저도 처음에 다른 예제에서 끌어와서 사용했습니다. 사실 이부분은 여러가지 수식이 내포되어 있지만 최종적으로 수식을 간소화 해서 입력받은 마이크로 초 시간을 29로 나누고 그것을 또 2로 나눈 값이 거리값이 되는 것으로 알고있습니다.

profile

김동훈 2015-10-31 23:10:20

소스가 오류가나는데 어떻하나요 !? ㅠㅠ

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'
컴파일 오류 발생.
이렇게 떠요

profile

송덕원 2015-11-10 16:08:28

오차 범위는 어느 정도 인가요?

profile

김동주 2016-10-12 23:36:23

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 메일로 보내주세요 ㅠㅠㅠ