[아두이노] PVM Shield를 이용한 제어 실습

김우경·2021년 4월 16일
0

아두이노

목록 보기
7/9

이번에는 PVM Shield로 DC Motor/Buzzer를 제어해봤습니다.

DC Motor와 Buzzer 제어

DC Motor의 Control

DC 모터의 방향 제어

DC 모터의 방향은 H-Bridge를 이용해서 제어한다.


극성을 바꿔서 전류 흐름이 바뀔때 바뀐다.
-> 회로 구성시에는 극성을 바꿀 수 없다 !
: Transistor를 이용해서 Motor의 입장에서 브러쉬에 흐르는 전류의 방향을 바꿔준다.



일종의 전기 스위치 역할을 하는 transistor 4개를 이용해서 H-Bridge를 구성한다.


: 극성을 바꿔주지 않아도 TR를 이용해서 전류의 흐름만 바꿔준다.
-> ON되는 스위치에 PWM을 걸어줌

  • 문제점 : DC 모터의 용량 제한
    -> 모터의 종류와 용량에 따라서 다른 소자를 사용
    -> 2~3A: TR로
    -> 10A이상 : FET
    -> 100A 이상 : 사이니스터

DC 모터의 속도 제어

: PWM의 duty를 이용해서 제어한다.

  • duty란? 한 주기에서의 High Time
  • DutyRatio(%)=주기duty100Duty Ratio(\%) = \cfrac{주기} {duty} *100

PWM Shield

  • Motor Shield는 두개의 PWM Shield로 구성
    -> Arduino의 digital port 5번과 6번에 각각 연결됨
  • PWM Shield에서 PWM1, PWM2에 각각 진동 모터압전 스피커가 연결됨
  • 스위치를 이용해서 모터와 스피커 중 제어 대상을 선택할 수 있음
  • 아두이노에서 주기는 고정, duty로 회전 속도를 제어한다.
    -> TR Base에 인가되는 PWM의 duty 비율이 증가하면 모터 회전 속도 증가
    ->TR Base에 인가되는 PWM의 duty 비율이 감소하면 모터 회전 속도 감소
  • 아두이노에서 주파수는 고정, duty로 출력 음의 크기를 제어한다.
    -> TR Base에 인가되는 PWM의 duty 비율이 증가하면 스피커에 강한 음
    ->TR Base에 인가되는 PWM의 duty 비율이 감소하면 스피커에 약한 음
    -> tone() 함수를 이용하면 duty를 50으로 고정 & 주파수 변경이 가능
  • Transistor가 필요한 이유? 증폭의 기능
    : MCU단에서 구동 전류가 필요한데, 아두이노에서 나오는 전류는 20mA정도로 너무 작음 -> 모터 드라이버 회로가 필요한데 여기서는 그것을 TR로 구현

아두이노와 연결하기


위와 같이 PWM1는 아두이노의 digital port 5번과 PWM2는 아두이노의 digital port 6번과 연결해준다.

PWM1의 진동모터 동작

int pwm1value = 0; // 초기 pwm의 값 

void setup() {
  // put your setup code here, to run once:
  pinMode(5, OUTPUT);
}

void loop() {
  // analogWrite() 함수를 이용해서 PWM을 만든다 
  analogWrite(5, pwm1value);
  delay(500);
  pwm1value += 10;
  if (pwm1value > 255) {
    pwm1value = 0;
  }
}

예제 코드들

  1. 1번째 DC motor의 속도 0.5초 간격으로 증가-감소
int pwm1value = 0; // 초기 pwm의 값 
boolean increasing = true;

void setup() {
  // put your setup code here, to run once:
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // analogWrite() 함수를 이용해서 PWM을 만든다 
  Serial.println(pwm1value);
  analogWrite(5, pwm1value);
  delay(500);

  if (increasing) {
    pwm1value += 10;
  } else {
    pwm1value -= 10;
  }

  if (pwm1value > 255) {
    increasing = false;
  } else if (pwm1value < 0) {
    increasing = true;
  }
}
profile
Hongik CE

0개의 댓글