초음파센서 제어(아두이노)

in #kr-newbie6 years ago (edited)

초음파센서 제어(아두이노)



오늘은 재밌는 소재로 거리를 측정할 수 있는 초음파센서를 사용하여 실험하는 내용을 다뤄 보겠습니다. 실제 초음파센서를 구매하시면 4핀으로 구성되어 있는데 가상시뮬레이터에서는 초음파센서가 3핀으로 되어서 어떻게 코딩해야하나 혼동 되실 수 있지만 원리는 동일하니깐 어렵게 생각하실 필요는 없습니다.

1. 초음파센서


초음파센서를 부품을 실제 구입하면 1200원정도 하는 초급 초음파센서를 구매하실수 있을꺼에요. 핀은 총 4핀으로 전원(+,-) 2핀, 입력핀, 출력핀으로 구성되어 있습니다. 하지만 가상시뮬레이터에서는 3핀으로 구성되어 있으면 입력/출력을 한핀에서 다 제어해야 합니다.

가상 시뮬레이터 코딩은 이 한핀을 어떻게 제어할지만 생각하시고 표현하시면 됩니다.

2. 초음파센서 계산 공식


  • 공식 : 기본 340 (위 1200원짜리 4핀 초음파센서 초음파속도입니다.)
    거리 = ((초음파속도 * 센서시간값) / 10000) / 2

            ((float)(340 * duration) / 10000) / 2;  
    

초음파속도 : 실제 사용하는 초음파센서 부품의 초음파속도입니다. 즉 초음파센서마다 초음파속도는 다르고 부품을 구매하실때 제공되는 정보를 잘 확인하시면 정교한 계산을 하실 수 있을꺼에요.

센서시간값 : 초음파센서에서 초음파가 나가고 앞에 장애물에 부딪치고 되돌아오는데 까지 걸리는 시간값입니다. 왕복시간값이라고 생각하시면 됩니다. 그래서 마지막에 나누기 2를 함으로써 초음파센서의 위치에서 장애물까지의 거리가 나오게 되는 것이죠.

3. 초음파센서 코딩

  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
   
  float duration = pulseIn(6, HIGH);
    
  float distance = ((float)(340 * duration) / 10000) / 2;  
    

7번핀이 출력모드이고 6번핀은 입력모드입니다. 7번핀으로 초음파를 쏘고 되돌아오는 초음파를 6번핀에서 읽게 됩니다. 그 값은 시간값이고 초음파공식에 대입하여 계산하게 됩니다.

  1. 초음파를 쏘기 전 초음파출력핀을 LOW(0)으로 한다. => 초기단계
  2. 딜레이 delayMicroseconds()함수는 시간을 마이크로초로 딜레이 시킬 때 사용. => 대기시간단계
  3. 초음파출력핀을 HIGH(5V)으로 한다. => 초음파를 출력 시작
  4. 딜레이 delayMicroseconds()함수로 대기한다. => 초음파를 쏘는 시간이다.
  5. 초음파출력핀을 LOW(5V)으로 한다. => 초음파 출력 중지

쉽게 말해서 초기상태는 초음파 출력핀 0V 상태로 2마이크로초로 초기상태로 뒀다가 7번핀을 통해 10마이크로초동안 초음파를 쏘고 난뒤에 초음파 출력핀 0V으로 10마이크로초동안만 초음파를 쏜 신호값을 거리계산에 사용한다는 점만 이해하시면 된다.

pulseIn(입력핀, HIGH)함수 : 펄스 신호의 길이를 잴 때 사용합니다. 초음파 되돌아 왔을때 HIGH->LOW가 되는 시점까지의 시간값을 반환하는 함수입니다. 좀 어려울 수 있습니다.
그냥 저 함수로 초음파 거리 시간값을 읽어오는 구나 정도만 처음에 이해하시면 됩니다.

정 모르겠다면 통으로 저 코딩을 외우시면 됩니다. 초음파센서를 사용할때 저 코딩으로 제어하는 구나 정도만 이해하시면 됩니다.

4. 회로도 구성


  • 준비물 : 초음파센서3핀 1개, 아두이노우노

5. 코딩


void setup() {
  Serial.begin(9600);
}
void loop() {   
  pinMode(7,OUTPUT); //출력모드  초음파 출력
  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
  
  pinMode(7,INPUT);    //입력모드로 초음파 입력
  float duration = pulseIn(7, HIGH); //초음파 거리 시간값 읽기
  float distance = duration / 57.5;  // ((float)(340 * duration) / 10000) / 2;   

  Serial.println(distance);   
} 

핀의 입력/출력모드 setup()함수에 선언된다고 했는데 여기서는 loop()함수에서 선언하였습니다. 왜 그렇게 했을까요. 그것은 바로 7번핀을 입력모드와 출력모드를 둘 다 사용해야 하기 때문에 계속 핀모드를 변경해야 합니다. 그래서 loop()함수에 선언된거죠.

초음파를 출력하기전에 7번핀을 출력모드로 선언했다가 다시 7번핀을 pulseIn()함수로 입력을 받을때에는 그 앞에 7번핀을 입력모드로 선언해야겠죠. 이런식으로 해서 7번핀으로 입력/출력모드 제어가 가능해 지는 것이죠.

 float distance = duration / 57.5;  // ((float)(340 * duration) / 10000) / 2;   

이식은 공식에서 최대한 줄이고 가상시뮬레이터에서 좀 더 거리가 비슷하게 나타내기 위해서 근사값 57.5로 표현했습니다. 실제로 하실때는 정식 공식을 사용하세요. 가상시뮬레이터에서는 정식 공식으로 대입하면 오차 거리가 좀 크게 나서 일부러 공식을 줄이고 줄인 공식에서 숫자를 앞뒤로 근사값들을 임의로 정해서 여러차례 실험한 뒤에 가장 오차가 적게 나오는 값이 57.5여서 이렇게 식을 만들었습니다.

실제로 하실때에는 정식 공식을 사용하시고 정식 공식을 써도 오차 거리가 발생할때에 그 부품에 맞게 근사값들을 잡아서 오차 거리를 줄이시면 아마 될꺼에요.

시리얼모니터 출력

지난시간에 사용했지만 복습차원으로 다시 설명하자면

아두이노 IDE 시리얼모니터를 사용하기 위해서

void setup()
{
 Serial.begin(9600);
}
void loop(){
Serial.println(distance);   
}

setup()함수에서 시리얼 통신을 시작한다고 선언(Serial.begin) 하고 loop()함수에서 시리얼모니터로 출력(Serial.println) 합니다.

Serial.println(출력값);   

이정도만 우선 알아두세요.

6. 결과


마무리


실제로 한다면 4핀 코딩을 해야하는데 아래와 같이 실험하시면 됩니다.

void setup() {
  Serial.begin(9600);
  pinMode(7,OUTPUT); //출력모드
  pinMode(6,INPUT);    //입력모드
}
void loop() {    
  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
   
  float duration = pulseIn(6, HIGH);
  float distance = duration / 57.5;  // ((float)(340 * duration) / 10000) / 2;  

  Serial.println(distance);   
}  

이 초음파센서 하나로 어떤곳에 사용하면 좋을까요 한번 상상의 나래를 펼쳐보세요. 초음파센서가 거리를 측정할 수 있는 재밌는 부품이여서 거리를 측정할 수 있으면 할 수 있는 것들이 참 많습니다. 한번 생각해 보세요.

Sort:  

스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.

방문해주셔서 감사합니다.

아두이노 초음파센서 저도 집에 있는데!! 반갑네요ㅎㅎ 손을 휙 하는 모션으로 조명을 껐다켜는 기기 같은 걸 만들면 재밌을 것 같아요~ 저는 스팀잇에 스타트업&개발&디자인 관련 글을 올리는 초보 개발자입니다. 팔로우하고 갑니다 :)

모션은 인체감지센서를 이용하시면 돼요.
현관문에 있는 감지센서 있죠. 그걸로 불켜기 하시면 돼요.
초음파센서는 거리를 측정하기 때문에 거리에 관련해서 한번 상상의 나래를 펼쳐보세요.

한가지 예로 자동차 후진하면 뒤에 장애물과의 거리가 위험 수준이면 멜로디 나오잖아요
그런식으로 일상의 거리측정을 적용한다면 어떤게 있는지 한번 상상해보세요.

이번 학기에 아두이노나 라즈베리파이에 대해서도 공부할 예정입니다.팔로우하고 좋은 정보 얻으러 오겠습니다~!

우선 아두이노를 하시고요 그 다음에 라즈베리파이로 GPIO제어를 통해 실험하시면 아마 될꺼에요.
아두이노는 오래전에 다뤘고요.
지금은 라즈베리파이로 GPIO제어하고 있네요

이쁜 여자분과의 거리를 측정 해 볼까요? ㅎㅎㅎ

짱짱맨 태그 보고 왔는데 댓글+응원+보팅 하고 가용!
나중에 한번 제 포스팅에 놀러오세요!~^^

측정할 수 있으면 얼마나 좋을까요.! ^^

헉..전문적인 내용.ㅎㅎ
저는 잘 모르지만
아무튼 잘 보고 갑니다^^

아두이노는 비전공자들이 가지고 놀기 좋아요

생각하기에 따라서 활용폭이 무진장 넓겟네요 ^^

자동자 주차할때 후진할때 장매물 경고음이나 로봇청소기 등 기타 엄청 많죠

자꾸 글은 안보게 되고 마지막의 동영상만 보게 되는 것 같아요. ㅋㅋ

될 수 있으면 실생활에 비슷한 사례들을 으용편으로 거론해야겠네요.
대충 이런 느낌으로 구현이 가능하다는쪽으로 이야기를 펄쳐 나가야겠네요.

아두이노 얼마 안하는군요. 사서 코딩맨님 따라해보는것도 굉장히 재미있겠어요.ㅣ

정품은 라즈베리파이정도의 가격인데 싼거는 4천원대인데요.
아두이노칩 자체가 얼마안해요. 기본구성은 아두이노칩,크리스털, 저항, led 이것만 구매해서 직접 제작하셔도 돼요. 추가로 전원부분과 통신부분을 더 붙여야하는데 기본구성은 별거 없어요.
중요한것은 아두이노보다 연결하는 부품이 더 비싸다는게 함정임
아두이노 자체가 칩에 프로그램을 이식하고 이식된 칩에 핀을 제어하는게 전부라서 별거 없어요

모래요정 바람돌이가 하루에 한가지 소원만을 들어주는것처럼
짱짱맨도 1일 1회 보팅을 최선으로 합니다.
부타케어~ 1일 1회~~
너무 밀려서 바쁩니다!!

방문해주셔서 감사해요

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.030
BTC 58752.84
ETH 3153.55
USDT 1.00
SBD 2.44