Radio por Internet Pi-Arduino
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
|
Acerca de este proyecto
Descripción general
Me encanta escuchar la radio cuando estoy haciendo algo o cocinando, pero donde vivo la recepción de FM es terrible. Y con Internet, escuchar estaciones de radio del mundo es un placer, pero no me gusta usar mi teléfono inteligente para escuchar música, así que con muchas búsquedas en Google, encontré varias soluciones.
Basé este proyecto en otro tutorial:Arduino / Raspberry Pi Internet Radio de akellyirl. El código está escrito en Python en la Raspberry Pi y básicamente usa el demonio del reproductor de música de Linux (mpd) y el reproductor (mpd). Hay una biblioteca nanpy que permite a Python comunicarse con el Arduino que controla los botones y la pantalla LCD.
Usé un protector de teclado / LCD para el Arduino que tiene botones pulsadores:Protector de teclado LCD SainSmart para Arduino, y luego agregué una tira de 4 botones que deseché de un reloj despertador roto. Primero usé una Raspberry Pi 2 con un adaptador WiFi USB, pero ahora estoy usando un RP3 que tiene WIFI integrado y no necesita antena.
La parte más difícil fue encontrar las URL correctas de las estaciones que quería. Finalmente encontré este programa:URL HELPER que rastrea el sitio en el que se encuentra y muestra las URL de los medios que se están reproduciendo. Para el sonido, utilicé un par de parlantes de computadora activos que también se recuperaron de la papelera.
Instrucciones de instalación
Instrucciones de instalación para RP3 (de Arduino / Raspberry Pi Internet Radio por akellyirl en Arduino):
1. Actualice Raspbian a los paquetes más recientes:
$ sudo apt-get update
2. Instale los paquetes mpd / mpc:
$ sudo apt-get install mpc mpd
Queremos poder hablar con Arduino desde Python que se ejecuta en Pi. Para hacer eso, necesitamos instalar la biblioteca nanpy para Python y el firmware nanpy para Arduino:
1. Instale los paquetes de Arduino para construir el firmware nanpy para Arduino:
$ apt-get install arduino
2. Obtenga la biblioteca nanpy para Python y extráigala de / home / pi:
$ wget http://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz $ tar xvf nanpy-v0.7.tar.gz
3. Obtenga setuptools para Python (una dependencia de nanpy) y extraiga:
$ wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e $ tar xvf setuptools-0.6c11.tar.gz
4. Obtenga pyserial para Python (una dependencia de nanpy) y extraiga:
$ wget http://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz $ tar xvf pyserial-2.6.tar.gz
5. Vaya al directorio setuptools e instale Python setuptools:
$ cd setuptools-0.6c11 $ sudo python setup.py install
6. Vaya al directorio nanpy e instale la biblioteca nanpy de Python:
$ cd ../nanpy $ sudo python setup.py install
7. Vaya al directorio serial e instale la biblioteca serial de Python:
$ cd ../pyserial-2.6 $ sudo python setup.py install
Ahora que tenemos los archivos que necesitamos, coloquemos el firmware nanpy en el Arduino.
Firmware
nanpy permite que un programa Python que se ejecuta en Raspberry Pi opere el Arduino usando la sintaxis convencional de Arduino-Sketch, p. el programa Python para leer una entrada analógica de Arduino podría leer:
int val =Arduino.analogRead (14)
Nanpy tiene dos componentes:
- Una biblioteca para Python que permite que los comandos de Arduino se escriban en una sintaxis familiar y se comuniquen con Arduino;
- Firmware que se ejecuta en Arduino, comunicándose con Python en la Pi.
Instalamos la parte Python de nanpy y descargamos la parte Arduino de nanpy en el Pi en el último paso. Ahora necesitamos cargar el firmware nanpy en Arduino.
Conecta Arduino al USB de Raspberry Pi.
1. Vaya al directorio de firmware nanpy y cárguelo en Arduino:
$ cd ../nanpy/firmware $ export BOARD =uno $ make $ make upload
Si recibe un informe de que el dispositivo no se encuentra en / dev / ttyACM0, conecte el Arduino al otro puerto USB.
Creé un script de lista de reproducción y un script de Python (publicado en la pestaña de código) e hice que el script de Python se ejecutara automáticamente en el arranque de la Raspberry. También agregué otro botón para mostrar algunas opciones de menú, como mostrar la IP o elegir la salida de audio.
última actualización:lo rehice:, agregué codificadores rotatorios para marcar y ajustar el volumen e imprimí la carcasa en 3D:
Código
- piradio
- radio_plylist.sh
piradio Python
No soy un programador de Python (esto es principalmente copiar / pegar de bits que encontré en google.hasta ahora funciona :)
Este script debe cargarse al inicio en el pi, agregué a una tarea crontab
de datetime import datetimefrom subprocess import * from time import sleep, strftimefrom Queue import Queuefrom threading import Threadimport osfrom nanpy import Arduino, Lcdimport socketArduino.pinMode (14, input) lcd =Lcd ([8,9,4,5,6,7], [16,2]) # Configure los pines LCD para Sainsmart Shieldlcd.printString ("Ruben's RadioZ", 0,0) lcd.printString ("Cargando" + "." * 3,0,1) sleep (5) max_trax =10x =1loop_menu =1loop_radio =1stations =[] # agregado para mostrar el nombre de la estación cuando se presiona el botónstations.append ("Ecco 99") estaciones.append ("Galgalaz") estaciones.append ("Galaz") estaciones.append ("88 FM") estaciones.append ("Gimel") estaciones.append ("Radios 100fm") estaciones.append ("Kol Hamusica" ) estaciones.append ("WQXR Nueva York") estaciones.append ("WPR Winsconsin") estaciones.append ("BBC world servic") estaciones.append ("LINN jazz") estaciones.append ("LINN clásica") #. ........... def get_local_ip_address (destino):ipaddr ='' try:s =socket.socke t (socket.AF_INET, socket.SOCK_DGRAM) s.connect ((target, 8000)) ipaddr =s.getsockname () [0] s.close () excepto:pass return ipaddrprint "Raspberry Pi - Dirección IP local" print ( get_local_ip_address ('10 .0.1.1 ')) print (get_local_ip_address (' google.com ')) # muestra la dirección IP def display_ipaddr ():show_wlan0 ="ip addr show wlan0 | cut -d / -f1 | awk '/ inet / {printf \ "w% 15.15s \", $ 2}' "show_eth0 =" dirección ip 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 ('Dirección IP:', 0,0) lcd.printString (ipaddr, 0,1) sleep (2) #menu en el quinto pulsador def displaymenu ():si x ==1 :lcd.printString ("1. Pantalla", 0,0) lcd.printString ("Dirección IP", 0,1) elif x ==2:lcd.printString ("2. Salida de audio", 0,0) lcd .printString ("al puerto hdmi", 0,1) elif x ==3:lcd.printString ("3. Salida de audio", 0,0) lcd.printString ("al puerto analógico", 0,1) elif x ==4:lcd.printString ("4. Salida de audio", 0,0) lcd.printString ("Auto Sel. Port", 0,1) elif x ==5:lcd.printString ("5. Recargue el" , 0,0) lcd.printString ("Playlist", 0,1) elif x ==6:lcd.printString ("6. ShutDown", 0,0) lcd.printString ("el Sistema", 0,1) else:lcd.printString ("7. Salir a", 0,0) lcd.printString ("Menú principal", 0,1) def load_playlist ():output =run_cmd ("mpc clear") output =run_cmd ("/ inicio / pi / radio / radio_playlist.sh ") def ru n_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') para S en os.popen ('mpc'). Readlines ()] # Obtener la información de la pista desde la salida estándar del comando mpc output =run_cmd ("mpc current") station =output [0:16] # Selecciona la información de la estación y la pista track =output [-17:-1] lcd.printString (station + "" * (16 - len (estación)), 0, 0) lcd.printString (track + "" * (16 - len (track)), 0, 1) track_num =1 # Inicio en la pista número 1os.system (" sudo service mpd restart ") os.system (" mpc play "+ str (track_num)) # Dile al SO que lo reproduzca mientras loop_radio ==1:getTrack () loop_menu =1 x =1 key =getKey () if key =="ARRIBA":track_num + =1 si track_num> max_trax:trac k_num =1 lcd.printString (estaciones [track_num-1], 0,0) os.system ("sudo service mpd restart") os.system ("mpc play" + str (track_num)) getTrack () tecla elif =="DOWN":track_num - =1 si track_num <1:track_num =max_trax lcd.printString (estaciones [track_num-1], 0,0) os.system ("sudo service mpd restart") os.system ("mpc play" + str (track_num)) getTrack () tecla elif =="LEFT":os.system ("mpc volume +10") lcd.printString (16 * "", 0, 0) lcd.printString (16 * "", 0, 1) salida =run_cmd ("volumen mpc") lcd.printString ("SUBIR VOLUMEN:", 0, 0) lcd.printString (salida, 5, 1) suspensión (.25) lcd.printString (16 * "" , 0,0) lcd.printString (16 * "", 0,1) tecla elif =="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) tecla elif =="SEL":while loop_menu ==1:tecla displaymenu () =getKey () si clave =="DERECHA":os.system ("mpc volumen +10 ") lcd.printString (16 *" ", 0, 0) lcd.printString (16 *" ", 0, 1) salida =run_cmd (" volumen mpc ") lcd.printString (" SUBIR VOLUMEN:", 0, 0) lcd.printString (salida, 5, 1) sleep (.25) lcd.printString (16 * "", 0,0) lcd.printString (16 * "", 0,1) tecla elif ==" IZQUIERDA ":os.system (" mpc volume -10 ") lcd.printString (16 *" ", 0,0) lcd.printString (16 *" ", 0,1) salida =run_cmd (" mpc volume ") lcd .printString ("BAJAR VOLUMEN:", 0, 0) lcd.printString (salida, 5, 1) dormir (.25) lcd.printString (16 * "", 0,0) lcd.printString (16 * "", 0,1) tecla elif =="ARRIBA":si x <=1:x =7 else:x =x - 1 tecla elif =="ABAJO":si x> =7:x =1 más:x =x + 1 tecla elif =="SEL":si 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 ("salida", 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 (" salida ", 0, 1) sleep (.5) elif x ==4:salida =run_cmd ("amixer -q cset numid =3 0") lcd.printString ("Audio OUT-> Auto", 0, 0) lcd.printString ("salida", 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) salida =run_cmd (" volumen mpc ") lcd.printString (" SUBIR VOLUMEN:", 0 , 0) lcd.printString (salida, 5, 1) sleep (.25) lcd.printString (16 * "", 0,0) lcd.printString (16 * "", 0,1) tecla elif =="LEFT ":os.system (" mpc volume -2 ") lcd.printString (16 *" ", 0, 0) lcd.printString (16 *" ", 0, 1) salida =run_cmd (" mpc volume ") lcd. printString ("BAJAR VOLUMEN:", 0, 0) lcd.printString (salida, 5, 1) dormir (.25) lcd.printString (16 * "", 0,0) lcd.printString (16 * "", 0 , 1)
radio_plylist.sh SH
esta es mi lista de reproducción con emisoras israelíes#! / bin / shmpc clear 1> / dev / null # 1 ecco99mpc agregar http://99.livecdn.biz/99fm_aac#2 galgalazmpc agregar http://glglzwizzlv.bynetcdn.com/glglz_mp3#3 galazmpc agregar http:// glzwizzlv .bynetcdn.com / glz_mp3 # 4 88 fmmpc agregar http://ibala.vidnt.com:8000/iba_radio-88fmM#5 gimelmpc agregar http://ibala.vidnt.com:8000/iba_radio-gimelM#6 radios 100 fmmpc agregar http://100fm.streamgates.net/Radios100Fm#7 kol hamusicampc agregar http://ibala.vidnt.com:8000/iba_radio-kolmusicaM#8 wqxrmpc agregar http://stream.wqxr.org/wqxr#9 npr currentmpc agregar http://current.stream.publicradio.org/kcmp.mp3#10 bbcmpc agregar http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk#11 linn jazzmpc agregar http://radio.linnrecords .com:8003 / autodj # 12 linn clásicompc agregar http://radio.linnrecords.com:8004/autodj
Esquemas
Proceso de manufactura
- Mando a distancia universal Raspberry Pi
- Un trozo de Raspberry Pi
- Cycle Chaser
- Detector de ladrones Raspberry Pi
- Sensor de temperatura Raspberry Pi
- RASPBERRY PI HOME AUTOMATION
- MrRobot - Robotics habilitado para la aplicación Ubuntu Mobile (Raspberry Pi y arduino involucrados)
- Robot de caja de CD Raspberry Pi
- Robot Raspberry Pi controlado por Bluetooth
- Cree su robot de transmisión de video controlado por Internet con Arduino y Raspberry Pi
- Placa RaspiRobot V2