저항
출처 : https://ko.wikipedia.org/wiki/%EC%A0%84%EA%B8%B0%EC%A0%80%ED%95%AD
전기 저항은 도체에서 전류의 흐름을 방해하는 정도를 나타내는 물리량입니다. 전기회로 이론에선 간단히 줄여 저항이라고 합니다. 이와 반대로 전기를 얼마나 잘 흐르게 하는 지를 나타내는 물리량은 전기 전도도라고 합니다.
일반적인 저항의 모습은 위와 같습니다. 저항에 새겨진 띄의 의미는 다음과 같습니다.
가변 저항 (Potentiometer)
일반적으로 저항의 값이 정해져 있는데 반해, 가변 저항은 중심 회전 축을 돌리거나, 슬라이더를 좌우로 미는 등 저항을 조절 할 수 있습니다.
일반적으로 가변 저항의 1번 핀에는 GND를, 3번 핀에는 5V(외부전원의 종류에 따라 달라 질 수 있습니다.)를 연결하고 , 2번 핀에는 아날로그 입력 핀을 연결합니다.
가변 저항 내부에는 저항물질이 둥글게 자리잡고 있습니다. 따라서 중심 축을 회전 시킬때 다이얼 와이퍼가 돌아가게됩니다. 저항 값은 저항물질의 길이에 비례하기 때문에 1번과 3번 사이의 저항 값은 다이얼 와이퍼의 위치와 관계없이 일정합니다. 다이얼 와이퍼가 1번 핀에 가까울 수록 1번과 2번 사이의 저항값은 감소하고 2번과 3번 사이의 저항 값은 증가합니다. 반대로 3번과 가까워 지면 1번과 2번사이의 저항은 증가하고 2번과 3번 사이의 저항은 감소합니다.
즉, 돌아간 정도에 따라 2번 핀의 전압이 달라집니다. 2번 핀의 전압을 읽어오면 가변 저항의 손잡이가 어느 정도 돌아 갔는지 인식 할 수있습니다.
슬라이드 가변 저항의 작동 방식 또한 비슷합니다.
슬라이더를 좌우로 밀면서 저항 값이 변합니다.
0V5V 사이의 변화하는 전압 값을 01023 사이의 아날로그 값으로 변환하여 연결된 아날로그 입력 핀에 값을 반환합니다.
아날로그 입력 (Analog Input)
아두이노에는 6개의 아날로그-디지털 변환기 (ADC : Analog to Digital Converter)가 포함되어 있습니다. A0 ~ A5핀에서 아날로그 값을 읽어들일 수 있습니다.
ADC가 출력하는 비트의 수를 ADC의 분해능(분해능력)이라고 합니다. 만약 ADC가 3-bit의 분해능을 갖는다면, 들어오는 입력 값을 2∧3(=8)개의 디지털 신호 단계(000~111 = 0 ~ 7)로 변환하여 구분한다는 의미 입니다.
8-bit의 분해능은 256(0255)가지, 10-bit의 분해능은 1024가지(01023)의 출력이 가능하다는 의미입니다.
아두이노의 ADC는 10-bit의 분해능을 가지고 있습니다. 따라서 0V ~ 5V의 입력 전압을 디지털 신호 0~1023 정수로 반환하며, 4.9mV(=0.0049V) 단위로 전압을 구분 할 수 있습니다.
ADC는 아날로그 입력값을 디지털 값으로 변환하는데 일정 시간(Conversion Time)이 필요합니다. 아두이노에서는 약 100 마이크로 초 (0.0001초)의 시간이 소요됩니다. 1마이크로 초는 1000000분의 1초를 의미합니다. 따라서 1초에 1만번의 아날로그 입력 값을 읽어 들일 수 있습니다.
다음은 슬라이드 저항에 따라 LED의 출력 색이 바뀌는 예제 입니다.
시리얼 모니터가 아닌 시리얼 플로터로 실행을 시키면 변화에 따라 그래프가 그려집니다. 스케치 업로드 후 플로터를 통해 변화를 확인 해보는 것이 좋을 것 같습니다.
const int potentiometerPin = A0; // Slide Potentiometer의 핀 번호를 A0로 설정
const int redPin = 9; // RGB LED의 빨간색 핀 번호를 9번으로 설정
const int greenPin = 10; // RGB LED의 녹색 핀 번호를 10번으로 설정
const int bluePin = 11; // RGB LED의 파란색 핀 번호를 11번으로 설정
int analogValue; // 읽어온 아날로그 값을 저장할 변수
float voltage; // 아날로그 값에 따른 전압 값을 저장할 변수
void setup() {
pinMode(redPin,OUTPUT); // RGB LED의 빨간색 핀을 출력 모드로 설정
pinMode(greenPin,OUTPUT); // RGB LED의 녹색 핀을 출력 모드로 설정
pinMode(bluePin,OUTPUT); // RGB LED의 파란색 핀을 출력 모드로 설정
Serial.begin(9600); // 시리얼 통신 속도 9600으로 시작
}
void loop() {
analogValue = analogRead(potentiometerPin); // Slide Potentiometer로 부터 아날로그 값을 읽어옴
voltage = analogValue * (5.0/1023.0); // 읽어 온 아날로그 값으로 부터 전압 값을 환산
Serial.print("Analog Value : "); // 아날로그 값 출력
Serial.println(analogValue);
Serial.print("Volatage : "); // 전압 값 출력
Serial.print(voltage);
if(analogValue<200){ // 아날로그 값이 200 이하면 출력 없음
digitalWrite(redPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(bluePin,LOW);
}else if(analogValue>=200 && analogValue < 400){ // 아날로그 값이 200이상, 400 미만이면 빨간색 출력
digitalWrite(redPin,HIGH);
digitalWrite(greenPin,LOW);
digitalWrite(bluePin,LOW);
}else if(analogValue>=400 && analogValue < 600){ // 아날로그 값이 400이상, 600 미만이면 녹색 출력
digitalWrite(redPin,LOW);
digitalWrite(greenPin,HIGH);
digitalWrite(bluePin,LOW);
}else if(analogValue>=600 && analogValue < 800){ // 아날로그 값이 600이상, 800 미만이면 파란색 출력
digitalWrite(redPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(bluePin,HIGH);
}else if(analogValue>=800){ // 아날로그 값이 800이상 이면 흰색 출력
digitalWrite(redPin,HIGH);
digitalWrite(greenPin,HIGH);
digitalWrite(bluePin,HIGH);
}
delay(1); // 아날로그 값을 안정적으로 읽을 수 있도록 지연시간을 설정
}
다음 코드는 슬라이드 저항에 따라 아날로그 출력으로 RGB의 변화를 출력하는 코드 입니다.
const int potentiometerPin = A0; // Slide Potentiometer의 핀 번호를 A0로 설정
const int redPin = 9; // RGB LED의 빨간색 핀 번호를 9번으로 설정
const int greenPin = 10; // RGB LED의 녹색 핀 번호를 10번으로 설정
const int bluePin = 11; // RGB LED의 파란색 핀 번호를 11번으로 설정
int analogValue; // 읽어온 아날로그 값을 저장할 변수
float voltage; // 아날로그 값에 따른 전압 값을 저장할 변수
// led의 밝기 조절 변수
int ledLevel_1; // 빨간색~녹색으로 바뀔 때 쓸 변수(아날로그 값 0~341)
int ledLevel_2; // 녹색~파란색으로 바뀔 때 쓸 변수(아날로그 값 342~683)
int ledLevel_3; // 파란색~빨간색으로 바뀔 때 쓸 변수(아날로그 값 684~1023)
void setup() {
pinMode(redPin,OUTPUT); // RGB LED의 빨간색 핀을 출력 모드로 설정
pinMode(greenPin,OUTPUT); // RGB LED의 녹색 핀을 출력 모드로 설정
pinMode(bluePin,OUTPUT); // RGB LED의 파란색 핀을 출력 모드로 설정
Serial.begin(9600); // 시리얼 통신 속도 9600으로 시작
}
void loop() {
analogValue = analogRead(potentiometerPin); // Slide Potentiometer로 부터 아날로그 값을 읽어옴
voltage = analogValue * (5.0/1023.0); // 읽어 온 아날로그 값으로 부터 전압 값을 환산
ledLevel_1 = map(analogValue,0,341,0,255); // 아날로그 값에 따라 led 밝기를 저장 할 변수
ledLevel_2 = map(analogValue,342,683,0,255);
ledLevel_3 = map(analogValue,684,1023,0,255);
Serial.print("Analog Value : "); // 아날로그 값 출력
Serial.println(analogValue);
Serial.print("Volatage : "); // 전압 값 출력
Serial.print(voltage);
if(analogValue<342){ // 아날로그 0~341값에 따라 빨간색에서 녹색으로 변화
analogWrite(redPin,255-ledLevel_1);
analogWrite(greenPin,ledLevel_1);
analogWrite(bluePin,0);
}else if(analogValue > 341 && analogValue<684 ){ // 아날로그 342~683에 따라 녹색에서 파란색으로 변화
analogWrite(redPin,0);
analogWrite(greenPin,255-ledLevel_2);
analogWrite(bluePin,ledLevel_2);
}else if(analogValue>683){ // 아날로그 684~1023에 따라 파란색에서 빨간색으로 변화
analogWrite(redPin,ledLevel_3);
analogWrite(greenPin,0);
analogWrite(bluePin,255-ledLevel_3);
}
delay(1); // 아날로그 값을 안정적으로 읽을 수 있도록 지연시간을 설정
}