arduino的led闪亮

2016-12-26 17:15:00 weixin_30588827 阅读数 35

点个 LED 闪亮好像太单调,这次来个光控 LED 灯。这个其实不需要 Arduino 也能做,这次只是用来演示一下 PWM 在 Arduino 里面的做法。PWM 原理后面会解释。这次用充电宝提供 5V ,对四个 LED 供电,NPN 三极管作为开关用,Arduino 接基极发 PWM 控制亮度,另外 PWM 是从光敏电阻取值而发出。就是说,通过 Arduino,环境变暗,LED 就越亮的一个控制。

这一篇主要是针对新学的朋友们,讲解或者回顾一下基本知识点。

需要的材料

整个光控灯我们需要以下材料完成:

Arduino Mini Pro 3.3V 1 PCS
LED 白色,直插 4 PCS
排母 12孔 2 PCS
电阻 47 欧 1 PCS
电阻 4.7K 欧 2 PCS
光敏电阻 47K 欧 1 PCS
NPN 三极管 2N3904 1 PCS
充电宝 任何牌子 1 PCS
USB 座 直插,母 1 PCS
USB 头 自组装 2 PCS
单股电线 线芯 0.5MM 若干
万用板 单面木质 1 PCS
外壳 PVC/ABS 板自制 1 PCS

因为QQ群里发起了投票,发现有不少朋友们希望了解基本知识,所以加入以下新手专用的理论部分。如无兴趣请直接跳过。

原理简单介绍 - 新手专用

我认为这些知识以及它们的物理原理,是需要看书的,这里只是简单描述一下。

1. 电路

电路,不管是数字还是模拟,都是一个个回路组成,特别注意是回路,是一个圈。不是回路,就无法导通,电信号或电能不能通过。

举例,TTL 不供电时候我们只接了 TX 和 RX 两条信号线,是无法通讯的,必须加上 GND 地线,至少三条线。可以想作,TX 发出电信号,电能从 GND 回路回来,RX 接到电信号,电能从 GND 回去。

2. 通路、开路、短路

电路有三个状态,通路、开路、短路。通路顾名思义是正常导通有电流的回路,开路是电路断开不能导通没有电流的,而短路是指,电源供应直接连到电源的地而中间没有负载。

短路因没有负载,电流会一口气从源头涌往地端,造成巨大电流。从导体来看,巨大电流从没有负载的导体比如电线流过时,电线无法承受而转化电能为热能释放,造成各种灾害。从电源来看,一瞬间释放大量电流,供电源有可能也承受不了,同样会造成灾害。

3. 电压、电阻、电流

电压,符号 V (Voltage),计量单位为伏(V),是指电路里面两个点的电势差;电阻,符号 R(Resistance),计量单位为欧姆(Ohm),是电流通过导体时遇到的阻碍;电流,符号 I (Idensity of Current),计量单位为安培 A(Amp),是表达导体切面中电子流过数量的值。人们常用水流类比,一个水桶满载液体,底部以水管连接到另一个空水桶。两个水桶水压差异导致水往空的水桶流动,类比电势差;水管内材质形状长度影响水流阻力,类比成电阻;水流在水管其中一个部分切面流过的水分子数量(速度),类比成电流。

如用一节 1.5V 电池点亮的灯,我们会发现到了后段快没电时候,灯会变暗然后慢慢熄灭,原因是,电池的正负极电势差慢慢趋向零。情况类比到上面水桶说法就是,两个桶的水量渐渐趋向相同,水就不再流动了。

从上可以看到电压电阻与电流,在电路中是有一定关系的。欧姆定律就是描述这个关系的一个公式,详见百度百科或书本资料。

I = V / R

我们下面会运用到这一公式来做些计算。

4. 交流电与直流电

交流电 AC (Alternating Current)是指电流的方向随着时间有周期性变化的电流。家用电插座是 220伏 50Hz 的交流电,50Hz 意思是每秒五十个周期,正反方向流动一组为一个周期,意思在一秒内电流方向变换了一百次。具体详见百度百科或看书之类参考。

直流电 DC (Direct Current)是指电流的方向不会变化的电流,它还细分了很多种,比如恒定电流是指方向与电流大小都不会变化的电流。详见百度百科或看书之类参考。

本次实验是一个直流电的电路。

