|
|
|
# 저항
|
|
|
|
|
|
|
|
출처 : [https://ko.wikipedia.org/wiki/%EC%A0%84%EA%B8%B0%EC%A0%80%ED%95%AD](https://ko.wikipedia.org/wiki/%EC%A0%84%EA%B8%B0%EC%A0%80%ED%95%AD)
|
|
|
|
|
|
|
|
*전기 저항*은 도체에서 전류의 흐름을 방해하는 정도를 나타내는 물리량입니다.
|
|
|
|
전기회로 이론에선 간단히 줄여 *저항*이라고 합니다.
|
|
|
|
이와 반대로 전기를 얼마나 잘 흐르게 하는 지를 나타내는 물리량은 *전기 전도도*라고 합니다.
|
|
|
|
|
|
|
|
![https://wikidocs.net/images/page/30780/01_%E1%84%90%E1%85%A1%E1%86%AB%E1%84%89%E1%85%A9%E1%84%91%E1%85%B5%E1%84%86%E1%85%A1%E1%86%A8_%E1%84%8C%E1%85%A5%E1%84%92%E1%85%A1%E1%86%BC.png](https://wikidocs.net/images/page/30780/01_%E1%84%90%E1%85%A1%E1%86%AB%E1%84%89%E1%85%A9%E1%84%91%E1%85%B5%E1%84%86%E1%85%A1%E1%86%A8_%E1%84%8C%E1%85%A5%E1%84%92%E1%85%A1%E1%86%BC.png)
|
|
|
|
|
|
|
|
일반적인 저항의 모습은 위와 같습니다.
|
|
|
|
저항에 새겨진 띄의 의미는 다음과 같습니다.
|
|
|
|
|
|
|
|
![http://cfile205.uf.daum.net/image/999CBE3C5AED5A19275C72](http://cfile205.uf.daum.net/image/999CBE3C5AED5A19275C72)
|
|
|
|
|
|
|
|
## 가변 저항 (Potentiometer)
|
|
|
|
|
|
|
|
일반적으로 저항의 값이 정해져 있는데 반해, 가변 저항은 중심 회전 축을 돌리거나, 슬라이더를 좌우로 미는 등 저항을 조절 할 수 있습니다.
|
|
|
|
|
|
|
|
![http://mblogthumb1.phinf.naver.net/MjAxNzAyMjhfMjM3/MDAxNDg4Mjg0MTQ5MzU3.xPBFOxHpiFPkj6RPbrNum62srFGHm3Z0uvO2z32AjZgg.JM1_v8V4eM57HMtQ6k0ccH5-50JLDEPWUx6VKEWhb5Ug.PNG.jamduino/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2017-02-28_%EC%98%A4%ED%9B%84_8.57.02.png?type=w800](http://mblogthumb1.phinf.naver.net/MjAxNzAyMjhfMjM3/MDAxNDg4Mjg0MTQ5MzU3.xPBFOxHpiFPkj6RPbrNum62srFGHm3Z0uvO2z32AjZgg.JM1_v8V4eM57HMtQ6k0ccH5-50JLDEPWUx6VKEWhb5Ug.PNG.jamduino/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2017-02-28_%EC%98%A4%ED%9B%84_8.57.02.png?type=w800)
|
|
|
|
|
|
|
|
![https://mblogthumb-phinf.pstatic.net/MjAxNzAyMjhfODMg/MDAxNDg4Mjg0NjM3NTky.skdDhexGAOmHbvJwtLxgaGI1gz6zqHvEgH9JQw3BYYkg.0O5hvgG_lNp0-8yTSJ6uB3RNCG8YyQ6nzZivwzPIZ_Ig.JPEG.jamduino/image_6211468281488284533414.jpg?type=w800](https://mblogthumb-phinf.pstatic.net/MjAxNzAyMjhfODMg/MDAxNDg4Mjg0NjM3NTky.skdDhexGAOmHbvJwtLxgaGI1gz6zqHvEgH9JQw3BYYkg.0O5hvgG_lNp0-8yTSJ6uB3RNCG8YyQ6nzZivwzPIZ_Ig.JPEG.jamduino/image_6211468281488284533414.jpg?type=w800)
|
|
|
|
|
|
|
|
일반적으로 가변 저항의 1번 핀에는 GND를, 3번 핀에는 5V(외부전원의 종류에 따라 달라 질 수 있습니다.)를 연결하고 , 2번 핀에는 아날로그 입력 핀을 연결합니다.
|
|
|
|
|
|
|
|
가변 저항 내부에는 저항물질이 둥글게 자리잡고 있습니다.
|
|
|
|
따라서 중심 축을 회전 시킬때 다이얼 와이퍼가 돌아가게됩니다.
|
|
|
|
저항 값은 저항물질의 길이에 비례하기 때문에 1번과 3번 사이의 저항 값은 다이얼 와이퍼의 위치와 관계없이 일정합니다.
|
|
|
|
다이얼 와이퍼가 1번 핀에 가까울 수록 1번과 2번 사이의 저항값은 감소하고 2번과 3번 사이의 저항 값은 증가합니다.
|
|
|
|
반대로 3번과 가까워 지면 1번과 2번사이의 저항은 증가하고 2번과 3번 사이의 저항은 감소합니다.
|
|
|
|
|
|
|
|
즉, 돌아간 정도에 따라 2번 핀의 전압이 달라집니다.
|
|
|
|
2번 핀의 전압을 읽어오면 가변 저항의 손잡이가 어느 정도 돌아 갔는지 인식 할 수있습니다.
|
|
|
|
|
|
|
|
슬라이드 가변 저항의 작동 방식 또한 비슷합니다.
|
|
|
|
슬라이더를 좌우로 밀면서 저항 값이 변합니다.
|
|
|
|
0V~5V 사이의 변화하는 전압 값을 0~1023 사이의 아날로그 값으로 변환하여 연결된 아날로그 입력 핀에 값을 반환합니다.
|
|
|
|
|
|
|
|
|
|
|
|
# 아날로그 입력 (Analog Input)
|
|
|
|
|
|
|
|
ADC 참고 : [https://m.blog.naver.com/PostView.nhn?blogId=seo0511&logNo=10155970833&proxyReferer=https%3A%2F%2Fwww.google.com%2F](https://m.blog.naver.com/PostView.nhn?blogId=seo0511&logNo=10155970833&proxyReferer=https%3A%2F%2Fwww.google.com%2F)
|
|
|
|
|
|
|
|
아두이노에는 6개의 아날로그-디지털 변환기 (ADC : Analog to Digital Converter)가 포함되어 있습니다.
|
|
|
|
A0 ~ A5핀에서 아날로그 값을 읽어들일 수 있습니다.
|
|
|
|
|
|
|
|
ADC가 출력하는 비트의 수를 ADC의 분해능(분해능력)이라고 합니다.
|
|
|
|
만약 ADC가 3-bit의 분해능을 갖는다면, 들어오는 입력 값을 2∧3(=8)개의 디지털 신호 단계(000~111 = 0 ~ 7)로 변환하여 구분한다는 의미 입니다.
|
|
|
|
|
|
|
|
8-bit의 분해능은 256(0~255)가지, 10-bit의 분해능은 1024가지(0~1023)의 출력이 가능하다는 의미입니다.
|
|
|
|
|
|
|
|
![https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/45e61547a19170159e2a5ed000206078.jpg](https://storage.googleapis.com/cr-resource/forum/482c743ad6ddf00ee50331306178d311/45e61547a19170159e2a5ed000206078.jpg)
|
|
|
|
|
|
|
|
아두이노의 ADC는 10-bit의 분해능을 가지고 있습니다.
|
|
|
|
따라서 0V ~ 5V의 입력 전압을 디지털 신호 0~1023 정수로 반환하며, 4.9mV(=0.0049V) 단위로 전압을 구분 할 수 있습니다.
|
|
|
|
|
|
|
|
ADC는 아날로그 입력값을 디지털 값으로 변환하는데 일정 시간(Conversion Time)이 필요합니다.
|
|
|
|
아두이노에서는 약 100 마이크로 초 (0.0001초)의 시간이 소요됩니다.
|
|
|
|
1마이크로 초는 1000000분의 1초를 의미합니다.
|
|
|
|
따라서 1초에 1만번의 아날로그 입력 값을 읽어 들일 수 있습니다.
|
|
|
|
|
|
|
|
다음은 슬라이드 저항에 따라 LED의 출력 색이 바뀌는 예제 입니다.
|
|
|
|
|
|
|
|
시리얼 모니터가 아닌 시리얼 플로터로 실행을 시키면 변화에 따라 그래프가 그려집니다.
|
|
|
|
스케치 업로드 후 플로터를 통해 변화를 확인 해보는 것이 좋을 것 같습니다.
|
|
|
|
|
|
|
|
```C++
|
|
|
|
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의 변화를 출력하는 코드 입니다.
|
|
|
|
|
|
|
|
```c++
|
|
|
|
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); // 아날로그 값을 안정적으로 읽을 수 있도록 지연시간을 설정
|
|
|
|
}
|
|
|
|
``` |
|
|
|
\ No newline at end of file |