오늘은 아두이노에서 초음파 센서를 이용해서 거리를 측정하고
그 결과를 LCD로 출력하는 회로를 만들어 보려고 합니다.
회로는 위처럼 구성을 했는데요.
LCD와 초음파센서를 보드에 연결하고 두 가지 다 5V전원을 연결하고 접지선을 연결해주었습니다.
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,4,8,9,10,11);
void setup()
{
lcd.begin(16,2);
lcd.print("Distance : ");
}
long readTravelTime(int triggerPin, int echoPin)
{
pinMode(triggerPin, OUTPUT);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
return pulseIn(echoPin, HIGH);
}
int cm=0;
void loop()
{
cm=0.01723*readTravelTime(12,12);
lcd.setCursor(0,1);
lcd.print(cm);
lcd.print(" ");
int pos=(cm<10)?2:(cm<100)?3:4;
lcd.setCursor(pos,1);
lcd.print("cm ");
delay(1000);
}
전에 올린 LCD사용하기에 나왔던 내용이 나오죠.
lcd라는 생성자를 선언해주었습니다.
setup 함수에서는 lcd를 초기화해주고, Distance : 라는 문구를 출력하도록 설정했습니다.
그리고 long readTravelTime이라는 함수가 있는데요.
먼저, 초음파센서는 트리거 핀과 에코 핀이 있습니다.
순서대로 읽어보자면, 트리거 핀에서 신호를 출력하도록 설정하고 LOW값을 주어 트리거 핀을 초기화했습니다.
2마이크로초만큼 delay 후 10마이크로초만큼 신호를 보내고,
다시 LOW값을 준 다음 에코 핀으로 보낸 신호를 받는 거죠.
pulseIn(echoPin, HIGH)는 에코 핀에 발생할 HIGH 펄스 폭을 마이크로초 단위로 반환하는 함수입니다.
그러니 이 readTravelTime 함수는 초음파센서에서 발생한 신호가 출발했다 도착하는 시간을
Microsecond 단위로 반환하는 함수인 것이죠.
loop 함수에서는 cm라는 int형 변수에 거리를 저장할 건데요. 모두 아시다 시피 거리는 시간*속도죠.
초음파는 말그대로 음파이기 때문에 소리의 속도와 같죠.
소리의 속도는 대략 340m/s이고, microsecond마다 움직이는 cm값을 계산하면 1us에 0.034cm라는 계산이 나옵니다.
그런데, cm에 왜 0.01723인가 하면 우리가 readTravelTime에서 가져온 시간값은
초음파가 출발했다가 도착한 시간이니깐 거리를 한 번 왕복한 것이죠.
따라서, 2로 나누어 준 것입니다.
그렇게 cm이라는 변수를 설정했고, lcd에 값을 출력하게 되는데
두 번째 줄에 숫자를 출력하고 한 칸을 띄고 cm라는 문자열을 출력할 건데요.
int pos라는 변수가 있습니다.
만약, cm값의 자리 수가 달라질 때마다 cm이라는 문자열이 출력되는 위치가 같다면
제가 원하는 결과값이 나오지 않을 건데요.
따라서 cm이라는 문자열이 출력될 위치를 다르게 설정해주어야 합니다.
cm값이 한 자리면 2번 칸에 출력하고, 100미만은 3번 칸, 아니면 4번 칸에 출력하도록 커서를 설정했습니다.
여기서 헷갈리시면 안되는 건 LCD의 칸은 0부터 시작이라는 거죠.
그래서 2번 칸은 실질적으로 3번째 칸이 되고, 3번 칸은 4번째 칸, 4번 칸은 5번째 칸인 겁니다.
그렇게 1초만큼의 딜레이를 주고 출력을 하게되면 아래처럼 결과가 나오게 됩니다.
이번 회로는 함수를 구현하는 것이 조금 복잡하긴 했는데요.
초음파 센서의 특성을 공부하느라 조금 힘들었을 수 있을 것 같아요.
그래도 모두 자신이 원하는 회로를 구성하는 것을 목표로 하신다면 할 수 있을 정도라고 생각합니다.
모두 힘내서 이외의 다른 목표도 달성하시길 바라요 ㅎㅎ
'Dev > C언어' 카테고리의 다른 글
아두이노 조도 센서 사용하기 (0) | 2020.08.22 |
---|---|
아두이노 충돌 경보기 만들기 (0) | 2020.08.12 |
아두이노 Text LCD 사용하기 (0) | 2020.08.02 |
아두이노 가로등 만들기 (0) | 2020.07.25 |
아두이노 millis와 interrupt로 LED 제어하기 (0) | 2020.07.20 |