아두이노 우노의 입출력
디지털 입출력 핀
- 14개 -> 0번~13번
- 아날로그 입력핀까지 디지털로 사용해서 총 20개까지 사용 가능
아날로그 입력 핀
- 6개 -> A0~A5까지 상수로
- 14~19까지 디지털 입출력핀으로 사용 가능
pinMode()
void pinMode(uint8_t pin, uint8_t mode)
- pin : 사용할 pin 번호
- mode : INPUT(default), OUTPUT, INPUT_PULLUP 중 하나
- 반환값 : x
-> 하나의 pin을 입출력 모두 사용하려면? pinMode()를 2번 호출해야함
디지털 데이터의 입출력
디지털 데이터 입력
digitalRead()
int digitalRead(uint8_t pin)
- 비트 단위의 데이터 입력용
- 반환값 : 논리값 0(LOW) 또는 1(HIGH)
int pinNo = 13;
pinMode(pinNo, INPUT);
int value = digitalRead(pinNo);
입력 핀의 상태
- 3가지 상태 존재 : 0, 1, floating
floating
: 불안정하여 외부의 영향에 따라 무작위 값이 가해짐
-> 0도 1도 아닌 떠있는 상태
의 상태에서,
- switch on -> MCU on
- switch off -> MCU의 값은 알 수 없다
: 전기적으로 0V 또는 5V가 들어가여 명확하게 0,1의 값을 가지는데 저항을 달지 않으면 0도 1도 아닌 floating 상태를 가진다.
위와 같이 저항을 달아서 명확하게 -처리를 표시해줘야 floating없는 완전한 회로의 완성이 가능하다.
-> PULL-UP 회로 또는 PULL-DOWN 회로를 구성해줘야 한다.
PULL-UP 회로
: 입력값과 상관없이 항상 default값이 논리 1인 회로
PULL-UP 회로
: 입력값과 상관없이 항상 default값이 논리 0인 회로
-> 아두이노에서의 내부 풀업 저항
: pinMode()
에서 INPUT_PULLUP
옵션 사용
Bounce 현상
: 기계적 진동에 의해 버튼을 1번 눌렀는데 2번 이상 눌리는 현상
-> mechanical contact시 전기적으로 불안정하기 때문에
- 없애기 : de-bounce
-> 방법 1: delay를 이용해서 해당 chattering 발생 시점에 아예 값 읽지 않기
-> 방법 2: Latch 함수 이용
디지털 데이터 출력
LED
- 발광 다이오드
- 극성 가짐 : 순방향으로 연결된 경우에만 불이 켜짐
-> 흐르는 전류의 한계는 보통 20mA
** 정전류 회로 사용
: V=IR
I = 0.02A, V= 5V일때 R = 250Ω
digitalWrite()
void digitalWrite(uint8_t pin, uint8_t value)
- pin : 핀번호
- value : LOW 또는 HIGH
- 반환값 : x
tone()
void tone(uint8_t pin, uint8_t frequency, unsigned long duration = 0)
- pin : 핀번호
- frequency : 출력 주파수
- duration : 출력 지속 시간 (ms)
- 반환값 : x
- duty는 50%로 고정, 파라미터로 받은 주파수의 구형파로 단음 재생
- duration만큼 음 재생
- pitches.h 헤더 사용
- duty=주기Th∗100
<-> pulse : digital 신호를 이용해서 0,1 값의 변화
- PWM : 주기는 고정, duty가 변화
-> 조명의 밝기, 모터의 회전 속도 등
| 주기(주파수) | duty |
---|
PWM | 고정 | 변화 |
tone | 변화 | 50%로 고정 |
시간 지연을 위한 함수
delay()
- 밀리초 단위의 시간 지연
- ms초 단위의 지연은 delayMicroseconds 사용
- 단점 : delay() 실행 중 다른 대부분의 작업 수행 x이므로 정확한 시간 제어는 할 수 없다.
-> 시간과 관계없이 상태 체크할때
-> 타이밍이 중요하다면 millis()를 사용한다 !
millis()
- 프로그램이 시작된 이후 경과된 CPU time을 밀리초 단위로 반환
- 4Bytes의 값 반환
-> 70분간 체크 가능