3색 LED 제어(아두이노)

in #kr-newbie8 years ago (edited)

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와 이번시간의 설명한 내용을 기반으로 상상할 수 있는 것들을 이야기 해보도록 하죠.

Sort:  

스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.

오래전 부터 홍보프로젝트 지원 게시물을 봐 왔는데 설마 올린분들이 많아서 여기 올려서 찾아올까 하고 반신반의했는데 오늘도 찾아오셨군요.
지금 생각하면 진작에 이 홍보프로젝트 지원을 신청할 껄 하는 생각을 하게 되네요.

코딩맨님 화이팅!

바로 뭔가를 만드는 방향으로 가야하는데 기초적인걸 다루니깐 아직은 재밌는 내용이 없네요

충분히 재미잇게 보고잇습니다 이런 기초적인 것이 바탕이 되어 다양한 활용도가 나가겠지요 흥미롭게 잘 보고 있습니다

감사합니다.

와 대박 배워보고싶다생각했는데
이렇게보니 머리가 ㅠ

pinMode(), analogWirte(), delay()함수만 이해하시면 돼요.
구지 프로그램 문법을 이용해서 짤려고 하실 필요는 없고요.
RGB led 어떻게 색을 만들것인가 analogWirte()함수로 표현을 순차적으로 일기 쓰듯이 명령을 내리면 돼요.
R색을 몇으로 하고, G색을 몇으로 하고, B색을 몇으로 analogWirte()로 하면 그 값이 합산된 색이 RGB led로 밝히게 됩니다.
이걸 사용하시면 나중에 재밌는걸 많이 만들 수 있어요.

아~ 넵 그럼 어플개발을 하려면 뭘배워야할까요?

Android Studio로 공부해보세요.
Java와 Eclipse 도 관련해서 설치와 사용하는법도 배우시고요.

Android Studio의 가상머신이 지금은 무거운지 어쩐지는 모르겠네요.
몇년전에 잠깐 공부했는데 그때 무거워서 가상머신으로 블루스택을 깔아서 어플만들거 테스트 했거든요.
가상머신으로 지니모션으로 최신기종의 스마트폰을 가상폰으로 써보고 그랬고요.
녹스도 가상머신으로 써도 되고요.
암튼 Android Studio로 공부해보세요.

따로 다른것도 있고요.
간단한 어플 만들기은 웹인벤트인가 스크래치 처럼 블록 배치로 어플을 만들기도 해요.

참고로 게임을 개발하고 싶으면 우선 프로그램적 지식이 부족하시면요.

스크래치 or 엔트리로 블록배치로 게임을 만들어보세요. 스크래치를 추천드리고 싶고요.

그다음 c언어의 문법을 배우시고요. 그다음 코딩은 스크립트언어 c#하면 되는데 물론 자바로 해도되긴하는데 나중에 유니티엔진으로 게임을 만들어 보는 것도 재미있어요.
흐름이 스크래치->C언어->유니티 이렇게 가면 게임 개발 공부에 재미있을거에요.
유니티 샘플예제가 많아서 간단한 게임같은거 프로그램언어 해독력만 있으면 만들 수 있어요.
어플게임을 그래픽디자인분들이 유니티 공부해서 개발하는 분들이 많아요.

우와. 빨초파. 프로그램이 너무 귀엽게 되어있네요. 막 선택하고. ㅋㅋㅋ 저거보니까 저희집 현관 센서등 생각이 나요. 깜빡 깜빡 30분 지나야 꺼지길래 전구를 갈면 되나 싶어서 열었더니 led판이네요. 갈줄도 모르고 뭐가 원인인줄도 모르고. 일단 집주인한테 동영상 카톡 보내놨는데. Led어려워요.

PIR 센서에요 그거 현관에 있는거는요. 사람감지 센서인데 사람을 감지해서 전기신호가 발생하고 그걸 아두이노로 그 신호값을 읽고 Led로 불이 들어오게 하면 현관에 부착된 그걸 아두이노로 표현 가능해져요.
실제는 아두이노칩을 사용하지는 않지만 대충 그런 원리를 실험할 수 있고 표현할 수 있게 됩니다.
이런 실험이 실생활에서 우리가 흔하게 사용하는 그런것들을 다 아두이노로 표현이 가능하지요.

아 난독증 rip로 보고 삼가고인의 명복을 비는 센서구만 이런 생각을 ㅋㅋ아두이노. 어디가서 아는척해야겠어요 ㅋㅋ

코딩님, 아들과 같이 해보고 있고 정말 신기하군요. 제가 컴퓨터 언어를 몰라 코딩님 한대로 복사하여 시뮬레이션하니 그대로 됩니다. 아들에게 멋진 아빠가 되었어요. 감사합니다. 그런데 한 가지 질문이 있습니다.
0~255A의 전류로 나가는 것이고 3가지의 조합을 하면 노랑, 하늘색, 보라색등이 나오더군요. 하여 색을 조절하고 싶으면 디지털이 아닌 아날로그를 써라 로 이해했는데,,,
아래 color함수에서 화살표된 red, green, blue와 rpin, gpin, bpin이 같은말이 아닌가요? 혹시나 싶어 지우고 하니, int가 부족하다고 뜨네요. 그 의미를 가지는 것 아닌지요?

이미지 009.jpg

이거 알려면 C언어책을 봐야하나요? 아니면 별도의 아두이노 책이 있는지요? 있다면 시간되실 때 소개부탁드립니다.

아, 밑에 보니 벌서 소개해주셨네요. 내일 도서관에 가봐야 겠습니다. 허허...

Loading...

Coin Marketplace

STEEM 0.13
TRX 0.33
JST 0.034
BTC 111152.00
ETH 4304.17
USDT 1.00
SBD 0.83