Интернет-радио Pi-Arduino
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
|
Об этом проекте
Обзор
Я люблю слушать радио, когда что-то делаю или готовлю, но там, где я живу, FM-прием ужасен. А с Интернетом слушать радиостанции мира - одно удовольствие, но я не люблю использовать свой смартфон для прослушивания музыки, поэтому, много гуглил, я нашел несколько решений.
Я основывал этот проект на другом руководстве:Интернет-радио Arduino / Raspberry Pi от akellyirl. Код написан на Python на Raspberry Pi и в основном использует демон музыкального проигрывателя Linux (mpd) и проигрыватель (mpd). Есть библиотека nanpy это позволяет Python взаимодействовать с Arduino, который управляет кнопками и ЖК-дисплеем.
Я использовал экран LCD / клавиатуры для Arduino с кнопками:SainSmart LCD Keypad Shield для Arduino, а позже добавил полосу с 4 кнопками, которую я выбросил из сломанного будильника. Сначала я использовал Raspberry Pi 2 с USB-адаптером WiFi, но теперь я использую RP3 со встроенным Wi-Fi и без антенны.
Самым сложным было найти правильные URL-адреса станций, которые мне нужны. Наконец я нашел эту программу:URL HELPER, которая обнюхивает сайт, на котором вы находитесь, и показывает URL-адреса воспроизводимого мультимедиа. Для звука я использовал пару активных компьютерных динамиков, также восстановленных из металлолома.
Инструкция по установке
Инструкция по установке RP3 (из Интернет-радио Arduino / Raspberry Pi от akellyirl в Arduino):
1. Обновите Raspbian до последних пакетов:
$ sudo apt-get update
2. Установите пакеты mpd / mpc:
$ sudo apt-get install mpc mpd
Мы хотим иметь возможность общаться с Arduino из Python, работающего на Pi. Для этого нам нужно установить библиотеку nanpy для Python и прошивку nanpy для Arduino:
1. Установите пакеты Arduino для сборки микропрограммы nanpy для Arduino:
$ apt-get install arduino
2. Получите библиотеку nanpy для Python и извлеките из / home / pi:
$ wget http://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz $ tar xvf nanpy-v0.7.tar.gz
3. Получите setuptools для Python (зависит от nanpy) и извлеките:
$ wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e $ tar xvf setuptools-0.6c11.tar.gz код>
4. Получите pyserial для Python (зависимость от nanpy) и извлеките:
$ wget http://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz $ tar xvf pyserial-2.6.tar.gz
5. Перейдите в каталог setuptools и установите Python setuptools:
$ cd setuptools-0.6c11 $ sudo python setup.py install
6. Перейдите в каталог nanpy и установите библиотеку Python nanpy:
$ cd ../nanpy $ sudo python setup.py install
7. Перейдите в каталог последовательного порта и установите последовательную библиотеку Python:
$ cd ../pyserial-2.6 $ sudo python setup.py install
Теперь, когда у нас есть нужные файлы, давайте поместим прошивку nanpy на Arduino.
Прошивка
nanpy позволяет программе Python, работающей на Raspberry Pi, управлять Arduino с использованием обычного синтаксиса Arduino-Sketch, например программа Python для чтения аналогового ввода от Arduino может читать:
int val =Arduino.analogRead (14)
Nanpy состоит из двух компонентов:
- Библиотека для Python, которая позволяет писать команды Arduino в знакомом синтаксисе и взаимодействовать с Arduino;
- Прошивка, которая работает на Arduino и взаимодействует с Python на Pi.
Мы установили Python-часть nanpy и загрузили Arduino-часть nanpy на Pi на последнем шаге. Теперь нам нужно загрузить прошивку nanpy в Arduino.
Подключите Arduino к USB-порту Raspberry Pi.
1. Перейдите в каталог прошивки nanpy и загрузите в Arduino:
$ cd ../nanpy/firmware $ export BOARD =uno $ make $ make upload
Если вы получили сообщение о том, что устройство не найдено в / dev / ttyACM0, подключите Arduino к другому USB-порту.
Я создал сценарий списка воспроизведения и сценарий Python (опубликованный на вкладке кода) и сделал автоматический запуск сценария Python при загрузке Raspberry. Я также добавил еще одну кнопку, чтобы отобразить некоторые параметры меню, такие как отображение IP или выбор аудиовыхода.
последнее обновление:я переделал его:, добавил поворотные энкодеры для набора и регулировки громкости, а также напечатал корпус на 3d-принтере:
Код
- пирадио
- radio_plylist.sh
пирадио Python
Я не программист на Python (в основном это копирование / прошлое из битов, которые я нашел в google.пока работает :)
Этот скрипт должен загружаться при запуске в пи, я добавил в crontab задачу
from 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]) # Настройте выводы ЖК-дисплея для Sainsmart Shieldlcd.printString ("Ruben's RadioZ", 0,0) lcd.printString ("Загрузка" + "." * 3,0,1) sleep (5) max_trax =10x =1loop_menu =1loop_radio =1stations =[] # добавлено, чтобы отображать имя станции при нажатии кнопки stations.append ("Ecco 99") station.append ("Галгалаз") station.append ("Galaz") station.append ("88 FM") station.append ("Gimel") station.append ("Радио 100fm") station.append ("Kol Hamusica" ) station.append ("WQXR New York") station.append ("WPR Winsconsin") station.append ("BBC world servic") station.append ("LINN jazz") station.append ("LINN classic") #. ........... def get_local_ip_address (цель):ipaddr ='' попробуйте:s =socket.socke t (socket.AF_INET, socket.SOCK_DGRAM) s.connect ((target, 8000)) ipaddr =s.getsockname () [0] s.close () за исключением:pass return ipaddrprint "Raspberry Pi - Local IP Address" print ( get_local_ip_address ('10 .0.1.1 ')) print (get_local_ip_address (' google.com ')) # показать IP-адресdef display_ipaddr ():show_wlan0 ="ip addr show wlan0 | вырезать -d / -f1 | awk '/ inet / {printf \ "w% 15.15s \", $ 2}' "show_eth0 =" ip addr show eth0 | вырезать -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 в пятой кнопке def displaymenu ():if x ==1 :lcd.printString ("1. Дисплей", 0,0) lcd.printString ("IP-адрес", 0,1) elif x ==2:lcd.printString ("2. Аудиовыход", 0,0) lcd .printString («в порт hdmi», 0,1) elif x ==3:lcd.printString («3. Аудиовыход», 0,0) lcd.printString («в аналоговый порт», 0,1) elif x ==4:lcd.printString («4. Аудиовыход», 0,0) lcd.printString («Авт. Выбор порта», 0,1) elif x ==5:lcd.printString («5. Перезагрузить» , 0,0) lcd.printString («Плейлист», 0,1) elif x ==6:lcd.printString («6. ShutDown», 0,0) lcd.printString («Система», 0,1) else:lcd.printString ("7. Выход в", 0,0) lcd.printString ("Главное меню", 0,1) def load_playlist ():output =run_cmd ("mpc clear") output =run_cmd ("/ home / 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:вернуть «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 ()] # Получить информацию о дорожке из стандартного вывода команды mpc output =run_cmd ("mpc current") station =output [0:16] # Выбрать станцию и отслеживать информацию track =output [-17:-1] lcd.printString (station + "" * (16 - len (станция)), 0, 0) lcd.printString (track + "" * (16 - len (track)), 0, 1) track_num =1 # Начало на дорожке номер 1os.system (" sudo service mpd restart ") os.system (" mpc play "+ str (track_num)) # Укажите ОС, чтобы она воспроизводила его, пока loop_radio ==1:getTrack () loop_menu =1 x =1 key =getKey () if key =="UP":track_num + =1, если track_num> max_trax:trac k_num =1 lcd.printString (станции [track_num-1], 0,0) os.system («sudo service mpd restart») os.system («mpc play» + str (track_num)) getTrack () elif key ==«ВНИЗ»:track_num - =1, если track_num <1:track_num =max_trax lcd.printString (станции [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 =="ВПРАВО":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":если x <=1:x =7 else:x =x - 1 elif key =="DOWN":если x> =7:x =1 else:x =x + 1 ключ elif =="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 («До свидания», 0, 0) lcd.printString («Хорошего дня», 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 ") lcd.printString (" УВЕЛИЧЕНИЕ ГРОМКОСТИ:", 0 , 0) lcd.printString (output, 5, 1) sleep (.25) lcd.printString (16 * "", 0,0) lcd.printString (16 * "", 0,1) elif key =="ВЛЕВО ":os.system (" mpc volume -2 ") lcd.printString (16 *" ", 0, 0) lcd.printString (16 *" ", 0, 1) output =run_cmd (" mpc volume ") lcd. printString ("УМЕНЬШЕНИЕ ГРОМКОСТИ:", 0, 0) lcd.printString (output, 5, 1) sleep (.25) lcd.printString (16 * "", 0,0) lcd.printString (16 * "", 0 , 1)
radio_plylist.sh SH
это мой плейлист с израильскими станциями#! / bin / shmpc clear 1> / dev / null # 1 ecco99mpc add http://99.livecdn.biz/99fm_aac#2 galgalazmpc add http://glglzwizzlv.bynetcdn.com/glglz_mp3#3 galazmpc add http:// glzwizzlv .bynetcdn.com / glz_mp3 # 4 88 fmmpc добавить http://ibala.vidnt.com:8000/iba_radio-88fmM#5 gimelmpc добавить http://ibala.vidnt.com:8000/iba_radio-gimelM#6 радио 100 fmmpc добавить http://100fm.streamgates.net/Radios100Fm#7 kol hamusicampc добавить http://ibala.vidnt.com:8000/iba_radio-kolmusicaM#8 wqxrmpc добавить http://stream.wqxr.org/wqxr#9 npr currentmpc добавить http://current.stream.publicradio.org/kcmp.mp3#10 bbcmpc добавить http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk#11 linn jazzmpc добавить http://radio.linnrecords .com:8003 / autodj # 12 linn classicmpc add http://radio.linnrecords.com:8004/autodj
Схема
Производственный процесс
- Универсальный пульт дистанционного управления Raspberry Pi
- Кусочек Raspberry Pi
- Cycle Chaser
- Детектор воров Raspberry Pi
- Датчик температуры Raspberry Pi
- МАЛИНОВАЯ АВТОМАТИЗАЦИЯ ДОМА
- MrRobot - мобильное приложение Ubuntu с поддержкой робототехники (задействованы Raspberry Pi и arduino)
- Робот-бокс для компакт-дисков Raspberry Pi
- Робот Raspberry Pi, управляемый через Bluetooth
- Создайте своего робота для видеостриминга, управляемого через Интернет, с помощью Arduino и Raspberry Pi