본문 바로가기
아두이노

[Do it! 아두이노] 9. 함수와 라이브러리 활용하기

by Lizardee 2023. 8. 20.
1. 초음파 센서로 거리 측정하기

▶ 초음파 센서란?

  • 소리: 물체의 진동에 의해 발생하고 공기로 전달되는 파동(음파)
    --> 진동이 1초에 얼마나 발생하는 소리인지에 따라 사람이 들을 수 있는지가 결정된다.
  • 진동수(주파수): 1초 동안 진동한 횟수, 단위 = 헤르츠(Hz)
  • 초음파: 주파수가 높아서 사람이 들을 수 없는 소리

 

초음파 센서의 원리

: 초음파 센서는 초음파가 물체에 반사되어 돌아올 때까지의 '시간'을 측정한다. 이때 초음파의 '속력'은 이미 정해져 있다.

  • 거리 = 속력*시간
    --> 시간, 속력을 알면 거리를 구할 수 있다.

 

Do it! 실습 9-1. 초음파 센서로 거리 측정하기

▷ 트리거와 에코 이해하기

  • 트리거: 초음파 센서에서 초음파 신호를 발생시키는 장치
    --> 트리거가 초음파를 발생시키면 초음파 신호는 뻗어나가다가 물체를 만나면 반사되어 돌아온다. 
  • 에코: 초음파 신호를 수신하는 장치
    --> 에코는 물체에 반사되어 되돌아오는 초음파 신호를 수신해 초음파 신호가 발생한 시점부터 수신한 시점까지의 시간을 마이크로초(microsecond, ms) 단위로 반환한다.

초음파 센서

  1. 아두이노의 디지털 핀을 통해 초음파 센서의 트리거에 사각파 신호를 전달한다.
  2. 사각파 신호를 전달받은 초음파 센서는 여덟 개의 초음파 묶음을 연속해서 발생시킨다.
  3. 초음파가 발생한 순간과 초음파가 물체에 반사되어 되돌아오는 순간 에코의 신호에 변화를 준다. 
    --> 에코 신호의 변화를 확인하면 초음파 신호가 발생한 시점과 수신된 시점을 알 수 있다. 둘 사이의 시간을 측정하면 거리를 계산할 수 있다.

 

초음파 센서로 거리 측정하기

// 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 만들기

물체 사이의 거리에 반응하는 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를 만든다.

핀이 4개인 초음파 센서를 다뤄봐요!

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번 핀을 에코로 사용한다.