프로젝트

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

거리 스캐너 만들기

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, 버튼, 거리, 줄자