用VB + Arduino开展创客式教学
2016-09-10吴海忠
吴海忠
普通高中信息技术课程的总目标是提升学生的信息素养,培养信息时代的合格公民。浙江省普通高中信息技术必修模块《信息技术基础》和选修模块《算法与程序设计》都选用Visual Basic作为算法教学语言。在学习Visual Basic语言时,怎样激发学生的学习兴趣,并使其长久保持学习的热情;开发校本选修课时,能开出一门既有深度又能吸引学生的Visual Basic课程;学习Visual Basic语言时还能培养动手能力和创新能力;学有余力的学生在学习完Visual Basic语言后能顺利自学C语言。基于这些思考,笔者提出用Visual Basic 6 + Arduino开展创客式教学。
所谓创客式教学是指用创客的理念和方式来改造日常的教学,形成新的教学模式。创客理念主要指:①将创意变成实物;②做中学;③持续分享;④协作学习;⑤跨学科;⑥运用信息技术。Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。Arduino硬件都非常便宜,购买也非常方便,适合开展低成本的教学。Arduino通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。在Arduino IDE中,通过Arduino语言编写程序,并将编译后的二进制文件烧录进微控制器,实现传感器和执行器的协同工作。在开展Visual Basic教学时,Visual Basic程序可以扮演执行器、控制器等角色。
下面以游戏摇杆操控VB窗体中图像实现自由移动为例,介绍如何实现VB和 Arduino协同工作,为开展VB + Arduino教学抛砖引玉。
连接游戏摇杆和Arduino板
图1为游戏摇杆和Arduino板连接实物图,各针脚对应连接如表1所示。摇杆由Arduino板的5V输出电压供电,原始状态下S-X,S-Y读出电压约2.5V。当沿板上X和Y箭头方向按下,读出电压值随着增加,最大到5V;当沿X和Y箭头反方向按下,读出电压值随着减少,最小为0V。Arduino板上的A0和A1为模拟量输入脚,读取时0~5V电压值已被转换为数值0~1023。
安装Arduino驱动程序
将连接Arduino的USB口插入到计算机后,Windows会提示“发现新硬件”。Arduino板本身将作为计算机的一个串口设备,由于计算机中没有相应的驱动程序,会显示安装失败。进入Windows设备管理器,在端口(COM和LPT)下找到带黄色感叹号的USB Device,通过手动指定驱动程序文件夹位置来安装驱动程序(具体参考网上教程)。对于Windows 7以上操作系统可通过在线搜索安装驱动程序。安装好驱动程序后,Arduino板在设备管理器中显示如图2所示,在笔者计算机中Arduino作为串口6设备。
配置Arduino IDE
登录网址https://www.arduino.cc/en/Main/Software,下载最新的Arduino开发环境IDE。运行Arduino IDE:①进入工具菜单选择开发板型号,基础版选择“Arduino/Genuino Uno”;②选择Arduino所在的串行端口号(参考设备管理器提示),这里选择“COM6”,如图3所示。
编写Arduino程序
根据当前连接的感应器和执行器协同工作需要,为Arduino编写相应的程序。Arduino程序主要的功能:设置连接外接设备针脚模式和参数,读取外接设备数据,控制外接设备等。作为授课老师,这些程序是需要了解或会编写的,学有余力的学生可以自学和编写,普通学生只需能将程序编译和上传(烧录进微控制器)。Arduino编程语言是建立在C语言基础上的,有C语言基础的能很快上手。图4是进入Arduino IDE后默认建立的程序框架。
Arduino语言以setup函数作程序开头,loop函数作程序框架主体。setup函数用来初始化变量、管脚模式,调用库函数等,只运行一次。loop函数在setup函数运行后,被周而复始的循环执行。Arduino语言参考网址http://www.arduino.cn/reference/。为摇杆编写的代码如图5所示。
Serial.begin(9600):将串口通信速率设置为9600bps。通信的两端要保持相同的传输速率,Arduino将通过USB与计算机连接的接口定义为Serial对象。
Serial.flush():等待串口数据传输完成,并将缓冲区清空。
analogRead函数的功能是读取指定模拟针脚的值,A0、A1是模拟针脚0和1的别名。模拟针脚上的电压值(0~5V)经模/数转换后变为一个整数值(0~1023)。Serial.print函数的功能为将数据以字符串方式输出到串口。Serial.println函数在输出时数据的同时在后面增加回车符(ASCII 13)和换行符(ASCII 10)。delay函数为让程序等待多少毫秒,然后往下执行。
由于loop函数是被循环执行的,因此整个程序的功能为首先设置端口传输速率为9600位/秒,然后每隔0.1秒读取模拟针脚0和1上的数值,并将这二个数值用分号分隔,再连接回车换行符,最后输出到串口。当然程序还可以更完善或更精炼。
单击工具栏上第一个按钮对程序进行验证(编译),如图6。在程序通过验证后,单击工具栏上的第二个按钮,将程序重新编译并上传给Arduino板,如图7所示。Arduino在有程序上传后,首先进行初始化,然后按上传程序指令重新开始工作。
为了验证程序是否有效,单击工具菜单中“串口监视器”,打开监视窗口。如图8所示,监视窗口中不断收到Arduino发送过来的数据。按动游戏摇杆,数据会变化,如图9所示。
编写VB程序
运行VB6,新建一个工程文件。在工程中添加MSComm控件,如图10所示。MSComm是一个串行通信控件,它提供了一系列标准通信命令的接口,允许建立串口连接。MSComm采用事件驱动通信,当有字符到达或发生了改变,OnComm事件就被触发。
在窗体中添加二个CommandButton控件,一个Image控件,一个MSComm控件。工程属性、窗体属性和窗体内各控件属性设置如表2所示,窗体界面设计如图11所示。
MSComm控件的CommPort属性值要设置为6,也就是Arduino板所在的串口号。RThreshold的属性值设置为1,也就是每当接收到一个字符时就触发MSComm控件的OnComm事件。因为Arduino的数据传输速率已设置为9600bps,所以Settings属性值无需修改。
在窗体代码窗口输入以下代码:
Private Sub CStart_Click()
MSCom.PortOpen = True
End Sub
Private Sub CStop_Click()
MSCom.PortOpen = False
End Sub
Private Sub MSCom_OnComm()
Debug.PrintMSCom.Input
End Sub
运行工程,单击窗体中“开始”按钮。VB6立即窗口显示如图12所示。
虽然设置RThreshold为1,即每接收到一个字符时触发OnComm事件,但读取时缓冲区内容可能已经有好几个字符了。因此,需要根据回车换行符进行重组。窗口代码如下:
Private SBuffer As String
'增加一个窗体变量,作为接收缓冲区
Private Sub MSCom_OnComm()
Dim I As Byte
Dim STmpAs String, SLeft As String, SChar As String
STmp = MSCom.Input
SBuffer = SBuffer&STmp
SLeft = ""
For I = 1 To Len(SBuffer)
SChar = Mid(SBuffer, I, 1)
Select Case Asc(SChar)
Case 10
'检测到换行符不做什么作丢弃
Case 13
'检测到回车符时
Call OnComing(SLeft)
'调用过程
SLeft = ""
Case Else
'其他任何字符作加入输出内容
SLeft = SLeft&SChar
End Select
Next
SBuffer = SLeft
'剩余内容保留给下一次
End Sub
Private Sub OnComing(ByValSStr As String)
Debug.PrintSStr
End Sub
CStart_Click和CStop_Click过程代码保持不变。运行工程,单击窗体上“开始”按钮。此时立即窗口显示如图13所示。
在MSCom_OnComm事件处理过程中,每接收到一组正确的数据时OnComing过程就被调用一次。将OnComing过程修改为如下:
Private Sub OnComing(ByValSStr As String)
Dim L As Integer, T As Integer, Tmp() As String
Tmp = Split(SStr, ";")
L = Tmp(0): T = Tmp(1)
If L < 411 Then ITurtle.Left = ITurtle.Left - (511 - L)
If L > 611 Then ITurtle.Left = ITurtle.Left + (L - 511)
If T < 411 Then ITurtle.Top = ITurtle.Top - (511 - T)
If T > 611 Then ITurtle.Top = ITurtle.Top + (T - 511)
End Sub
运行工程,单击窗体上“开始”按钮。上下、左右按下摇杆,窗体中的小乌龟图片将上下、左右移动,按力越大移动速度也越快。在摇杆初始状态下,读出数据约为513~516,而程序中411~611间的数据不作移动处理,因此初始状态下图片不会自己移动。
小 结
在小学阶段,可以利用S4A(Scratch For Arduino)开展创客式教学。对于浙江的中学生来说,在学习完VB后,开展VB + Arduino创客式教学是很有必要和很有前景的。由于篇幅关系,这里仅以一个小小的例子演示如何利用VB + Arduino编程实现协同工作。在实际教学时,根据学习进度和能力的不同,可以给学生提出不同的编程要求。比如在初学时,教师可以将MSCom控件和OnComm事件处理过程(含数据整理代码)重新封装为一个控件,学生只要在工程中添加这个控件并设置基本属性就可。为Arduino编写的程序,教师可以事先发给学生,学生只需要在使用前上传一下就可。而学有余力的学生,教师可以引导他们阅读和模仿这些代码。
(作者单位:浙江嘉兴教育学院)