5. 发光二极管 LED (Light Emitting Diode)

发光二极管是二极管的一种,当然,正常工作时候会发光。

二极管其中一个特性是在正常工作电压下单向导通,它在原理图的符号形状很好地描述此一特性。也因此单向导通特性,市电交流电电路里面是无法使用 LED 的。虽然说单向导通,但电压再加大时候,是可以反向击穿的。另外,所谓正常工作电压,意思是你供给的电压如果低于它,它是不会工作的。

发光二极管是电流流过时,光子释出,发出特定波段的光。所谓特定波段,也包括了不可见的红外线。LED 有两个重要参数,一是它的工作电压,二是最大能承受的最大电流。电流越大 LED 越亮,但超过一定电流值的话它会烧毁。

不同的 LED 他们的工作电压是不一样的。就算外形看起来一样的我们实验用到的小草帽型 LED,不同颜色的工作电压也有所不同。还有高亮的 LED 灯珠也有不同的最大流限制。使用前,务必查看清楚,以免造成损坏。

基本理论仿真实验 - 新手专用

首先我们用 Multisim 软件,做简单的仿真,看看以上关于 LED 的特性。

我们从二极管分类里面找到了 LED,选个红色,看看这个界面:

)YNMW6IW1N]5Z@IU5{S6EGG

大家可以看到右侧中间位置 Function 窗口有个 Vf = 1.83V @ 20mA 的一句话。意思是它的工作电压最大是 1.83V ,而最大电流是 20mA(即 0.02 A)。我们试试给 1V ,电路加个探针然后开始仿真,看看什么情况:

P[`J`9KH4`XZDJ~(F{K}{~C

你会看到 LED 那两个往外代表发光的箭头是空心的,代表没有点亮。然后我们按停止仿真,把直流电源改为 5V,再启动仿真看看:

_[_46YF[@48[K$9H@Q0A0]0

如果 Multisim 仿真可以做个烧毁的动画图就更好了。这次,它发光的箭头红色了,但注意一下探针读数,1.11kA(即 1110 A)。家用电磁炉功耗够大了也才 7A 左右,这一千多安培能一瞬间烧毁 LED。

为了阻止大量电流,我们加入一个电阻,限制电流在电路里面的流动。运用欧姆定律计算,如下:

I = V / R

0.02 A = (5V – 1.83V) / R

R = 158.5 Ohm

我们就加入一个 158.5 Ohm 电阻器,再次启动仿真看看:

~8DFJ~U(_A26YP{HT6}RDBW

可以看到,探针读数 1.83V 20mA。加入了电阻器作为限制电流,LED 就正常工作了。如果我们把电阻加大,电流减少,LED 虽然能发光但会变暗。Multisim 的 LED 参数里面有控制最小能发光的电流,是 5 mA。我们把电阻改为 220 Ohm (Arduino 官网例子就是用这个值的电阻),再启动仿真看看:

2XL@07L8M`LP]3DBRJCYX8G

你会发现它电压读数有所减少,而电流变成了 14.5mA。同样能点亮。

然后这次,我们看看蓝色的 LED 是怎样的参数:

F53QKE]TH(`{`@2SYN3~07U

3.45V @ 20mA,如果我们用蓝色,电阻的值就是:

(5V – 3.45V) / 0.02 A = 77.5 Ohm

GEKGVSJ6BC$R}9ZJ8KJWH0M

本次实验的并联 LED - 新手专用

这次来点实际的,本次实验中用到的四颗 LED 并联情况,直接上公式,看看仿真:

(5V – 3.45V) / (20 mA x 4)= 19.375 Ohm

由于是四颗并联(注意不是串连),以上电流值是需要乘以 4。我们得到所需要的电阻为 19.375 Ohm。

D)5VI9_5LEAZ}{JRR%Y$BBD

第一个探针的值是总的电流,第二个探针是流到其中一个 LED 的电流。由于四路的负载相同,他们分得的电流也是相同,对电压无影响。这是最高亮度的安全情况了。各位有兴趣的,可以思考一下,把其中一个 LED 改为红色,保持全部 LED 每颗获得 20mA 应该怎么做。

然后,确定了阻值,我们可以搭建实物了。第一个问题来了,仿真归仿真,现实世界的实物中,19.375 欧姆的电阻哪里找来呢?

其实电子世界存在很多误差,要生产出精确无误而且不受温度影响的电阻是非常高难度和高成本。一般我们买到的直插电阻,特别是新手包套装套件那种,误差可能达 10%。另外 LED 所谓的标称工作电压,也不一定那么准确。再说你的电源,也不一定精确无误地提供 5V 稳定电源。所以,我们计算时候,都是以范围来估算,所以各位在各种情况看到的数据手册,很多值都是以范围标示。

电阻的值,百分之十误差来说,我们看看为了保持电流在 20mA 或以下我们应该怎么选:

R x 90% = 19.375 Ohm

R = 21.5278 Ohm

我们知道阻值越高电流越少。在使用蓝色 LED 时,我们选10% 误差的电阻,超过以上标称阻值的(估算结果 21.5278 Ohm),就是安全了。我们实物的电阻,找个比这值大的最接近值即可。我家里最接近的就 47 Ohm,我就那个来搭。

实物的 LED,具体参数请找厂家卖家,或者网上搜索获得。

IMG_20161226_220201

实物电路与仿真相同,只是照片里的电阻放了在负极。

IMG_20161226_220120

用5V 电源接通后的效果如上图。

最后一点,是否超过 20mA 比如 22mA 的电流,LED 就会挂呢?答案是否定的,至少你不会马上看到它烧毁。但厂家写了最高电流,你却在使用过程中长期超过,LED 的寿命就可能会缩短。

总结

以上就是组成 LED 部分最基本的电路。这电路还没加入灯的开关,没有探测室内光线亮度的电路,当然也没加上 Arduino。下一篇,我们先看看光敏电阻怎样用。

欢迎加入我们的大家庭  点击加入 Arduino 硬创联盟,群号 8580606

参考

实用电子元器件与电路基础 第三版

电子工业出版社,ISBN:9787121223785

模拟电子技术基础 第五版

高等教育出版社,ISBN:9787040425055

电子元器件的选择与应用

科学出版社,ISBN:9787030165060

电路基础(英文版 第五版)

机械工业出版社,ISBN:9787111411840

Multisim 12.0 软件

http://www.ni.com/multisim/

转载于:https://www.cnblogs.com/leptonation/p/6223029.html

2016-10-24 10:30:09 ling3ye 阅读数 10668

 

这是一个很入门也很简单的例子,玩过Arduino 的可以直接跳过

 

木有玩过的可以看看。

 

在Arduino系列的板子上,有些是集成了一个可以控制LED灯

Ardunio Uno , MEGA, ZERO  是 PIN 13

 

Ardunio MKR1000 是 PIN 6

 

*本例子用的是Uno

 

示例效果

就是控制板子上的LED 灯 又亮又灭,别小看这简单的控制,万变不离其中的道理就在这了

 

 

BOM表

Arduino Uno *1

 

接线图

朋友,不用接线哦,直接控制的板子上集成的LED灯

 

程序源码

程序是用内置的示例,打开方式如下:

 

程序注释中做了简单的翻译,大意如下,如有错漏,请指出,互相学习。

 

/*
  闪烁
  打开LED一秒然后关闭一秒,不断重复

   在Arduino系列的板子上,有些是集成了一个可以控制的LED灯。Ardunio Uno , MEGA, ZERO  是 PIN 13Ardunio MKR1000 是 PIN 6,如果你想知道你的型号的板子对应的板载LED请到这里查询  at https://www.arduino.cc/en/Main/Products
  
  此示例代码在公共库

  modified 8 May 2014
  by Scott Fitzgerald
  
  modified 2 Sep 2016
  by Arturo Guadalupi
*/


// 当您按下复位或为板供电时,setup()运行一次
void setup() {
  pinMode(LED_BUILTIN, OUTPUT); //将数字引脚LED_BUILTIN初始化为输出。
}

// loop()永远重复运行
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // 输出高电平(打开LED)
  delay(1000);                       // 等待1秒(1秒= 1000微秒)
  digitalWrite(LED_BUILTIN, LOW);    // 输出低电平(关闭LED)
  delay(1000);                       // 等待1秒
}


用数据线连接板子,点击上传,上传完成就可以了。

 

 

 

 

 

 

 

2016-12-23 00:18:55 lizhi8522008 阅读数 429

