불과 일주일 전에 piAu 펀딩 관련 실 제품이 도착했다. 작년 말에 진행이 되고 이제야 받았으니 꽤 오랜 기간 기다린 셈이다. 실제 이 제품을 보면서 케이싱 디자인이 매우 맘에 들어서 두 개나 구매하고야 말았다. 아직 나머지 한 개는 조립조차 하지 않았고 하나는 내가 하고 싶은 커스터마이징을 하느라 본체 케이스를 전부 새로 출력하고 OLED 화면에 외부 DAC까지 장착했다.
이번 글에서는 그 과정을 기술하고자 한다. 따라서 독자를 위한 글이라기보다는 기록을 남기기 위한 작업 로그 성격의 글이라 생각하면 된다.
제품을 조금 사용해보면서 소셜 오디오 제품 측면의 기능이 있기는 하지만 음악 감상에 충실한 오디오를 만들고 싶었던 나로서는 별로 필요하지 않은 기능이 많았고, 음감에 충실한 기능이 부재하다는 점이 아쉬웠다.
하지만 모든 재료가 오픈소스이다 보니 대부분의 것들을 공개하고 있었고, 아래 기능을 가진 기기로 바꾸기로 제품이 오기 전부터 결심하고 있었다.
1. 개인 로컬 저장소의 음원을 플레이할 수 있게 한다.
2. 별도의 DAC을 이용해 음질을 향상한다.
3. 중앙에 있는 세그먼트 디스플레이는 시간 출력에만 충실하게 하고 별도의 OLED를 이용해 플레이 중인 곡의 정보를 표시하게 한다.
1번의 경우는 volumio를 깔아서 해결한다. 아쉽게도 piAu의 OS 사용은 일단 보류...
2번의 경우 가지고 있는 아래 DAC을 활용한다.
위 DAC이 아니더라도 다른 DAC을 사용할 수도 있다.
3번은 2달 전에 알리익스프레스에서 5천 원 정도에 주문해둔 OLED를 사용한다. 빠른 배송을 원한다면 국내 몰에서 구매해도 되지만 거의 세배 이상의 가격을 줘야 된다.
일단 DAC을 아래와 같은 방식으로 GPIO 핀에 연결한다.(piAu는 라즈베리파이 A+ 버전을 사용하므로 관련 PIN 정보를 기반으로 연결한다.)
5V to pin2
PWR GND to pin6 (gnd)
BCK to pin12
MCLK removed
LRCK to pin35
GND dac to pin39
DATA to pin40
이렇게 진행을 하면서 동시에 micro SD카드에 volumio를 설치한다.
volumio를 설치하고 나면 소리가 나지 않을 것이다. 따라서 아래와 같이 volumio 설정(menu - system)에 들어가서 Hifiberry로 I2S Driver를 선택하고 재부팅하면 특별한 상황이 아니라면 소리가 재생될 것이다.
여타 volumio 사용법에 대해서는 관련 자료들이 많으니 필요하다면 찾아보면 된다.
이 작업을 통해 필자의 네트워크 HDD에 있는 음원들을 piAu를 통해 플레이할 수 있게 되었다.
piAu 중앙에 보면 4개 문자를 표시할 수 있는 세그먼트 디스플레이가 있다. piAu OS를 갈아엎으면서 요 부분이 먹통이 되었을 것이다.
필자는 이 부분을 시계로 활용할 것이다. 이를 위해 라즈베리파이에 소프트웨어적인 작업을 해야 된다.
piAu는 max7219 칩을 사용하므로 관련 드라이버를 설치해야 되면 관련 환경 설정도 해야 된다.
https://github.com/rm-hull/max7219 에 관련 정보가 기재되어 있으니 따라서 라이브러리 설치 및 설정 /테스트를 진행한다.
$ sudo python examples/sevensegment_test.py
설정을 하고 난 뒤 위 명령어로 실행을 하면 실행되지 않는 것을 알 수 있다. 게다가 제공되는 예제는 piAu가 보유한 세그먼트와 다소 다른 하드웨어 적인 특징을 가지고 있어서 소스를 고쳐야 된다.
필자가 piAu에 맞는 시계 코드를 아래 링크에 마련해 두었다. 아마 환경설정이 동일하다면 정확하게 시계가 동작할 것이다.
https://github.com/haven-jeon/piAu_volumio/blob/master/clock.py
위 시계는 OS가 시작되면 항상 동작을 해야 되기 때문에 데몬 형태로 올려야 되는데, 필자의 경우 라즈베리파이에서는 supervisord를 이용해 데몬 관리를 한다. 이 부분 역시 해당 내용이 길기 때문에 별도 자료를 참고하길 바란다.
구매한 OLED의 스펙은 아래와 같다.
Resolution: 128 * 64
Driver IC: SSD1306
I2C 인터페이스로 연결되기 때문에 아래 핀 설정을 보고 설정한다. (역시 핀 구성 매핑은 사용 보드 핀 설정을 참고해서 정확한 핀넘버에 꽂는다.)
필자가 구매한 부품은 RST 핀이 없기 때문에 해당 부분 연결은 생략했다.
I2C가 사용 가능해야 되기 때문에 아래 명령어 및 다른 명령어들로 정확히 설정되었는지 확인한다.
$ ls /dev/i2c*
만일 디바이스가 리스트 되지 않는다면 필자의 설정을 참고로 설정한다.
$ nano /boot/config.txt
#gpu_mem=16
#hdmi_drive=2
dtoverlay=hifiberry-dac
dtparam=spi=on
dtparam=i2c1=on
dtparam=i2c_arm=on
#arm_freq=900
#core_freq=250
#sdram_freq=450
#over_voltage=2
$ nano /etc/modules
snd_bcm2835
#spi_bcm2708
#i2c_bcm2708
#lirc_dev
#lirc_rpi gpio_in_pin=18
i2c-dev
i2c-bcm2708
spi-dev
i2c 관련 패키지들을 설치한다.
$ sudo apt-get update
$ sudo apt-get install i2c-tools
아래와 같은 화면이 출력되면 정상적으로 설치가 된 것이다.
앞서 세그먼트 디스플레이 덕분에 대부분의 Python 환경은 설정되었을 것이지만 이 부분만 설정할 분이 있을 것으로 믿고 전체 설정을 기술하도록 하겠다.
$ sudo apt-get install build-essential python-dev python-pip
$ sudo pip install RPi.GPIO
$ sudo apt-get install python-imaging python-smbus
$ sudo pip install python-mpd2
SSD1306 파이썬 라이브러리를 설치한다.
$ sudo apt-get install git
$ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
$ cd Adafruit_Python_SSD1306
$ sudo python setup.py install
정상적으로 설치가 되었으면 필자의 파일을 다운로드하여 실행해본다.
https://github.com/haven-jeon/piAu_volumio/blob/master/song_title_disp.py
정상적으로 모든 과정이 제대로 수행되었다면 아래와 유사한 곡 정보가 표시될 것이다.
https://github.com/haven-jeon/piAu_volumio 에 한글 폰트도 포함되어 있는데, 음원의 ID 태그가 UTF-8로 잘 정리되어 있다면 제일 상단에 앨범명과 중간 제목 그리고 플레이 타임 그리고 볼륨이 잘 표현이 될 것이다. 원하는 폰트가 있다면 관련 소스를 수정하고 폰트를 올려서 사용하면 된다. 현재 기본으로 나눔 고딕과 마인크래프트 폰트가 적용되어 있다.
piAu는 심지어 case도 공개해서 Thingiverse에서 제공하고 있다.
https://www.thingiverse.com/thing:1363338
실제 DAC을 설치하면서 추가적인 단자 구멍이 필요했다. 해당 작업은 openscad를 기반으로 수행했다.
왼쪽이 원본 STL이며 오른쪽은 컴포넌트 단자 구멍을 뚫은 것이다.
3D 프린터로 열심히 출력한다. 약 2시간이 걸렸다.
필자의 경우 우든 필라멘트로 출력했다. 다소 뻑뻑해서 연약한 나무 재질의 다른 부품들이 깨지는 경우가 생겨 결국 앞면을 제외하고 전부 새로 출력했다. ^^;
DAC 보드와 OLED 디스플레이를 고정 시키고 3D 프린터로 뽑은 새로운 케이스로 케이싱 작업을 완료한다.
이 정도 작업을 해서 사용 중인데, piAu 스피커가 맘에 들지 않아서 유닛 교체를 생각하고 있다. 일단 적당한 크기의 유닛을 주문해놓고 전에 만들어둔 블루투스 스피커와 함께 사용 중인데, 기본 스피커보다 훨씬 좋은 음량과 음질을 들려주고 있다.(블루투스 스피커의 유닛이 무려 소니에서 사용하는 유닛이다. ㅋ )
<소스코드>
https://github.com/haven-jeon/piAu_volumio