12133| 3
|
[入门] 【呼吸灯】基于Mind+ Ardunio入门教程04 |
本帖最后由 DFEDU 于 2019-11-29 10:01 编辑 在前面几章中,我们知道了如何通过程序来控制LED亮灭。但Arduino还有个很强大的功能,通过程序来控制LED的明亮度。Arduino UNO板上,数字引脚中有六个引脚标有“~”,分别是3、5、6、9、10、11,这个符号就说明该口具有PWM功能。我们动手做一下,在做的过程中体会PWM的神奇力量!下面就介绍一个呼吸灯,所谓呼吸灯,就是让灯有一个由亮到暗,再到亮的逐渐变化的过程,感觉像是在均匀的呼吸。 所需元件 ■ 1× 5mm LED灯 ■ 1× 220欧电阻 硬件连接 这个项目的硬件连接与项目一、二是完全相同的。如有不明白,可以回看项目一,或参照图4-1。 图4-1 呼吸灯连接示意图 连接主板和电脑,打开Mind+载入扩展库,输入样例程序4-1所示程序。本项目中将用到一个新的循环,指令学习和代码学习中会有详细的讲解。 样例程序4-1: 代码下载完成后,我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程,而不是直接的亮灭,如同呼吸一般,均匀变化。 图形化指令学习 代码学习 [mw_shl_code=c,true]// 动态变量 volatile float mind_n_value; // 函数声明 void DF_fadeOff(); void DF_fadeOn(); // 主程序开始 void setup() { } void loop() { DF_fadeOff(); DF_fadeOn(); } // 自定义函数 void DF_fadeOff() { mind_n_value = 255; while (!(mind_n_value<=0)) { analogWrite(10, mind_n_value); delay(20); mind_n_value -= 5; } } void DF_fadeOn() { mind_n_value = 0; while (!(mind_n_value>=255)) { analogWrite(10, mind_n_value); delay(20); mind_n_value += 5; } }[/mw_shl_code] 大部分代码我们已经很熟悉了,比如初始化变量声明、引脚设置、以及函数调用。 在主函数中,只有两个调用函数fadeOff和fadeOn。前者是让LED逐渐变暗,后者是逐渐变亮,以此来实现呼吸灯的效果。这两个函数的内容基本一致,在数值设置上存在一些差别,故先行学习其中一个。 [mw_shl_code=applescript,true]void DF_fadeOff() { mind_n_value = 255; while (!(mind_n_value<=0)) { analogWrite(10, mind_n_value); delay(20); mind_n_value -= 5; } }[/mw_shl_code] fadeOff函数中出现了一个新的语句while,while语句通常在程序用作条件循环。 While(){} 函数格式如下: 对应指令为: while语句中涉及了一个新函数: ■ analogWrite( 10 ,mind_n_value ); 如何发送一个模拟值到一个数字引脚呢?就要用到该函数,使用这个函数是要具备特定条件的——该数字引脚需具有PWM功能。观察一下Arduino板,查看数字引脚,你会发现其中6个引脚(3、5、6、9、10、11)旁标有“~”,这些引脚不同于其他引脚,因为它们可以输出PWM信号。 analogWrite()函数用于给PWM口写入一个0~255的模拟值。特别注意的是,analogWrite()函数只能写入具有PWM功能的数字引脚。 PWM PWM是一项通过数字方法来获得模拟量的技术。数字控制来形成一个方波,方波信号只有开关两种状态(也就是我们数字引脚的高低)。通过控制开与关所持续时间的比值就能模拟到一个0到5V之间变化的电压。开(学术上称为高电平)所占用的时间就叫做脉冲宽度,所以PWM也叫做脉冲宽度调制。 通过下面五个方波来更形象的了解一下PWM。 上图绿色竖线代表方波的一个周期。每个analogWrite(value)中写入的value都能对应一个百分比,这个百分比也称为占空比(Duty Cycle),指的是一个周期内高电平持续时间比一个周期时间得到的百分比。图中,从上往下,第一个方波,占空比为0%,对应的value为0。LED亮度最低,也就是灭的状态。高电平持续时间越长,也就越亮。所以,最后一个占空比为100%的对应value是255,LED最亮。50%就是最亮的一半了,25%则相对更暗。 PWM比较多的用于调节LED灯的亮度。或者是电机的转动速度,电机带动的车轮速度也就能很容易控制了,在玩一些Arduino小车时,更能体现PWM的好处。 课后作业 1. 同前两个项目,本课的第一条作业依旧是手动输入项目的代码,旨在养成这一习惯、勤加操练,为之后的项目打好必要的输入代码、编译后自行纠错debug能力的基础。 *如果遇到其他的编译报错可以登录DF创客社区查看或发帖询问。 2. 用LED能否做个火焰的效果,通过PWM使LED产生随机的亮度变化,来模拟一个火焰闪烁的效果。找个浅色罩子盖住效果更佳,可以放在家中作为小夜灯。 主要材料:一个红色LED、两个黄色LED以及220欧电阻。在这个实验中,有个函数会比较好用——random(),Mind+中对应的指令为。它可以产生一定范围内的随机数。 提示:可以先设定LED灯亮度,在其值附近产生一个随机数,比如random(120)+135,对应指令,让其值稳定在135附近,产生这种小幅变化,就更具有火焰跳跃感。不妨尝试一下。 random函数格式为:random(120)它能够从0-120随机取值。 具体其他用法可以查看下面链接的编程参考手册,会详细介绍这个函数的用法。之后的讲解中,我们可能有对些函数不进行详细说明,你可以通过这种方法来学习某个新函数。 在“入门教程”中的“Arduino编程参考手册”可以学习更多的函数。 3. 尝试一个稍微有点难度的,通过两个按键,一个按键控制LED逐次变亮,另一个按键控制LED逐次变暗。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed