☆王伟民
(浙江省上虞中学,浙江绍兴 312300)
为推动普通高中办学多样化、特色化发展,从2013年开始,浙江省教育厅开展“普通高中特色示范学校”建设评估,我校也开始了特色学校的创建之路。在全校教师及校外力量的共同努力下,在不到1年的时间里,开设了100多门校本选修课程,笔者开设的《创意机器人》也名列其中。
在课程的开设过程中,笔者发现目前高中生在机器人方面的基础普遍较差,从连续两年对高一选修本课程的学生(总人数为60)的调查结果来看,学过机器人的学生人数为零,学过编程的只有1人,学过电子小制作的也为零,可见机器人或与其相关的技术学科在小学阶段和初中阶段的普及教育还是一片空白,小学和初中虽然都有机器人的相关教材,但许多学校并不开设课程,或仅作简单介绍。因此,现阶段高中开设机器人选修课时,教师仍需要对学生进行机器人基础知识的普及教育。
这一现状导致目前高中阶段的机器人教学深度和难度不够,教和学均停留在简单机器人的学习和制作上。但其实高中生的智力水平远远高于小学生和初中生,应当适当涉及复杂编程;另外,大多数学校开设这门课是希望从中挑选优秀的学生去参加各类机器人比赛。从这两方面考虑,教师有必要向学生介绍复杂编程的相关知识,因此,我们在每学期结束前均会安排2-3节课,引导学生从简单编程过渡到复杂编程,本文介绍的是其中一节课的相关情况,以期与同行交流。
机器人项目一般有一定的复杂度,特别是高智能、多功能机器人,不光硬件复杂,其软件部分也非常复杂。为了降低编程难度,便于多人合作编程,通常采用模块化编程。对于高中生而言,掌握利用机器人解决一些较复杂问题的策略和思路,不但可以锻炼学生的思维能力、综合应用能力和面对复杂问题时的决策能力,也有利于学生创意的发挥,从而能制作出功能更加新颖和强大的机器人。
复杂编程相对于简单编程,不仅仅是代码的长度更长,也不是一段段的简单程序的简单堆砌,复杂编程有着独特的结构。在编程中,通常会用到函数和函数调用、复合条件的使用、程序嵌套、并行驱动等知识,对于初次接触复杂编程的初学者,建议从复合条件的使用入手。
我校选用的是雍异教育机器人,采用C51语言,它是在标准C语言的基础上根据51单片机的特性进行了适当改造而成的,和标准C语言高度相似。
我们知道,智能机器人必须要用到传感器,在编程时,通常采用IF语句或WHILE语句来实现传感器状态的判断,简单的机器人可能只用到了一个传感器,相应的IF语句或WHILE语句的()内的条件也比较简单,属于单一条件。
复杂的智能机器人,通常要用到多个传感器,相应地IF语句或WHILE语句的()内的条件也会变得更加复杂,不再是单一条件,而是复合条件。复合条件通常是由多个单一条件用与、或逻辑运算符连接而成的。
在C语言中,&&表示“与”,||表示“或”。
||是“或”运算符,当条件1或条件2至少有一个满足时,执行循环体语句,然后返回,再次判断……
当“爸爸给买玩具娃娃”或“妈妈给买小红裙”时,小女孩不断地笑……显然小女孩微笑的条件是宽松的,只要能得到小红裙或者玩具娃娃中的任何一件,她就心满意足了。
前面例子中的||变成了这里的&&,其他没有变,显然小女孩微笑的要求更高了,两样东西都得到才会笑。
在实际教学中,建议通过一个具体的项目来引导学生了解复杂编程的相关知识。
针对使用的这款机器人的硬件条件,笔者设计了一个名为“各就各位”的项目。地面上有一条黑色的起跑线,小车离该线有一段距离,其前进方向与起跑线不垂直,编程让小车前进到起跑线,并让其前进方向与起跑线垂直,并停车。这个任务类似于运动员起步时在起跑线上各就各位,做好起跑准备。
学生明确任务后,往往不知道从何下手,这时教师需要对学生进行思路引导,可以让学生在单片机内编曲写一个停车程序,然后给小车通电,用手移动小车前进,我们先假设夹角小于90°(如图1)。
当小车运动到黑线时,装在车头左侧的光电开关指示灯状态发生变化,只要我们将该光电开关的输出通过一根电线接到单片机的任一IO脚上,单片机就能知道小车左侧已经到黑线位置,然后思考这个时候小车还能继续前进吗?如果继续前进,小车车头的左边就到黑线前面,学生自然就想到左轮应该停止,小车的右边还没有到黑线,右轮要继续前进,这个时候小车应该是左转弯,当装在车头右侧的光电开关指示灯状态发生变化时,小车右边也到达黑线,此时停车即可。
显然,学生要用到小车车头左右2个光电开关,将它们的输出脚用2根导线连到单片机的任何2个IO脚上即可。
图1
有了思路,我们还需要将它转换成C语言语句。利用已学知识,学生很容易写出下面的程序:
实际运行后,学生会发现大致能对齐,但不是对得非常齐,原因是左轮停止、右轮前进时,小车左侧会有少许滑动。如果要求准确对齐,可以在程序中加入更精确的调整语句,程序修改如下:
程序运行后,发现对得非常齐了。
程序可以顺利运行了,但演示时必须保证夹角小于90°,如果取消这一限制,即小车与黑线的夹角为任何角度时,小车都能前进到黑线前,并与黑线对齐成90°角,还需要进一步动脑筋。
如果事先知道夹角小于90°,必定是左边的传感器状态先发生改变,所以,学生应先判断左边的传感器状态是否改变;如果事先知道夹角大于90°,必定是右边的传感器状态先发生改变,应先判断右边的传感器状态是否改变。但这个夹角事先是不知道的,它可能小于90°,可能大于90°,也等于90°,该如何判断传感器的状态呢?
这种情况下,需要用到前面讲过的复合条件和与或的知识。传感器判断语句写成下面的形式:
里面的条件是一个复合条件,两个传感器,如果都检测到白纸,说明没有到达黑线位置,所以不作任何处理,继续前进;当其中一个传感器检测到黑线时,说明小车的左边或右边到了黑线位置,此时,已到黑线的一侧要停止前进,没有到黑线的一侧要继续前进。有的学生在这里又会被难住,因为先到黑线的可能是左侧也可能是右侧,可以通过一个IF语句判断当前是左侧传感器探测到黑线还是右侧传感器探测到黑线,再用分支语句分情况处理。
最后,我们写出各就各位的完整版程序如下:
通过对学生循序渐进的思路引导,几乎所有学生都能编写出这个复杂程序,更重要的是学生知道了一个道理,即使是最复杂的程序也是由简单程序组合而来或者变形而来的,只要不畏惧困难,肯动脑,同时掌握一定的复杂编程知识和技巧,更复杂的程序也是可以写出来的。当学生在心理上克服了对复杂程序的恐惧感,就会变得更加自信,对于他们将来进入大学完成较高难度的学习和研究也有很大益处。
[1]谢作如.Arduino创意机器人[J].浙江教育资源网,2015.
[2]孙丹江.如何在中小学开展机器人普及课程—以我校机器人普及课程的开设为例[J].中国信息技术教育,2012.