회로구성
DC모터 + 가변저항(또는 분압기(Potentiometer, 포텐시오미터))
동작 요구사항
- 아두이노에 전원이 인가되면 모터는 멈춰있는 상태이다.
- 분압기로 전압을 조정하여 전압이 높아지면 모터의 회전 속도가 빨라지고 전압이 낮아지면 속도가 느려진다.
DC 모터
- DC 전원을 회전운동으로 변환시키는 장치
- 고정자로 영구자석을 사용하고, 회전자(전기자)로 코일을 사용하여 구성한 것으로, 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발, 흡인력으로 회전력을 생성
TIP120
- NPN 달링턴 페어 트랜지스터
- 5A 부하 처리에 좋은 특성 : 5V의 이미터-베이스 전압, 60V의 컬렉터-이미터 전압
- 최대 65W 콜렉터 소비전력 및 최대 전류 이득 1000
- 스위칭 및 증폭에 사용
아두이노와 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임
- 아날로그 입력을 읽기 위해서는 약 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%
- 아두이노 디지털 핀은 5V(HIGH) 또는 0V(LOW)를 제공 → 구형파 신호
- 디지털 핀에 연결된 LED의 밝기를 조절하려면 디지털 핀에서 0~5V 사이의 전압을 제공해야 함 → 불가능
- 신호의 ON/OFF 시간을 변경할 수 있음 → ON/OFF 시간을 충분히 빠르게 변경하면 LED의 밝기 조정이 가능함 (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 시뮬레이션 결과영상
'아두이노' 카테고리의 다른 글
L293D Dual H-Bridge Motor Driver와 아두이노를 이용한 DC 모터 제어 (0) | 2021.06.05 |
---|---|
아두이노 릴레이 제어 (0) | 2021.05.18 |
아두이노 절전모드 (sleep mode (0) | 2021.05.17 |
아두이노를 이용한 자동차 후방 센서 구현 : 초음파 거리센서+LED+피에조 (0) | 2021.05.16 |
아두이노와 2개의 7세그먼트를 이용한 카운터 구현 (0) | 2021.05.16 |