아두이노 우노와 1Sheeld로 만드는 4x4x4 LED 큐브 – 인터랙티브 LED 프로젝트
부품 및 소모품
| 부품 |
수량 |
| 안드로이드 기기 |
1 |
| 저항 220옴 |
16 |
| LED (일반) |
64 |
| 아두이노 우노 |
1 |
| 1Sheeld |
1 |
| 점퍼 와이어 (일반) |
20 |
| 납땜 도구 |
1 |
프로젝트 소개
스마트폰의 1Sheeld와 아두이노 우노를 연결해 음악에 반응하는 4x4x4 LED 큐브를 만드는 프로젝트입니다. 마이크 실드를 활용해 소리 크기에 따라 LED 레이어가 점등되는 인터랙티브한 시각 효과를 구현합니다.
LED 큐브 제작 방법
다음 인스트럭터블을 참고해 LED 큐브를 제작하세요. 3단계, 4단계, 5단계만 따라하면 됩니다. 기본적인 납땜 지식이 필요합니다.
LED Cube 4x4x4 제작 가이드
주의: 인스트럭터블의 부품 목록은 참조하지 마시고, 위 부품 목록을 따르세요.
동작 원리
각 LED의 애노드에 개별 배선하는 것은 비현실적입니다. 대신 큐브를 4개 레이어로 나누고, 각 레이어는 16개 LED로 구성합니다.
- 수직 열(Column)의 모든 LED는 공통 애노드(+)를 공유
- 수평 레이어(Layer)의 모든 LED는 공통 캐소드(-)를 공유
특정 LED를 켜려면 해당 레이어에 GND(-)를, 해당 열에 5V(+)를 공급하면 됩니다. 이렇게 하면 16개 열 제어 핀 + 4개 레이어 제어 핀 = 총 20개 핀으로 64개 LED를 제어할 수 있습니다.
배선 방법
큐브 완성 후 16개 열 제어 핀과 4개 레이어 제어 핀이 나옵니다.
- 열 제어 핀: 각 핀에 220Ω 저항을 직렬로 연결하고, 저항의 다른 쪽을 1Sheeld(아두이노 위에 장착)에 연결합니다. 저항 없이 직접 연결해도 작동하지만 권장하지 않습니다.
- 열 제어 핀은 디지털 핀 13~0, 아날로그 핀 A4, A5에 순서대로 연결합니다. (회로도 참조) 열 연결 순서는 자유롭게 변경 가능합니다.
- 레이어 제어 핀: 아날로그 핀 A0, A1, A2, A3에 연결합니다. 코드상 맨 아래 레이어는 A0, 그 위는 A1, A2, 최상단은 A3입니다.
- 배선 완료 후 코드를 업로드하고 스마트폰을 1Sheeld와 연결합니다. 1Sheeld 사용이 처음이라면 시작 가이드를 먼저 보세요.
코드 설명
스마트폰 마이크로 입력된 소리 크기(Mic.getValue())에 따라 4개 레이어를 순차적으로 점등합니다. 임계값(70, 76, 82, 88)은 스마트폰마다 다를 수 있으니 음악을 재생하며 마이크 실드 수치를 보고 조정하세요.
/* 1Sheeld와 아두이노 우노로 4x4x4 LED 매트릭스를 스마트폰 마이크로 제어 */
#define CUSTOM_SETTINGS
#define INCLUDE_PUSH_BUTTON_SHIELD
#define INCLUDE_MIC_SHIELD
#include <OneSheeld.h>
// 핀 정의
int coloumn[16] = {13,12,11,10,9,8,7,6,5,4,3,2,1,0,A4,A5};
int layer[4] = {A0, A1, A2, A3};
int counter;
void setup() {
OneSheeld.begin();
Serial.begin(115200);
for(int i=0;i<16;i++) pinMode(coloumn[i], OUTPUT);
for(int i=0;i<4;i++) pinMode(layer[i], OUTPUT);
}
void loop() {
// 모든 열 HIGH(5V)
for(int i=0;i<16;i++) digitalWrite(coloumn[i], HIGH);
delay(30);
// 마이크 값에 따라 레이어 제어 (LOW = GND 연결 = 점등)
if(Mic.getValue() > 70) { digitalWrite(layer[0], LOW); delay(50); } else { digitalWrite(layer[0], HIGH); }
if(Mic.getValue() > 76) { digitalWrite(layer[1], LOW); delay(50); } else { digitalWrite(layer[1], HIGH); }
if(Mic.getValue() > 82) { digitalWrite(layer[2], LOW); delay(50); } else { digitalWrite(layer[2], HIGH); }
if(Mic.getValue() > 88) { digitalWrite(layer[3], LOW); delay(50); } else { digitalWrite(layer[3], HIGH); }
}
회로도
아래 회로도에는 저항이 표시되어 있지 않으니 배선 시 저항을 꼭 추가하세요.