산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Pi-Arduino 인터넷 라디오

구성품 및 소모품

Arduino UNO
× 1
라즈베리 파이 3 모델 B
× 1
Arduino용 SainSmart LCD 키패드 실드
× 1
5V 전원 공급 장치
× 1

앱 및 온라인 서비스

파이썬

이 프로젝트 정보


개요

나는 무언가를 만들거나 요리를 할 때 라디오를 듣는 것을 좋아하지만 내가 사는 곳에서는 FM 수신이 끔찍합니다. 그리고 인터넷으로 세계의 라디오 방송을 듣는 것은 즐거운 일이지만 스마트폰으로 음악을 듣는 것을 좋아하지 않아서 구글링을 많이 하다가 몇 가지 해결책을 찾았습니다.

나는 이 프로젝트를 또 다른 튜토리얼인 akellyirl의 Arduino / Raspberry Pi Internet Radio를 기반으로 했습니다. 코드는 Raspberry Pi에서 Python으로 작성되었으며 기본적으로 Linux 뮤직 플레이어 데몬(mpd)과 플레이어(mpd)를 사용합니다. nanpy 도서관이 있습니다 Python은 푸시 버튼 및 LCD를 제어하는 ​​Arduino와 통신할 수 있습니다.

저는 푸시 버튼이 있는 Arduino용 LCD/키보드 실드를 사용했습니다:Arduino용 SainSmart LCD 키패드 실드, 나중에 고장난 알람 시계에서 스크랩한 4개의 푸시 버튼 스트립을 추가했습니다. 처음에는 USB WiFi 어댑터가 있는 Raspberry Pi 2를 사용했지만 지금은 WIFI가 내장되어 있고 안테나가 필요 없는 RP3를 사용하고 있습니다.

가장 어려운 부분은 내가 원하는 방송국의 올바른 URL을 찾는 것이었습니다. 마침내 나는 이 프로그램을 찾았습니다:URL HELPER 당신이 있는 사이트를 스니핑하고 재생 중인 미디어의 URL을 보여줍니다. 사운드를 위해 스크랩에서 회수한 활성 컴퓨터 스피커 한 쌍을 사용했습니다.

설치 지침

RP3 설치 지침(Arduino의 akellyirl의 Arduino / Raspberry Pi Internet Radio에서):

1. Raspbian을 최신 패키지로 업데이트:

$ sudo apt-get 업데이트 

2. mpd/mpc 패키지 설치:

$ sudo apt-get install mpc mpd 

Pi에서 실행되는 Python에서 Arduino와 통신할 수 있기를 원합니다. 그렇게 하려면 Python용 nanpy 라이브러리와 Arduino용 nanpy 펌웨어를 설치해야 합니다.

1. Arduino용 nanpy 펌웨어를 빌드하기 위해 Arduino 패키지를 설치합니다.

$ apt-get 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.6gz /코드> 

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 디렉토리로 이동하여 Python setuptools를 설치합니다.

$ cd setuptools-0.6c11 $ sudo python setup.py 설치 

6. nanpy 디렉토리로 이동하여 Python nanpy 라이브러리를 설치합니다.

$ cd ../nanpy $ sudo python setup.py 설치 

7. 직렬 디렉토리로 이동하여 Python 직렬 라이브러리를 설치합니다.

$ cd ../pyserial-2.6 $ sudo 파이썬 setup.py 설치 

이제 필요한 파일을 얻었으니 Arduino에 nanpy 펌웨어를 설치해 보겠습니다.

펌웨어

난피 Raspberry Pi에서 실행되는 Python 프로그램이 기존 Arduino-Sketch 구문을 사용하여 Arduino를 작동할 수 있도록 합니다. Arduino에서 아날로그 입력을 읽는 Python 프로그램은 다음과 같이 읽을 수 있습니다.

int val =Arduino.analogRead(14) 

Nanpy에는 두 가지 구성 요소가 있습니다.

