[Arduino机器人课程]Arduino机器人第3课:创意LED

4683浏览
查看: 4683|回复: 1

[Arduino机器人课程] Arduino机器人第3课:创意LED

[复制链接]
《创意LED》是第一章《LED》的第三个专题。通过前两个专题的学习,学生已经具备一定的编程能力,熟悉了Arduino的基本语法,掌握了变量、选择结构以及digitalWrite()和digitalRead()函数。本专题通过增加传感器使学生掌握analogWrite()、analogRead()函数、循环结构等内容。但是学习这些的最终目的是让学生有足够的技术基础设计有创意的LED作品。
本文主要对本次课的重难点、主要教学设计的设计意图以及学生上课的反应做部分说明。

相关资源下载地址:http://pan.baidu.com/s/1pJ0kk0V 密码:2ebm
本课程的讨论地址:http://mc.dfrobot.com.cn/forum-75-1.html

1.理解PWM
PWM——脉冲宽度调制,可以将数字信号转换成模拟信号。Arduino板子上有6个引脚支持PWM信号,分别是3、5、6、9、10、11。通过数字口的PWM输出analogWrite()函数可以改变LED的亮度。analogWrite(pin,vlaue)——pin 接引脚(3、5、6、9、10、11) value值为0~255。
2.按钮控制LED明暗
这个部分,我们主要是和学生一起完成按下按钮,led慢慢亮,延迟一段时间,led慢慢暗的任务。这个时候我们就需要用到循环结构了,循环结构有两种,一种是while,一种是for,两种都可以实现,这次我们用while结构来实现。
程序如下:
[mw_shl_code=applescript,true]int b;  int i=0;
void setup()
{
  pinMode(3,OUTPUT);
  pinMode(5,INPUT);
}
void loop()
{
  b=digitalRead(5);
  if(i==LOW)
{
while(i<255)
{
analogWrite(3,i);  
  i=i+1;   
}
    delay(3000);//延时时间
     while(i>0)
{
    analogWrite(3,i);
    i=i-1;
}
}
}[/mw_shl_code]

在上面的程序中,可以看到我们在每个while()函数里面都加了delay(10),这里的延时是很重要的,如果去掉延时,很多情况下,我们都看不到灯光渐变的效果,这是因为loop()循环的非常快,有时候肉眼看不出来灯光的明暗变化,加了延时,就相当于将led渐变拉成慢镜头,从而呼吸灯的效果也就非常明显了。
3. 光控LED亮灭
在这一部分,我们引导学生使用光线传感器控制LED的亮灭,我们用analogRead(pin)函数了。该函数可以读取模拟口的输入值,pin是模拟输入口的编号。在讲解完光控LED亮灭,进一步启发学生通过光线传感器控制灯光暗灭时,有个学生自己写出了如下程序:
[mw_shl_code=applescript,true]int a;
void setup()
{
pinMode(6 , OUTPUT);//LED接数字口6
}
void loop()
{
a = analogRead(A0) ;//读取传感器值
    analogWrite( 3 , a);/
}  [/mw_shl_code]
光线传感器读取到外界的值是0-1023的,我们那天上课的时候光线传感器读出来的值大约在1000左右,但是我们知道PWM的值是0到255,所以学生产生了疑问,为什么analogWrite( 3 , a)中a是1000多,我们的led灯还是有明暗变化的,0到1023和0到255又有什么对应转化关系。值得高兴的是,我们的这个同学在经过多次尝试以后,发现了两者之间的周期性关系。虽然是一个很小的探索,但是学生的这种求知和实践还是很让人高兴的。我们以后在上课的时候,也可以提一提两者之间的转换关系,正好这个知识点与下面的map()函数的教学相对应,也过度自然。

最后一个光控LED明暗小实验中,因为analogRead()函数读出来的值是0~1023之间的值;而PWM值为0~255,这两者之间就需要用到转换。在这里我们使用map()函数。
map(value, fromLow, fromHigh, toLow, toHigh),在这里value指要转换的值,fromLow指值现在的下界,romHigh指值现在的上界,toLow指值目标范围的上界,oHigh指值目标范围的上界。因为我们要完成的是0-1023到0-255的转换,所以map(a,0,1023,0,255)是可以理解的,但是我们给的程序显示的是map(a,800,1023,0,255),在这里,需
[mw_shl_code=applescript,true]要让学生自己测试两个写法的不同效果,进而总结出把0改成800的原因,代码如下:
int b;
int i;
void setup() {
pinMode(3,OUTPUT);
pinMode(0,INPUT);
}
void loop() {
  b=analogRead(0);
  i=map(b,800,1023,0,255);
  analogWrite(3,i);
}[/mw_shl_code]

Phoebe  高级技匠

发表于 2014-3-18 14:00:29

通过按键加延时控制LED慢慢变亮变暗的方法挺新颖,我一般都是通过模拟旋钮传感器调节亮度,哈哈:lol
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail