본문 바로가기
공부하는/GPT, 코딩

3색 LED를 켜보자(1) - 캐소드와 애노드, INPUT_PULLUP

by 공부하는이땡땡 2020. 3. 20.
반응형

[3색 LED란?]

 

쉽게 이야기 해서 RGB

3색의 칩이 함께 들어 있는 

LED를 말한다. 

 

빛의 3원색이라고 해서 

RGB를 조합하면 백색이 된다는 

아무리 머리로 이해하려고 노력해보아도 

되지 않는 빛의 3원색을 떠올리며

이 3가지 색상의 조합이면 무수히 많은 색의 조합을 만들어 낼 수 있다. 

 

반면 빛을 섞어서 흰색이 되는 경우는(난 본적 없다 ㅋㅋㅋ)

세 가지 칩이 모두 가장 강한 빛을 낼 때 가능한 것이므로 

전류를 많이 사용한다. 

따라서 전류 소모를 줄이기 위해 4색을 낼 수 있는 RGBW(흰색 추가)

4색 LED도 있다.  


RGB를 섬세한 색의 조합을

색상표를 참고해서 만들어낼 수 있는 LED가 

네오픽셀이고, 네오픽셀과 관련해서는 차후 포스팅 하도록 하겠다


[3색 LED의 종류]

 

일반적으로 생긴 3색 4핀 LED 이다. 

내부에 실제로 저런 모양이며 다리가 네 개 이다. 

물론 LED 제원을 살펴봐야 하는 것이지만 

유독 긴다리가 하나가 있는데, 이 긴 다리가 (-) 역할을 한다. 

그리고 나머지 다리들이 각각 RGB의 (+) 역할을 한다. 

(시뮬레이터에서는 R (-) B G 순이었다.)

 

 

 

 

필자가 가진 3색 LED 이다.

2번째 다리가 가장 긴 것을 볼 수 있고

 

가장 왼쪽이 R

그 다음이 G 

그 다음이 B 의 

역할을 한다. 

 

이 LED에는 슬픈 사연이 있는데...

RGB+ 라고 써 있길래 

당연히 업그레이드 된 버전이라고 생각 ㅋㅋ

구매하고 봤더니 긴다리가 (+) 극이다. ㅠㅠㅠ

(업그레이드라니 ㅠㅠ)

 

 

이와 같이 모듈 형태로 되어 있는 것도 있다.

아두이노에서 쓰기 쉽게

RGB 방향 각각에 칩 저항이 달려 있어서

저항을 별도로 연결하지 않고 

아두이노의 5v 전압에서

마음껏 사용하여도 문제가 없는 모듈이다. 

 

 

이 외에도 다양한 종류가 있다! 

 

 

[캐소드와 애노드란?]

3색 LED의 경우 

일반적인 경우 긴 다리가 (-) 이지만 

필자가 구매한 것 처럼 긴 다리가 (+) 인 경우도 있다. 

 

일반적으로 다리 두개 짜리 단색 LED에서 

LED의 긴 다리(+)를 애노드(ANODE)

LED의 짧은 다리(-)를 캐소드(CATHODE)라 

부른다. 

 

그래서 3색 LED에서

긴 다리가 (+)인 경우를 애노드 타입,

긴 다리가 (-)인 경우를 캐소드 타입이라고 부른다.

 

 

그렇다면 긴 다리가 (+) 일 때 무슨 차이가 생기는지 궁금하다면 아래 접힌 글을 읽어보자.

더보기

캐소드와 애노드의 코드 구성 차이(3색 LED)

1. 캐소드 타입인 경우: 긴 다리가 (-)

LED의 (+)를 디지털 핀에 연결하고 (-)를 GND에 연결하면

디지털 신호가 HIGH이면 켜지고 LOW이면 꺼진다.

따라서 RGB를 디지털 핀에 연결해서 디지털 신호나 아날로그 신호를 제어해

LED를 켜고 끄는 회로를 일반적으로 쉽게 작성할 수 있다. 

 

2. 애노드인 경우: 긴 다리가 (+)

긴 다리 한게가 (+) 극성이므로 3.3v 나 5v 출력에 연결해야 한다. 

그 말은 GND에는 한 개의 LED만 연결 할 수 밖에 없단 소리인가?

GND는 제어가 안 되므로 내가 원하는 RGB 제어가 불가능하다. 

 

그래서 이 때는 디지털 핀에 연결해서 HIGH 명령을 입력하면

전원부 출력에서 전압이 걸리고

디지털 핀에서도 전압이 걸려 LED가 켜지지 않는다. 

디지털 핀에서 LOW 명령을 입력하면

전원부 출력에서 전압이 걸려 디지털 핀으로 전류가 흘러들어가

LED가 켜지게 된다. 

 

즉 LED를 켜고 싶으면 LOW 명령을 써야 한다는 뜻

(반대가 되기 때문에 섬세한 불빛 조절이 힘들다)

 

