대부분의 사람들은 LED 큐브를 좋아하지만, 8x8x8 같은 대형 큐브는 제작과 프로그래밍 모두 많은 노력이 필요합니다. 작은 큐브(3x3x3 또는 4x4x4)는 LED 수가 적고 시프트 레지스터나 하이사이드 드라이버 같은 외부 하드웨어가 필요 없어 제작이 쉽지만, 대형 큐브의 느낌을 주지는 못합니다.
이 프로젝트의 목표는 제작이 쉬운 큐브를 만들고, 대형 큐브를 만들 때의 번거로움 없이 대형 큐브의 느낌을 즐길 수 있을 만큼 멋진 소프트웨어를 제공하는 것입니다. 이 5x5x5 큐브는 아두이노 메가만으로 직접 구동할 수 있으며, 시프트 레지스터 없이 5개의 트랜지스터만으로 한 레이어(25개 LED의 캐소드)를 접지로 풀다운합니다. 시프트 레지스터를 피하는 이유는 수배선이 매우 어렵기 때문입니다(시도해 보았습니다). 제대로 사용하려면 PCB를 설계하고 제작해야 합니다.
과거 대형 큐브용 코드를 많이 작성해 본 경험을 살려, 기존 큐브 애니메이션들을 이 5x5x5 큐브에서 실행되도록 수정했습니다.
참고: 메가로 구동하는 5x5x5 큐브를 제안한 것이 처음은 아닙니다. MEGA DAS가 2017년에 유사한 프로젝트를 발표했습니다. 하드웨어는 거의 동일하지만, 핀아웃과 저항값이 다릅니다. 이 프로젝트를 공개하는 주된 이유는 큐브 소프트웨어 작성 경험이 풍부하기 때문이며, 제 소프트웨어가 몇몇 분들에게 큐브 제작 동기를 부여하기를 바랍니다.
하드웨어
메가에는 많은 디지털 I/O 핀이 있습니다. 5개는 각 레이어의 캐소드를 풀다운하는 트랜지스터 구동용으로, 25개는 한 레이어 내 25개 LED의 애노드를 하이로 구동하는 데 사용합니다. 이 방식으로는 6x6x6 큐브도 가능하지만, 전력 제한을 고려해야 합니다. 메가의 핀당 전류 제한은 40mA, 총 200mA입니다. 파란색 LED 순방향 전압 강하는 약 3V, 캐소드 트랜지스터 강하 0.7V를 고려하면, 5V 공급에 180옴 저항 사용 시 LED당 7.2mA가 흐릅니다. 한 레이어 25개 LED가 모두 켜지면 180mA로, 한 번에 한 레이어만 켜므로 메가의 전류 제한을 만족합니다. NPN 트랜지스터로 캐소드를 접지로 풀다운하며, 베이스 전류 5mA를 더해도 총 185mA 정도로 200mA 이하를 유지합니다.
디지털 핀 22-26은 트랜지스터를 구동해 LED 캐소드를 접지에 연결합니다. 핀 27-51은 180옴 저항을 거쳐 각 레이어 25개 LED의 애노드로 연결됩니다. 핀아웃 배치가 다소 복잡해 보이지만, 소프트웨어에서 디지털라이트 대신 직접 포트 액세스를 사용하여 25개 LED를 제어하기 위해 포트 참조를 정리하려고 이렇게 배치했습니다.
큐브 제작
큐브 제작 방법은 다양하지만, 어떤 방식이든 꼼꼼함과 인내심이 필요합니다. 제가 제작한 방식을 소개하지만, 다른 방법도 온라인에서 찾아볼 수 있습니다.
제작은 LED 리드 성형 및 5개씩 컬럼으로 납땜 → 5개 컬럼을 패널로 납땜 → 5개 패널을 큐브로 조립 순서로 진행합니다. 리드 각도의 작은 오차도 누적되어 눈에 띄게 되므로 리드 성형이 가장 중요합니다. 시간을 들여 정확히 하면 완벽하진 않아도 괜찮은 큐브가 나옵니다.
애노드(긴 다리)는 아래로 향하게 하지만 옆으로 구부려 수직 컬럼의 애노드끼리 납땜할 수 있게 합니다. 애노드 오프셋과 캐소드 리드는 90도를 이루어야 합니다.
리드 성형이 지루하고 손에 무리가 가서, 25개 LED 성형 후 패널 하나를 만듭니다. 컬럼과 패널 제작에는 지그가 필요한데, 블루택(재사용 가능한 접착제)을 사용합니다. LED를 블루택에 눌러 고정하고 납땜하며, 자국을 내어 동일한 간격으로 반복합니다. 처음에는 매우 정확하게 측정해야 합니다. 저는 세 방향 모두 0.6인치 간격을 두어, 완성된 큐브가 표준 0.1인치 홀 간격의 보드에 꽂히게 했습니다.
LED 납땜 주의사항: 큐브 완성 후 내부에서 냉납을 발견하는 것은 악몽입니다. 각 컬럼 제작 시 납땜 상태를 꼼꼼히 확인하세요.
각 패널 완성 후 테스트합니다. 완성 후 불량을 발견하면 재작업이 불가능하므로 필수입니다. 소프트웨어에 패널 테스트 스케치가 포함되어 있습니다. 5개 수직 애노드 리드를 330옴 저항과 핀 40-44에 연결하고, 5개 캐소드 핀을 핀 22-26에 연결해 테스트합니다. 정상 패널은 위 영상처럼 보입니다. (트랜지스터 설치 전이라 캐소드를 로우로 드라이브해 LED를 켭니다. 트랜지스터 설치 후에는 하이로 드라이브해 트랜지스터가 캐소드를 로우로 풀다운합니다.)
5개 패널을 만들고 테스트한 후, 메인 보드에 저항과 트랜지스터를 장착하고 배선합니다.
180옴 저항을 각 애노드 컬럼 옆에, 캐소드 트랜지스터와 베이스 저항을 큐브와 메가 사이에 배치합니다. 애노드 컬럼 간격은 양방향 0.6인치로, 보드에서 5개 구멍 건너 하나씩 애노드 컬럼이 위치합니다.
아두이노를 보드에 장착합니다. 스탠드오프가 있으면 사용하고, 저는 얇은 플라스틱 조각과 접착제로 메가를 보드 위 1/4인치 높이에 고정했습니다.
패널을 메인 보드에 부착합니다. 모든 애노드 컬럼이 정확한 구멍에 들어갔는지 확인하고, 모든 패널이 같은 방향(캐소드 리드가 같은 쪽으로 나오게)으로 향하게 하세요.
각 레이어의 캐소드 5개를 직선으로 펴서 연결합니다. 주석 도금 구리선을 사용합니다.
각 레이어의 캐소드를 메인 보드로 내려 트랜지스터 컬렉터에 연결합니다. 역시 주석 도금 구리선을 사용합니다.
저항에서 메가로 모든 리드 연결을 완료하면 큐브 테스트 준비가 끝납니다. 소프트웨어에 큐브 테스트 스케치가 있어 각 LED를 순서대로 잠깐 켜줍니다. 패널 테스트를 이미 했으므로, 문제는 최근에 연결한 캐소드 라인 쪽일 가능성이 높습니다. 한 레이어가 안 켜지거나 일부가 안 켜지면 냉납을 의심하세요.
소프트웨어
큐브의 각 LED 상태는 5x5x5 전역 바이트 배열 cube[][][]로 정의합니다. 1은 켜짐, 0은 꺼짐입니다. 모든 애니메이션은 이 배열에 1과 0을 배치해 만듭니다.
큐브 소프트웨어의 핵심은 큐브를 리프레시하는 타이머 인터럽트입니다. setup()에서 시작하며 프로그램 맨 끝에 있습니다. 10ms마다 호출되어 약 6ms 동안 큐브를 리프레시합니다. 메인 루프 실행에 4ms가 남습니다.
리프레시 시 각 레이어를 1.2ms 동안 켭니다. 초당 100회 리프레시하므로, 켜진 LED는 초당 120ms(12% 듀티 사이클) 동안 켜집니다. 100Hz는 육안으로 연속적으로 보이기에 충분하고, 12% 듀티 사이클로도 꽤 밝게 보입니다.
리프레시 사이클을 짧게 하고 LED 점등 시간을 늘리기 위해 digitalWrite 대신 직접 포트 액세스를 사용합니다. 인터럽트 루틴에 25줄의 직접 포트 제어 코드가 있어 보기엔 좋지 않지만, digitalWrite 몇 줄보다 훨씬 빠릅니다.
loop()는 각 애니메이션 서브루틴을 순서대로 호출하고 반복합니다. 일부 애니메이션은 다른 루틴을 호출합니다. 코드에 각 애니메이션 설명이 있습니다. clearCube()(모든 LED 끄기), copyDown()(각 레이어 내용을 아래 레이어로 시프트하고 최상단 레이어 클리어) 등 공통 유틸리티 루틴도 있습니다.
다운로드 가능한 스케치는 세 가지입니다: 메인(영상의 15개 애니메이션), 패널 테스트, 큐브 테스트. 후자 두 개는 제작 중 테스트용입니다.
코드
5x5x5 큐브 소프트웨어 (아두이노) - 패널 테스트, 큐브 테스트, 15개 애니메이션 포함