티스토리 뷰


시작하겠습니다~


1. PiFace CAD 

라즈베리파이 내에 핀과 LCD를 Display 하고 Control 하기 위해 PiFace CAD를 설치하여야 합니다

설치하는 방법은 아래 코드를 순차적으로 입력하시면 됩니다.

$ sudo apt-get update

◈ $ sudo apt-get upgrade 

◈ $ sudo apt-get install python3-pifacecad

여기까지 하면 PiFace CAD는 설치 완료~!!

◈ $ python3 /usr/share/doc/python3-pifacecad/examples/sysinfo.py

이 부분을 입력하게 되면 아래와 같이 현재 라즈베리에 할당된 IP , 온도 등을 LCD화면에 보여주게 됩니다.



2.SPI


SPI를 사용하기 위한 설정 순서 입니다. 

$sudo raspi-config

입력 하게 되면 설정 창이 뜨는데 그부분에서 아래와 같이 설정합니다.

Adavnced Options->SPI->YES


$sudo reboot

설정을 마쳤으면 재부팅~!


2.IR Remote

적외선 송수신 하기 위한 설정 과정입니다. 리모컨을 사용하기 때문에 꼭 필요한 요소입니다. 
리모컨은 집에서 안쓰는 리모컨이나 핸드폰에서 각종 리모컨 앱을 다운받으셔서 사용하시면 됩니다.
※주의! IR 센서가 탑재되지 않은 핸드폰도 있어서 먼저 확인이 필요합니다

먼저 리모컨을 송수신을 위한 lirc.sh 파일을 다운받아 설치합니다.

$ wget https://raw.github.com/piface/pifacecad/master/bin/setup_pifacecad_lirc.sh 

 

$ chmod +x setup_pifacecad_lirc.sh
$ sudo ./setup_pifacecad_lirc.sh

$ sudo reboot
설정을 했으면 재부팅은 필수 

$ irrecord –list-namespace > list
$ vi list
재부팅을 마치고 이 부분을 입력하게 되면 아래와 같이 KEY들의 목록이 창에 출력됩니다.

★ 중요 단계입니다 리모컨과 라즈베리파이와의 일종의 약속이 시작되는 단계입니다. 

각종 KEY들을 눌렀을때 어떤 KEY인지 서로 약속하는것 입니다.

$ sudo rm /etc/lirc/lircd.conf 

$ sudo irrecord –f –d /dev/lirc0 /etc/lirc/lircd.conf


먼저 라즈베리 파이에게 "내가 바로 너의 리모컨이다"라고 자기 자신을 알리는 과정입니다.

이 순간 리모컨 버튼중 아무 버튼이나 눌렀을때 초록색 상자부분에서 " . " 이 입력이 됩니다. 

이 "." 들을 오른쪽 끝까지 채우면 서로의 대면식은 끝나게 됩니다.



 이부분에서 한번 ENTER를 입력합니다. 입력을 하고나면 아래와 같은 창으로 넘어갑니다.



먼저 할당한 KEY의 이름을 입력합니다. KEY의 이름은 앞서 설명했던 KEY의 목록에서 선택하면 됩니다.

이름을 다 입력하고 나면 KEY에 해당하는 부분을 리모컨에서 누르면 아래와 같이 창이 뜹니다. 


이렇게 하나의 KEY의 약속이 완료되었습니다~!

사용하고자 하는 KEY들을 위와 같은 순서대로 반복하면 설정 되고 설정을 마치고자 할때는 위창에서 ENTER를 입력하면 빠져나가게 됩니다 

※주의! 리모컨 라즈베리의 약속하는 창을 한번 빠져나가게 되면 2. IR Remote 부분 맨처음 부터 다시 시작 하여야 하니 신중히 설정 후 ENTER를 눌러야 합니다. (언제나 약속은 가벼운것이 아니니까~~)


$ sudo reboot

언제까지나 설정 완료후에는 재부팅 필수!

재부팅을 안하고 다음 과정을 거칠시에는 예상치 못한 에러가 발생합니다

에러가 발생하게 되면 또 맨처음부터 다시...............


여기까지 잘 따라 오셨다면 설정을 했으니 확인을 해야겠죠?

확인하는 방법 2가지 )

방법 1]

$ irw

irw 입력하고 난후 리모컨을 눌렀을때 약속했던 KEY의 내용을 확인할수 있습니다!


방법 2]

sudo nano /etc/lirc/lircd.conf