뭐... 애노드였다고 해도 이 LED로 섬세한 불빛 조정은 안 할거지만....

 

 

[오늘의 회로 소개]

3색 LED를 택트 스위치를 이용해 켜고 끄기

오늘은 3색 LED를 택트 스위치로 켜고 끄는 회로를 만들어볼까 한다. 

 

시뮬레이션의 3색 LED: R (-) B G 순

13번: 빨간색 출력

12번: 파란색 출력

11번: 초록색 출력

6번: 스위치를 누르면 빨간색 켜기

5번: 스위치를 누르면 파란색 켜기

4번: 스위치를 누르면 초록색 켜기

3번: 스위치를 누르면 모두 켜기

 

그런데!

지금 회로에는 가장 큰 문제가 있다. 

바로 풀업 또는 풀다운 저항이 구성이 되지 않아 플로팅 현상이 일어날 수 도 있다는 것!

 

☆ 풀업 저항, 풀다운 저항, 플로팅 현상이 궁금하다면?

2020/03/09 - [공부하는 이땡땡/아두이노를 작동해보자] - 택트 스위치로 LED를 켜보자(2) - 신호를 입력받아 LED 제어

 

택트 스위치로 LED를 켜보자(2) - 신호를 입력받아 LED 제어

지난 포스팅에 이어 택트 스위치로 디지털 신호를 입력받아 LED를 켜는 회로를 소개하겠다 2020/03/09 - [공부하는 이땡땡/아두이노를 작동해보자] - 택트 스위치로 LED를 켜보자(1) - 택트스위치의 구조 택트 스..

studylee00.tistory.com

 

 

그렇다고 네 개의 스위치에 풀업 또는 풀다운 저항을 연결해주자니 

회로가 너무 많이 복잡해질 것 같다. 

 

그래서 등장한 것이 바로 INPUT_PULLUP!!!!!!!!!!!!!!

 

 

[INPUT_PULLUP]

INPUT_PULLUP에 대한 설명은 아래 접은 글에 있다.

(접은 글인 이유는 영어 원문이라서 ㅋㅋ)

더보기

There are 20K pullup resistors built into the Atmega chip that can be accessed from software. These built-in pullup resistors are accessed by setting the pinMode() as INPUT_PULLUP. This effectively inverts the behavior of the INPUT mode, where HIGH means the sensor is off, and LOW means the sensor is on.

The value of this pullup depends on the microcontroller used. On most AVR-based boards, the value is guaranteed to be between 20kΩ and 50kΩ. On the Arduino Due, it is between 50kΩ and 150kΩ. For the exact value, consult the datasheet of the microcontroller on your board.

When connecting a sensor to a pin configured with INPUT_PULLUP, the other end should be connected to ground. In the case of a simple switch, this causes the pin to read HIGH when the switch is open, and LOW when the switch is pressed.

The pullup resistors provide enough current to dimly light an LED connected to a pin that has been configured as an input. If LEDs in a project seem to be working, but very dimly, this is likely what is going on.

The pullup resistors are controlled by the same registers (internal chip memory locations) that control whether a pin is HIGH or LOW. Consequently, a pin that is configured to have pullup resistors turned on when the pin is an INPUT, will have the pin configured as HIGH if the pin is then switched to an OUTPUT with pinMode(). This works in the other direction as well, and an output pin that is left in a HIGH state will have the pullup resistors set if switched to an input with pinMode().

 

...... 나도 한국어로 번역해서 이해했다

요약하자면 아두이노 자체에 20K의 풀업 저항이 내장되어져 있다. 

이 저항을 이용하여 저항을 연결하지 않고 플로팅 현상을 방지할 수 있다.

 

INPUT_PULLUP은 항상 입력을 받는 디지털 핀과 GND를 연결한다. 

단순한 스위치의 경우  스위치의 경우 스위치를 열면 핀이 HIGH로, 스위치를 누르면 LOW로 표시된다.

(입력 모드를 반전시켜 항상 HIGH 상태를 유지, 신호가 들어오면 LOW가 된다)

 

 


[코드 구성]

int SR=6; // 6번은 R 스위치
int SB=5; // 5번은 B 스위치
int SG=4; // 4번은 G 스위치

int R=13; // 13번은 빨간색 불을 제어
int B=12; // 12번은 파란색 불을 제어
int G=11; // 11번은 초록색 불을 제어

void setup() 
{ pinMode(SR, INPUT_PULLUP); 
  pinMode(SG, INPUT_PULLUP); 
  pinMode(SB, INPUT_PULLUP); // 각 스위치의 핀모드를 인풋풀업모드로 
} 

