BLOG > Arduino > Arduino笔记,简单数字输出

Arduino笔记,简单数字输出

折腾Arduino也一个多月了,今天终于搞定了Arduino通过三个数字信号控制四个级联的MAX7219芯片来驱动LED矩阵屏。想想从不知Arduino为何物到现在折腾它实现了各种各样的有趣的功能,有必要写点什么来记录学习的过程,免得以后又忘记。好记性不如烂笔头么:)。那么,作为第一篇笔记,我们不可免俗的从第13号数字端口的LED说起。

在这篇笔记里,会通过实验说明如何使用数字端口进行输出。虽然说是从13号LED说起,但是我要更进一步,多了解一些,因此需要准备如下实验器材:
  • Arduino Duemilanove 一块
  • 实验用面包板一块
  • 发光二极管(LED)两个
  • 1K欧电阻两个
  • 8欧姆扬声器一个
  • 导线若干

以上器材请按下图(点击图片放大)来搭建实验环境(图片是我用开源软件Fritzing画的,嘿嘿,很好用呢)。


这个实验环境,可以支持如下的两个实验:
  • 两个LED交替闪烁
  • 扬声器奏乐

首先看第一个实验,两个LED交替闪烁。

*** 添加于2010-07-29
请一定注意本注释之后的段落中划线删减部分的修改。
之前我一直有个误解,应该不止于我,很多很多使用arduino的人都有这样的误解,认为第13号数字端口在内部串联了一个限流电阻,因此可以直接将二极管插在13号数字端口和GND之间,不需要串联限流电阻。因为很多网上的教材都是这么写的。今天我仔细研究了Arduino Duemilanove的电路图之后发现我们大家都错了!在13号端口上连接的电阻是这样和L发光二极管连接的:

                 o 13号端口
                 |
GND--LED--/\/\/\-|
                 |
               uC pin ATMEGA328引脚

显而易见,这个电阻R7只是LED的上拉电阻,与13号端口上所外部连接的任何设备都没有关系。因此我建议所有在13号端口上连接的设备都必须串联限流电阻,否则如果长时间使用,将会有因为大电流而烧坏ATMega控制器的可能!!!

在本文以及后续的文章中,由于实验连接图提前画好,修改的话太过于麻烦,因此图上还是将发光二极管直插在13号数字端口,但是请实际操作的时候一定要串联限流电阻。请一定注意!!!

关于造成误解的原因,据了解,应该来源于Arduino板子的一个早期版本Arduino-NG,这个版本的13号数字端口,的确有串联一个限流电阻,也许大家都是从那篇介绍NG的文章或书本学起,才导致了这样的一个普遍的误解。


两个LED分别接在Arduino的第9 和第13数字端口。不同的是,第9端口的LED还串联了一个1K欧的电阻,目的是限制最大电流,以免烧坏电路。而13号数字端口由于在Arduino内部已经串联了限流电阻,因此就不需要在连接电阻了(所有端口中,只有13号端口内部串联了限流电阻)。在接下来的实验中,对于13号端口上的LED,在闪烁的时候,Arduino板子上的L LED也会同时闪烁,这是因为L作为测试灯号是与13号数字端口并联了。另外需要注意的是在面包板接线时,注意LED的正负极,正极接数字端口,负极接地。

实验代码如下:

C代码:
  1. int ledPin1 =  9;    // 数字端口9上连接的LED
  2. int ledPin2 =  13;    // 数字端口13上连接的LED
  3.  
  4. void setup()   {               
  5.   // 将两个数字端口设置为输出模式
  6.   pinMode(ledPin1, OUTPUT);     
  7.   pinMode(ledPin2, OUTPUT);     
  8. }
  9.  
  10. void loop()                     
  11. {
  12.   digitalWrite(ledPin1, HIGH);   // 数字端口9设置为高电平,点亮LED9
  13.   delay(1000);                  // 等待一秒
  14.   digitalWrite(ledPin1, LOW);    // 数字端口9设置为低点平,关闭LED9
  15.   digitalWrite(ledPin2, HIGH);   // 数字端口13设置为高电平,点亮LED13
  16.   delay(1000);                  // 等待一秒
  17.   digitalWrite(ledPin2, LOW);    // 数字端口13设置为低电平,关闭LED13
  18. }