<울>
  • Arduino 명령을 친숙한 구문으로 작성하고 Arduino와 통신할 수 있도록 하는 Python용 라이브러리입니다.
  • Python on Pi와 통신하는 Arduino에서 실행되는 펌웨어
  • nanpy의 Python 부분을 설치하고 마지막 단계에서 Pi에 nanpy의 Arduino 부분을 다운로드했습니다. 이제 Arduino에 nanpy 펌웨어를 업로드해야 합니다.

    Arduino를 Raspberry Pi의 USB에 연결합니다.

    1. nanpy 펌웨어 디렉토리로 이동하여 Arduino에 업로드:

    $ cd ../nanpy/firmware $ export BOARD=uno $ make $ 업로드 만들기 

    /dev/ttyACM0에서 장치를 찾을 수 없다는 보고를 받으면 Arduino를 다른 USB 포트에 연결합니다.

    재생 목록 스크립트와 Python 스크립트(코드 탭에 게시됨)를 만들고 Python 스크립트를 Raspberry 부팅에서 자동 실행되도록 만들었습니다. 또한 IP 표시 또는 오디오 출력 선택과 같은 일부 메뉴 옵션을 표시하기 위해 또 다른 푸시 버튼을 추가했습니다.

    마지막 업데이트:다시 만들었습니다:, 다이얼링 및 볼륨을 위한 로터리 인코더를 추가하고 케이스를 3d 인쇄했습니다:


    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 피라디오
  • radio_plylist.sh
  • piradio파이썬
    저는 파이썬 프로그래머가 아닙니다(이것은 대부분 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에 대한 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("라디오 100fm")stations.append("Kol Hamusica" )stations.append("WQXR New York ")stations.append("WPR Winsconsin ")stations.append("BBC 세계 서비스")stations.append("LINN 재즈")stations.append("LINN 클래식")#. ...........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 "라즈베리 파이 - 로컬 IP 주소"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 주소:',0,0) lcd.printString(ipaddr,0,1) sleep(2)# 다섯 번째 푸시 버튼의 메뉴 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 포트 ",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) 출력 =p.communicate()[0] return output def getKey():val =Arduino.analogRead(14) if val ==1023:"NONE" 반환 elif val <100:"오른쪽" 반환 elif val <150:"UP" 반환 elif val <330:"DOWN" 반환 elif val <510:"LEFT" 반환 elif val <750:반환 "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(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 동안 재생하도록 OS에 지시:getTrack() loop_menu =1 x =1 key =getKey() if key =="UP":track_num +=track_num> max_trax:trac인 경우 1 k_num =1 lcd.printString(stations[track_num-1],0,0) os.system("sudo 서비스 mpd 다시 시작") os.system("mpc play" + str(track_num)) getTrack() elif 키 =="DOWN":track_num -=track_num <1인 경우 1:track_num =max_trax lcd.printString(stations[track_num-1],0,0) os.system("sudo 서비스 mpd 다시 시작") os.system("mpc play " + str(트랙 번호)) getTrack() elif 키 =="왼쪽":os.system("mpc 볼륨 +10") lcd.printString(16*" ", 0, 0) lcd.printString(16*" ", 0, 1) 출력 =run_cmd("mpc 볼륨") lcd.printString("볼륨 UP:", 0, 0) lcd.printString(출력, 5, 1) sleep(.25) lcd.printString(16*" " ,0,0) lcd.printString(16*" ",0,1) elif 키 =="오른쪽":os.system("mpc 볼륨 -10") lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) 출력 =run_cmd("mpc 볼륨") lcd.printString("볼륨 다운:", 0, 0) lcd.printString(출력, 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 키 =="오른쪽":os.system("mpc 볼륨 +10") lcd.printString(16*" ", 0, 0) lcd.printString(16*" ", 0, 1) 출력 =run_cmd("mpc 볼륨") lcd.printString("볼륨 업:", 0, 0) lcd.printString(출력, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif 키 ==" 왼쪽":os.system("mpc 볼륨 -10") lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) 출력 =run_cmd("mpc 볼륨") lcd .printString("볼륨 다운:", 0, 0) lcd.printString(출력, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) elif 키 =="UP":if x <=1:x =7 else:x =x - 1 elif 키 =="DOWN":if x>=7:x =1 else:x =x + 1 elif 키 =="SEL":if x ==1:display_ipaddr() #get_local_ip_address() sleep(1) elif x ==2:출력 =run_cmd("amixer -q cset numid=3 2") lcd. printString("오디오 출력-->HDMI", 0, 0) lcd.printString("출력", 0, 1) sleep(.5) elif x ==3:출력 =run_cmd("amixer -q cset numid=3 1") lcd.printString("오디오 출력->아날로그", 0, 0) lcd.printString("출력", 0, 1) sleep(.5) elif x ==4:출력 =run_cmd("amixer -q cset numid=3 0") lcd.printString("오디오 출력-> 자동", 0, 0) lcd.printString("출력", 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 =="오른쪽":os.system("mpc 볼륨 +2") lcd.printString(16*" ",0,0) lcd.printString(16*" ", 0,1) 출력 =run_cmd("mpc 볼륨") lcd.printString("볼륨 업:", 0 , 0) lcd.printString(출력, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0,1) elif key =="LEFT ":os.system("mpc 볼륨 -2") lcd.printString(16*" ", 0, 0) lcd.printString(16*" ", 0, 1) 출력 =run_cmd("mpc 볼륨") lcd. printString("볼륨 다운:", 0, 0) lcd.printString(출력, 5, 1) sleep(.25) lcd.printString(16*" ",0,0) lcd.printString(16*" ",0 ,1)
    radio_plylist.shSH
    이것은 이스라엘 방송국이 있는 내 플레이리스트입니다
    #! /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 재즈mpc 추가 http://radio.linnrecords .com:8003/autodj#12 linn classicmpc 추가 http://radio.linnrecords.com:8004/autodj

    회로도


    제조공정

    1. Raspberry Pi 범용 리모컨
    2. 라즈베리 파이 한 조각
    3. 사이클 체이서
    4. 라즈베리 파이 도둑 탐지기
    5. 라즈베리 파이 온도 센서
    6. RASPBERRY PI 홈 자동화
    7. MrRobot – Ubuntu Mobile 앱 지원 Robotics(Raspberry Pi 및 arduino 관련)
    8. 라즈베리 파이 CD 상자 로봇
    9. Bluetooth를 통해 제어되는 Raspberry Pi Robot
    10. Arduino 및 Raspberry Pi로 인터넷 제어 비디오 스트리밍 로봇 구축