[아두이노] 가변저항을 이용하여 3색 LED 제어

IOT/아두이노|2019. 2. 23. 10:17

[아두이노] 가변저항을 이용하여 3색 LED 제어



오늘은 가변저항 부품을 이용해서 3색 LED의 색상을 마음대로 조절하는 실험을 하겠습니다. 오늘의 주제는 가변저항입니다. 지금까지 실험에서는 고정저항으로 LED에 연결하여 불을 켜거나 다른 부품의 전류를 조절하기 위해서 써왔습니다. 이제는 고정저항 대신에 가변저항을 써서 유동적으로 제어할 수 있는 방법을 배워보도록 하겠습니다.

1. 가변저항


모양은 대충 이렇게 Termial1,2와 Wiper로 핀이 구성되어 있습니다. 실험에서는 Terminal2(5V), Terminal1(Gnd), Wiper(저항값추출)로 구성합니다. 가정에 보시면 형광등에 돌려서 밝기 조절하는 스위치를 보시거나 있으신분들 아마 있을거에요. 바로 그게 가변저항스위치 입니다. 가정 형관등 보시면 돌려서 저항이 작으면 전류가 통과하는 양이 많아 형광등이 밝아지고 저항이 크면 전류가 통과하는 양이 적어져서 형광등이 어두어집니다. 대충 가변저항 부품에 대해서 이해가 되시죠. 참고로 여기서 Terminal1과 Terminal2의 Vcc와 Gnd 연결 순서는 고정된 것이 아닙니다. 반대로 연결하더라도 작동은 됩니다. 자신이 연결했을때 Wiper의 값이 큰값이면은 반대로 연결하게 되면 Wiper의 값은 작은값으로 바뀌에 됩니다. Terminal1,2의 선을 어떻게 연결하느냐에 따라서 Wiper의 나오는 전류값은 서로 반대값이라고 생각하시면 됩니다. 쉽게 말해서 자신이 연결한 선에서 돌리면 0~1023으로 순차적으로 출력된다면 반대로 연결하여 돌리면 1023~0으로 순차적으로 출력됩니다. 참쉽죠.

1. 회로도 구성


  • 준비물 : 가변저항 3개, 3색 LED 1개, 저항 220옴 3개, 아두이노우노, 뻥판
  • 내용 : 가변저항스위치는 각각 RGB의 저항값을 추출하고 그 값을 토대로 RGB의 색상값으로 출력하도록 하는 실험


가변저항 부품을 보시면 Wiper에서 나오는 선이 아날로그 A0, A1, A2에 입력으로 들어옵니다. Wiper은 가변저항 부품에 흐를 전류의 값을 출력합니다. Terminal1은 Gnd, Terminal2은 5V에 연결합니다. 그러면 가변저항기에 전류가 공급되고 조절기로 돌리면 저항값이 변화되고 Wiper로 그 변화된 전류가 출력됩니다. 그 출력값이 A0, A1, A2에 아날로그 값으로 읽게 되고 그 값은 다시 3색 LED의 아날로그 신호값으로 출력되여 색이 결정됩니다. 하지만 아두이노는 아날로그 출력이 없으며 아날로그 출력과 비슷한 형태로 출력되는 PWM 출력으로 대신하는데 그냥 단순하게 PWM디지털핀으로 아날로그 신호를 내보낸다고 생각 하시면 돼요.

3. 코딩


  • 사용함수 : pinMode(), analogWrite(),analogRead()
  • 내용 : 간단히 가변저항 조절기로 조절하면 흐를 전류를 조절할 수 있고 그 조절된 전류 값을 3색 LED에 출력값으로 해서 색을 자유롭게 만들어 낸다.
  • 참고 : 3색 LED 제어(아두이노)

복습

  • pinMode(사용핀,모드) : 사용할 핀을 입력/출력모드(INPUT/OUTPUT) 인지 선언한다.
  • analogWrite(출력핀,상태) : 출력핀에 0~255 사이의 아날로그신호(PWM)를 내보낸다.(3색 LED에 출력용)
  • analogRead(입력핀) : 입력핀을 0~1023 사이의 아날로그 신호값을 읽어들인다.

설계

(1) 가변저항기 읽기

color_value[0] = analogRead(A0)/4; //(0~1023 => 1024/4=256)
color_value[1] = analogRead(A1)/4;
color_value[2] = analogRead(A2)/4;

analogRead()함수로 각 Wiper핀에서 발생된 가변저항값을 읽게 됩니다. 0~1023 사의 값을 가져오는데 3색 LED의 입력값은 0~255사이이기 때문에 나누기 4를 해줘야 되겠죠. 왜 나루기를 했는지는 아시겠죠.

color_value[0]=map(analogRead(A0),0,1023,0,255)

원래는 이렇게 코딩해야합니다. map()함수로 효율적으로 코딩해야 합니다. 하지만 대충 어떤 값이 들어가는지 직관적으로 이해 시키기 위해서 map()함수를 생략했네요.

  • map(입력값,입력최소,입력최대,출력최소,출력최대) : analogRead(A0)에서 읽은 값이 방금전 0~1023이라고 했죠. 그걸 입력최소, 입력최대로 범위를 지정해주고 이 값을 기준으로 출력값의 범위는 0~255니깐 출력최소 0과 출력최대 255로 지정하면 함수 하나로 쉽게 매핑 시킬 수 있습니다. 둘 중 아무거나 사용해서 이용하시면 돼요.

(2) 색 결정

우선 3색 LED에서 따로 Color()함수를 직접 만들었습니다. 이렇게 만들어 놓으면 3색 LED 부품을 사용하면 이 함수만 복사해오면 번거로운 코딩을 할 필요 없겠죠. 3색핀에 값이 결정되면 그 값을 color(Red, Green, Blue) 값을 넣으면 3색 LED에 색이 출력됩니다.

void Color(int red, int green, int blue)
{
  analogWrite(rpin, red);
  analogWrite(gpin, green);
  analogWrite(bpin, blue); 
}

코딩을 하면

  1. 3색 LED에 RGB 핀에 제어할려면 3핀이 필요하니깐 우선 3핀을 변수로 선언해야지(9,10,11)
  2. 가변저항1,2,3이 있는데 이걸 저장할 변수가 필요해! 3개가 필요하니 그냥 배열변수로 하지. (color_value[3])
  3. 3색 LED에 사용할 핀이 3개니깐 변수도 선언했고 그러면 이 핀이 출력으로 사용할려면 우선 선언해야지.
  4. 자! 가변저항을 읽어와서 배열변수에다 순서대로 저장하자.
  5. 이제 3색 LED에 저장된 값인 가변저항값으로 색을 만들자
int rpin = 11;
int bpin = 10;
int gpin = 9;
int color_value[3];
 
void setup()
{
  pinMode(rpin, OUTPUT);
  pinMode(gpin, OUTPUT);
  pinMode(bpin, OUTPUT);
}

void loop()
{
  color_value[0] = analogRead(A0)/4; //(0~1023 => 1024/4=256)
  color_value[1] = analogRead(A1)/4;
  color_value[2] = analogRead(A2)/4;
  Color(color_value[0],color_value[1],color_value[2]);
}

void Color(int red, int green, int blue)
{
  analogWrite(rpin, red);
  analogWrite(gpin, green);
  analogWrite(bpin, blue); 
}

5. 결과


그냥 가변저항 예제로 LED 1개, 가변저항 1개를 이용해서 밝기를 조절하는 실험을 해도 되는데 좀 더 복습하면서 3색 LED의 색을 만들어내는게 시각적으로 보기도 좋고 실험이 재밌을 것 같아서 선택했습니다.

마무리


가변저항을 이용해서 조절하니깐 시각적으로 3색 LED의 색의 변화를 체험하셨을 거라 생각합니다. 3색 LED의 색의 변화를 통해서 뭔가 재밌는 소재가 없나 한번 떠올려 보세요. 예전에 어떤분의 블로그 글을 본적 있는데 3색 LED를 이용한 실험이였습니다. 참 참신하더군요. 비닐인가 솜인가 구름의 형태로 만들어서 그 안에 3색 LED를 넣고 wifi쉴드를 이용해서 날씨 정보를 읽어오게 했는데 그 정보를 이용해서 현재의 날씨 상태를 3색 LED의 색으로 나타냈는데 참 재밌어 보이더군요.
한번 이런건 어떨까요. 토양습도센서를 아두이노에 연결해서 식물이 물이 부족할경우 그걸 시각적으로 3색 LED로 식물의 감정을 표현한다면 괜찮겠지요.

이야기가 삼천포로 빠졌지만 가변저항을 조절할 수 있다면 과연 일상에서 어떤것들이 있는지 찾아보고 또 어디에다 이 부품을 사용하면 재미 있을지 한번 상상의 나래를 펼쳐보세요.


댓글()