아래와 같이 설정한 KEY들의 목록과 정보들이 저장되어있습니다. 



◈$sudo nano /etc/lirc/.lircrc

이제 각 해당하는 KEY마다 출력을 설정해주는 부분입니다. 아래와 같은 스크립트로 구성하시면 됩니다

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
begin
prog = irexec
button = KEY_CHANNELUP
config = CHANNELUP
repeat = 0
end
 
begin
prog = irexec
button = KEY_CHANNELDOWN
config = CHANNELDOWN
repeat = 0
end
 
begin
prog = irexec
button = KEY_LEFT
config = LEFT
repeat = 0
end
 
begin
prog = irexec
button = KEY_RIGHT
config = RIGHT
repeat = 0
end
 
begin
prog = irexec
button = KEY_SELECT
config = SELECT
repeat = 0
end
 
begin
prog = irexec
button = KEY_PREVIOUSSONG
config = PREVIOUSSONG
repeat = 0
end
 
begin
prog = irexec
button = KEY_NEXTSONG
config = NEXTSONG
repeat = 0
end
 
begin
prog = irexec
button = KEY_VOLUMEUP
config = VOLUMEUP
repeat = 0
end
 
begin
prog = irexec
button = KEY_VOLUMEDOWN
config = VOLUMEDOWN
repeat = 0
end
 
begin
prog = irexec
button = KEY_PAUSE
config = PAUSE
repeat = 0
end
 
begin
prog = irexec
button = KEY_INFO
config = INFO
repeat = 0
end
 
begin
prog = irexec
button = KEY_MUTE
config = MUTE
repeat = 0
end
 
begin
prog = irexec
button = KEY_MENU
config = MENU
repeat = 0
end
 
begin
prog = irexec
button = KEY_EXIT
config = EXIT
repeat = 0
end
 
begin
prog = irexec
button = KEY_FASTFORWARD
config = FASTFORWARD
repeat = 0
end
 
begin
prog = irexec
button = KEY_REWIND
config = REWIND
repeat = 0
end
 
begin
prog = irexec
button = KEY_PLAY
config = PLAY
repeat = 0
end
 
 
 
cs


이렇게 노트패드 ++ 에서 접근하면 스크립트 작성이 매우 수월 합니다~!


3. MPD MPC 설정

제가 선택한 클라이언트는 바로 MPD입니다. 

MPD(Music Player Daemon) 는 음악파일을 재생, 관리해주는 서비스입니다.

스피커 출력, 재생 및 playlist 관리를 할 수 있는 가볍고 편리한 프로그램입니다.


먼저, 필요한 패키지부터 설치합니다.


◈$sudo apt-get install mpd ncmpc mpc

mpd 는 백그라운드로 실행되는 플레이어 core 입니다. mpc는 mpd의 동작을 제어할 수 있는 쉘 스크립트 - 명령어 기반 관리도구(클라이언트) 입니다. ncmpc는 쉘 환경에서 좀 더 편하게 키보드로 조작할 수 있도록 해주는 클라이언트 입니다.



◈$sudo nano /etc/mpd.conf

설치가 끝나면 MPD 설정 파일을 만져줘야 합니다. 이 부분에서 매우 고생을 많이 하였습니다. 

반드시 아래와 같은 설정대로 바꿔 주어야 합니다.



#user "mpd"
#group "nogroup"
bind_to_address "any"
port "6600"

