[아두이노]3x3x3 CUBE LED 제어 II

IOT/아두이노|2019. 3. 20. 09:00

[아두이노]3x3x3 CUBE LED 제어 II



지난 시간에 간단히 3x3x1 LED를 제어 해봄으로써 3x3x3 CUBE LED의 원리를 이해 했습니다. 오늘 실험에서는 3x3x3 CUBE LED를 실험할 예정이였지만 실제 구현까지 할려고 하니 총 27개 LED를 다뤄야 하고 뻥판에 배치하자니 지져분해지고 오히려 의미 전달이 잘 안될 것 같아요. 2x2x2 CUBE LED 간단히 소개할까 합니다.

1. 3x3x3 CUBE LED


모습은 아래 그림처럼 구성되어 있습니다. 가로로 보시면 Gnd(-) 부위에 녹색선으로 사각형 모양을 만들어 하나로 선을 만듭니다. 그게 세로로 보는 것 처럼 3층으로 이루어진 것을 3x3x3 CUB LED라고 부릅니다.

[ 세로 ][ 가로 ]


여기서, 무조건 Gnd(-)로 9개 LED를 하나로 묶어을 필요는 없습고 반대로 Vcc(+)로 9개 LED를 하나로 묶을 수 있습니다. 그냥 선택사항일 뿐이죠. 저는 9개 LED를 Gnd로 묶어서 하나의 선으로 만든 것일 뿐이죠.

이걸 실험할려면 총 27개의 LED를 제어를 해야하고 실제로 회로도를 만들면 좀 복잡해 질 수 있어서 의미 전달보다 시각적으로 복잡하게 느낄 수 있어서 차라리 2x2x2 CUBE LED를 실험하는게 의미 전달하는데 더 나을 것 같아서 수정하였습니다.

2. 2x2x2 CUBE LED


2x2x2 CUBE LED 모습인데 가상시뮬레이터에서 그릴려고 하니깐 모양이 참 애매하네요. 대충 이런식으로 배치한다고 생각하시면 됩니다.


실제로 CUBE 모양을 만들려면 납땡을 하고 철사가 필요한데 납땜 도구를 찾아서 제작을 할까 고민을 하다가 CUBE를 만드는데 LED를 다쓰면 나중에 다른 실험을 할때 LED가 부족할 것 같았서 뻥판에 배치하여 그 의미만 전달하는 걸로 표현했습니다.


[ 실행 결과 ]


녹색은 1층을 나타내고 노랑은 2층으로 생각하시면 됩니다. 위 그림에서 각 호실은 오렌지 1호실, 블루 2호실, 엘로우 3호실, 화이트 4호실를 가리킵니다. 여기서, 오렌지 1호실은 2층 1호실과 연결되고요. 블루, 엘로우, 화이트 들은 각층에 해당 호실과 선이 연결됩니다. 각층 Gnd(-)은 아두이노의 Gnd(-)에 연결 되었고, 각 오렌지, 블루, 엘로우, 화이트 선은 아두이노의 Vcc(5V)에 연결되었습니다. 결론은 각 층은 Gnd(-) 연결하고 각호실에 Vcc(5V)에 모두 연결되었기 때문에 전부 불이 들오게 됩니다.

만약, 오렌지 1호실만 Vcc(5V)에 연결하고 각층 Gnd(-)은 전부 연결했다며 아래 그림처럼 1층 1호실, 2층 1호실에 불이 들어 오겠죠. 다시 정리하자면, Vcc의 전류가 엘로우 1호선만 공급되는데 1층, 2층 중 Gnd(-)로 모두 연결되었기 때문에 둘다 전류가 흘러가기 때문에 각 층 1호실에 불이 들어오게 됩니다. 만약 1층이 Gnd(-)와 연결이 끊어졌고 2층만 Gnd(-)에 연결되었다면 2층 1호실만 불이 들어 오겠죠.


이렇게 Vcc(5V)가 연결된 선을 따라서 최종 목적인 Gnd(-)로 연결된 곳만 전류가 정상적으로 흘러가게 됩니다. 이것만 이해하시면 됩니다.


[ 참고 ] 전류의 흐름

[예로 1층 1호실에 불이 들어왔다면]


전류의 흐름을 빨간선으로 표시한 부분이 정상적으로 연결되어 전류가 흘러가는 표시 이고요. 위 그림처럼 화살표 방향으로 흘러간다는 것을 참고해 주세요. 대충 어떤 느낌이신지 아시겠지요.


아두이노에서는 디지털 핀에 연결하여 제어를 하게 되는데 그 과정을 배워보도록 하겠습니다.

3. 회로도 구성


  • 준비물 : Green LED 4개, Yellow LED 4개, 저항 220옴 2개, 아두이노우노, 뻥판
  • 내용 : 2x2x2 CUBE LED 형태를 표현하자.


