Pi-Arduinoインターネットラジオ
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
|
このプロジェクトについて
概要
何かを作ったり料理をしたりするときはラジオを聞くのが大好きですが、私が住んでいる場所ではFM受信がひどいです。インターネットでは、世界中のラジオ局を聴くのは楽しいですが、スマートフォンを使って音楽を聴くのは好きではないので、グーグルをたくさん使って、いくつかの解決策を見つけました。
私はこのプロジェクトを別のチュートリアルに基づいています:akellyirlによるArduino / RaspberryPiインターネットラジオ。コードはRaspberryPi上でPythonで記述されており、基本的にLinuxミュージックプレーヤーデーモン(mpd)とプレーヤー(mpd)を使用します。ライブラリがあります nanpy これにより、PythonはプッシュボタンとLCDを制御するArduinoと通信できます。
プッシュボタンを備えたArduino用のLCD /キーボードシールドを使用しました:Arduino用のSainSmart LCDキーパッドシールド、そして後で壊れた目覚まし時計から廃棄した4つのプッシュボタンストリップを追加しました。最初はUSBWiFiアダプター付きのRaspberryPi 2を使用していましたが、現在はWIFIが組み込まれていてアンテナが不要なRP3を使用しています。
一番大変だったのは、欲しい駅の正しいURLを見つけることでした。ついに私はこのプログラムを見つけました:あなたがいるサイトをスニッフィングし、再生中のメディアのURLを表示するURLHELPER。サウンドには、スクラップから回収したアクティブなコンピュータースピーカーを使用しました。
<図>

インストール手順
RP3のインストール手順(ArduinoのakellyirlによるArduino / Raspberry Piインターネットラジオから):
1. Raspbianを最新のパッケージに更新します:
$ sudo apt-get update
2. mpd / mpcパッケージをインストールします。
$ sudo apt-get install mpc mpd
Piで実行されているPythonからArduinoと通信できるようにしたいと考えています。そのためには、Python用のnanpyライブラリとArduino用のnanpyファームウェアをインストールする必要があります。
1. Arduinoパッケージをインストールして、Arduino用のnanpyファームウェアをビルドします:
$ apt-get install arduino
2. Python用のnanpyライブラリを取得し、/ home / piから抽出します:
$ wget http://pypi.python.org/packages/source/n/nanpy/nanpy-v0.7.tar.gz $ tar xvf nanpy-v0.7.tar.gz
>
3. Python用のsetuptools(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. Python用のpyserial(nanpyの依存関係)を取得して抽出します:
$ wget http://pypi.python.org/packages/source/p/pyserial/pyserial-2.6.tar.gz $ tar xvf pyserial-2.6.tar.gz
5. setuptoolsディレクトリに移動し、Pythonsetuptoolsをインストールします。
$ cd setuptools-0.6c11 $ sudo python setup.py install
6. nanpyディレクトリに移動し、Pythonnanpyライブラリをインストールします。
$ cd ../nanpy $ sudo python setup.py install
7.シリアルディレクトリに移動し、Pythonシリアルライブラリをインストールします。
$ cd ../pyserial-2.6 $ sudo python setup.py install
これで必要なファイルができました。Arduinoにnanpyファームウェアを配置しましょう。
ファームウェア
nanpy Raspberry Piで実行されているPythonプログラムが、従来のArduino-Sketch構文を使用してArduinoを操作できるようにします。 Arduinoからのアナログ入力を読み取るPythonプログラムは次のようになります:
int val =Arduino.analogRead(14)
Nanpyには2つのコンポーネントがあります:
- Arduinoコマンドを使い慣れた構文で記述し、Arduinoと通信できるようにするPython用ライブラリ。
- Arduinoで動作し、Pi上のPythonと通信するファームウェア。
最後のステップで、nanpyのPython部分をインストールし、nanpyのArduino部分をPiにダウンロードしました。次に、nanpyファームウェアをArduinoにアップロードする必要があります。
ArduinoをRaspberryPiのUSBに接続します。
1. nanpyファームウェアディレクトリに移動し、Arduinoにアップロードします:
$ cd ../nanpy/firmware $ export BOARD =uno $ make $ make upload
デバイスが/ dev / ttyACM0に見つからないという報告を受け取った場合は、Arduinoを他のUSBポートに接続してください。
プレイリストスクリプトとPythonスクリプト([コード]タブで公開)を作成し、PythonスクリプトをRaspberryブートで自動実行しました。また、IPの表示やオーディオ出力の選択など、いくつかのメニューオプションを表示するための別のプッシュボタンを追加しました。
最終更新:私はそれを作り直しました:、それをダイヤルして音量を上げるためのロータリーエンコーダーを追加し、ケースを3Dプリントしました:
<図>
コード
- ピラディオ
- radio_plylist.sh
piradio Python
私はPythonプログラマーではありません(これは主にグーグルで見つけたビットからのコピー/過去です。これまでのところそれは動作します:)
このスクリプトは、piでの起動時にロードされます。
fromdatetime 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のLCDピンを設定します( "Loading" + "。" * 3,0,1)sleep(5)max_trax =10x =1loop_menu =1loop_radio =1stations =[]#ボタンを押したときにステーション名を表示するために追加されましたstations.append( "Ecco 99") station.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")statio ns.append( "LINN jazz")stations.append( "LINN classic")#............ 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()ただし、次の場合を除きます。passreturn ipaddrprint "Raspberry Pi --Local IP Address" print(get_local_ip_address( ' 10.0.1.1 '))print(get_local_ip_address(' google.com '))#show the ip addressdef 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 in the 5th pushbutton 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( "to hdmi Port"、0,1)elif x ==3:lcd.printString( "3。AudioOutput"、0,0)lcd.printString( "to Analog port"、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。シャットダウン"、0,0)lcd.printString( "システム"、0,1) else:lcd.printString( "7。E xit 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:「SEL」を返すelse:「KBD_FAULT」を返すload_playlist()def getTrack():L =[S.strip( '\ n')for S in os.popen( 'mpc')。readlines()]#Get mpcコマンドのstdoutからのトラック情報output =run_cmd( "mpc current")station =output [0:16]#ステーションを選択してトラック情報track =output [-17:-1] lcd.printString(station + " "*(16 --len(station))、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()ifkeyの間に再生するようにOSに指示する=="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 volu me ")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.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 add http://ibala.vidnt.com:8000/iba_radio-88fmM#5 gimelmpc add http://ibala.vidnt.com:8000/iba_radio-gimelM#6 radios 100 fmmpc http://100fm.streamgates.net/Radios100Fm#7 kolhamusicampcを追加http://ibala.vidnt.com:8000/iba_radio-kolmusicaM#8wqxrmpcを追加http://stream.wqxr.org/wqxr#9nprを追加currentmpc add http://current.stream.publicradio.org/kcmp.mp3#10 bbcmpc add http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-eieuk#11 linn jazzmpc add http://radio.linnrecords .com:8003 / autodj#12 linn classicmpc add http://radio.linnrecords.com:8004/autodj
回路図

製造プロセス