void loop() 
{ if(digitalRead(SR)==LOW)  // 만일 SR의 신호가 LOW라면, 즉 스위치를 누른다면
     {digitalWrite(R, HIGH); //  R에 HIGH 신호를 줘서 R을 켭니다
     } 
     else{digitalWrite(R,LOW); //  그게 아니라면 R을 끄세요
         } 
  if(digitalRead(SG)==LOW)  // (원리는 위와 동일)
     {digitalWrite(G, HIGH);   
     } 
     else{digitalWrite(G,LOW);   
         } 
  if(digitalRead(SB)==LOW)  
     {digitalWrite(B, HIGH);  
     } 
     else{digitalWrite(B,LOW); 
         } 
} 


이렇게 된다면 왼쪽부터 

버튼을 누르면 각각 빨강, 파랑, 초록의 불빛이 들어오게 된다. 

시뮬레이션 영상

 

 

 


 

 

[오늘의 창의력 문제]

1. 4번째 스위치를 눌렀을 때 모두 켜지는 코드를 추가해보자 

회로는 위와 동일

 

▽ 코드 구성을 확인하려면? 아래 접은 글 클릭

더보기

[코드구성]

 

int SR=6; // 6번은 R 스위치
int SB=5; // 5번은 B 스위치
int SG=4; // 4번은 G 스위치

int SA=3; // (추가) 3번은 모두 켜짐 스위치
int R=13; // 13번은 빨간색 불을 제어
int B=12; // 12번은 파란색 불을 제어
int G=11; // 11번은 초록색 불을 제어

void setup() 
{ pinMode(SR, INPUT_PULLUP); 
  pinMode(SG, INPUT_PULLUP); 
  pinMode(SB, INPUT_PULLUP); // 각 스위치의 핀모드를 인풋풀업모드로 
  pinMode(SA, INPUT_PULLUP); // 추가
} 

void loop() 
{ if(digitalRead(SR)==LOW)  // 만일 SR의 신호가 LOW라면, 즉 스위치를 누른다면
     {digitalWrite(R, HIGH); //  R에 HIGH 신호를 줘서 R을 켭니다
     } 
     else{digitalWrite(R,LOW); //  그게 아니라면 R을 끄세요
         } 
  if(digitalRead(SG)==LOW)  // (원리는 위와 동일)
     {digitalWrite(G, HIGH);   
     } 
     else{digitalWrite(G,LOW);   
         } 
  if(digitalRead(SB)==LOW)  
     {digitalWrite(B, HIGH);  
     } 
     else{digitalWrite(B,LOW); 
         } 
 if(digitalRead(SA)==LOW)  // (추가)
     {digitalWrite(R, HIGH); 
     digitalWrite(G, HIGH); 
     digitalWrite(B, HIGH); 
     } 
     else{digitalWrite(R,LOW); 
         digitalWrite(G,LOW); 
         digitalWrite(B,LOW); 
         } 
} 


2. 애노드 타입의 LED를 사용한다고 생각하고 회로와 코드를 구성해보자

 

▽ 코드 구성을 확인하려면? 아래 접은 글 클릭

더보기

꼭 이것이 정답은 아니다. 

[회로구성]

기존 회로와 거의 동일하고, 3색 LED의 애노드(+) 부분을

3.3v 또는 5v와 연결해주는 것만 수정하면 된다. 

 

[코드구성]

int R=13;
int G=12;
int B=11;
int SR=6;
int SG=5;
int SB=4;
int SA=3;

void setup() 
{ pinMode(SR, INPUT_PULLUP); 
pinMode(SG, INPUT_PULLUP); 
pinMode(SB, INPUT_PULLUP); 
pinMode(SA, INPUT_PULLUP); 
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT); // 아웃풋 선언 안하면 죽었다 깨어나도 안되던... ㅠㅠ


void loop() 

 if(digitalRead(SR)==LOW)  // 만일 SR의 신호가 LOW라면, 즉 스위치를 누른다면
     {digitalWrite(R, LOW); // R에 LOW 신호를 줘서 R을 켭니다
     } 
     else{digitalWrite(R,HIGH);
         } 
 if(digitalRead(SG)==LOW)  
     {digitalWrite(G, LOW); 
     } 
     else{digitalWrite(G,HIGH);
         } 
 if(digitalRead(SB)==LOW)  
     {digitalWrite(B, LOW); 
     } 
     else{digitalWrite(B,HIGH);
         } 
 if(digitalRead(SA)==LOW)  
     {digitalWrite(R, LOW);
     digitalWrite(G, LOW);
     digitalWrite(B, LOW);
     } 
     else{digitalWrite(R,HIGH);
     digitalWrite(G,HIGH);
     digitalWrite(B,HIGH);
         }        

 

택트 스위치가 두개 뿐이라ㅜㅜㅜㅜㅜ

 

 

빨강 온 / 초록 온
(스위치 핀을 옮겨서) 파랑 온 / 모든 불빛 온

GIF는 사기 같아서 동영상도 첨부합니다 ㅋㅋㅋ

 

여담: RGB의 혼합은 눈으로 보면 백색으로 안 보이는데

영상으로 보니 조금 백색으로 보이는 거 같기도...?

반응형

댓글