[아두이노] 3색 LED 제어

IOT/아두이노|2019. 2. 2. 12:34

[아두이노] 3색 LED 제어




이번 시간에는 3색 Led를 제어하는 시간입니다. 한개의 3색 led를 어떻게 RGB 색으로 나타내는지 실험하도록 하죠.

1. 회로도 구성


  • 구성 : 3색LED 1개, 저항 220옴 3개, 뻥판, 아두이노우노

3색 LED의 각 꼭지점에 마우스를 대면 red, green, blue란 단어가 보여진다. 각각 보기 편하게 전선을 각 색상선으로 바꿔 준다. 저항은 클릭한 뒤에 Ctrl+C로 복사 한 뒤에 원하는 위치에 마우스 대고 Ctrl+V하면 복제가 된다.

그리고 두번째 검정색선(Gnd)로 연결하면 회로도 구성은 끝난다. 그런데 실제 부품은 제품 정보를 보시고 색선을 구별하셔야 합니다.

2. 코딩


  • 함수 : pinMode(핀번호,모드), analogWrite(핀번호, 색값), delay(시간값)
  • 코딩 내용 : R->G->B로 3색을 순차적으로 간단히 출력하는 로직을 짜본다.

int rpin=11;
int gpin=9;
int bpin=10;

void setup()
{
  pinMode(rpin, OUTPUT);
  pinMode(gpin, OUTPUT);
  pinMode(bpin, OUTPUT);
}

void loop()
{
  analogWrite(rpin, 255);
  analogWrite(gpin, 0);
  analogWrite(bpin, 0);
  delay(1000);
  
  analogWrite(rpin, 0);
  analogWrite(gpin, 255);
  analogWrite(bpin, 0);
  delay(1000);
  
  analogWrite(rpin, 0);
  analogWrite(gpin, 0);
  analogWrite(bpin, 255);
  delay(1000);  
}

첫번째 :
변수 선언에서 int은 자료형으로 변수의 그릇의 크기를 나타낸다. rpin, gpin, bpin으로 3개의 변수를 선언하고 그 변수 그릇에 각각 해당핀 값을 저장시켜 놓는다.

두번째 :
setup()함수는 초기화 작업 코딩하는 부분으로 11, 10, 9핀을 OUTPUT(출력모드)로 아두이노에서 외부로 전류를 보내는 출력모드로 사용하겠다는 것이다.
여기서, 주의할 것은 사용된 핀이 다른 디지털핀과 다르다는 것이다. 0~13번 디지털 핀 중에 6개의 핀은 앞에 (~)에 붙은 핀들이 있는데 아두이노우노 보드를 보면 표시 되어 있다. 이것은 아날로그값을 출력으로 내보낼 수 있는 핀이다. 즉 0~255의 전류로 신호를 출력할 수 있는 특수한 핀이다. 실제 아날로그 값이 나가는게 아니라 아날로그 값이 나가는 것처럼 느낌의 전류 신호를 제어해서 내보낼 수 있는 핀으로 생각하면 된다.
3개의 RGB 핀은 각각 0~255의 값의 범위로 해서 다양한 색상을 만들어 낼 수 있다.

3번째 :
loop()함수에서 기존의 digitalWirte(rpin,100)하면 안된다. 디지털출력은 0과 1의 값만 OV와 5V만 존재한다. 즉, 0이 아닌 값은 무조건 5V의 전류가 흐르게 된다. 그렇게 되면 다양한 색을 만들어 낼 수 없다. (~핀)을 사용하기 위해서는 analogWrite(rpin,100)을 해야 합니다. 0~255사이의 전기신호를 보내기 위한 함수 이고 이 함수를 통해서 아날로그 100의 값의 전기신호를 내보내게 된다. 그래서 RGB Led은 rpin을 통해서 100이란 전기신호값의 색밝기로 보여지게 된다.
여기서는 1초 단위로 max 값 255로 R->G->B로 색이 나오도록 출력한 코딩입니다.

rpin을 255의 전기신호를 보내고 gpin, bpin은 0의 전기신호를 보내면 자동으로 Red 색이 출력되겠죠. 함수의 의미만 잘 이해하시면 다양한 색으로 출력이 가능합니다.

3. 고민해야 할 것


여기서 고민을 해야 합니다. 색을 만들기 위해서 analogWrite()함수가 세번 loop()함수에 표현을 해야하는게 불편함을 느껴야 합니다.
여러가지 색을 표현하고자 한다면 매번 3개의 함수를 loop()함수 안에서 코딩으로 표현하는 것은 엄청 비효율적이지요. 그래서 C언어 문법 하나를 배우도록 하죠.

C언어 문법


  • 문법 : 외부사용자함수()

외부사용자함수란 프로그래머가 직접 함수를 만드는 것이죠. 특정 중복되는 동작을 함수로 묶어서 그 함수를 호출하여 해당 동작을 수행할 수 있게 만들 수 있습니다. 즉, pinMode(인자1, 인자2); 이렇게 함수에 2개의 인자값을 넣어서 pinMode()함수 동작을 수행되는데 이런식으로 직접 프로그래머가 함수를 만들어서 RGB 인자값을 넣어서 색을 출력하는 함수를 만들면 간단한 코딩이 되겠죠.
3개의 analogWrite()함수로 RGB led의 색이 결정되는 원리를 배웠습니다. 그러면 이 원리를 이용해서 하나의 새로운 함수를 만들어 보죠.

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