총 6개의 핀을 사용하게 됩니다. 2,3,4,5번 핀은 각 호실을 나타내는 핀이고 11,12번 핀은 층을 나타내는 핀입니다. 지금까지 LED 제어를 할때 Vcc(+) 방향에 저항을 붙여왔습니다. 하지만 Gnd(-)방향에 저항을 붙여 놓아도 상관 없습니다. 저항으로 흐르는 전류가 제어가 되기 때문에 어느 방향으로 저항을 붙이든 상관이 없다는 점을 참고해 주세요.

4. 코딩


  • 사용함수 : pinMode(), digitalWrite(), delay()
  • 내용 : 간단히 2x2x2 CUBE LED를 순차적으로 깜박이기
  • 참고 : [아두이노] LED 제어

복습

  • pinMode(사용핀, 사용모드) : 사용핀을 INPUT/OUTPUT/INPUT_PULLUP 모드중 뭘로 사용할지를 정함.
  • digitalWrite(사용핀, 출력형태) : 사용핀을 HIGH(5V) or LOW(0V) 중 출력 형태를 정함.
  • delay(1000) : 1초(1000)를 대기한다.

설계

이전 시간에 직접 전류를 선으로 Vcc(+), Gnd(-)를 연결해서 해당 위치의 불이 들어오게 만들었습니다. 그렇다면 아두이노에서는 어떻게 명령을 내려야 할까요.

1층 1호실에 불이 들어올려면 오레지(2)핀에 Vcc(5V)가 공급되고 1층(11)핀이 Gnd(-)가 되면 되겠죠. 직접 선을 연결한다는 생각을 하시면 됩니다.

그걸 코딩화 하면은 digitalWrite()함수를 사용해야 합니다.

  • 오렌지(2)핀이 Vcc(5V)가 공급 => digitalWrite(2, HIGH);
  • 1층(11)핀이 Gnd(0V)가 되어야 하니깐 => digitalWrite(11, LOW);

이렇게 표현하시면 됩니다.

1층을 순차적으로 깜박이게 하려면 어떻게 해야 할까요.

층별로는 1층(11)핀이 Gnd 상태이고 2층은 Gnd 상태가 아니면 되죠.

  • digitalWrite(11, LOW);
  • digitalWrite(12, HIGH);

이렇게 표현합니다. 왜 2층에 HIGH를 공급했을까요. 디지털 출력은 HIGH or LOW 두가지 상태만 존재합니다. 그리고 LED가 불이 들어올려면 Vcc와 Gnd가 연결해야 전류가 흘러서 LED에 불이 들어온다고 했죠. 가령 해당 LED가 Vcc쪽으로 5V를 공급하고 Gnd쪽으로 5V 상태면 서로 충돌하게 되잖아요. 그러면 전류가 흐를 수 없게 됩니다. 같은 극이 되면은 전류를 흐르지 않습니다. 이런 원리를 이용해서 LED를 제어하게 됩니다.

1층만 순차적으로 LED가 1,2,3,4 호실에 불이 들어올려면

digitalWrite(12, HIGH);

2층이 HIGH 상태에서 1층1호실을 불이 들어올려면

digitalWrite(11, LOW); 
digitalWrite(2, HIGH);
delay(1000);

2번 Vcc, 11번 Gnd로 1층 1호실에 불이 들어오고 1초간 대기한다는 의미입니다.

그러면 1층 2호실이면 같은 문장으로.

// 2층 잠금
digitalWrite(12, HIGH);

// 1층 개방
digitalWrite(11, LOW); 

// 1층 1호실 켜기
digitalWrite(2, HIGH);
delay(1000);

// 1층 1호실 끄고 2호실 켜기
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delay(1000);

.....

주석에서 설명하는 것처럼 켠 LED은 끄고 다음 LED은 켜고 이 문장을 반복해서 표현하면 됩니다.

2층으로 넘어갈때는

// 1층 잠금
digitalWrite(11, HIGH); 

// 2층 개방
digitalWrite(12, LOW); 

// 2층 1호실 켜기
digitalWrite(2, HIGH);
delay(1000);

// 2층 1호실 끄고 2층 2호실 켜기
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delay(1000);

.....

이렇게 반대로 생각하시면 됩니다.

전체적으로 코딩을 하면

int layer1 = 11;
int layer2 = 12;

int room1 = 2;
int room2 = 3;
int room3 = 4;
int room4 = 5;


void setup()
{
  pinMode(layer1, OUTPUT);
  pinMode(layer2, OUTPUT);

  pinMode(room1, OUTPUT);
  pinMode(room2, OUTPUT);
  pinMode(room3, OUTPUT);
  pinMode(room4, OUTPUT);

  //초기화 각 층을 막아놓습니다.
  digitalWrite(layer1, HIGH);
  digitalWrite(layer2, HIGH);
}

