이것은 저의 첫 번째 아두이노 프로젝트입니다. 여러 메이커들의 POV(Persistence of Vision, 잔상 효과) 디스플레이 프로젝트[2,3,4]에서 영감을 받았습니다.
잔상 효과(POV)는 여러 개의 개별 이미지가 인간의 마음속에서 하나의 이미지로 합쳐져 보이는 광학적 착시 현상으로, 영화와 애니메이션의 동작 지각 원리로 알려져 있습니다[1].
참고 프로젝트들은 개별 LED와 시프트 레지스터를 사용한 POV 글로브 디스플레이를 구현했지만, 본 장치는 회전하는 실린더와 기성품 RGB LED 스트립을 POV 디스플레이로 사용합니다.
주요 특징
POV (잔상 효과) 디스플레이
회전 실린더에 애니메이션 GIF 이미지 표시
GIF 이미지는 아두이노의 RAM 또는 플래시 메모리에 저장
블루투스를 통한 PC와의 통신
기술 사양
실린더 직경: 200mm
실린더 높이: 200mm
실린더 재질: 스티로폼
실린더 무게: 420g
LPD8806 기반 RGB LED 스트립 4개
화면 해상도: 151 × 40 픽셀
아두이노 듀 기반
HC-06 블루투스 모듈 내장
PC에서 블루투스로 제어
기계적 구조
기계적 구조는 아래 도면과 같습니다.
장치는 섀시와 로터로 구성됩니다. 섀시는 세 개의 나사봉으로 연결된 두 개의 원형 합판 디스크로 이루어져 있으며, 디스크 간 거리는 120mm입니다. 중앙에는 두 개의 볼 베어링과 축이 있습니다. 축 역시 나사봉을 사용하며, 두 개의 크라운 기어와 타이밍 벨트를 통해 전기 모터로 구동됩니다. 회전 속도는 최대 1300 RPM (22Hz)입니다.
로터는 두 개의 스티로폼 실린더와 두 개의 원형 알루미늄 디스크로 구성됩니다. 스티로폼 실린더는 하부 디스크에 접착되고, 상부 디스크는 탈착 가능하며 축에 로터를 고정하는 데 사용됩니다.
전자 회로는 로터 상부에 위치하며 다음을 포함합니다:
아두이노 듀 보드
아두이노 듀용 자작 실드
전원 공급 장치(PS) 보드
HC-06 블루투스 모듈
전원(7.5V)은 슬라이딩 컨택트와 컨택트 링을 통해 전원 공급 보드로 공급됩니다.
총 40개의 RGB LED를 가진 4개의 LED 스트립이 사용되며, 아두이노 실드에 케이블로 연결됩니다.
4개의 LED 스트립은 아래 도면과 같이 배치됩니다. 4개의 어긋난 LED 스트립을 사용함으로써 Y축 방향의 LED 간격이 4분의 1로 줄어듭니다. X축 간격은 소프트웨어로 처리합니다. 소프트웨어는 회전당 151회 모든 40개 LED를 업데이트합니다. 도면의 격자는 보이는 픽셀에 해당합니다.
전자 회로
전자 회로는 첨부된 PDF 회로도에 나와 있습니다.
LM317 전압 레귤레이터가 있는 전원 공급 보드가 있습니다. 입력 전압은 7.5V, 출력 전압은 4.6V입니다. 레귤레이터는 아두이노 듀 보드와 LED 스트립에 전원을 공급합니다.
아두이노용 자작 실드도 있습니다. LED 스트립용 커넥터 케이블과 IR 수신기 회로가 포함되어 있습니다. IR 수신기는 로터 위치를 감지하는 데 사용되며 아두이노의 타이머/인터럽트 입력에 연결됩니다.
STRIP0부터 STRIP3까지 네 개의 LED 스트립이 있습니다. 각 스트립은 5개의 LPD8806 LED 드라이버와 10개의 RGB LED를 가집니다. STRIP0은 USART0에, STRIP1은 USART1에 연결되며 둘 다 SPI 모드로 동작합니다. STRIP2와 STRIP3은 직렬로 연결되어 아두이노의 SPI 인터페이스로 구동됩니다.
PC와의 통신을 위해 HC-06 블루투스 모듈이 USART3에 연결됩니다. 블루투스 모듈은 아두이노 보드에서 제공하는 3.3V로 구동됩니다.
아두이노 소프트웨어
아두이노 소프트웨어는 메인 프로그램(mpc.ino)과 다음 라이브러리로 구성됩니다:
bt - 블루투스 모듈 드라이버 SW
LDP8806 - LED 스트립 드라이버 SW
MemoryFree - 사용 가능한 여유 RAM 메모리 감지 함수
mpcgif - RAM 또는 플래시 메모리에 있는 GIF 파일 재생
pictures - 플래시에 저장된 내부 GIF 이미지
trace - SW 디버깅용 함수
이미지의 LED 스트립 주기적 출력은 인터럽트 방식으로 수행됩니다. 두 개의 토글 프레임 버퍼가 있습니다. 각 프레임 버퍼는 40 × 151 픽셀의 이미지 하나를 저장하며, 각 픽셀은 1바이트 컬러 팔레트 인덱스입니다. 한 프레임 버퍼가 인터럽트와 DMA를 통해 LED 스트립으로 출력되는 동안, 다른 프레임 버퍼는 메인 프로그램에서 준비됩니다(예: GIF 이미지 디코딩 함수에 의해). 프레임 버퍼 토글은 프레임 인터럽트 루틴에서 수행됩니다.
IR 센서에 의해 회전당 하나의 프레임 인터럽트가 발생합니다. 프레임 인터럽트 루틴은 하드웨어 타이머를 통해 회전 속도를 측정하고, 하드웨어 타이머로 주기적인 컬럼 인터럽트(회전당 150개 인터럽트, 즉 컬럼당 하나)를 프로그래밍합니다. 컬럼 인터럽트 루틴은 현재 컬럼을 LED 스트립으로 출력합니다. 성능을 위해 출력은 완전히 병렬로 동작하는 세 개의 DMA 채널을 통해 수행됩니다.
전체 아두이노 소스 코드는 GitHub에서 확인할 수 있습니다.
PC 제어 프로그램
PC 제어 프로그램(pccp)은 C++로 작성된 명령줄 도구로, Cygwin에서 실행되며 블루투스를 통해 아두이노와 통신합니다. pccp는 다음 단일 문자 명령으로 POV 실린더를 제어할 수 있습니다: