Bangun Radio Internet Wi-Fi dengan Raspberry Pi dan Arduino: Streaming Stasiun Global
Komponen dan Perlengkapan
Arduino UNO – 1 unit
Raspberry Pi 3 Model B – 1 unit
SainSmart LCD Keypad Shield for Arduino – 1 unit
Sumber daya 5V – 1 unit
Aplikasi dan Layanan Online
python
Tentang Proyek
Ringkasan
Saya suka mendengarkan radio saat saya membuat sesuatu atau memasak, tetapi di tempat saya tinggal penerima FM buruk. Dan dengan Internet, mendengarkan stasiun radio di dunia adalah kesenangan, tetapi saya tidak suka menggunakan ponsel saya untuk mendengarkan musik, jadi dengan banyak Googling, saya menemukan beberapa solusi.
Saya mendasari proyek ini pada tutorial lain: Arduino / Raspberry Pi Internet Radio oleh akellyirl. Kode ditulis dalam Python pada Raspberry Pi dan pada dasarnya menggunakan Linux music player daemon (mpd) dan player (mpd). Ada library nanpy yang memungkinkan Python berkomunikasi dengan Arduino yang mengontrol tombol push dan LCD.
Saya menggunakan shield LCD/papan kunci untuk Arduino yang memiliki tombol push: SainSmart LCD Keypad Shield for Arduino, dan kemudian menambahkan pita 4 tombol push yang saya ambil dari jam alarm yang rusak. Pertama saya menggunakan Raspberry Pi 2 dengan adapter USB WiFi, tetapi sekarang saya menggunakan RP3 yang memiliki WiFi bawaan dan tidak perlu antena.
Bagian yang paling sulit adalah menemukan URL yang tepat dari stasiun yang saya inginkan. Akhirnya saya menemukan program ini: URL HELPER yang mencurigai situs yang Anda kunjungi dan menunjukkan URL media yang diputar. Untuk suara, saya menggunakan sepasang speaker komputer aktif juga yang diambil dari sisa.
Instruksi Instalasi
Instruksi instalasi untuk RP3 (dari Arduino / Raspberry Pi Internet Radio oleh akellyirl di Arduino):
1. Perbarui Raspbian ke paket terbaru:
$ sudo apt-get update
2. Instal paket mpd/mpc:
$ sudo apt-get install mpc mpd
Kami ingin dapat berbicara dengan Arduino dari Python yang berjalan di Pi. Untuk melakukannya, kita perlu menginstal library nanpy untuk Python dan firmware nanpy untuk Arduino:
1. Instal paket Arduino untuk membangun firmware nanpy untuk Arduino:
$ apt-get install arduino
2. Dapatkan library nanpy untuk Python dan ekstrak dari /home/pi:
$ wget https://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz $ tar xvf nanpy-v0.7.tar.gz
3. Dapatkan setuptools untuk Python (dependensi nanpy) dan ekstrak:
$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e $ tar xvf setuptools-0.6c11.tar.gz
4. Dapatkan pyserial untuk Python (dependensi nanpy) dan ekstrak:
$ wget https://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz $ tar xvf pyserial-2.6.tar.gz
5. Pergi ke direktori setuptools dan instal Python setuptools:
$ cd setuptools-0.6c11 $ sudo python setup.py install
6. Pergi ke direktori nanpy dan instal library Python nanpy:
$ cd ../nanpy $ sudo python setup.py install
7. Pergi ke direktori serial dan instal library Python serial:
$ cd ../pyserial-2.6 $ sudo python setup.py install
Sekarang kita telah memiliki file yang kita butuhkan, mari kita tempatkan firmware nanpy pada Arduino.
Firmware
nanpy memungkinkan program Python yang berjalan pada Raspberry Pi untuk mengoperasikan Arduino menggunakan sintaks Sketch Arduino konvensional, misalnya program Python untuk membaca input analog dari Arduino mungkin membaca:
int val = Arduino.analogRead(14)
Nanpy memiliki dua komponen:
Library untuk Python yang memungkinkan perintah Arduino ditulis dalam sintaks yang familiar dan berkomunikasi dengan Arduino;
Firmware yang berjalan pada Arduino, berkomunikasi dengan Python di Pi.
Kami telah menginstal bagian Python dari nanpy dan mengunduh bagian Arduino dari nanpy pada Pi pada langkah terakhir. Sekarang kita perlu mengunggah firmware nanpy ke Arduino.
Colokkan Arduino ke USB Raspberry Pi.
1. Pergi ke direktori firmware nanpy dan unggah ke Arduino:
$ cd ../nanpy/firmware $ export BOARD=uno $ make $ make upload
Jika Anda mendapatkan laporan bahwa perangkat tidak ditemukan di /dev/ttyACM0, colokkan Arduino ke port USB lainnya.
Saya membuat skrip playlist dan skrip Python (diterbitkan di tab kode) dan membuat skrip Python berjalan otomatis saat boot Raspberry. Saya juga menambahkan tombol push lain untuk menampilkan beberapa opsi menu seperti menampilkan IP atau memilih output audio.
update terakhir: saya membuatnya ulang: , menambahkan rotary encoder untuk menyalurkan dan volume dan mencetak 3D casing:
Kode
piradio
radio_plylist.sh
piradioPython
Saya bukan programmer Python (ini sebagian besar copy/paste dari bagian yang saya temukan di google. sejauh ini berhasil:) Skrip ini harus dimuat saat startup di pi, saya menambahkan ke tugas crontab
from datetime import datetime from subprocess import * from time import sleep, strftime from Queue import Queue from threading import Thread import os from nanpy import Arduino, Lcd import socket Arduino.pinMode(14, input) lcd = Lcd([8,9,4,5,6,7],[16,2]) # Setup the LCD pins for the Sainsmart Shield lcd.printString("Ruben's RadioZ",0,0) lcd.printString("Loading" + "."*3,0,1) sleep(5) max_trax = 10 x = 1 loop_menu = 1 loop_radio = 1 stations=[] #added to show the station name when push button pressed stations.append("Ecco 99 ") stations.append("Galgalaz ") stations.append("Galaz ") stations.append("88 FM ") stations.append("Gimel ") stations.append("Radios 100fm ") stations.append("Kol Hamusica ") stations.append("WQXR New York ") stations.append("WPR Winsconsin ") stations.append("BBC world servic") stations.append("LINN jazz") stations.append("LINN classical") #............ def get_local_ip_address(target): ipaddr = '' try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((target, 8000)) ipaddr = s.getsockname()[0] s.close() except: pass return ipaddr print "Raspberry Pi - Local IP Address" print(get_local_ip_address('10.0.1.1')) print(get_local_ip_address('google.com')) #show the ip address def display_ipaddr(): show_wlan0 = "ip addr show wlan0 | cut -d/ -f1 | awk '/inet/ {printf \"w%15.15s\", $2}'" show_eth0 = "ip addr show eth0 | cut -d/ -f1 | awk '/inet/ {printf \"e%15.15s\", $2}'" ipaddr = '' #ipaddr = run_cmd(show_eth0) ipaddr =get_local_ip_address('10.0.1.1') #if ipaddr == "": # ipaddr = run_cmd(show_wlan0) lcd.printString('IP Address:',0,0) lcd.printString(ipaddr,0,1) sleep(2) #menu in the fifth pushbutton def displaymenu(): if x==1: lcd.printString("1. Display ",0,0) lcd.printString(" IP Address ",0,1) elif x==2: lcd.printString("2. Audio Output ",0,0) lcd.printString(" to hdmi Port ",0,1) elif x==3: lcd.printString("3. Audio Output ",0,0) lcd.printString(" to Analog port",0,1) elif x==4: lcd.printString("4. Audio Output ",0,0) lcd.printString(" Auto Sel. Port",0,1) elif x==5: lcd.printString("5. Reload the ",0,0) lcd.printString(" Playlist ",0,1) elif x==6: lcd.printString("6. ShutDown ",0,0) lcd.printString(" the System ",0,1) else: lcd.printString("7. Exit to ",0,0) lcd.printString(" Main Menu ",0,1) def load_playlist(): output = run_cmd("mpc clear") output = run_cmd("/home/pi/radio/radio_playlist.sh") def run_cmd(cmd): p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT) output = p.communicate()[0] return output def getKey(): val = Arduino.analogRead(14) if val == 1023: return "NONE" elif val < 100: return "RIGHT" elif val < 150: return "UP" elif val < 330: return "DOWN" elif val < 510: return "LEFT" elif val < 750: return "SEL" else: return "KBD_FAULT" load_playlist() def getTrack(): L= [S.strip('\n') for S in os.popen('mpc').readlines()] # Get the Track info from the stdout of the mpc command output = run_cmd("mpc current") station = output [0:16] # Pick out the Station and Track info track = output [-17:-1] lcd.printString(station + " "*(16 - len(station)), 0, 0) lcd.printString(track + " "*(16 - len(track)), 0, 1) track_num = 1 # Start off on Track number 1 os.system("sudo service mpd restart") os.system("mpc play "+str(track_num)) # Tell the OS to Play it while loop_radio == 1: getTrack() loop_menu = 1 x = 1 key = getKey() if key == "UP": track_num += 1 if track_num > max_trax: track_num = 1 lcd.printString(stations[track_num-1],0,0) os.system("sudo service mpd restart") os.system("mpc play " + str(track_num)) getTrack() elif key == "DOWN": track_num -= 1 if track_num < 1: track_num = max_trax lcd.printString(stations[track_num-1],0,0) os.system("sudo service mpd restart") os.system("mpc play " + str(track_num)) getTrack() elif key == "LEFT": os.system("mpc volume +10") lcd.printString(16*" ", 0, 0) lcd.printString(16*" ", 0, 1) output = run_cmd("mpc volume") lcd.printString("VOLUME UP:", 0, 0) lcd.printString(output, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif key == "RIGHT": os.system("mpc volume -10") lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) output = run_cmd("mpc volume") lcd.printString("VOLUME DOWN:", 0, 0) lcd.printString(output, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif key == "SEL": while loop_menu == 1: displaymenu() key = getKey() if key == "RIGHT": os.system("mpc volume +10") lcd.printString(16*" ", 0, 0) lcd.printString(16*" ", 0, 1) output = run_cmd("mpc volume") lcd.printString("VOLUME UP:", 0, 0) lcd.printString(output, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif key == "LEFT": os.system("mpc volume -10") lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) output = run_cmd("mpc volume") lcd.printString("VOLUME DOWN:", 0, 0) lcd.printString(output, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif key == "UP": if x <= 1: x = 7 else: x = x - 1 elif key == "DOWN": if x >= 7: x = 1 else: x = x + 1 elif key == "SEL": if x == 1: display_ipaddr() #get_local_ip_address() sleep(1) elif x == 2: output = run_cmd("amixer -q cset numid=3 2") lcd.printString("Audio OUT-->HDMI", 0, 0) lcd.printString("output ", 0, 1) sleep(.5) elif x == 3: output = run_cmd("amixer -q cset numid=3 1") lcd.printString("Audio OUT->Analog", 0, 0) lcd.printString("output ", 0, 1) sleep(.5) elif x == 4: output = run_cmd("amixer -q cset numid=3 0") lcd.printString("Audio OUT-> Auto", 0, 0) lcd.printString("output ", 0, 1) sleep(.5) elif x == 5: load_playlist() os.system('mpc play 1') elif x == 6: lcd.printString("Good Bye ", 0, 0) lcd.printString("Have a Nice Day ", 0, 1) output = run_cmd("mpc stop") # = run_cmd("sudo shutdown now") quit() elif x == 7: loop_menu = 0 getTrack() break elif key == "RIGHT": os.system("mpc volume +2") lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) output = run_cmd("mpc volume") lcd.printString("VOLUME UP:", 0, 0) lcd.printString(output, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif key == "LEFT": os.system("mpc volume -2") lcd.printString(16*" ", 0, 0) lcd.printString(16*" ", 0, 1) output = run_cmd("mpc volume") lcd.printString("VOLUME DOWN:", 0, 0) lcd.printString(output, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1)
radio_plylist.shSH
ini adalah playlist saya dengan stasiun Israel
#! /bin/sh mpc clear 1>/dev/null #1 ecco99 mpc add https://99.livecdn.biz/99fm_aac #2 galgalaz mpc add https://glglzwizzlv.bynetcdn.com/glglz_mp3 #3 galaz mpc add https://glzwizzlv.bynetcdn.com/glz_mp3 #4 88 fm mpc add https://ibala.vidnt.com:8000/iba_radio-88fmM #5 gimel mpc add https://ibala.vidnt.com:8000/iba_radio-gimelM #6 radios 100 fm mpc add https://100fm.streamgates.net/Radios100Fm #7 kol hamusica mpc add https://ibala.vidnt.com:8000/iba_radio-kolmusicaM #8 wqxr mpc add https://stream.wqxr.org/wqxr #9 npr current mpc add https://current.stream.publicradio.org/kcmp.mp3 #10 bbc mpc add https://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk #11 linn jazz mpc add https://radio.linnrecords.com:8003/autodj #12 linn classical mpc add https://radio.linnrecords.com:8004/autodj