從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (2) 設定 BLE

李松錡
9 min readOct 22, 2017

--

此為系列文,目前已完成的文章列表:

  1. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (0)
  2. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (1) 製作左手
  3. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (2) 設定 BLE
  4. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (3) Debounce
  5. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (4) 定義 keyboardMgr class
  6. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (5) 製作右手
  7. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (6) 基礎鍵盤
  8. 從 0 開始,手打一把專屬的藍牙雙模人體工學鍵盤 (7) 軌跡球

在前一篇 “製作左手” 的部分,如果你 keyboard matrix 確定已經沒有問題的話,可以先將左手的 HM-10 BLE 模組也接上去。因為 PCB 是用現有的原始 Ergodox 的,所以前一篇焊了一堆的跳線,然後有兩根很奇怪的跳線 (Pro Mini 的 pin 4 跟 pin 9),就是利用了本來 PCB 上的設計,因此可以參考下圖

除此之外再連接藍牙模組的 VCC 和 GND

接著就可以燒 code 來驗證看看連線有沒有問題

首先打開 2_set_BLE/set_left_HM-10 的專案。裡面我們使用了 Arduino 的 SoftwareSerial 來跟 HM-10 溝通。把 code 燒上去之後,打開 Serial monitor,baud rate 調整正確,選擇沒有行結尾

根據 HM-10 的 datasheet,可以看到輸入 AT ,藍牙模組會有回應。AT+OK。再這邊我們要做的事情是抄下這個藍牙模組的 address。輸入 AT+ADDR?,就可以拿到此藍牙模組的 address。此外大部分的設定我們可以都維持預設值即可。有一個可以設定的部分是 trasmitting power,因為我們使用的距離非常短,所以其實可以把 transmitting power 設定成最低,藉此拉長使用的時間。輸入 AT+POWE0,可以把 transmitting power 設定成最低的 -23 db。註: 因為藍芽用的是 2.4GHz 的頻道,所以有可能會跟環境的 wifi 衝到,雖然 bluetooth 4.0 有所謂的自動跳頻,但有時候還是會輕微的受到干擾。此時遇到這樣的狀況可以考慮把藍芽模組的 transmitting power 設高一點。

接著我們總算要拿出 Arduino Pro Micro 了。在這邊我們先將右邊 HM-10 模組跟 Pro Micro 連接,但不要急著焊起來

這是示意圖,接線會有一點不同

然後拉好以下的接線:

  • HM-10 VCC -> Pro Micro VCC
  • HM-10 GND -> Pro Micro GND
  • HM-10 Tx -> Pro Micro pin 8
  • HM-10 Rx -> Pro Micro pin 7

接著就可以打開 2_set_BLE/set_right_HM_10,一樣選取板子。如果你使用的 Pro Micro 是 5V 的版本,在 Arduino IDE 的選取板子你可以選取 Arduino Leonardo,但如果你是 3.3V 的版本,要跟著 SparkFun 的教學,用 board manager 把 Pro Micro 加入到 Arduino IDE 裡。

在燒上去的時候要特別注意處理器一定要選對,3.3V 或 5V 不可弄混,弄混的話一樣跟著前面 SparkFun 的教學解磚。這個部分我會留在這篇文章的最後做比較詳細的說明。

燒上去以後開啟 Serial monitor,打入 AT 會得到 HM-10 的回應。右邊的 HM-10 我們要調整成 central (master),輸入 AT+ROLE1,並且輸入 AT+RESET 重啟模組,就可以把模組設定為 central 模式。我們先將左邊的 HM-10 通電,然後在 Pro Micro 的 serial monitor 裡面輸入 AT+CON[address],把左邊 HM-10 的 address 填入以後,就會看到兩個 HM-10 模組上的燈號長亮而不再閃爍,至此兩個藍牙模組就配對完成了。兩個藍牙模組目前處於 transmission mode,從藍牙模組 Rx 輸入的資料會像 socket 一樣被傳送到另一邊藍牙模組的 Tx 端。這個步驟也處理完畢以後,我們要來測試把左邊的 “row column is closed” 的字樣送到右邊的 HM-10 上。

打開 2_set_BLE/left_send_closed 的專案,這個專案要燒到 Pro Mini。這個專案其實是延續前面 keyboard matrix 的那個範例,但我們把 “row column is closed” 的字樣用 SoftwareSerial 送到左邊的 HM-10 上面,然後左邊的 HM-10 就會自動把這些文字送給右邊的 HM-10,接著才被送到 Arduino Pro Micro 的 Rx pin 上面。燒錄完畢以後,打開 Pro Micro 的 serial monitor (是 Pro Micro 的,因為我們把訊息用 HM-10 傳到 Pro Micro 上,所以現在要來檢查 Pro Micro 是不是有收到 “row column is closed 的字樣”)。接著一樣用跳線模擬按鍵按下去的動作