Arduino控制LED

为什么先控制LED呢,因为简单呗(笑)

LED只需要一个电源输入和一个输出,即一个VCC正极和一个GND接地端。

鉴于普通LED接口太简单,所以直接讲RGB LED。
RGB LED有共阴极和共阳极两种,在此以共阳极为例。
RGB LED共有四个接口,如图:
这里写图片描述
从左到右的接口依次为:
1:红灯端
2:VCC端 接入5V电源
3:绿灯端
4:蓝灯端

使用时,VCC端接+5V电源(3.3V亦可,区别是亮度不如5V),红,绿,蓝灯端口分别接入Arduino数字接口
若要控制LED各灯亮度,则需要将三灯端口接入支持PWM调频功能的接口(即带有‘~’符号的接口)

控制的代码如下:

        analogWrite(10, 255);

其中第一个参数为灯的接口号,类型为int,支持0~13。
第二个参数为PWM电压调节,类型为int,支持0~255。
在共阳极LED中,255为灭(电压最小),0为亮(电压最大)。共阴极LED中应相反。

LED与Arduino链接范例图:
这里写图片描述

一个基础的LED控制程序如下:

        int RedPin = 11;     //定义三个灯接口,红灯接口接11,绿灯接口接10,蓝灯接口接9
        int GreenPin = 10;
        int BluePin = 9;
        analogWrite(RedPin, 0);    //每一个analogWrite控制一种LED灯的亮度,三个LED灯泡共同形成彩色
        analogWrite(GreenPin, 0);
        analogWrite(BluePin, 0);

在这个例子中,LED将会稳定的发出白光。

下面的例子展示的是一个LED灯进行彩色循环:

    //(在模拟器上似乎有BUG)

    int RedPin = 11;     //定义三个灯接口,红灯接口接11,绿灯接口接10,蓝灯接口接9
    int GreenPin = 10;
    int BluePin = 9;
    void setup() {
    }

    void setColor(int red,int green,int blue)  //这个函数用来控制颜色
    {
    analogWrite(RedPin, red);
    analogWrite(GreenPin, green);
    analogWrite(BluePin, blue);
    }

    void loop(){
    setColor(0, 0, 0);
    delay(1000);   //dalay用于设置延时,1000=1秒
    setColor(255,0,255);  //绿灯亮
    delay(1000); 
    setColor(255,255,0);  //蓝灯亮
    delay(1000);
    }

在这个例子中,可通过loop循环使LED灯在红,绿,蓝灯循环闪亮,一秒钟变换一次。

2018-05-27 00:17:26 kangguang 阅读数 1885

1.材料:

Arduino 板、面包板、红色LED灯一个、220欧电阻一个、面包线2根

2.连接元器件

红色线 连接 D13 (因为D13 联通后有一个LED灯点亮) 白色线接地线

USB线连接电脑


3.连接电脑后 IDE设置




4.编写代码


大功告成

LED等间隔一秒不停的闪烁

2014-05-08 17:58:20 weboo10000 阅读数 7458

第一步:硬件准备

  1.ATMEGA8L-8PU avr单片机(图1)

 图1

  2.USBasp(用于烧写bootloader的工具)(图2上)

  3.USB转TTL串口线(我用的是FT232芯片的,稳定性比较好,用于在arduino下装载程序)(图二下)

 图2

  4. 16M晶振,面包板,发光二极管等,及若干杜邦线

  这里可能有疑问:ATMEGA8L-8PU为什么配了16M晶振?

 原因是这样的:原则上ATMEGA8L-8PU最高用的是8M晶振,但Arduino 中的所用M8平台的bootloader是基于ATMEGA8编译的,并且使用的是16M晶振;而我手头没有ATMEGA8的芯片(注意我用的芯片后面带个“L”),又不会重新编译bootloader,只好把现有ATMEGA8L配上16M。虽然“超频”了,但目前试验中尚未发现问题。

第二步:软件准备(下载找度娘吧)

  1.arduino的IDE:arduino-1.0.5-r2

  2.USB asp的驱动以及串口线的驱动(这个注意要下载自己串口线对应芯片的驱动)

  3.progisp(这个是用来烧写bootloader的软件)

