1. 程式人生 > >我也DIY一個Android遙控器-全部開源

我也DIY一個Android遙控器-全部開源

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

我也DIY一個Android遙控器-全部開源

1.試用

       記得宋寶華在「裝置驅動開發詳解」提出一個這樣的理論「軟體和硬體互相滲透對方的領地」,這次證明還是確實是這樣,使用上層APP

軟體加上簡單的更為簡單的硬體設計就可以完成一個遙控器了。

       有開發應用程式網友發E-mail問網上那種DIY的紅外遙控器是如何工作的,查了一下目前有兩種方式,一種是基於USB一種是基於耳機孔。就簡單的回覆了一資訊。說是將音訊訊號/USB訊號轉換為紅外訊號。事後自己都覺得有點敷衍,還好自己硬體瞭解一些,軟體也會開發。就將他們結合一下。

       試用次合,現在開發規律比較清晰了,一般就是先試用進而瞭解大概功能。試用的次合是在網上買一個 耳機插孔式的遙控發射器 如下內部圖(不要理會線,線是我測量焊接的)。


       手機上的軟體使用提「遙控精靈」(2.9.3版本),身邊的測試電器是創維電視。軟體設計的比較好使用,試用成功,沒有其它障礙。

 

2.DIY硬體

       第二步就是DIY了,GoogleDIY]便宜好用-使用耳機孔的IR遙控器(適用可播.WAVplayer) 文長圖多手機遙控器,3.5mm耳機介面紅外遙控改造解析兩篇文章和一篇原理文章遙控器原理.再結合使用示波器測試按鍵是耳機孔的輸出波形,大概理解了其原理以及DIY需要的元件。

       DIY所需元件:

1. 3.5耳機插頭 2. 紅外發射管(其實這個名字也怪,嚴格意義上它屬於發光二極體和一種,但是去電子商城購買時要說前「紅外發射管」)

 

       接下來的硬體相關實驗是部分替換,軟體上使用「遙控精靈」上適配好的配置,然後將焊接好的「遙控器」連線上,進行試驗。第一次根據第一篇引用文章中將兩個二極體正負相連再連線到耳機插頭的左右聲道 如下圖:


       實驗結果:成功無誤。

       第二次實驗是 根據第二篇引用文章只焊接一個發射管,實驗結果:成功無誤。

       第三次實驗是將正負極顛倒再次測試,實驗結果同樣是:成功無誤。

 

       從上述三個次實驗中,清晰了很多概念,但是也帶來很的疑惑,文章一中說要將19kHz轉換為38kHz所以要兩個發射管正負互接的,但是第二次實驗中,不進行互接也是可以發射訊號的。第三次實驗中正反互換都沒有影響訊號正常的發射與接收。這也是一個一點。第三點是沒有接三極體進行放大,同樣是可以使用的。先將理論討論暫時放到這裡。繼續新的實驗。

 

       軟體上的實驗是最終實現自己開發一個APP來發射資料。

       第一步是將「遙控精靈」輸出的音訊錄音下來。硬體連線是使用一個公公的耳機插頭將「遙控精靈」輸出的按鍵波形錄製下來。將其放到手機中進行播放音訊來向電視機發送紅外訊號。驗證通過。

 

2.DIY軟體

       整體原理理通順之後就開始大盤計劃,使用編寫一個「遙控精靈」的開源版本,即使用程式碼來實現活的波形。訊號的各個引數可以調整,這樣就可以實現控制不同型別的裝置了。

 

       根據遙控器原理得知需要38kHz的正弦波訊號,先在Playing an arbitrary tone with Android找到如何生成正弦波的方法。測試發現並不能輸出38kHz,最高只有20KHz,反過來測試「遙控精靈」的輸出頻率也是20KHz,那就暫且使用20KHz的訊號。稍作改動使其輸出20KHz的單通道正弦訊號。

 

       同樣根據遙控器原理中規定的波形的各個長度,進行編碼,不過第(3)條要求給忽略了。實現了以下方法:getleaderCode, getUserCodeToWave, getDataCodeToWave, getStopBit分別獲取各個階段的波形。將其結合後第0.1版本出爐。原始碼位於:https://code.csdn.net/kangear/sinewave。目前可以控制測試的一臺創維電視。效果圖:

 

 

 

 

    還有很多缺陷要完善:

1.目前失誤率還比較高,4次成功一次。

2.目前只實現一個鍵,可以通過程式碼修改usercodedatacode

3.基於單聲道的波形,所以只能硬體上連線 左右聲道上的一個 和 地。參考軟體是可以實現左 右 地之前的任意組合的硬體連線。

