[아두이노] 초음파줄자 응용

IOT/아두이노|2019. 2. 9. 12:46

[아두이노] 초음파줄자 응용




초음파센서로 줄자를 만들려면 대충 이런식으로 A, B의 벽까지의 거리를 측정하면 쉽게 줄자가 만들어 질 수 있겠죠.
이걸 표현하기 위해서 실험을 하고자 합니다.

1. 회로도 구성


  • 준비물 : 초음파센서3핀 2개, 스위치버턴 1개, 아두이노우노, 뻥판
  • 내용 : 벽과 벽사이의 거리를 측정하는 줄자를 구현해보자.

스위치를 누르면 아두이노우노 본체를 기준으로 양쪽 두지점의 벽과 벽사이 거리를 측정하도록 하기 위해서 회로도를 우선 아두이노우노 기준으로 양쪽 방향으로 초음파센서를 배치하여 회로도를 구성하였습니다.


2. 코딩


  • 거리계산 : ((float)(340 * 초음파거리시간값) / 10000) / 2;
  • 두지점거리계산식 : 아두이노우노를 10cm로 가정할경우
    total=v1+v2+10; => v1(A초음파), v2(B초음파), 10(아두이노우노본체크기)
  • 내용 : 스위치를 누르면 A,B 초음파 거리를 측정하고 그 결과를 시리얼모니터에 출력한다.

우선 스위치버턴은 복습차원으로 내부풀업저항을 이용합니다. 그래서 pinMode은 INPUT_PULLUP으로 선언합니다. 그리고 스위치 버턴값을 읽기 위해서 digitalRead(핀번호) 함수를 사용합니다. 지난 스위치버턴 포스팅에서 이미 소개했으며 복습차원으로 스위치 버턴을 사용하였습니다.

void setup() {
  Serial.begin(9600);
  pinMode(5,INPUT_PULLUP);
}
void loop() {  
  if(digitalRead(5)==0){
    float v1=UltrasonicDistance(6);
    float v2=UltrasonicDistance(7);
    float total=v1+v2+10;
    Serial.println(total);
    delay(500);
  }  
}

float UltrasonicDistance(int m_pin){
  pinMode(m_pin,OUTPUT); 
  digitalWrite(m_pin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(m_pin,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(m_pin,LOW); 
  
  pinMode(m_pin,INPUT);    
  float duration = pulseIn(m_pin, HIGH);  
  return duration / 57.5;  
}

여기서 2개의 초음파 거리측정을 해야하는데 그러면 두번의 중복 코딩이 발생합니다. 지난시간에 배웠던 C언어문법 외부함수로 재정의하여 뺐습니다.

복습하자면

float 초음파거리(int A){
 return 거리식;
}

초음파거리함수에 인자는 핀번호입니다. 함수 앞에 float는 변수 선언에서 설명한 자료형입니다. 즉, 함수 앞에서 자료형이 표현되었다는 것은 return의 명령어로 자료형(float)으로 반환한다는 의미입니다. 여기서는 좀 더 정확한 거리계산을 위해서 실수형으로 거리 계산된 값을 반환하겠다는 의미인거죠. 만약 정수형(int, long)으로 반환하겠다면 앞에 정수자료형을 선언하시면 됩니다.

loop()함수에서 사용할때는

<
v1=초음파거리(6)

이렇게 하면 6번핀의 초음파센서가 거리계산을 한뒤에 그 값을 반환하여 v1에 저장하게 됩니다.
v1 6번핀에 연결된 초음파센서 거리값이 저장됩니다.

초음파거리 계산식을 외부함수로 재정의함으로써 중복코딩을 줄이게 됩니다.
loop()안에는 아두이노 전원이 공급되고 반복되는 작업 명령들이 수행됩니다. 가독성을 위해서는 될 수 있으면 loop()함수에 선언되는 코딩들은 최소화 해야합니다. 그래야 가독성이 좋고 나중에 수정하기도 편합니다.

코딩 순서는

  1. 스위치버턴을 누르면 거리를 계산한다.
    pinMode(5,INPUT_PULLUP); //선언
    if(digitalRead(5){ //동작
    거리계산;
    }
  2. A, B초음파 거리 계산측정한다.
    float v1=UltrasonicDistance(6); //A 초음파거리계산
    float v2=UltrasonicDistance(7); //B 초음파거리계산
  3. 최종거리 계산한다.
    float total=v1+v2+10;
  4. 시리얼모니터에 그 결과를 출력한다.
    Serial.begin(9600); //선언
    Serial.println(total); //출력

3. 결과



마무리


코딩은 우선 어떤 명령을 내릴지 한글로 메모장에다가 순서를 정하여 글로 써보세요. 그리고 그 명령에 대해 사용할 함수들은 각 부품을 다룰때 쓰던 함수들을 그대로 사용하시면 됩니다. 어렵게 생각하실 필요없이 각 부품을 소개할때 거기에 사용한 함수들 2~3개를 기억했다가 그 함수의 의미를 이해하고 그것을 응용해서 표현하시면 됩니다.

정교한 초음파센서를 이용해서 건축현장에서 건물안에 길이를 측정할 때 유용하겠죠.

또 초음파로 어떤것을 표현할 수 있을까요. 상상의 나래를 펼쳐 보세요.


댓글()