user, group 항목은 주석처리(#을 앞에 붙여서) 해주시면 됩니다.

bind_to_address 항목은 "any"로 바꿔서 어디서든 접근 가능하게 해줍니다.

port 항목은 절대 바꾸지 마세요. 외부에서 MPD 설정을 바꿀 때 사용하는 포트인데,

이 부분을 수정하게 되면 동작을 원격제어가 안되는 문제가 발생합니다.


◈$sudo /etc/init.d/mpd restart

설정을 했으면 재시작은 필수~! MPD 데몬을 재시작 하는 명령어 입니다.

◈$mpc update

음악파일을 인식할수 있게 업데이트를 해야 합니다. 

mpc 클라이언트 명령어를 통해서 간단히 할수 있습니다. 


mpc 클라이언트 명령어를 몇개 소개 하겠습니다.


◈$mpc playlist

 

재생 목록들을 전부 출력해줍니다.

◈$mpc volume +5

듣고 있는 환경에서 볼륨을 5퍼센트 올려줍니다.

◈$mpc play

재생목록 상에서 순서가 된 부분을 재생해줍니다. 

◈$mpc stop

듣고 있는 부분을 정지 시킵니다. 





4. 소스코드
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
import pifacecad 
import lirc
import os 
import sys 
import subprocess
import time
from time import sleep
from pygame import mixer
 
cad = pifacecad.PiFaceCAD()
backlight = 0 
status = "stopped" 
channel_pos = 0 
channelLink = ["mms://210.96.79.102/Incheon","mms://210.96.79.102/Junju","mms://211.181.136.136/livefm","mms://114.108.140.39/magicfm_live","mms://210.105.237.100/mbcam","mms://211.218.209.124/L-FM_300k","mms://live.febc.net/LiveFm",'mms://222.116.93.208:7080',"mms://vod.ysmbc.co.kr/YSFM"] 
channelName = ["Incheon","TBN","MBC FM4U","SBS PowerFM","MBC FM","EBS FM","YSFM"] 
 
#초기 화면 구성
cad = pifacecad.PiFaceCAD()
cad.lcd.backlight_on()
cad.lcd.write("WELCOME TO")
cad.lcd.set_cursor(7,1)
cad.lcd.write("RASPBERRY")
time.sleep(1.5)
cad.lcd.clear()
cad.lcd.write("1.MP3 PLAYER")
cad.lcd.set_cursor(0,1)
cad.lcd.write("2.RADIO")
 
 
sockid = lirc.init("irexec", blocking = False)
 
# 디스플레이와 외부입력(버튼 입력)으로부터 수행해주는 함수 
 
def update_pin_text(event):
   global channel_pos
   global status
   if(event.pin_num == 0):
      status = "playing"
      os.system('mpc play')
      event.chip.lcd.set_cursor(0, 1)
      event.chip.lcd.write_custom_bitmap(1)
      event.chip.lcd.write(" ")
      display_channel()
      display_playlist()
 
   elif(event.pin_num == 1):
      status = "stopped"
      os.system('mpc stop')
      event.chip.lcd.set_cursor(0, 1)
      event.chip.lcd.write_custom_bitmap(2)
      event.chip.lcd.write(" ")
      clear_channel()
 
   elif(event.pin_num == 2 and status == "playing" and channel_pos > 1):
      os.system('mpc prev')
      clear_channel()
      display_channel()
      display_playlist()
 
   elif(event.pin_num == 3 and status == "playing" and channel_pos < len(channelLink)):
      os.system('mpc next')
      clear_channel()
      display_channel()
      display_playlist()
 
   elif(event.pin_num == 4):
      global backlight
      if(backlight == 1):
         event.chip.lcd.backlight_off()
         backlight = 0
      else:
         event.chip.lcd.backlight_on()
         backlight = 1
 
   elif(event.pin_num == 5):
      clear_time()
      time_show()
      time.sleep(1.5)
      clear_time()
 
   elif(event.pin_num == 6):
      os.system('mpc volume -5')
      display_volume()
 
   elif(event.pin_num == 7):
      os.system('mpc volume \+5')
      display_volume()
 
   else:
      sleep(1)
 
 
 
 
def time_show():
   now = time.localtime()
   cad.lcd.set_cursor(9,0)
   times = "%02d:%02d" % (now.tm_hour,now.tm_min)
   cad.lcd.write(times)
   time.sleep(2)
 
 
 
 
#인터넷 라디오 채널을 mpc list에 추가해주는 함수
def create_playlist(): 
   subprocess.check_output("mpc clear", shell=True, stderr=subprocess.STDOUT, universal_newlines=True) 
   for channel in channelLink: 
      subprocess.check_output("mpc add " + channel, shell=True, stderr=subprocess.STDOUT, universal_newlines=True) 
 
 
# LCD에 표현되는 스피커 모양, 재생 모양, 현재 진행되는 채널들을 비트맵화해서 표현 
def custom_bitmaps():
   speaker = pifacecad.LCDBitmap([1,3,15,15,15,3,1,0])
   play = pifacecad.LCDBitmap([0,8,12,14,12,8,0,0])
   stop = pifacecad.LCDBitmap([0,31,31,31,31,31,0,0])
   playlist = pifacecad.LCDBitmap([2,3,2,2,14,30,12,0])
   cad.lcd.store_custom_bitmap(0, speaker) 
   cad.lcd.store_custom_bitmap(1, play) 
   cad.lcd.store_custom_bitmap(2, stop)
   cad.lcd.store_custom_bitmap(3, playlist)
 
 
 
 
# 디스플레이를 초기화    
def init_display(): 
   cad.lcd.set_cursor(11, 1) 
   cad.lcd.write_custom_bitmap(0) 
   display_volume() 
 
 
# 재생 목록 위치를 기반으로 채널 이름 검색 및 표시   
def display_channel(): 
   global channel_pos 
   channel = subprocess.check_output("mpc status | grep playing", shell=True, stderr=subprocess.STDOUT, universal_newlines=True) 
   channel = channel[channel.find("#")+1:channel.find("/")] 
   channel_pos = int(channel) 
   channel = channelName[int(channel)-1] 
   cad.lcd.set_cursor(0, 0)
   cad.lcd.write(channel)
 
# 빈줄을 표시해주는 함수
def clear_channel(): 
   cad.lcd.set_cursor(0, 0) 
   cad.lcd.write("                ")
 
def clear_time(): 
   cad.lcd.set_cursor(0, 9) 
   cad.lcd.write("     ")
   
def fordebug(): 
   cad.lcd.set_cursor(0, 0) 
   cad.lcd.write("hh")
 
 
# mpc 및 표시에서 plylist 위치 및 크기 검색 
def display_playlist(): 
   playlist = subprocess.check_output("mpc status | grep playing", shell=True, stderr=subprocess.STDOUT, universal_newlines=True) 
   playlist = playlist[playlist.find("#")+1:playlist.find("/")+2] 
   cad.lcd.set_cursor(4, 1) 
   cad.lcd.write_custom_bitmap(3) 
   cad.lcd.write(playlist) 
 
 
# 현재 볼륨 레벨 표시 
def display_volume(): 
   volume = subprocess.check_output("mpc status | grep volume", shell=True, stderr=subprocess.STDOUT, universal_newlines=True) 
   volume = volume[7:volume.find("%")+1]
   cad.lcd.set_cursor(12, 1) 
   cad.lcd.write(volume) 
 
 
 
global radiostate
global num2
radioplay=1
 
 
while True:
   while cad.switches[0].value:   # mp3 플레이어를 선택한 경우 (앞 포스터 확인)
   
      ...
 
   while cad.switches[1].value:   #라디오 플레이어를 선택한 경우
      cad.lcd.backlight_on()
      custom_bitmaps() 
      create_playlist() 
      init_display()
      while True:
         flags = 1#display_channel()
         while True:
            if flags ==0:
               cad.lcd.set_cursor(11, 1) 
               cad.lcd.write_custom_bitmap(0)
               init_display()
            remote = lirc.nextcode()
            if cad.switches[1].value or ((len(remote)>0) and remote[0]=='KEY_MUTE'):
               if flags == 1:
                  status = "stopped"
                  os.system('mpc toggle')
                  cad.lcd.set_cursor(0, 1)
                  cad.lcd.write_custom_bitmap(2)
                  cad.lcd.set_cursor(13, 1)
                  cad.lcd.write(" ")
                  cad.lcd.write("-0%")
            elif cad.switches[0].value or ((len(remote)>0) and remote[0]=='KEY_PLAY'):
               flags = 1#init_display()
               status = "playing"
               os.system('mpc play')
               cad.lcd.set_cursor(0, 1)
               cad.lcd.write_custom_bitmap(1)
               cad.lcd.write(" ")
               display_channel()
               display_playlist()
               display_volume()
               continue
            elif cad.switches[3].value or ((len(remote)>0) and remote[0]=='KEY_CHANNELUP' and status == "playing" and channel_pos < len(channelLink)): #next song
               os.system('mpc next')
               clear_channel()
               display_channel()
               display_playlist()
               display_volume()
               continue
            elif cad.switches[2].value or ((len(remote)>0) and remote[0]=='KEY_CHANNELDOWN'): #prev song
               os.system('mpc prev')
               clear_channel()
               display_channel()
               display_playlist()
               display_volume()
               continue
            elif cad.switches[7].value or ((len(remote)>0) and remote[0]=='KEY_VOLUMEUP'): #volume
               os.system('mpc volume +5')
               display_volume()
               display_channel()
               display_playlist()#cad.lcd.clear()
               continue
            elif cad.switches[6].value or ((len(remote)>0) and remote[0]=='KEY_VOLUMEDOWN'):
               os.system('mpc volume -5')
               display_volume()
               cad.lcd.write(" ")
               display_channel()
               display_playlist()
               continue
cs









5. 데모영상


 

이상 부족한 제글 구독해주셔서 정말 감사합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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