如果沒有問題的話,應該能夠在 Pro Micro 的 serial monitor 上面看到這些字樣

至此就表示藍牙模組也正常了。HM-10 模組在預設下,是會記憶以前連線過的裝置,然後會自動連線,所以未來只要兩邊都有通電的話,兩個 HM-10 模組就會自動連接,只要看到兩個 HM-10 的 LED 燈號都是長亮而非閃爍的話,就表示已經連線了。

至此,左邊該有的模組差不多也都完成了,此時我們可以把充電模組和電池都放進去。

我的充電模組是長這個樣子的,就照著模組上面的指示,B+ 接到電池的正極,B- 接到電池的負極,OUT+ 可以先連接到一個開關,然後開關再連到 PCB 上面 VCC 的孔;OUT- 就直接連接到 PCB 上面的 GND,然後我把他放在這個位置

如此一來我就可以直接插 micro usb 的線來進行充電。此時左手所有的電子元件都已經上去之後。就可以開始把蓋子蓋上,軸也都焊上了。焊上之後就和最終成品差不多,只是我上面還有多裝一個微動開關。在左邊的蓋子上鑽 3 個孔。然後微動開關以跳線拉到 keyboard matrix 上沒有焊軸體的孔 (因為有 6 個 row 和 7 個 column,所以其實是可以偵測 42 個開關的,只是 ergodox 上面只有 36 個按鍵,因此其實還有 6 個沒有配上軸的洞)。

Arduino Pro Micro

前面我們有提到如果在燒 Pro Mini 的時候選錯電壓 (3.3V 選成 5V的,或反過來),這時你的 Pro Micro 就會變成一塊磚,電腦無法辨識。我也遇過因為燒 Pro Micro 的 micro usb 線品質不好,燒到一半的時候訊號扭曲所以燒了有問題的 code 進去,這些都會造成 Pro Micro 事後無法開機。那要怎麼解決這個問題呢? 如果你的 Pro Micro 的 bootloader 是 SparkFun 的版本,那他們有提供一種方式,你要快速的短路 RST 跟 GND 兩次,然後會有 8 秒的時間 Pro Micro 會呈現在 bootloader 的狀態,此時電腦是可以辨識到的,然後隨便燒一個電壓正確的 code 上去,就可以解磚了。但如果你一直無法成功用這個方法解磚,你可以直接把 Arduino 的 bootloader 重新燒錄上去,這樣他就會恢復正常。燒錄 Arduino bootloader 最簡單的方式就是拿起另一塊 Arduino,例如我手上有一塊 Arduino UNO

然後按照以下的接線:

  • UNO 5V -> Pro Micro RAW
  • UNO GND -> Pro Micro GND
  • UNO 10 -> Pro Micro RST
  • UNO 11 -> Pro Micro 16
  • UNO 12 -> Pro Micro 14
  • UNO 13 -> Pro Micro 15

然後打開 Arduino IDE,選取範例中的 Arduino ISP

先把這個程式燒錄到 UNO 上面,接著再從工具中設定

設定使用 Arduino as ISP,接下來在開發版的選項設定你要燒錄的板子

這樣然後按下燒錄 Bootloader 就可以了。這個做法因為是直接去洗掉要被燒錄的 Arduino 上面的 flash memory,所以只要 Arduino 晶片是沒有壞的,基本上都可以救回來。但好死不死的是,3.3V 的 Arduino 通常是跑 8 Mhz的,而多數直接有 USB 接頭的 Arduino 都是 5V 的,都跑 16 Mhz。也因此,5V 的 Arduino 是沒辦法作為 3.3V 的 Arduino 的 programmer 的。所以如果大家當初買了一片 3.3V 的 Pro Micro,你就很難用這招把磚掉的 Pro Micro 救回來 (關於使用 Arduino Pro Mini 3.3V 作為 Programmer,我目前還沒成功過,也有一些猜測為什麼會失敗,但也都只是猜測)。我目前成功的把磚掉的 3.3V Pro Micro 救回來的方式,是拿第二片的 3.3V Pro Micro,把這片好的 Pro Micro 燒成 programmer,然後再拿他去燒 bootloader,如此就可以把磚掉的 Pro Micro 救回來,這也是為什麼我目前依然推薦大家使用 5V 的 Pro Micro 的原因。

--

--