일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Arduino
- Cura
- Theo Jansen Mechanism
- 아두이노 서보 모터
- 2020 LG gram
- 적층형 3D 프린터
- LG gram
- support
- 파이썬
- FDM
- 아두이노 LED 예제
- 3D Printer
- Arduino LED example
- gcode
- 서보 모터
- Servo Motor
- 아두이노
- Cura 사용법
- 테오 얀센 메커니즘
- 큐라 사용법
- python
- 드론
- Arduino IDE
- Arduino Servo Motor
- MHEV
- 3D 프린터
- 큐라
- Drone
- Arduino Ultrasonic Sensor
- Jansen Linkage
- Today
- Total
Mechanic 공방
15. 아두이노 초음파 센서 실습 (1) 본문
이번 포스팅에서는 초음파 센서를 사용하는 실습을 해보고자 한다.
초음파 센서는 초음파를 사용하여 물체와의 거리를 측정할 수 있는 센서로서, 초음파를 발사한 뒤 특정 물체에 튕겨져 다시 되돌아오기까지의 시간을 측정하여 거리를 계산할 수 있는 센서이다.
거리 측정에 가장 많이 사용되며, 자동차의 전후방 감지 센서에도 사용되는 종류의 센서이다.
[회로 구성]
회로는 아래와 같이 구성된다.
초음파 센서에는 총 4개의 핀이 존재하는데, VCC, GND, 신호 핀 2개로 이루어져 있다.
[코드 설명]
#define EchoPin 13
#define TrigPin 12
unsigned long duration;
float dist;
void setup() {
Serial.begin(9600);
pinMode(EchoPin,INPUT);
pinMode(TrigPin,OUTPUT);
}
void loop() {
//operating ultrasonic sensor
digitalWrite(TrigPin,LOW);
digitalWrite(EchoPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
//calculate distance
duration = pulseIn(EchoPin,HIGH);
dist = ((float)(331 * duration) / 10000) / 2;
//show serial monitor
Serial.print(dist);
Serial.println(" cm");
delay(500);
}
초음파 센서는 초음파를 발사하는 역할을 하는 핀과 수신하는 역할을 하는 핀 두 개가 존재한다.
발사하는 핀을 Trig라고 부르며, 수신하는 쪽은 Echo라고 부른다.
Trig와 연결된 핀은 OUTPUT으로 설정해야 하며, Echo와 연결된 핀은 INPUT으로 설정해야 측정이 이루어질 수 있다.
코드의 전체적인 진행은 아래와 같다.
1) Trig, Echo 핀 모두 LOW로 초기화
2) Trig 핀에서 HIGH 신호를 약 10ms 동안 발신
3) Trig 핀 LOW 값 초기화
4) Echo 핀에 LOW 값이 들어갈 때까지의 시간 측정
5) 음파의 속도를 기반으로 거리 계산
거리를 계산하는 식에서 (float)(331 * duration)의의 경우, 변수 간의 종류가 맞지 않을 경우 사용하는 문법이다.
즉, 위 코드에서 duration의 경우 ‘unsigned long’ 형형 변수로 선언했지만, dist 변수의 경우 ‘float’ 형으로 선언했기 때문에 계산 과정에서 동일한 변수형으로 맞추어 주어야 한다.
또한 계산 식에서 10000으로 나눈 이유는 단위를 ‘cm’로 맞추기 위함이다.
사용한 331이라는 상수의 경우 소리의 속도로, 단위는 m/s이다.
duration 변수의 경우 초음파 센서에서 측정된 시간으로, 단위는 ms이다.
따라서 해당 계산 식의 결과 값의 단위를 ‘cm’로 만들기 위하여 10000을 나누어 준 것이다.
마찬가지로 계산 식의 가장 마지막 부분에 2로 나눈 이유는 센서에서 측정되는 duration 값의 경우 왕복 시간이기 때문에 편도의 거리를 계산하기 위하여 절반으로 나눈 것이다.
마지막으로 본 실습에서는 지금까지 나오지 않았던 문법이 하나 더 나온다.
'Serial'이라는 문법인데, 이는 아두이노 IDE에 내장된 Serial Monitor를 사용할 수 있도록 도와주는 함수이다.
코드의 앞쪽 Setup() 함수 안에 'Serial.begin(9600)'이라는 구문을 볼 수 있는데, 이는 본 코드에서 Serial Monitor를 사용하겠다는 것을 의미하며 그 통신 속도는 9600 baudrate 함을 의미한다.
Serial Monitor를 사용하기 앞서 반드시 작성해주어야 하는 구문이다.
코드의 마지막 부분은 실제 Serial Monitor에 어떠한 값을 표시하겠다는 것을 의미한다.
'Serial.print()' 함수의 경우 중괄호 안의 내용을 Monitor 상에 띄어주는 함수이다.
마찬가지로 'Serial.println()' 함수의 경우도 동일한 기능을 수행하지만, 해당 내용 출력 후 줄 바꿈을 수행한다는 점에서 위 'Serial.print()' 함수와 다르다.
[동작 영상]
위 코드가 정상적으로 작동된다면 아래와 같이 Serial Monitor에 거리가 측정되는 것을 볼 수 있다.
초음파 센서 앞쪽에 장애물을 다양한 거리에 놓아두며 직접 테스트해보면 좋다.
(※ Serial Monitor를 켜는 방법은, 코드를 보드에 업로드 후 IDE 창의 우측 상단에 있는 돋보기 모양 버튼을 누르면 된다. 주의할 점은 Serial Monitor의 우측 하단에 있는 baudrate가 코드 상에서 정의한 숫자와 동일해야 한다.)
P.S
Serial Monitor를 사용하기 위한 Serial 함수에 관해서 보다 자세한 설명 및 예제 구문은 아래 아두이노 공식 홈페이지를 참고하면 좋다. 아직 C 언어에 익숙하지 않은 독자들을 위하여 참고 링크를 첨부한다.
https://www.arduino.cc/reference/en/language/functions/communication/serial/
'아두이노 (Arduino)' 카테고리의 다른 글
17. 아두이노 서보 모터 실습 (1) (0) | 2020.08.22 |
---|---|
16. 아두이노 초음파 센서 실습 (2) with LED (0) | 2020.08.18 |
14. 인터럽트 (Interrupt) (0) | 2020.07.31 |
13. 아두이노 LED 실습 (5) with Button module & Interrupt Pin (0) | 2020.07.29 |
12. 풀업 저항, 풀다운 저항 (플로팅 현상) (0) | 2020.07.25 |