雙掌控板收發摩爾斯電碼

2021年6月7日 吳新

文/牟曉東

作為國內開源硬件的杰出代表,掌控板是一款非常優秀的國產“創客”微控制器板,支持Python代碼編程以及Mind+、mPython等主流圖形化編程軟件。使用單塊掌控板進行編程,可以實現噪音計、身高測量儀、高溫報警系統和天黑自動收衣服系統等案例;如果有兩塊掌控板,就可以借助藍牙與WiFi雙無線通訊,遵循MQTT(消息隊列遙測傳輸)協議在SIoT開發平臺(如Mind+的SIoT本地物聯網、DFRobot的Easy IoT)或OneNET(移動物聯網開放平臺)等開放平臺上進行更為豐富的物聯網應用創意項目設計,比如實現諜戰影視片中摩爾斯電碼的發送與接收。


1.預備知識:摩爾斯電碼


摩爾斯電碼(Morse code)是一種通過不同的排列順序來表達相關字符(比如26個英文字母)的數字化通信形式,它的最基本代碼是“滴”和“嗒”,分別對應短促的“一個點”信號和“一個劃”信號,“一劃”相當于“三個點”的時長(如圖1)。在各種故事情節中最為經典的摩爾斯電碼應用,便是SOS國際通用求救信號的發送——字母S的摩爾斯電碼是“滴、滴、滴”三個點,字母O的摩爾斯電碼是“嗒、嗒、嗒”三個劃,通過開關手電筒控制電路通斷以光的形式,或是單根手指連續敲擊桌面以聲的形式,都能夠快速發送“三點、三劃、三點”的SOS求救摩爾斯電碼。

雙掌控板收發摩爾斯電碼

2.收發操作方法規劃


每個掌控板都有A和B兩個按鍵和P、Y、T、H、O、N六個觸摸鍵供我們選用。在發報方掌控板中進行編程,將按鍵A和B分別設計對應發送摩爾斯電碼的“滴”和“嗒”信號,而將觸摸鍵P作為每組摩爾斯電碼(即所表示的某一個字符)的結束信號,因為真實的用摩爾斯電碼發報字母間隔是一個“嗒”的時長(相當于3個“滴”),單詞間間隔是7個“滴”,這需要專門訓練才能做好,對于初學者來說操作難度較大,而簡單地“碰”一下觸摸鍵的動作則非常方便。另外,為了對按鍵和觸摸鍵的按下與觸摸操作進行即時反饋,還要添加RGB燈閃爍和蜂鳴器播放音符模擬“滴”“嗒”聲,比如三支RGB燈分別對應按鍵A、B和觸摸鍵P的“動作”;同時,在收報方掌控板中也進行同樣的編程控制方式,模擬實現摩爾斯電碼的發報與收報的“聲光”同步響應,趣味性更強。


3.掌控板發報方的mPython編程


將一塊掌控板通過數據線連接至聯網電腦的USB接口,然后運行mPython進行程序的編寫。


(1)通過Wi-Fi模塊將掌控板聯網


兩個掌控板之間能夠正常進行信號的發送與接收的“對話”前提條件是暢通的網絡連接,因此程序的最開始必須是進行聯網設置。從左側的“Wi-Fi”中選擇第一項“連接Wi-Fi名稱……密碼……”模塊語句,然后補充完整所使用的無線網絡名稱及密碼信息(明文顯示)。


(2)進行“連接MQTT”設置


