专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

Arduino机器人第2课:按钮控制的LED

作者:谢作如   来源:本站原创   点击数:  更新时间:2014年05月04日   【字体:

 专题二“按钮控制的LED”是对专题一的巩固与深化,在学生了解了Arduino的基础知识后,本专题从物理电路的连接上,增加了按钮;从编程上,增加了变量、数字输入和选择结构等内容。

本文主要对本次课的重难点、主要教学设计的设计意图以及学生上课的反应做部分说明。
 

相关资源下载地址:http://pan.baidu.com/s/1kTqOYs3

 
1.连接按钮
 
这一部分,我们主要是引导学生将按钮接到板子上,这里特别需要提醒的是按钮是接数字口还是模拟口。按钮有两种状态按下与放开,而数字口的值只有0和1,所 以教师要引导学生将按钮接的是数字口。在连接时,会发现有的学生忘了线的接法,所以教师还要提醒学生黑线接GND,红线接VCC,第三根线接数字口。此 外,我们还要向学生说明我们使用的DFROBOT的按钮按下是LOW(0),放开是HIGH(1),其他厂家的按钮可能不是这样的。
在这一点上,我们对Arduino教育机器人的模块标准制订非常有感触,不同标准对课程的开设带来很多不必要的影响,尤其是DFRobot的V5和V7的板子,在线序上让我们很头疼。
 
2.初步尝试按钮控制LED——按下亮,放开灭
 
引导学生我们将要做的第一个尝试,即按钮按下LED亮,放开LED灭。之后我们把程序发给学生,为学生粗略解读程序(包括bool、“=”等),请他们下载观察现象。与预设的情况相反,这样便引出了用“!”来实现。在这里,学生还是比较容易接受的。
Arduino的范例中提供了按钮控制LED的代码。我们之所以没有采用这种形式,主要是希望直接让学生对Arduino的bool变量和数字端口的值结合起来理解。

arduino的范例:

我们的范例:

void loop(){
  buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {     
    digitalWrite(ledPin, HIGH); 
  }
  else {
    digitalWrite(ledPin, LOW);
  }
}

void loop() {

  a=(digitalRead(2));

  digitalWrite(5,a);

}

 
3.进一步探究按钮控制的LED——按下亮,延时灭

     前面的按钮控制LED比较简单,学生甚至觉得这和在LED接个传统开关没有区别,所以用具体的情境引出延时的概念。这个过程中最重要的是,首先得判断按钮是否按下,自然地引出选择结构(我们用的是if结构),然后延时一段时间,再将LED灭掉。有的学生没有认真听讲,在判断是否按下的时候,条件判断用的是“=”而不是“==”;此外设置完延时之后,并没有将lED 灭掉,导致按下按钮,LED一直亮着。
 
4.一个按钮控制一个LED——按下亮,再按下灭
 
这一部分我们分为两个步骤来完成。
第一步,先写代码来判断当按钮按下,就改变Led的状态。
强调的还是先判断按钮是否按下,只有按钮按下的时候才改变LED的状态,提醒学生可引入一个变量k(k=0,LED灭,k=1,LED亮)。当学生发现问 题后(控制及其不稳定),然后思考原因,引导他们探究。通过这一探究,让学生深刻体会到Arduino代码中Loop部分是循环执行的。而且 Arduino的执行速度非常快!
第二步,引导学生再加入一个变量,记录上一次的状态。
我们提出“按下亮,放开,再按下灭”的思路,引导学生再引入一个记录按钮状态的变量s,这时,控制相对稳定许多。此时,还会有部分学生质疑没达到百分百的稳定,我们向他们提出了拓展任务——按钮的消抖。
 
5.扩展任务:按钮的消抖
 
向学生解释抖动现象产生的原理及解决方法(我们采用的是延时),请学生自己尝试。但是由于本课内容量较大,时间已经来不及了,所以拓展任务并没有开展。
从这一课的实践可以看出,高中的学生可以根据学生的编程能力,完成使用变量来实现一个按钮控制一只LED。小学或者初中的学生,估计只能到第四部分的第一步,用延时完成就差不多了。下一周我们将开始初中的教学实践了。
 
收获:
 
学生在课间做了一些其他的创意尝试,如有的学生设计了“按钮按下一个亮,再按下这个灭,另外两个亮”,“按钮按下一个亮,再按下两个亮,再按下三个亮”等,让我们很是欣喜的。
关闭窗口

相关文章