1. 초음파 센서로 거리 측정하기
▶ 초음파 센서란?
- 소리: 물체의 진동에 의해 발생하고 공기로 전달되는 파동(음파)
--> 진동이 1초에 얼마나 발생하는 소리인지에 따라 사람이 들을 수 있는지가 결정된다. - 진동수(주파수): 1초 동안 진동한 횟수, 단위 = 헤르츠(Hz)
- 초음파: 주파수가 높아서 사람이 들을 수 없는 소리
▶ 초음파 센서의 원리
: 초음파 센서는 초음파가 물체에 반사되어 돌아올 때까지의 '시간'을 측정한다. 이때 초음파의 '속력'은 이미 정해져 있다.
- 거리 = 속력*시간
--> 시간, 속력을 알면 거리를 구할 수 있다.
Do it! 실습 9-1. 초음파 센서로 거리 측정하기
▷ 트리거와 에코 이해하기
- 트리거: 초음파 센서에서 초음파 신호를 발생시키는 장치
--> 트리거가 초음파를 발생시키면 초음파 신호는 뻗어나가다가 물체를 만나면 반사되어 돌아온다. - 에코: 초음파 신호를 수신하는 장치
--> 에코는 물체에 반사되어 되돌아오는 초음파 신호를 수신해 초음파 신호가 발생한 시점부터 수신한 시점까지의 시간을 마이크로초(microsecond, ms) 단위로 반환한다.
- 아두이노의 디지털 핀을 통해 초음파 센서의 트리거에 사각파 신호를 전달한다.
- 사각파 신호를 전달받은 초음파 센서는 여덟 개의 초음파 묶음을 연속해서 발생시킨다.
- 초음파가 발생한 순간과 초음파가 물체에 반사되어 되돌아오는 순간 에코의 신호에 변화를 준다.
--> 에코 신호의 변화를 확인하면 초음파 신호가 발생한 시점과 수신된 시점을 알 수 있다. 둘 사이의 시간을 측정하면 거리를 계산할 수 있다.
// C++ code
//
void setup()
{
Serial.begin(9600);
}
void loop()
{
//초음파 신호 송신(사각파를 만드는 과정)
pinMode(9, OUTPUT); //초음파 센서의 신호: OUTPUT
digitalWrite(9, LOW); //LOW
delayMicroseconds(2); //delayMicroseconds
digitalWrite(9, HIGH); //HIGH
delayMicroseconds(5); //delayMicroseconds
digitalWrite(9, LOW); //LOW
//초음파 신호 수신
pinMode(9, INPUT); //초음파 센서의 신호: INPUT
double duration = pulseIn(9, HIGH);
double cm = duration*340/10000/2;
//측정 거리 출력
Serial.println(cm);
}
Do it! 실습 9-2. 물체 사이의 거리에 반응하는 LED 만들기
// C++ code
//
void setup()
{
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
}
void loop()
{
//초음파 신호 송신(사각파를 만드는 과정)
pinMode(9, OUTPUT); //초음파 센서의 신호: OUTPUT
digitalWrite(9, LOW); //LOW
delayMicroseconds(2); //delayMicroseconds
digitalWrite(9, HIGH); //HIGH
delayMicroseconds(5); //delayMicroseconds
digitalWrite(9, LOW); //LOW
//초음파 신호 수신
pinMode(9, INPUT); //초음파 센서의 신호: INPUT
double duration = pulseIn(9, HIGH);
double cm = duration*340/10000/2; //cm 정의
//물체의 측정 거리(cm)에 따라 LED 제어
if(cm < 20){
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
}
else if(cm < 60){
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
}
else{
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
}
delay(1000);
}
2. 서보 모터로 자동문 만들기
▶ 서보 모터(servo motor)란?
: DC 모터와 달리, 속도와 각도를 모두 제어하는 모터
- RC카의 방향 제어, 로봇의 관절 제어, 잠금 장치를 열고 닫을 때 등에 활용된다.
- 라이브러리: #include <Servo.h>
Do it! 실습 9-3. 서보 모터의 회전 각도 제어하기
#include <Servo.h>
Servo myServo; //라이브러리 이름, 라이브러리를 사용할 변수 이름
void setup()
{
myServo.attach(9); //라이브러리 변수, 라이브러리에 포함된 함수
}
void loop()
{
//서보 모터의 각도를 0~180도까지 바꿈
for(int angle = 0; angle<=180; angle++){
myServo.write(angle);
delay(100); //원활한 동작을 위해 지연시간 추가
}
}
Do it! 실습 9-4. 서보 모터와 PIR 센서로 자동문 회로 만들기
: PIR 센서가 움직임을 감지할 때마다 서보 모터가 회전하도록 한다.
#include <Servo.h>
Servo myServo;
void setup(){
//아두이노의 디지털 9번 핀을 서보 모터 제어에 사용
myServo.attach(9);
//PIR 센서의 값을 읽을 디지털 핀을 7번으로 설정
pinMode(7, INPUT);
}
void loop(){
//PIR 센서로 움직임 감지 시 서보 모터 제어
int detect = digitalRead(7);
if(detect == HIGH){ //HIGH일 때(움직임 감지)
myServo.write(90); //서보 모터의 각도를 0도로 조절한다.
delay(100);
}
else{ //LOW일 때
myServo.write(0); //서보 모터의 각도를 90도로 조절한다.
delay(100);
}
}
도전: 핀이 4개인 초음파 센서를 다뤄봐요!
: 핀이 4개인 초음파 센서(HC-SR04)를 사용해 물체 사이의 거리에 반응하는 LED를 만든다.
void setup()
{
pinMode(10, OUTPUT); // 10번 핀을 트리거로 사용
pinMode(9, INPUT); // 9번 핀을 에코로 사용
Serial.begin(9600);
}
void loop()
{
// 초음파 신호 송신
digitalWrite(10, LOW);
delayMicroseconds(2);
digitalWrite(10, HIGH);
delayMicroseconds(10);
digitalWrite(10, LOW);
// 초음파 신호 수신
pinMode(9, INPUT);
double duration = pulseIn(9, HIGH);
double cm = duration * 340 / 10000 / 2;
//물체의 측정 거리(cm)에 따라 LED 제어
if(cm < 20){
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
}
else if(cm < 60){
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
}
else{
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
}
delay(100);
}
- pinMode(10, OUTPUT);
- pinMode(9, INPUT);
--> 10번 핀을 트리거, 9번 핀을 에코로 사용한다.
'아두이노' 카테고리의 다른 글
[Do it! 아두이노] 11. 7세그먼트로 숫자 표시하기 (2) | 2023.08.20 |
---|---|
[Do it! 아두이노] 10. LCD로 문자열 출력하기 (0) | 2023.08.20 |
[Do it! 아두이노] 8. 아두이노 출력으로 아두이노 작동하기 (1) | 2023.08.19 |
[Do it! 아두이노] 7. 아날로그 입력으로 아두이노 작동하기 (0) | 2023.08.19 |
[Do it! 아두이노] 6. 디지털 입력으로 아두이노 작동하기 (0) | 2023.08.19 |