Volumio 곡 버튼으로 제어하기

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]

어가며

                                                                                                                              

 오래전부터 오디오 하시는 분들 이야기만 들어보았지 어떤 음과 함께하는지 자세히 알지는 못했다. 우연히 지인의 추천으로 PCM5102기반의 DAC을 공구하게 되었고 가지고 있던 Raspberry Pi를 이용하여 고품질의 음을 들을 수 있다고 하였다. 

저 또한 스피커도 구매하고 하나씩 디지파이의 세계에 빠져들고 있는 초보이다. Volumio(https://volumio.org/)는 MPD(Music Player Daemon)를 콘트롤하기 위한 GUI를 제공해 준다. 하지만 원격 디바이스에서 IP를 통해 접속을 해야하므로 나름 불편하다고 느꼈다. 그래서 버튼으로 간단하게 제어할 수 없을까? 해서 이곳 저곳 검색한 결과 성공한 내용을 정리하여 저같은 초보에게 도움을 주고자 글을 남긴다.

 

보기

                                                                                                                              

1. Raspberry Pi 2 

  (http://www.icbanq.com/shop/product_detail.asp?prod_code=P005686826&catg_code=115185)

 

2. Tact스위치

  (http://www.icbanq.com/shop/product_detail.asp?prod_code=P000096309&catg_code= )

 

     

            [Raspberry PI 2]                        [Tact스위치 1103T] 

 

 료 살펴보기

                                                                                                                              

1. 라즈베리파이
   다음과 같은 스펙을 가지고 있다.
 

 

2. Tact 스위치
   Tact스위치 종류는 아래 사진[사진1]과 같이 매우 다양한다. 사진[2]를 보면 빨간 라인이 서로 연결이 되어 있어서 한 라인이다. 처음 사용하시는 분은 주의해서 사용해야한다. 

 

 

    [사진1] Tact 스위치                                    [사진2] Tact 스위치 

 

 

 드웨어 구성하기

                                                                                                                              

1. 회로도




2. 납땜하기
   위의 회로도와 같이 납땜합니다.






 프트웨어 구성하기

                                                                                                                              

1. Music Player Daemon (http://www.musicpd.org/ )

 mpd는 무료 Open source music player server이다. 다양한 음원(확장자)을 실행해 주는 램상주 프로그램으로 이를 바탕으로 Volumio는 네트워크상 접속하여 제어할 수 있도록 GUI환경을 제공해 주고 있다.  이를 제어하기 위해서는 mpc로 제어해야 한다.

2. mpc-Program for controlling Music Player Daemon (MPD)

  mpc는 Music Player Daemon를 제어하기 위해 사용하는데 각 명령어는 다음 링크를 참조한다.
  


3. 코드작성하기

   3.1 라즈베리파이 접속한다.
   3.2 btnTest.py 파이썬 파일 만들기
      

   cd


   sudo nano btnTest.py

      
편집 프로그램에서 아래의 코드를 삽입한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python
 
import RPi.GPIO as GPIO
import time
import sys
import os
 
 
from mpd import MPDClient
client = MPDClient()               # create client object
client.timeout = 10                # network timeout in seconds (floats allowed), default: None
client.idletimeout = None          # timeout for fetching the result of the idle command is handled seperately, default:$
client.connect("localhost"6600)  # connect to localhost:6600
 
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
 
 
while 1:
    
    
    input_state_set = GPIO.input(4)
    input_state_play = GPIO.input(17)
    input_state_prev = GPIO.input(27)
    input_state_next = GPIO.input(22)
    
    if input_state_set == False:
        os.system('mpc toggle'
        
 
        
    if input_state_play == False:
        os.system('mpc toggle')
    
                
    
    if input_state_prev == False:
        status = "prev"
        os.system('mpc prev')    
        
    if input_state_next == False:
        status = "next"
        os.system('mpc next')
    
        
    
        
        
 
cs


위의 내용을 복사해서 붙여넣은 다음 

Ctrl+w, 
yes선택 
Enter

위와 같은 순서로 빠져나온다. 그럼 코드 작성은 완성이 되었다.



 동하기

                                                                                                                              


1. Volumio에서 일단 음을 실행한다 

2. 다음 아래의 명령어를 실행하면 파이썬으로 작성된 코드가 동작한다. 
      

   sudo python btnTest.py



3. 버튼 눌러보기
    

 GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)



위의 코드와 같이 버튼은 내부풀업을 세팅하였다. 따라서 스위치에 저항을 납땜하지 않아도 된다.

각 스위치의 연결은 다음을 확인한다.


        input_state_set = GPIO.input(4)

input_state_play = GPIO.input(17)

input_state_prev = GPIO.input(27)

input_state_next = GPIO.input(22)



버튼을 누르면 곡의 정보가 콘솔창에 아래와 같이 표시된다.




4. 실제 작동 동영상

  위의 동영상은 CLCD와 함께 곡의 정보까지 표현해 주는 프로그램이다. 아래 코드를 참고하면 된다.
CLCD활용방법은 다음 링크와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/python
 
from CharLCD import CharLCD
from subprocess import *
from time import sleep, strftime
from datetime import datetime
 
import RPi.GPIO as GPIO
import time
import sys
import os
 
 
 
from mpd import MPDClient
client = MPDClient()               # create client object
client.timeout = 10                # network timeout in seconds (floats allowed), default: None
client.idletimeout = None          # timeout for fetching the result of the idle command is handled seperately, default:$
client.connect("localhost"6600)  # connect to localhost:6600
 
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
 
lcd = CharLCD()
 
 
lcd.begin(16,2)
playFlag = False
 
while 1:
    
    
    input_state_set = GPIO.input(4)
    input_state_play = GPIO.input(17)
    input_state_prev = GPIO.input(27)
    input_state_next = GPIO.input(22)
    
    if input_state_set == False:
        lcd.clear()
        os.system('mpc toggle')
        
 
        
    if input_state_play == False:
        lcd.clear()
        os.system('mpc toggle')
    
                
    
    if input_state_prev == False:
        lcd.clear()
        status = "prev"
        os.system('mpc prev')    
        
    if input_state_next == False:
        lcd.clear()
        status = "next"
        os.system('mpc next')
    
        
    
    
    try:
    
    
        title = client.currentsong()['title']
        last_status = client.status()['state']
        volume = client.status()['volume']
        audio = client.status()['audio']
        id = client.currentsong()['id']
        currentsong = client.currentsong()['file']
        status = client.status()['state']
    
    
        if status == "play"
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "pause":
            lcd.message( "[" + id + "] " + title + "\n" + "PAUSED   " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "stop":
            lcd.message( "[" + id + "] " + title + "\n" + "STOPED   " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "prev":
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "next":
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     " + audio[0:2+"k"+ audio[6:8+ "b  ")
                
            
    except:
        pass