이렇게 Color라는 함수를 만들면 이 함수를 표현하여 RGB 색을 출력할 수 있게 됩니다. loop()함수 안에다 아래와 같은 방식으로 코딩하면 좀 더 깔끔한 코딩이 되겠죠. 여기서 인자값 (255,0,0)은 (red,green,blue)라는 변수에 저장되게 됩니다. 그 값이 3개의 analogWrite()함수에 각각 인자값이 대입하여 전기 신호를 출력하게 되는 것이죠. 간단한 원리죠.

Color(255,0,0);
delay(1000);
Color(0,255,0);
delay(1000);
Color(0,0,255);
delay(1000);

또, 고민을 해보세요. 지난 시간의 for()문을 이해 했다면 for()문을을 이용해서 RGB의 각 값을 순차적으로 변화시켜서 여러가지의 색을 만들어 볼 수 도 있겠죠.

웹언어를 공부하신분이라면 색을 나타날때 아래 예처럼 16진수로 각각 두자리가 RGB로 3개의 색을 나타내는 것을 알고 있을 겁니다.

예) #ff0000(red), #00ff00(green), #0000ff(blue)

참고 자료를 보시면 색을 좀 더 자세히 나눌 수 있겠죠.
각각 00~ff의 16진수 범위를 10진수 0~255로 색의 범위를 잡아서 색을 정하면 되겠죠.

4. 결과






마무리


RGB led를 한개를 제어해 봤습니다. 이전 led 제어 코딩에서 analogWrite()라는 함수를 새롭게 한개 배웠습니다.
이 함수로 하나의 RGB Led에 원하는 색으로 표현할 수 있게 된 거죠.
그러면 이것을 현실에서 이용하는 것들이 무엇일까요?
가장 가까운것은 현재 당신이 보는 스마트폰이나 pc 모니터를 생각하시면 됩니다. 쉽게 bmp 이미지 파일을 생각하는게 더 이해가 쉬울지 모르겠군요. bmp 이미지 파일은 픽셀단위로 해서 각 픽셀당 RGB색값이 할당 되고 이게 합쳐져서 이미지로 보여줍니다. RGB led 한개를 하나의 픽셀로 생각해 보세요. 수많은 RGB led를 각각 픽셀로 색의 값으로 밝혀진다면 이걸 다 연결하면 하나의 이미지 처럼 픽셀 이미지가 완성 되겠죠.
대충 어떤 느낌이신지 아시겠지요. 실험에 사용한 RGB led은 집중된 밝기가 아니고 분산된 밝기여서 사실상 이미지화 한다는 것이 무척 어렵지만 특수 led의 경우는 가능하겠죠.
네오 픽셀이라는 RGB 색을 만들어 내는 부품이 있습니다. 이걸로 실제 모니터로 구현한 외국인분들도 있습니다.
유사 표현으로는 주변 전광판을 생각하시면 되겠죠.

그리고 상상을 해보세요. RGB led은 3색을 섞어서 다양한 색을 만들어 낼 수 있습니다. 그러면 이걸로 뭘 할 수 있을까 끊임없이 상상해보세요. 0~255까지의 값의 색을 지정할 수 있다. 그러면 센서를 이용해서 그 센서의 값에 따라 밝기를 나타낸다면 뭔가 시각적인 데이터 표현이 가능하겠죠. 그러면 이걸 어떤부품과 연결해서 표현하면 좋을지 상상을 더해 보세요.

원한 하나의 부품을 사용하고 그 원리를 이해하면 단순히 거기서 끝나면 안됩니다.
그 부품이 다른 부품만 결합하면 또 다른 시너지 효과를 발휘 할 수 있으며 또 그 부품의 원리를 잘 이해하면 그 자체의 기능만으로 재밌는 표현이 가능하게 됩니다.

단순히 한개의 RGB를 제어했지만 이걸 어떻게 제어 하느냐에 따라서 표현하고자 하는 목적에 따라 당신이 생각하는 그 이상의 표현을 할 수 있으며 그런 표현들을 현실에서 아두이노를 다루는 분들이 작품으로 만들고 있습니다.
현재의 여러분들이 이걸 통해서 어떤 상상을 하느냐에 따라서 그 가치가 달라지는 점을 유념하세요.

끊임없이 의문을 갖고 생각을 통해 많은것들을 표현하길 바래요.
다음은 이전 시간에 led와 이번시간의 설명한 내용을 기반으로 상상할 수 있는 것들을 이야기 해보도록 하죠.


'IOT > 아두이노' 카테고리의 다른 글

[아두이노] 피에조부저 제어  (0) 2019.02.04
[아두이노] 스위치 버턴 제어  (0) 2019.02.03
[아두이노] 코딩 구조  (0) 2019.01.31
[아두이노] LED 제어  (0) 2019.01.30
아두이노의 기초  (0) 2019.01.27

댓글()