在代码中,可以看到有两个函数,setup()和loop(),这是arduino执行代码所必需的两个函数。setup()函数是在代码一开始执行时被执行的,只会执行一次,一般来说在这个函数内,都会做一些初始化的动作。在这个例子中,执行的是将两个数字端口9和13都设置为输出模式。另一个函数loop()则是arduino执行时的主程序体,顾名思义,写在loop()函数内的动作,将被顺序的重复执行,直到arduino板子断电为止。在这个例子中,则是执行两个数字端口交替点亮LED的动作。

这个例子改编自Arduino自带的Blink样例(增加了LED9)。在例子当中,使用了三个arduino函数。pinMode(),digitalWrite()和delay()。这三个函数的使用方法分别如下:
  • pinMode(数字端口号, 模式)  数字端口号是arduino板上的端口号码,模式则有INPUT,OUTPUT两种(注意一定要大写),分别表示输入和输出。
  • digitalWrite(数字端口号, 值)  数字端口号是arduino板上的端口号码,值则由于为数字端口,只有HIGH和LOW两种(注意一定要大写),分别表示高电平和低电平(1和0)。
  • delay(毫秒数) 延时函数,毫秒数为需要等待的时间。
板子加电后,可以看到loop()函数内的语句控制两个LED灯交替闪烁,间隔为一秒。

第二个实验,则是通过Arduino控制的数字端口让扬声器奏乐。

实验所需的扬声器通过数字端口4连接到了Arduino,同样的,串联了一个下拉电阻限流(理论上Arduino每个数字端口能输出的最大电流为40mA)。

这个实验的代码来自于Arduino自带的toneMelody样例(将扬声器端口从8改为4了),可以在菜单中通过File > Example > Digital > toneMelody来找到。代码如下。

C代码:
  1. #include "pitches.h"
  2.  
  3. // 旋律中的音符 C大调CDEFGAB=1234567,哈哈我音乐学的不错。
  4. int melody[] = {
  5.   NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
  6.  
  7. // 音符的节拍 4 = 四分之一拍, 8 = 八分之一拍, 等等
  8. int noteDurations[] = {
  9.   4, 8, 8, 4,4,4,4,4 };
  10.  
  11. void setup() {
  12.  
  13.    for (int thisNote = 0; thisNote < 8; thisNote++) {
  14.  
  15.     // 计算每个节拍的时间,以一个节拍一秒为例,四分之一拍就是1000/4毫秒,八分之一拍就是1000/8毫秒
  16.     int noteDuration = 1000/noteDurations[thisNote];
  17.     tone(4, melody[thisNote],noteDuration);
  18.  
  19.     // 每个音符间的停顿间隔,以该音符的130%为佳
  20.     int pauseBetweenNotes = noteDuration * 1.30;
  21.     delay(pauseBetweenNotes);
  22.   }
  23. }
  24.  
  25. void loop() {
  26.   // 不需要做任何事
  27. }


这段代码一开头,便通过#include指令加载了pitches.h头文件,在这个文件里是对所有音符的频率进行了定义,在这里就不详细讲述了。
这段代码中有一个新的数字输出函数tone()。tone()函数有两种使用方法:
  • tone(数字端口号, 频率)  这种使用方法,则是向指定的数字端口一直发送制定频率的方波,直到执行noTone()函数或者使用tone再次改变频率。
  • tone(数字端口号, 频率, 发送时间)这种方法比上面的多了一个参数,指定了发送方波的时间,时间以毫秒为单位,到时自动停止发送信号,无需调用noTone()函数。
tone()函数能使用的数字端口号是有限制的,从3-13,其他有端口无法使用。

另外,这段代码的特点是loop()函数为空,因为音乐只播放一次,因此在setup()函数中就完成了,loop()循环中就不需要做任何事情。

板子加电后,Arduino会控制扬声器演奏一段音乐,只演奏一次。

通过这两个例子,学习了数字端口的简单输出,现在想办法自己做个arduino电子版的hello world吧~
如果您喜欢这篇文章,您可以点击下列链接收藏
Del.icio.us Yahoo书签 365Key网摘 天极网摘 我摘 POCO网摘 YouNote网摘 和讯网摘 博啦网
发布时间 发布于 2010-07-12 00:02:54 | 阅读次数 阅读过222次 | 分类 Arduino | 评论 1条评论