Ardunio 紅外遙控PC音樂播放器
java
程序說明: windows
本程序經過紅外遙控器,發射信號給接收器,而後由Ardunio 經過 USB 傳給 PC端,實現一個播放器
本播放器能夠 播放,暫停,上一首,下一首,靜音,循環,聲音加減
相信我,只有JMF才能作到這些功能,其餘的JAVA媒體工具少之又少
本程序很Cool,學習的最主要是JAVA怎麼監聽USB,由此能夠開發多種小應用
環境說明: eclipse
所需硬件 工具
1. Ardunio uno 板一塊 oop
2. 紅外接收頭一個 學習
3. 紅外遙控器一個 測試
4. 麪包板 + 線若干 fetch
軟件版本:
ui
Ardunio 1.0.5
this
Java 播放 音樂用到的是JMF.版本是2.1.1
Java 監聽 Ardunio 用到的是RXTX
本程序所須要的JAVA庫
1. RXTX_lib_32_64.ZIP(JAVA 監聽 USB 所須要的庫)
解壓出來以後有RXTX_library_32和RXTX_library_64,一個是32位系統,一個是64位系統,別弄錯了, 把裏面的RXTXcomm.jar放到Eclipse, rxtxSerial.dll就放到 E:\dll\ 而後再Eclipse裏面,找到RXTXcomm.jar,右鍵Propertise - Native Library - 設置rxtxSerial.dll的目錄
2. 把jmf.jar mediaplayer.jar sound.jar 都添加到eclipse裏面,這是JMF的庫
整個項目打包下載地址:
http://pan.baidu.com/share/link?shareid=522418148&uk=3526727329
線路圖:
此圖是網上找的,實際的圖我沒有拍照,大同小異
Ardunio代碼:
PS: 請把紅外接收器的 VOUT接到 數字腳11
#include <IRremote.h> //附件裏面有
int RECV_PIN = 11; //定義紅外接收模塊輸出口接arduino數字引腳11 //此處定義遙控器的各個按鍵 #define btn_poweroff 16753245 #define btn_mode 16736925 #define btn_mute 16769565 #define btn_pause_start 16720605 #define btn_previous 16712445 #define btn_next 16761405 #define btn_eq 16769055 #define btn_subtract 16754775 #define btn_add 16748655 #define btn_0 16738455 #define btn_loop 16750695 #define btn_usd 16756815 #define btn_1 16724175 #define btn_2 16718055 #define btn_3 16743045 #define btn_4 16716015 #define btn_5 16726215 #define btn_6 16734885 #define btn_7 16728765 #define btn_8 16730805 #define btn_9 16732845 IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); //初始化紅外遙控 } //這裏是簡單的根據遙控器傳播過來的信號,作一個匹配,我已經事先獲取每個鍵的編碼 void loop() { if (irrecv.decode(&results)) { switch(results.value){ case btn_poweroff: Serial.println("poweroff"); break; case btn_mode: Serial.println("mode"); break; case btn_mute: Serial.println("mute"); break; case btn_pause_start: Serial.println("pause_start"); break; case btn_previous: Serial.println("previous"); break; case btn_next: Serial.println("next"); break; case btn_eq: Serial.println("eq"); break; case btn_subtract: Serial.println("substract"); break; case btn_add: Serial.println("add"); break; case btn_0: Serial.println("0"); break; case btn_loop: Serial.println("loop"); break; case btn_usd: Serial.println("usd"); break; case btn_1: Serial.println("1"); break; case btn_2: Serial.println("2"); break; case btn_3: Serial.println("3"); break; case btn_4: Serial.println("4"); break; case btn_5: Serial.println("5"); break; case btn_6: Serial.println("6"); break; case btn_7: Serial.println("7"); break; case btn_8: Serial.println("8"); break; case btn_9: Serial.println("9"); break; } irrecv.resume(); // 接收下一個值 } }
1. JAVA 監聽 Ardunio 主程序:
package cn.dxy.service; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Enumeration; import cn.dxy.action.audio.AudioController; import cn.dxy.action.audio.JMFAudio; import sun.audio.AudioPlayer; import sun.audio.AudioStream; public class ArdunioRemoteMusic implements SerialPortEventListener{ SerialPort serialPort; /** 鏈接系統的端口 */ private static final String PORT_NAMES[] = { "/dev/tty.usbserial-A9007UX1", // Mac OS X "/dev/ttyUSB0", // Linux "COM5", // Windows,此處咱們用到的是windows的com5 }; private BufferedReader input; private OutputStream output; private static final int TIME_OUT = 2000; /**此處爲鏈接超時時間*/ private static final int DATA_RATE = 9600; /**此處是和PC的USB鏈接通信頻率,默認*/ private static ArdunioRemoteMusic myArdunio = new ArdunioRemoteMusic(); private ArdunioRemoteMusic(){ } public static ArdunioRemoteMusic getInstance(){ return myArdunio; } /** * * 初始化端口鏈接 * */ public void initialize() { CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); //首先,找到已經鏈接好的端口 while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); for (String portName : PORT_NAMES) { if (currPortId.getName().equals(portName)) { portId = currPortId; System.out.println(PORT_NAMES); break; } } } if (portId == null) { System.out.println("Could not find COM port."); return; } try { // 打開端口 serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); // 設置端口參數 serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // 打開輸入輸出流 input = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); output = serialPort.getOutputStream(); // 增長事件監聽 serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (Exception e) { System.err.println(e.toString()); } } /** * 當你斷開斷開所觸發的事件 */ public synchronized void close() { if (serialPort != null) { serialPort.removeEventListener(); serialPort.close(); } } /** * 當由Ardunio有信息輸入的時候,觸發,進行讀寫 */ public synchronized void serialEvent(SerialPortEvent oEvent) { if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { String inputLine=input.readLine(); System.out.println("收到的字符時:"+inputLine); AudioController.getInstance().controller(inputLine); //此處就是音樂播放器模塊 } catch (Exception e) { System.err.println(e.toString()); } } } //啓動程序 public static void main(String[] args) throws Exception { ArdunioRemoteMusic main = new ArdunioRemoteMusic(); main.initialize(); Thread t=new Thread() { public void run() { //這裏是讓程序有足夠的時間初始化已經運行 try {Thread.sleep(1000000);} catch (InterruptedException ie) {} } }; t.start(); System.out.println("Ardunio is Started"); } }
package cn.dxy.action.audio; public class AudioController { private static JMFAudio audio ; private static AudioController audioController = new AudioController(); private AudioController(){ audio = JMFAudio.getInstance(); audio.initAudio(); } public static AudioController getInstance(){ return audioController; } public void controller(String msg){ //播放,暫停 if(msg.equals("pause_start")){ audio.begin(); } //下一首歌 if(msg.equals("next")){ audio.nextSong(); audio.play(); } //上一首歌 if(msg.equals("previouse")){ audio.previouseSong(); audio.play(); } //增長聲音 if(msg.equals("add")){ audio.addLevel(); } //減小聲音 if(msg.equals("subtract")){ audio.subtractLevel(); } //靜音 if(msg.equals("mute")){ audio.mute(); } //單曲循環 if(msg.equals("loop")){ audio.loop(); } } }
package cn.dxy.action.audio; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.media.CannotRealizeException; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.EndOfMediaEvent; import javax.media.Manager; import javax.media.NoPlayerException; import javax.media.Player; import javax.media.PrefetchCompleteEvent; import javax.media.StartEvent; import javax.media.StopEvent; import javax.media.Time; import sun.audio.AudioStream; /** * 音樂播放主類 * @author sam * */ public class JMFAudio implements ControllerListener { private static JMFAudio jmfAudio = new JMFAudio(); //這裏是我本地的音樂地址,大家能夠自由替換 private static String songFile[] = { "e:/wav/login.wav", "e:/wav/Adele - Rolling In The Deep.wav", "e:/wav/Avril Lavigne - Complicated.wav", "e:/wav/Britney Spears - Baby One More Time.wav", "e:/wav/Bruno Mars - The Lazy Song.wav", "e:/wav/F.I.R - Lydia.wav", "e:/wav/Super Junior - Sorry Sorry.wav", "e:/wav/Taylor Swift - You Belong With Me.wav", "e:/wav/Westlife - My Love.wav", "e:/wav/login_last.wav"}; private File sourceFile; //音樂地址 private InputStream inputStream; // 輸入流 private static Player audioPlayer; // 播放器 private boolean loop = false; // 是否循環 private boolean autoUnload; // 自動卸載 public boolean playState = true; // 播放仍是暫停狀態 private static int curSong = 0; // 當前播放歌曲序號 private static int songLength = 0; // 歌曲總數 private static float curLevel = 0f; // 當前聲音的大小 private static boolean muteState = false; //靜音狀態 private JMFAudio() { } public static JMFAudio getInstance() { System.out.println("init JMFAudio"); return jmfAudio; } //初始化 public void initAudio() { songLength = songFile.length; load(songFile[0]); } /** * 經過File 加載歌曲 * @param sourceFile */ public void load(File sourceFile) {// 加載文件 try { if (audioPlayer != null) unload();// 若是有正在播放的文件就先卸載播放器 this.sourceFile = sourceFile; audioPlayer = Manager.createRealizedPlayer(sourceFile.toURI() .toURL());// 從新創建播放器 audioPlayer.addControllerListener(this); } catch (Exception e) { System.out.println(e.getMessage()); } } /** * 經過地址 加載歌曲 * @param fileName */ public void load(String fileName) {// 加載文件 try { if (audioPlayer != null) unload();// 若是有正在播放的文件就先卸載播放器 sourceFile = new File(fileName); audioPlayer = Manager.createRealizedPlayer(sourceFile.toURI() .toURL());// 從新創建播放器 curLevel = audioPlayer.getGainControl().getLevel(); System.out.println("當前音量是:"+curLevel); audioPlayer.addControllerListener(this); } catch (Exception e) { System.out.println(e.getMessage()); } } public void load() {// 加載文件 try { if (audioPlayer != null) unload();// 若是有正在播放的文件就先卸載播放器 audioPlayer = Manager.createRealizedPlayer(sourceFile.toURI() .toURL());// 從新創建播放器 audioPlayer.addControllerListener(this); } catch (Exception e) { System.out.println(e.getMessage()); } } public void begin(){ if(playState){ play(); }else{ pause(); } playState= !playState; } public void play() {// 播放文件 try { audioPlayer.prefetch(); System.out.println("開始播放:"+songFile[curSong]); } catch (Exception e) { System.out.println(e.getMessage()); } } public void pause() {// 暫停當前播放 if (audioPlayer != null) audioPlayer.stop(); System.out.println("暫停播放:"+songFile[curSong]); } public void stop() {// 中止播放音樂文件 if (audioPlayer != null) { audioPlayer.stop(); audioPlayer.setMediaTime(new Time(0));//復位JMF播放器對象的開始時間 System.out.println("中止播放"); } } public void unload() {// 卸載播放器 if (audioPlayer != null) { audioPlayer.stop(); audioPlayer.close(); audioPlayer = null; System.out.println("卸載播放器"); } } // 下一首歌 public void nextSong() { if (curSong == songLength - 1) { curSong = 0; } else { curSong = curSong + 1; } System.out.println("切下一首歌:" + songFile[curSong]); load(songFile[curSong]); } // 上一首歌 public void previouseSong() { if (curSong == 0) { curSong = songLength - 1; } else { curSong = curSong - 1; } System.out.println("切上一首歌:" + songFile[curSong]); load(songFile[curSong]); } //增長聲音 public void addLevel() { if(curLevel < 1){ curLevel += 0.1f; } if (audioPlayer != null) { audioPlayer.getGainControl().setLevel(curLevel); System.out.println("增長音量:"+curLevel); } } //減小聲音 public void subtractLevel() { if(curLevel > 0){ curLevel -= 0.1f; } if (audioPlayer != null) { audioPlayer.getGainControl().setLevel(curLevel); System.out.println("減小音量:"+curLevel); } } //靜音 public void mute(){ if(muteState){ audioPlayer.getGainControl().setLevel(curLevel); }else{ audioPlayer.getGainControl().setLevel(0); } muteState = !muteState; } //單曲循環 public void loop(){ loop = !loop; if(loop){ System.out.println("設置了循環單曲播放"); }else{ System.out.println("取消單曲循環播放"); } } //這個方法很重要,它監聽歌曲的狀態,好比開始,結束,等等 public void controllerUpdate(ControllerEvent e) { if (e instanceof StartEvent) { // 監聽開始播放 } if (e instanceof StopEvent) { // 監聽stop播放 System.out.println("StopEvent"); } if (e instanceof EndOfMediaEvent) { // 監聽結束播放 System.out.println("EndOfMediaEvent"); if (loop){ audioPlayer.setMediaTime(new Time(0));//復位JMF播放器對象的開始時間 audioPlayer.start(); }else{ nextSong(); play(); } return; } if (e instanceof PrefetchCompleteEvent){ System.out.println("PrefetchCompleteEvent"); audioPlayer.start(); } } //初始化,本地測試用 // public void init() { // initAudio(); // loop = false; // play(); // } // // public static void main(String[] args) throws IOException, // NoPlayerException, CannotRealizeException { // new JMFAudio().init(); // } }
PS:轉載時請註明轉載地址 http://my.oschina.net/samtribiani/blog/145409