主控板显控板(双掌控板收发摩尔斯电码)
主控板显控板(双掌控板收发摩尔斯电码)两个掌控板之间能够正常进行信号的发送与接收的“对话”前提条件是畅通的网络连接,因此程序的最开始必须是进行联网设置。从左侧的“Wi-Fi”中选择第一项“连接Wi-Fi名称……密码……”模块语句,然后补充完整所使用的无线网络名称及密码信息(明文显示)。(1)通过Wi-Fi模块将掌控板联网每个掌控板都有A和B两个按键和P、Y、T、H、O、N六个触摸键供我们选用。在发报方掌控板中进行编程,将按键A和B分别设计对应发送摩尔斯电码的“滴”和“嗒”信号,而将触摸键P作为每组摩尔斯电码(即所表示的某一个字符)的结束信号,因为真实的用摩尔斯电码发报字母间隔是一个“嗒”的时长(相当于3个“滴”),单词间间隔是7个“滴”,这需要专门训练才能做好,对于初学者来说操作难度较大,而简单地“碰”一下触摸键的动作则非常方便。另外,为了对按键和触摸键的按下与触摸操作进行即时反馈,还要添加RGB灯闪烁和蜂鸣器播放音符模拟“滴
作为国内开源硬件的杰出代表,掌控板是一款非常优秀的国产“创客”微控制器板,支持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服务,需要从浏览器访问网站(iot.dfrobot/)先进行免费注册,然后登录进入自己账号的“工作间”;左侧有两处关键信息,一是“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函数,变量的使用也简单不少,只不过对操作者的发报操作方法要求比较高,但会更酷一些,大家不妨一试。