簡報筆的故事 (二)
上次我們已經成功用 RF 訊號傳送多個按鍵狀態,接下來就要想辦法把這個狀態餵進電腦,讓它來控制簡報播放。
市面上買得到的簡報遙控器應該都是用 USB 的 HID class 傳送訊號給電腦,而且我很確定我們手上的幾個簡報遙控器都說將自己宣告成 HID keyboard,因為每次當我們把接收器插上 Macbook 的時候,都會跳出這個畫面:
因此我們現在的目標就是做一個裝置,模擬 USB HID 鍵盤,在收到無線模組來的訊號時,送對應的 key code 給電腦。
我曾經用過不少可以做 USB device 的 MCU,也拿它們做過一些如 I2C/SPI bridge 或 JTAG scanner 之類的工具,還曾經開過帶 CDC (communication device class) 的 USB 複合裝置,因此對 USB device 還算有點研究。
我第一個想到的做法就是找一顆 LPC1U4 或 ATmega32U4 之類的,有 USB device 能力的 MCU,在上面跑個 USB HID class 來送 key code。軟體不是問題,這些我以前都寫過,只需要修改一點小東西就好,但我至少得洗塊電路板把 MCU 開起來,上面要有 USB connector (這年頭應該是用 microUSB 了) 跟 3.3V 電源,還要一個 crystal。這些 MCU 都是 QFP 或 QFN 的包裝,加上又有 crystal 跟 USB 走線,大概沒辦法用洞洞板做。
懶還要更懶
雖然畫這種小板子大概花不了我半小時,送淘寶洗電路板也沒多少錢,但我心裡隱隱覺得好像可以用更懶惰的解決方法。
咦 ? 我剛剛是不是提到 ATmega32U4 ?
我想到抽屜裡還有這個小東西:
這片小板子叫 Sparkfun Pro Miro,是 Sparkfun 將 Arduino Leonardo 的電路簡化之後設計出來的模組,它上面的 MCU 剛好是 ATmega32u4。這是我某次在淘寶上買零件時,順手淘回來的小玩具,但一直都沒用過。
我本來想直接在 ATmega32u4 上寫 HID 的程式,但想到它既然可以跑 Arduino,就查一下 Arduino 有沒有可以模擬 HID 鍵盤的功能好了。果然 Arduino 有個 Mouse and Keyboard library,可以讓 ATmega32u4 跟 Cortex-M3 的板子透過 native USB 模擬鍵盤跟滑鼠,而且範例看起來超簡單的:
void setup() { //start keyboard communication Keyboard.begin(); //send a keystroke Keyboard.print("Hello!"); //end keyboard communication Keyboard.end(); }
看到這範例,本來已經打開的 Keil uVision 就被我關掉了,直接改開 Arduino。
我很快地寫了一個簡單的程式,測試一下 Arduino 模擬鍵盤的能力:
// USB HID keyboard emulation test // target: Pro Micro 5V/16MHz #include <Keyboard.h> // Arduino keyboard emulation library const int LED=17; // on-board RX LED, active low const int buttonR = 2; // input pin for right button int previousR = LOW; // keep last state of the button int i=0xc0; void setup() { pinMode(LED, OUTPUT); pinMode(buttonR, INPUT); Keyboard.begin(); // start HID keyboard emulation } void loop() { int stateR = digitalRead(buttonR); // poll button state if ((stateR != previousR) && (stateR == HIGH)) { // if button state is changed and is high Keyboard.write(65); // send 'A' to host digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); // blink LED once } previousR=stateR; // update button state }
然後用麵包板接了一個 tach switch 到 Pro Micro 的 D2 I/O 腳上 (我把按鈕接成 active high,記得要加 pull down)。
把程式燒進 Pro Micro 後,電腦上果然多出一隻 USB 鍵盤。當我按下 tact switch 時,這個鍵盤就會吐一個 “A” 出來。
鍵碼的奧秘
現在我可以送 “A” 了,但要控制簡報的話,要送什麼鍵呢 ?
送方向鍵是最簡單的,我們常用的簡報軟體如 PowerPoint、Keynote、或是 Google Slides,在簡報播放中都可以用方向鍵切換投影片:右或下方向鍵是下一張,左或上方向鍵是上一張。但我記得如果我在文字編輯軟體中按簡報遙控器時,游標不會跑,因此一般的簡報遙控器應該不是送方向鍵。
我決定求證一下。
這是 AppWorks 目前使用的簡報遙控器中,比較厲害的一支。它除了可以切換投影片外,還有內建小滾珠滑鼠和雷射筆,但它也是 2.4GHz 的,一樣有射程不夠的問題。
我把它的接收器插到 Macbook 上,用一個叫 Key Codes 的小程式看看它到底送什麼鍵出來:
原來這支簡報遙控器,按「上一張」送的是 PageUp,「下一張」送的是 PageDown。除此之外,有個叫 Blank Screen 的鍵會送小寫的 “b” 出來,在 PowerPoint 和 Keynote 中可以切換全黑的畫面,但 Google Slides 沒有這個功能。至於 Start/Stop 鍵則會交替送出 “F5” 和 ESC,但 F5 只對 PowerPoint 有用,Keynote 跟 Google Slides 都不理他。
現在萬事俱備,我可以把 Pro Micro 跟 RF 接收模組接在一起試試了。
初試啼聲
我把 RF 接收模組也插到麵包板上,從 Pro Micro 的 RAW 腳引出 VBUS 的 5V 給 RF module,並把解碼 IC 的其中兩個輸出接到 Pro Micro 的 D2 和 D3 digital I/O 腳。
解碼 IC M7215 的輸出是 push-pull 的,所以我不用另外在 Pro Micro 的 digital I/O 腳上加 pull-up 或 pull-down 電阻。整個電路簡單得不得了,除了模組外沒有其他的零件。
把接收模組跟遙控器對碼後,一如預期,遙控器上的兩個按鍵就變成了 Page Up 跟 Page Down。
幫它找個家
最後一件事,就是我們得幫這個接收器找個家。
光華商場可以買到這種塑膠小機殼,小時候我常用它來做些小東西。雖然外型實在不怎麼樣,但精度和結構都還蠻可靠的。我決定用它來保護接收器的電路板。
我把洞洞板切成可以塞進機殼的大小,並把 Pro Micro 和 RF 接收器模組固定在上面。殼的邊上要打個半型孔,好讓 micro USB cable 穿過去。
另外,為了讓使用者可以知道接收器有沒有在運作,我另外在殼的正面開了一個小洞,裝了一顆帶燈殼的 3mm LED,並把它接到 RF 接收模組的 VT 訊號。VT 訊號是 M7215 解碼器的觸發輸出,用來指示解碼器解到正確的 address code,因此不管按哪一個鍵,VT 訊號都會有輸出。我試了一下,VT 腳可以直接驅動 2mA 左右的 LED,因此只需要加限流電阻就好了,不用另外加 driver。
手上一時找不到適合的限流電阻,就抓了一個 1K 的 VR 當限流電阻,LED 的亮度還可以調呢。
天線的難題
雖然模組化的接收器解決了我們大部分 RF 電路的麻煩,但最後還是得面對天線這個難題。
就像前面說過的,SYN470R 的 ANT 腳並不是理想的 50ohm RF 輸入,而是一個偏離甚遠的電容性負載,因此如果要接 50ohm 的天線,就要另外加 matching network。除了 IC 本身外,模組本身電路板 layout 和針腳所引入的寄生電容電感也是未知的變數。在手頭上沒有網路分析儀可以掃 Smiteh chart 和 S11 參數的狀況下,我幾乎不可能用正規的方法幫它設計天線。
不過還是有一些原則可以遵循的。天線一定要在它的接收中心頻率諧振,就算跟接收電路的阻抗不匹配,它最好還是得諧振,不然它無法捕獲空氣中虛無縹緲的目標訊號。
由於這是一個速度很慢的 OOK 接收機,它需要的天線頻寬非常小,因此我們可以儘可能讓天線在接收的頻率諧振,不用考慮頻寬的問題。
最簡單的天線就是 1/4 波長的鞭型天線 (whip antenna)。對任何頻率的訊號來說,拉一段 1/4 波長的導體,再加上夠好的接地,就是一個不錯的鞭型天線。315MHz 的訊號在空氣中的波長是 95.2 公分,1/4 波長就是 23.8 公分。因此最簡單的方法就是拉一段 23.8 公分的電線接在 RF 模組的 ANT 腳上。當然,這麼做的話,距離理想的 whip antenna 其實蠻遙遠的,一來我們沒有良好的 ground pland 給它參考,二來與發射訊號的極化方向也沒有良好的對應。
另外一個選擇就是螺旋天線,它基本上就是一個空氣芯的電感,在接收的頻率諧振。螺旋天線的設計參數相當多,線長、螺距、直徑甚至線徑都會影響天線的特性。315MHz 是個很常用的頻段,因此網路上可以找到很多實際的天線設計。
這是淘寶跟 eBay 上最常看到的一個 315MHz 螺旋天線,直徑 4.5mm、繞 23 圈,總長26mm。我決定依樣畫葫蘆,照這張圖來繞一個。
SYN470R 的接收感度在 315MHz 有 -106dBm,因此距離夠近的話就算完全不拉天線大概也收得到。在手上沒有網路分析儀的情況下,就只能在發射功率恆定的狀況下,以接收距離來判斷天線的效能,但這其中的變數實在太多了,我暫時還沒有時間可以這樣搞。
最後接收器的成品長這樣:
雖然看起來不起眼,但搭配大功率的遙控發射器,它在大場地的表現遠比 2.4GHz 的簡報遙控器要好得多。
***
後記
買到第一批材料後不久,我又買到了另一個比原來那隻霸氣十倍的遙控發射器:
這隻更猛,叫做 「4000 米大功率遙控發射器」。我很好奇它到底只是殼比較大,還是發射功率真的有比較猛 ? 拆開來看看。
它一樣是用 PT2264 編碼,RF 電路一樣用 SAW resonator 定頻,但發射器用了兩顆 2SC33557 (在板子背面),好像有比較厲害。
量一下耗電好了。這個遙控器是吃 9V 006P 的積層電池,發射時的電流… 哇,差不多 110mA,也就是說發射的時候它吃差不多 1W 的電。如果它的 RF 效率跟另一隻相仿的話,發射功率大概是兩倍。
現在我相信這隻不只是大而已,它可能真的比較厲害。
近期留言