簡報筆的進化 (二)
上回確定了新版簡報筆要使用的 RF 模組及軟體架構後,我就開始構思接下來的開發該怎麼進行。
幾經思考,我決定先做一塊板子,把 Arduino Pro Micro 跟 Si4432 的模組放上去,接著在上面進行軟體的開發。雖然發射器和接收器的電路會略有不同 (接收器用 USB 供電,而發射器應該要用電池供電),但我仍然可以先在接收器的板子上實作發射器的軟體,等到完成後再根據電源系統的需要去設計發射器的板子。
於是我就開始設計電路。
力回饋
除了之前所構思的功能外,我還想在發射器上加上機械式的回饋裝置,讓簡報者按下換頁鍵之後,能得到某種形式的回饋。如果因為 RF 的干擾或是其他因素,讓接收器沒有收到發射器來的訊號,或是訊號無法正確解碼,發射器就不要提供回饋,這樣簡報者就會知道換頁的動作有沒有確實成功。
力回饋最簡單的方法就是震動馬達,這是種已經在手機上使用超過 20 年的裝置。十多年前我還在設計手機時,震動馬達長這個樣子:
它是一個小型的 DC 馬達配上一個偏心質塊構成的。但由於手機越做越薄,現在的震動馬達長這個樣子:
而且它還有個很假掰的名字: ERM (eccentric rotating mass) 馬達,其實這跟多年前的震動馬達原理完全一樣,只是它的轉子跟偏心質塊做在一起,所以厚度可以盡可能的減小。
不管是長條還是扁平的震動馬達,它們的驅動方法都一樣: 只要加上適當的電源,他就會開始旋轉、產生震動。
在淘寶上搜尋 ERM 零件時,我還注意到另一種力回饋零件: 線性共震驅動器 LRA (linear resonant actuator)。LRA 的構造其實比 ERM 簡單,它就像是一個連接在彈簧上的質塊,可以用電磁鐵吸引:
某些方面來說,LRA 其實很像電磁喇叭,只是振膜換成了質塊而已。
LRA 的構造雖然簡單,但驅動起來比 ERM 麻煩得多。它不像 ERM 那樣加了電就會自己抖,而需要一個交流訊號讓它來回震動,而且這個訊號的頻率必須非常接近質塊加上彈簧的自然共振頻率,才能讓它達到最大振幅,否則會沒辦法很有效率地驅動它。
LRA 的好處是加速快,通常只要一到兩個週期就能達到最大的加速度,也能在數個週期內煞車到完全靜止。而 ERM 則需要更長的時間加速及減速。
事實上 iPhone 和 Apple Watch 上面的 Taptic Engine 就是一種 LRA,藉由巧妙地快速驅動 LRA 再將他煞停,可以做出 iPhone 7 上面非實體 home 鍵的精確回饋感,以及 Apple Watch 上各種複雜的觸覺回饋。Apple 在 iPhone 4S 和 CDMA 版的 iPhone 4 上首度使用了圓形扁平狀的 LRA,但顯然效果不好, iPhone 5 又換回了 ERM,直到 Apple Watch 上出現了方形的 LRA,並賦予了它一個新名字 – Taptic Engine,Apple 才又重回了 LRA 的陣營。
我在淘寶上也買到了 Apple 用的 LRA:
左邊是 iPhone 6 上所使用的長條形 LRA,右邊則是 iPhone 4S 上的圓形 LRA。
要自己產生 LRA 驅動所需的訊號非常麻煩,尤其在不知道共振頻率的狀況下,需要用 back EMF 的技巧,在驅動的同時短暫地放開負載,並透過測量線圈上的感應電動勢來得知 LRA 的共振頻率,藉以修正驅動的波形。幸好包山包海什麼 IC 都做的 TI 推出了一系列的 ERM/LRA 驅動控制 IC,把這個苦差事變成了可以用 I2C 簡單控制的黑盒子。
我選了 DRV2605L 來做實驗。選這顆的原因是它有 VSSOP 的包裝,我用烙鐵或熱風槍就能將它們焊到電路板上。其它幾顆 ERM/LRA 驅動 IC 都是 DSBGA 包裝,很顯然就是設計給寸土寸金的手機主機板用的。我現在沒有可以操作 BGA 焊接的設備,不要給自己找麻煩。
我在電路上同時留了用電晶體控制 ERM 的電路,以及 DRV2605L 的電路。除了想用 DRV2605L 驅動 LRA 外,我也想試試單純用電晶體控制 ERM 跟用 DRV2605L 控制 ERM 的效果有什麼不同。DRV2605L 裡面有 H 電橋的電路,因此控制 ERM 時還能反轉驅動的極性,理論上來說煞車會比較快。
DRV2605L 裡面內建了一個叫做 TouchSense 2200 的觸覺回饋波形 library,這是 TI 向一家叫 Immersion Technology 的公司授權來的軟體。這個 library 包含了 123 種波形,像是 “Strong Click”、”Double Click”、”Strong Buzz”、”Humming”… 等。光看名字其實很難想像這些效果用起來是什麼感覺,但實際上試過之後就會知道什麼事 buzz、什麼是 humming,而且其實個性還蠻鮮明的。
OLED 顯示器
我上次做 433MHz 的簡報遙控器時,在其中一組的接收器上面加上了 OLED 顯示模組,用來顯示接收到的按鍵訊號。之前做 Tonino 咖啡烘焙色度檢測計時,我也用了同同樣的 OLED 顯示模組。這些小型 OLED 顯示模組本來被用在各種運動手環和穿戴式裝置上,但隨著手環的熱潮退去,市場上開始出現很多便宜的零件可以用。
我以前用的模組是照片中左邊的這種,除了模組本身之外還帶了一片 PCB,上面有一個 3.3V 的 regulator 及一些點亮模組所需要的被動元件。PCB 拉出四隻腳:VCC/GND/SCL/SDA,只要接上電源就可以用 I2C 控制顯示模組。
但我手上其實還有一些右邊這種沒有帶 PCB 的模組,它就只有 OLED 的玻璃基板、COF 的 SSD1306 驅動 IC,以及 14 個可以焊接的 FPC 接點。它的 FPC 接點 pitch 是 0.65mm,可以直接焊到 PCB 的焊點上,不需要用 FFC 連接器。這種 pitch 的焊接對我來說不算太難,因此這次我想挑戰直接使用這種裸的 OLED 模組。
SSD1306 這顆驅動 IC 的資料不難找,但搞清楚這 14-pin 的 FPC 該怎麼接倒是花了我一些時間。因為 SSD1306 支援 I2C 和 SPI 兩種介面,而這種 0.91″ 的 128×32 模組也分成 I2C 跟 SPI 兩種。I2C 版的 FPC 是 14 隻腳,SPI 版的 FPC 是 15 隻腳,外觀上看起來幾乎一樣,不去細數 FPC 接腳數的話根本分不出來。
這是 OLED 周邊的電路圖。C1 和 C4 是 SSD1306 內部的 charge pump 用來產生驅動 OLED 所需的偏壓 VCC,它的電源來自 VBAT 這隻腳。根據 datasheet 上的規格,這邊的電壓會到 7V 左右,因此使用小顆的陶瓷電容要注意耐壓。其它的電容如 C8/C9/C10 等都是 bypass 的功能,VCC 的電壓也會到 7V 左右,而 VDD 則是 3.3V。如果不使用內部的 charge pump,也可以直接在 VCC 腳上供 7-9V 的電源。
R4 是一個用來設定驅動電流的電阻。OLED 是電流驅動的元件,跟電壓驅動的 LCD 不同,它的 pixel 發光亮度正比於流過 OLED 本身的電流,因此控制 IREF 接腳上的參考電流就可以決定整片面板的亮度。根據 datasheet 上的規格,IREF 腳上的電壓是 VCC-2.5V,而這片面板最大亮度的 IREF 電流是 12.5uA,因此可以計算出需要的 R4 大概是 380K 左右。不過由於 OLED 的壽命跟亮度呈反比,我想讓它用久一點,因此沒有設定到那麼高的電流。
另外還有個很重要的部分是 SSD1306 的 power-on reset 電路。最簡單做法是用一隻 GPIO 來控制,不過我看那種帶 PCB 的模組上用 RC reset 電路也工作得很好,就照著做了。這裡還有個小小的插曲:我第一次畫 power-on reset 電路時,沒有看清楚 SSD1306 的說明,以為 RESET 接腳內部有 weak pull-up,因此少拉了 VDD 到 RESET 電路上,結果板子洗出來 OLED 模組不會亮,要跳一根線才會動。
至於其他部分的電路,就沒什麼好說的了。Arduino Pro Micro 是模組,Si4432 也用模組,兩者之間只要把 4 根 SPI、一根 interrupt、一根 shutdown 接起來,再加上電源就好了。
比較需要注意的是 Si4432 module 的電源。Si4432 的發射功率可以到 +20dBm,也就是 100mW。RF 系統如果設計成需要線性的調變方法,PA 會工作在 class A,而 class A 放大器的效率大概只有 1/3。以 Si4432 的電源 3.3V 來說,RF 全功率發射時,系統大概需要 (0.1 / 3.3) * 3 = 90mA 左右的電流,這跟 datasheet 上的 TX mode 電流 85mA@+20dBM 不謀而合。
雖然 USB 的 VBUS 可以供到 500mA,但 Si4432 的 PA 在 ramp up 時抽電的速度可能會超過 VBUS 的暫態反應,因此我在 Si4432 的電源上加了一個相對很大的 bypass 電容。
倒是 Si4432 在接收模式時要吃到 18.5mA 的電流還滿令我訝異的,看起來它的 DAC 和 modem 都蠻耗電的呢。
設計完電路、畫完 layout、送洗板子、手工上件之後,我就做出了第一片板子。
除了前面說過的,OLED 的 reset 拉錯線不會動,得跳一根線之外,其它沒什麼問題。
抖一下看看
板子做好後,我第一個想做的實驗就是看看 LRA 和 ERM 驅動起來的效果如何。
DRV2605L 控制起來說複雜不複雜,但也有十幾個暫存器要設定。我查了一下,SparkFun 幫 DRV2605L 寫了一個 library 可以拿來用,就省得我自己一個一個去敲那些暫存器。
#include <Sparkfun_DRV2605L.h>// Sparkfun DRV2605L haptic library SFE_HMD_DRV2605L hapEng; // heptic engine object void haptic(int effect) { hapEng.begin(); hapEng.Mode(0x00); // enable internal trigger mode hapEng.MotorSelect(0xB9); // 0xB9 1011 1001: LRA MODE, 4X Brake Factor, Medium Gain, 7.5x Back EMF //hapEng.MotorSelect(0x39); // 0X39 0011 1001: ERM Mode, 4x Brake factor, Medium Gain, 1.365x Back EMF hapEng.Library(6); // select library #6 for LRA //hapEng.Library(5); // select library #1-5 for ERM hapEng.Waveform(0,effect); hapEng.Waveform(1,0); hapEng.go(); }
DRV2605L 裡面總共有 7 個 library,其中 6 個是給不同尺寸、速度的 ERM 用的,1 個是給 LRA 用的。每一個 library 都有 123 種效果。理論上如果 calibration 做得好的話,同樣的效果在不同的 library 和裝置上,應該會呈現近似的感覺。
這些觸覺回饋效果真是琳瑯滿目,我隨便選了一個 5 號的 “Sharp Click – 60%”,接了一顆 LRA 上去,驅動。
驅動的時候,我可以明顯地感覺到 LRA 以某種可辨識的 pattern 在震動,而在示波器上我看到這樣的驅動波形:
原來簡單的一個 click,在 LRA 上竟然有這麼複雜的波形。從波形上看,在這個效果下,LRA 總共被驅動了 13 次主要的震動,而尾巴那幾個則是煞車的波形。至於這些波形中間那密密麻麻的方波,則是 DRV2605L 用 back-EMF 在偵測 LRA 的共陣頻率時所造成的現象。驅動電路沒隔一小段時間就會將負載放開,因此在驅動波形上會造成一個小小的陷落,同時 DRV2605L 裡面的 back-EMF 偵測電路則利用這個空檔去測量 LRA 的振子或是 ERM 的轉子跟線圈交互作用時,所感應出來的波形,用以計算共振頻率,並調整驅動電路的輸出。
我把 DRV2605L 的模式從 LRA 換到 ERM,並且接了一顆 ERM 上去,設定同樣的效果。這次波形變成這樣:
ERM 的驅動波形遠比 LRA 要簡單,它基本上就是個 DC 波形,但同樣地裡面會有系統在偵測 back-EMF 時造成的方波。放大看的話,DRV2605L 偵測 back-EMF 的頻率大概在 20KHz 上下,因此它的 feedback loop 相對機械共振頻率一百多 Hz 的 LRA 或頻率更低的 ERM 來說,已經非常快了。
如果我們把驅動 ERM 的波形前端放大來看,可以看到 DRV2605L 利用 PWM 讓 ERM 加速的現象:
ERM 的反應比 LRA 慢得多,因為 ERM 的慣性比 LRA 大得多,在煞車甚至停止驅動之後,ERM 還會多轉個幾圈,因此驅動 ERM 的波形在同樣的效果下,看起來都比 LRA 的短,但我們在機構上感覺到的震動時間實際上是差不多的。
總之,驅動 ERM/LRA 真的是一件蠻好玩的事。接下來,我就要構思無線部分的通訊協定,以及如何把這些東西整合在一起了。
(未完待續)
近期留言