초음파센서로 줄자를 만들려면 대충 이런식으로 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()함수에 선언되는 코딩들은 최소화 해야합니다. 그래야 가독성이 좋고 나중에 수정하기도 편합니다.
코딩 순서는
코딩은 우선 어떤 명령을 내릴지 한글로 메모장에다가 순서를 정하여 글로 써보세요. 그리고 그 명령에 대해 사용할 함수들은 각 부품을 다룰때 쓰던 함수들을 그대로 사용하시면 됩니다. 어렵게 생각하실 필요없이 각 부품을 소개할때 거기에 사용한 함수들 2~3개를 기억했다가 그 함수의 의미를 이해하고 그것을 응용해서 표현하시면 됩니다.
정교한 초음파센서를 이용해서 건축현장에서 건물안에 길이를 측정할 때 유용하겠죠.
또 초음파로 어떤것을 표현할 수 있을까요. 상상의 나래를 펼쳐 보세요.