在mPython的“擴展”-“MQTT”中提供了若干種MQTT模塊,以其中的“MQTT-Easy IoT”為例(其它的用法基本類似),這是由DFRobot提供的物聯網MQTT服務,需要從瀏覽器訪問網站(
https://iot.dfrobot.com.cn/)先進行免費注冊,然后登錄進入自己賬號的“工作間”;左側有兩處關鍵信息,一是“Iot_id(user)”(即用戶名),將其值“XNbxt3rMR”復制粘貼至mPython編程中“MQTT-Easy IoT”模塊語句中的第三項“Iot_id”中;二是“Iot_pwd(password)”(即密碼),可點擊“小眼睛”圖標進行顯示,將其值“uHxxpqrGRz”復制粘貼至第四項“Iot_pwd”中(前兩項“服務器”和“Client ID”均保持默認值)。在“工作間”中執行三次“添加新的設備”操作,分別重命名為“mPython_1”、“mPython_2”和“mPython_3”,對應三個Topic“主題”的數值,可分別復制并粘貼至記事本中保存,這些信息在收報方掌控板中也要用到(如圖2)。


再次返回mPython編程界面,從“MQTT”中選擇“連接MQTT”模塊語句,添加至“MQTT-Easy IoT”模塊語句后面,作用是根據之前的設置進行MQTT連接。

雙掌控板收發摩爾斯電碼

(3)設置OLED顯示屏的顯示提示信息


先從左側的“顯示”中選擇“OLED顯示‘清空’”模塊語句;再使用兩次“OLED第‘’行顯示‘’模式‘普通’‘不換行’”,控制OLED顯示屏的第1行、第2行分別顯示“連接MQTT-Easy IoT !”和“長江長江,我是黃河!”提示信息;最后要添加“OLED顯示生效”模塊語句(如圖3)。

雙掌控板收發摩爾斯電碼

(4)定義字典變量my_dict并進行數據的初始化


為了進行摩爾斯電碼的分解與重組,可以將二進制代碼“0”和“1”與摩爾斯電碼的“滴”和“嗒”一一映射進行組合編碼。比如:字母“A”的摩爾斯電碼是“滴、嗒”,在字典中為它設置“鍵”(Key)為“01”,“值”(Value)為“A”;再比如:字母“B”是“嗒、滴、滴、滴”,在字典中的“鍵”就是“1000”。對應摩爾斯電碼的編碼規則,對字典變量my_dict進行定義和初始化,完成26個大寫英文字母的“0”“1”編碼映射(如圖4)。

雙掌控板收發摩爾斯電碼

(5)a_func、b_func和p_func三個函數的編寫


為了使主程序結構更加條理清晰,編寫a_func、b_func和p_func三個函數來分別實現當按下按鍵A、B和觸摸P時所觸發的“動作”:聲音提醒、RGB燈閃爍提醒等。注意我們建立message、my_string和morse三個變量的作用。變量message的作用是用來生成“0”或“1”,這個值取決于操作者按下的是A鍵還是B鍵:A鍵對應“0”,B鍵對應“1”;變量my_string相當于Python中的“列表”,它的作用是將變量message依次生成的“0”或“1”單個值通過“追加文本”的方式不斷有序的“補充”組合;當生成的最終組合值在字典my_dict中進行“鍵”的搜索時,如果有對應的“鍵”,則將變量morse的值設定為字典中該“鍵”所對應的“值”,即某一個英文字母(如圖5)。

雙掌控板收發摩爾斯電碼

比如:先按一次B鍵、再按一次B鍵、再按一次A鍵、最后按一次P鍵的操作,變量message中就會依次存儲“1”、“1”和“0”;當這三個數據按生成的先后次序追加至變量my_string中時,組合值就是“110”;將“110”與字典my_dict中的26個“鍵”去查找“配對”,找到對應的“值”是字母“G”,接下來就將字母“G”保存至變量morse中,表示發送的摩爾斯電碼是字母“G”。在p_func函數中又一次控制OLED顯示屏進行顯示輸出,其中變量i的作用是控制多個連續發送的摩爾斯電碼能夠依次顯示(通過后面的“將變量i的值增加10”的語句實現),對應的是OLED顯示屏橫坐標x的數值(如圖6)。

雙掌控板收發摩爾斯電碼

注意:在主程序中要將變量message、my_string和morse先進行文本型數據的“空值”設定,變量i的初值則設置為整型數據10;而在a_func、b_func和p_func三個函數中,每次獲取對應的數據后還要根據情況進行變量值的“清空”或是“自增”操作。


(6)設置三個“發送”主題的循環


建立一個“一直重復執行”的循環結構,注意在循環體最后要添加一條“等待0.01秒”的模塊語句(防止程序運行過快而消耗過多的系統資源);循環內是一個三分支的選擇結構,當檢測到A鍵被按下時,調用執行a_func函數并且發布值為“ON”數據至第一個主題“Mqj-t39Gg”;當檢測到B鍵被按下時,則調用執行b_func函數并且也發布值為“ON”的數據,但對應的是第二個主題“qagfpq9Gg”;當檢測到P被觸摸時,調用執行的是p_func函數,發布值為“ON”的數據至第三個主題“wP_Q-69GR”;注意此處需要添加內層選擇結構,對字典變量my_dict中的“鍵”是否與變量my_string的值進行匹配檢測(如圖7)。


這三個不同的主題所存儲的“ON”消息值,是第二塊掌控板(收報方)的響應動作觸發條件,要在收報方掌控板中進行對應主題消息的“訂閱”等一系列操作后才會起效。


4.掌控板收報方的mPython編程


將第二塊掌控板通過數據線連接至第二臺聯網電腦的USB接口,運行mPython進行程序的編寫。


與發報方掌控板的程序基本一致,包括Wi-Fi聯網和MQTT設置(其中的Client ID須改動至少一位數字),OLED顯示屏的顯示提示信息稍作改動——“黃河黃河,我是長江!”;字典變量my_dict的定義與數據初始化,a_func、b_func和p_func三個函數的編寫,以及變量message、my_string和morse、i等的初始賦值等均完全一致(如圖8)。

雙掌控板收發摩爾斯電碼

最大的區別是取消了三個主題發送的循環結構,但同樣是新建了一個極為類似的循環結構。先從左側“循環”和“擴展”-“MQTT”中分別選擇“一直重復執行”和“等待主題消息以‘阻塞’模式”模塊語句,接著進行三個主題的同步“監聽”,其中的主題名與發報方的三個主題是一一對應的,這就相當于進行主題的訂閱:當收到對應主題有“ON”消息值到達時,分別調用執行對應的a_func、b_func和p_func函數,與發報方進行摩爾斯電碼發報時的響應完全相同(如圖9)。

雙掌控板收發摩爾斯電碼

5.測試摩爾斯電碼的發報與接受


程序編寫完畢后進行保存,接著分別在發報方和收報方的mPython編程界面點擊上方的“刷入”按鈕,右下角的“控制臺”區會有“代碼刷入36%”、“刷入成功”和“Connection Wi-Fi”等提示信息。很快,兩塊掌控板的OLED顯示屏第一行都會顯示“連接MQTT-Easy IoT!”提示信息,第二行則是表明自己身份的信息(“黃河”與“長江”)。


在發報方掌控板上進行SOS國際通用求救信號的發送操作:先連續按三次A鍵、碰一下觸摸鍵P,顯示出字母“S”,同時在收報方掌控板上也同樣會有字母“S”出現,而且都會有“滴”聲響起和RGB燈閃爍;接著再連續按三次B鍵、碰一下觸摸鍵P,又顯示出字母“O”;然后重復第一次的操作,字母“S”再次出現,在收報方掌控板的OLED顯示屏上也是正常顯示出了完整的“SOS”信息(如圖10)。

雙掌控板收發摩爾斯電碼

同樣,如果再進行其它字母的發送與接收測試,比如最簡單的字母“E”和“T”,分別是“滴”和“嗒”,對應的操作是按A再碰P、按B再碰P,測試均正常,完成雙掌控板mPython編程“隔空”收發摩爾斯電碼實驗項目的設計。


6.對本實驗的改進與升級設想


在編程和測試結束之后,感覺并不完美,仍有若干處需要改進和升級的地方:


(1)發報方與收報方是進行“單向”通信的,收報方掌控板在收到“SOS”求救信號后并不能對發報方掌控板做出回應,比如再發送回“OK”。將雙方的程序各自進行對應功能模塊的添加,發報方需要添加主題訂閱,收報方需要添加主題發送。另外,在“雙向”響應的基礎之上還可以考慮進行“一對多”、“多對一”甚至是“多對多”的升級,也就是將多塊掌控板組成一個彼此獨立但又能相互進行摩爾斯電碼的發報與接收。


(2)程序中的字典my_dict只包含了26個英文大寫字母,可以根據國際摩爾斯電碼將10個阿拉伯數字、斜杠和括號等標點符號也進行添加,可以傳輸表達更多的信息。除了這些通用的國際摩爾斯電碼之外,我們還可以考慮對字典進行自定義式擴充,比如若干使用頻率極高的漢字,只要各掌控板程序中使用的字典是相同的,并且均進行了“鍵”、“值”的惟一對應編碼,就可以直接進行漢字的摩爾斯電碼發報與接收。


(3)在進行摩爾斯電碼的發報和接收時均為“明文”,保密性幾乎為零。其實可以添加各種加密算法來嘗試摩爾斯密碼的發報與接收,比如凱撒加密,相當于對字典文件中的“鍵”、“值”進行不確定量的偏移計算,解密的過程就是將該運算進行反向即可。


(4)實驗項目中是將掌控板的觸摸鍵P作為每個摩爾斯電碼的結束標志,如果按照標準的摩爾斯電碼發報操作,也就是只有對應“滴”和“嗒”的兩種操作,正好分別分配給按鍵A和B。只不過相鄰兩個信號的間隔必須要控制好,比如點與劃之間的停頓、單詞間的停頓,還有句子間的長停頓,具體可查閱摩爾斯電碼的標準操作規范。此時的程序就簡單了很多,比如省略掉一個主題、精簡p_func函數,變量的使用也簡單不少,只不過對操作者的發報操作方法要求比較高,但會更酷一些,大家不妨一試。