注意事项:在安装完USB asp后,必须 要将驱动程序目录下的  libusb0.dll,libusb0.sys这两个文件复制到 烧写工具progisp.exe所在目录。特别的,在USBasp的驱动文件目录下,有多组 libusb0.dll,libusb0.sys文件,必须要选择与自己电脑系统对应的文件。

例如 图3是x64位的驱动目录,我的电脑是AMD CPU的x64win7,我所复制的那两个文件是在amd64下面。当然intel CPU 的电脑用ia64文件夹里的两个文件。

 图3

否则烧写程序时就可能出现如下问题:
 图4

第三步:在面包板上搭建最小系统
如图5所示接线

图5
实物示例图6:
 图6
第四步:用usbasp烧写bootloader
安装并连接好USBasp驱动后,打开progisp软件如图7

                       

                                                                   图7

  1.选择芯片为ATmega8

  2.打开bootloader的HEX文件,位于Arduino IDE软件的arduino-1.0.5-r2\hardware\arduino\bootloaders\atmega8目录,文件名为ATmegaBOOT-prod-firmware-2009-11-07.hex

  3.配置熔丝位为0xCADF,注意熔丝位配置错误可能会将芯片锁定

  4.选中编程熔丝选框

  5.单击 自动 按钮,开始对芯片编程,编程完成后软件左下角框框会出现successfully字样。


第五步:在Arduino的IDE下建立闪亮LED的代码
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}
 图8
输入代码后单击图8所示IDE中第一个的形如 "对号"的按钮编译。


第六步:在Arduino的IDE下装载编译后的程序到Atmega8芯片中
   1.断开USBasp与面包板的任何连接(这个重要,否则会下载失败,当然bootloader如果下载正确了,以后可以用USB to TTL下载Arduino程序了,USBasp也用不上了)
   2.将USB to TTL的VCC,GND连接到Atmega8L芯片的相应引脚。USB to TTL的TXD连接到ATmega8L的RXD,USB to TTL 的RXD连接到ATmega8L的TXD,参考图6。
   3 在面包板上接一个发光二极管:发光发光二极管正极接ATmega8L的PB5(第19个引脚),负极通过一个限流电阻(500欧姆左右吧)接到GND。(参考图10,图10中未接限流电阻)
   4.将USB to TTL连接到PC。然后在Arduino的IDE下单击选择菜单 Tool->Board->Arduino NG or older /W ATmega8,再选择Tool->Board->Serial Port下选择USB to TTL在你的电脑上对应的COM口。如图9。
图9
图10
  5.最后单击Ardunio IDE上的“→”按钮,开始装载程序,同时在面包板上用杜邦线将Atmega8L的RST(第一个引脚)与GND短接一下,进行复位(当然接个按钮最方便),然后等待下载完成。
  6.下载完成后:就可以看到实验效果   LED小灯亮一秒,灭一秒,如此往复。如果这里成果,则说明bootloader正确的引导了程序的下载与运行,并且Ardunio程序本身也是正确的。
                                         
图11
至此,一个最小的Arduino开发板制作完成,并运行了第一个Arduino入门程序,后续Arduino 程序的实现和系统扩展由大家发挥


附图:Arduino中的PIN引脚与Atmega8L芯片管脚的对应关系。

附加说明:
在Ardunio IDE的安装目录 arduino-1.0.5-r2\hardware\arduino 下 有一个板子类型配置文件boards.txt。其中有部分配置代码如下
##############################################################

atmega8.name=Arduino NG or older w/ ATmega8

atmega8.upload.protocol=arduino
atmega8.upload.maximum_size=7168
atmega8.upload.speed=19200

atmega8.bootloader.low_fuses=0xdf
atmega8.bootloader.high_fuses=0xca
atmega8.bootloader.path=atmega8
atmega8.bootloader.file=ATmegaBOOT-prod-firmware-2009-11-07.hex
atmega8.bootloader.unlock_bits=0x3F
atmega8.bootloader.lock_bits=0x0F

atmega8.build.mcu=atmega8
atmega8.build.f_cpu=16000000L
atmega8.build.core=arduino
atmega8.build.variant=standard

##############################################################

在这里可以看到熔丝位的配置,晶振频率,以及指定的bootloader的HEX文件等信息,这也是为什么 在第四步中熔丝位那样配置,晶振非要选择16M等的原因了。