본문 바로가기

아두이노

아두이노에서 가변저항을 이용한 DC 모터 속도 제어

회로구성

DC모터 + 가변저항(또는 분압기(Potentiometer, 포텐시오미터))

동작 요구사항

- 아두이노에 전원이 인가되면 모터는 멈춰있는 상태이다.

- 분압기로 전압을 조정하여 전압이 높아지면 모터의 회전 속도가 빨라지고 전압이 낮아지면 속도가 느려진다.

DC 모터

- DC 전원을 회전운동으로 변환시키는 장치

- 고정자로 영구자석을 사용하고, 회전자(전기자)로 코일을 사용하여 구성한 것으로, 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발, 흡인력으로 회전력을 생성

DC 모터 외형과 내부, 동작 원리

TIP120

- NPN 달링턴 페어 트랜지스터

- 5A 부하 처리에 좋은 특성 : 5V의 이미터-베이스 전압, 60V의 컬렉터-이미터 전압

- 최대 65W 콜렉터 소비전력 및 최대 전류 이득 1000

- 스위칭 및 증폭에 사용

 

NPN 달링턴 페어 트랜지스터 (TIP120)

아두이노와 DC 모터, TIP120 연결도

아두이노 제어 함수

- 데이터 직렬통신을 위한 함수 : Serial.begin(), Serial.print(), Serial.println()

- 아날로그 I/O : analogRead(), analogWrite()

Serial

- 아두이노와 컴퓨터 또는 다른 디바이스와 직렬 통신을 위한 클래스

- Uno, Nano, Mini 및 Mega에서는 0번 핀과 1번 핀이 컴퓨터와 통신에 사용된다. 이 핀에 무엇이든 연결하면 보드 업로드 실패를 포함, 통신을 방해 할 수 있다.

- 아두이노 IED 환경의 내장 직렬 모니터를 사용하여 아두이노 보드와 통신 할 수 있다.

 

아두이노 보드별 시리얼 핀 번호

Serial.begin()

- 직렬 데이터 전송을 위한 데이터 전송률을 초당 비트 수(baud)로 설정

- 사용법

Serial.begin(데이터 전송률);

- 데이터 전송률 종류 : 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400,

                             250000, 500000, 1000000, 2000000

- 예시

Serial.begin(9600); // 컴퓨터와 9600bps 속도로 직렬 통신을 하도록 설정

Serial.print() / Serial.println()

- 직렬 포트의 데이터를 ASCII 텍스트로 표시. Serial.println은 텍스트 끝에 줄바꿈 문자를 추가로 표시

- 사용법

Serial.print(데이터, 포맷);

- 매개변수
     데이터 : 인쇄할 값
     포맷 : 숫자 표현 방식 지정 (실수의 경우 소수점 자릿수. 기본값 2자리)

- 예시

val = 123.456789;
Serial.print(val, 4);  // 직렬 모니터에 123.4568 출력 (반올림 수행)

analogRead()

- 지정된 아날로그 핀(A0~A5)에서 데이터를 읽어와서 0~1023(210-1)의 정수로 반환

- 사용법

analogRead(아날로그 핀번호);

- 아두이노 보드에는 멀티채널 10비트 아날로그 디지털 변환기(analog to digital converter, ADC)가 내장되어 있음

- 예시

val = analogRead(A3); // A3핀에 입력된 전압을 읽어 변환된 ADC값을 저장

 

※ ADC (Analog to Digital Converter)

- 아날로그 신호를 디지털 신호로 변환하는 장치

- 아날로그 신호 → 샘플링 → 양자화 → 부호화 → 디지털 신호

 

- 아두이노에는 멀티채널 10비트 ADC가 내장되어있음

- ADC는 입력 전압(0V~5V*)을 0~1023의 정수값으로 매핑
     아두니노 우노의 분해능 : 5V / 1024 = 0.0049V (4.9 mV)
     * 5V는 우노(Uno)의 operating voltage이고, 아두이노 제로(Zero)는 3.3V가 operating voltage임

 

아두이노 보드의 ADC

- 아날로그 입력을 읽기 위해서는 약 100us의 시간이 필요함. 즉, 초당 최대 10,000번의 아날로그 데이터를 읽어올 수 있음

analogWrite()

- 아날로그 값(PWM 듀티사이클)을 핀에 쓰면, 해당 핀은 다음 analogWrite() (또는 analogRead(), digitalRead(), digitalWrite())가 호출될 때까지 특정 듀티사이클을 갖는 구형파(rectangular wave)를 발생함

- digitalWrite()와 달리 핀을 출력으로 설정하기 위해 pinMode()를 사용할 필요가 없음

- analogWrite() 기능은 아날로그 핀(A0~A5)이나 analogRead() 함수와 아무관련이 없음

- 사용법

analogWrite(핀 번호, 값);

- 매개변수
     핀 번호 : PWM 핀
     값 : 듀티사이클에 해당하는 0~255사이의 정수

- 예시

analogWrite(10, 127); // 10번 핀에서 듀티비가 50%인 구형파 발생

- 아두이노의 PWM 핀 : 물결(~) 표시가 있는 핀

 

 

PWM (Pulse Width Modulation)

- 한 주기 내 펄스의 폭을 변조하는 방식

- 전압을 일정한 비율로 HIGH(Duty cycle)를 유지하고, 나머지는 LOW를 유지

- 아두이노에서 듀티사이클 0%는 0으로, 듀티사이클 100%는 255로 나타냄

- 듀티사이클은 듀티비(duty ratio)라고도 함

  (예) analogWrite(10, 64) → Duty Cycle = 64/255 x 100 = 25.09%

 

analogWrite() 함수와 듀티비

- 아두이노 디지털 핀은 5V(HIGH) 또는 0V(LOW)를 제공 → 구형파 신호

- 디지털 핀에 연결된 LED의 밝기를 조절하려면 디지털 핀에서 0~5V 사이의 전압을 제공해야 함 → 불가능

- 신호의 ON/OFF 시간을 변경할 수 있음 → ON/OFF 시간을 충분히 빠르게 변경하면 LED의 밝기 조정이 가능함 (PWM - 듀티비를 조절함으로써 원하는 DC 전압을 생성한 것과 같은 효과를 낼 수 있음)

 

PWM 신호와 상응하는 DC 전압 레벨

Tinkercad 시뮬레이션

전체코드

int motor = 6;

void setup() {
  Serial.begin(9600);
  pinMode(motor, OUTPUT);
}

void loop() {
  int val = analogRead(A5);
  int pwm = val/4;
  analogWrite(motor, pwm);
  
  Serial.print("Voltage : ");
  Serial.print(5.0*val/1024, 4);
  Serial.print("V   ADC value : ");
  Serial.print(val);
  Serial.print("   PWM : ");
  Serial.print(pwm);
  Serial.print("   Duty ratio : ");
  Serial.print(pwm/255.0*100);
  Serial.println("%");  

  delay(10);
}

Tinkercad 시뮬레이션 결과영상