void loop()
{
  //1층 점등
  digitalWrite(layer1, LOW);  
  digitalWrite(room1, HIGH);  
  delay(1000);
  
  digitalWrite(room1, LOW);  
  digitalWrite(room2, HIGH);  
  delay(1000);
  
  digitalWrite(room1, LOW);  
  digitalWrite(room2, HIGH);  
  delay(1000);
  
  digitalWrite(room2, LOW);  
  digitalWrite(room3, HIGH);  
  delay(1000);

  digitalWrite(room3, LOW);  
  digitalWrite(room4, HIGH);  
  delay(1000);
  
  digitalWrite(room4, LOW);  
  digitalWrite(layer1, HIGH);  
  delay(1000);
  
  //2층 점등
  
  digitalWrite(layer2, LOW);  
  digitalWrite(room1, HIGH);  
  delay(1000);
  
  digitalWrite(room1, LOW);  
  digitalWrite(room2, HIGH);  
  delay(1000);
  
  digitalWrite(room1, LOW);  
  digitalWrite(room2, HIGH);  
  delay(1000);
  
  digitalWrite(room2, LOW);  
  digitalWrite(room3, HIGH);  
  delay(1000);

  digitalWrite(room3, LOW);  
  digitalWrite(room4, HIGH);  
  delay(1000);
  
  digitalWrite(room4, LOW);  
  digitalWrite(layer2, HIGH);  
  delay(1000);

}

코딩만 길게 표현이 된 것일뿐 LED을 켜고 끄고 이렇게 순차적으로 반복되는 문장일뿐 길다고 복잡하게 생각하실 필요는 없어요.

아래 두 표현으로만 코딩한 내용을 순차적으로 깜박이는 패턴을 만들려고 하니깐 전체적 코딩에서 길어지게 보였을분 아래 두 표현만 이해하시면 됩니다. 순차적으로 깜박이는게 중요한게 아니라 어떻게 전류를 흐르게 하고 차단을 하는지를 이해하시면 됩니다.

  digitalWrite(layer1, HIGH); //1층 잠금   
  digitalWrite(layer1, LOW); //1층 열림
  

  digitalWrite(room1, HIGH); //켜기 
  digitalWrite(room1, LOW);  //끄기

오늘 코딩한 표현은 흐름의 동작을 직설적으로 다 일일히 코딩으로 보여준거고요. 프로그램 문법을 사용하면 간단히 줄일 수 있습니다. 프로그램 문법보다는 일일히 동작하는지를 살펴보는게 주 목적입니다. for문을 사용하면 아주 간단하게 축소 시킬 수 있지만 오늘은 그 부분을 다루지 않을께요.

5. 결과


가상시뮬레이터에 부품이 많이 배치되면은 온라인상에서 실험하는거랑 렉이 좀 발생하네요. 실험 소스대로 하면 컴사양과 인터넷 사양에 따라 달라지겠지만 제 컴에서는 1초가 꽤 길게 느껴지더군요. 아주 짧은 시간으로 돌렸는데 첫음에는 빠르게 동작하다가 나중에는 거의 1초 단위로 순차적으로 깜작이더군요. 마지막에 실제 아두이노로 실험한 결과를 올려놨으니깐 젤 마지막 부분인 14분 20초부터 영상을 보시고 동작을 살펴보세요.

마무리


원래는 3x3x3 CUBE LED를 할려고 계획했는데 실제로 뻥판에 구현하는 장면까지 넣을려고 하니깐 뻥판이 너무 지져분해지고 의미 전달이 안될 것 같아서 2x2x2 CUBE LED로 변경했네요. 이 경우는 총 8개 LED만 제어하면 되기 때문에 코딩량도 적고 회로도 배치하는 것도 복잡하지 않고 실제 제작에서도 간단하게 실험할 수 있어서 좋은 것 같더군요.
개인적으로 3x3x3 CUBE LED를 실제로 납땜하면서 구현해보는게 가장 이상적이라고 생각되네요. 문제는 딱 제가 보유한 LED 개수가 딱 색상별로 10개씩 있어서 만약에 3x3x3 CUBE LED를 실제로 만들면 색상별로 1개씩 밖에 남지않아서 다음 실험에 LED를 활용할 수 없어서 실제로 제작한 모습은 보여드릴 수 없어서 아쉽네요. 이런건 실제로 만들어지는 걸 봐야 시각적 효과가 큰데 말이죠.

참고로 RGB LED로 구현도 가능합니다. 이경우는 총 4핀이여서 제작 과정이 좀 복잡하지만 원리는 동일합니다. 한번 연구해 보세요.


댓글()