20140924更:

    失誤率高的原因找到了,多次按鍵時會偶爾造成波形只剩後半部分。由於這個問題比較模糊,不知道是什麼原因,觀察了參考軟體的波形,其前後添加了一個過濾波形10(low) + 4*(1.69(high) + 0.56(low)) + 10(low)。這樣的波形有真正的資料前後都有三個。在程式碼中實現後,效果明顯好轉,之前的波形截斷雖然還是會有,但是截斷不到真正的訊號了。

    程式碼進一步完善,可以方便的修復user codedata code。    

 

    public void onClick(View v) {

        switch (v.getId()) {

        case R.id.volume_add_button:

            mWaveService.sendSignal((short)0x00ff, (byte)0x28);

            break;

        case R.id.volume_sub_button:

            mWaveService.sendSignal((short)0x00ff, (byte)0x01);

            break;      

        }

}

     關於wav的單聲道還沒有優化,目前還只能使用單聲道的硬體連線方式。

     另一個影響準確率的是硬體上,如果直接接到耳機插口上,電平並沒有達到 紅外發射管 的最大,就會造成功率不夠。使用自己開發的APP結合網上購買的 紅外發射器 已經可以很好的使用了。

     關於 Repeat Code,真正的遙控器是會在按鍵按下的時候每隔110ms傳送一個repeat code的。通過這個實現「按下不鬆開連線發射訊號的功能」,比如按下聲音+鍵不鬆開就可以實現連續加音量。不過「遙控精靈」也並沒有實現,這樣的意義有多大暫時還不清楚。

 

問與答

(20150127)最近關注這一篇文章的人開始多了起來,我也開啟這篇文章的「問與答」吧。
1.c語言生成一個wava檔案而你使用正弦波轉化,放到陣列中如何生成WAVE檔案?
答:是先有了需求才去實現的,瞭解了紅外發射管需要的波形:38kHz的方波。再來看手機的能力,由於手機的屬性,一般將音訊限制為人耳聽力範圍20~20kHz,這明顯不夠呢,如何辦?不怎麼辦,只管試試。就播放最高的20KHZ看如何?測試結果是可行。(這說明不能完全信手冊上,還是要自己動手做一下)
    目的是播放20KHZ音樂,產生波形,但是API預設生成的是正弦波,如果要用軟體實現那麼需要再經過傅立葉變化為方波,顯得相當麻煩。那麼別人是如何實現的呢?查看了一個成品軟體,測量了一下輸出波形果真也是僅僅正弦波,那麼我就放心地使用了正弦波。
    關於如何播放,如果你瞭解Android開發,你會明白不需要生成WAV檔案,直接在記憶體中生成並播放也是一種播放音訊的方式。當然音訊檔案的方式我是嘗試過的,也是可行的。不相信權威勇敢嘗試,一切要比書本上要明白的更深。

2.如果要自己修改發射的碼是否是隻要更改 usercode和datacode呢,我在看紅外線遙控原理的時候看到的是 使用者反碼+使用者碼+資料碼+資料反碼?
答:這個就更簡單了,是我封裝了一下,當提供使用者碼的時候 怎麼轉換其反碼,資料同理。如果你看程式碼了的話,就不會有這個疑問了。;)

(20150426)

3.44.1Khz是什麼的頻率?

答:44.1kHz是音訊訊號的取樣頻率,詳見:http://en.wikipedia.org/wiki/44,100_Hz
4.sin函式裡面傳的引數是什麼意思呀,(sampleRate/freqOfTone)是什麼意思,為什麼那兩個要相除,(private final double freqOfTone = 200000; // hz 200000=>20khz(50us) 最高這裡面20KHz是不是多打了一個零)。

答:原本的程式碼寫的不是那麼容易上人理解,已經更新且加上了程式碼註釋。其實是一個求值的過程,公式是已有的:y(t) = A * sin (2πft + φ),其中:

       * A: 振幅,這裡為1;
       * f: 頻率,這裡為freqOfTone;
       * t: 時間,這裡為(i/sampleRate);
       * φ: 初相位,這裡為0;

        那句程式碼其實就是根據這個公式寫的,這個公式的介紹見:http://en.wikipedia.org/wiki/Sine_wave

        所以好理解的寫法是這樣的:sample[i] = Math.sin(2 * Math.PI * freqOfTone * (i / sampleRate));

        關於是否多打一個零,我想應該是的。
5.載波頻率38KHz(也就是樓主用的20KHz)指的是什麼,不是指每次跳變是1/38KHz嘛。按樓主寫的好像是陣列中的每一位是1/44.1KHz

答:載波頻率就是正弦波的頻率,週期就是1/38Khz,具體的公式介紹已經在上一個問題中進行了講解。


6.(20150616)問:我現在想做一個控制空調的功能,從網上查到我的空調的紅外訊號是按照以下規定來的:
0的電平寬度為:600μs低電平+600μs高電平
1的電平寬度為:600μs低電平+1600μs高電平
起始碼 S電平寬度 為:9000us低電平+4500us高電平
連線碼C電平寬度為:600us低電平+20000us高電平
請問如果我要實現01sc這四個的話,在您封裝的函式是可以直接呼叫的麼?還是需要修改什麼引數。
另外我用兩個公頭的線錄下了其他成品軟體控制我空調的錄音,用cooledit開啟看到的貌似也是正弦波

答:從訊號寬度上來看和我文章中的那個時序圖差不多,應該是一個標準。我再次整理程式碼,將這個幾個時序引數整理成常量到一起,這樣想自己改一些引數也可以很好的更改。也加上了註釋方便理解。你需要自行結合圖上的時序圖和下圖註釋來找到你訊號寬度對應:(其實你搜索這些引數和文中的參考文件中有都提到,紅外訊號協議一般不會區分裝置型別:電視,空調,投影儀;至於怎麼改適合你你得自己搞清楚了)


關於正弦波,暫還找到能輸出正弦波的APP,說明手機的能力就這些,但是不影響使用。

7. userCode與dataCode代表什麼意思


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述