Arduino笔记,简单数字输出
文章信息
关键字:机器人; arduino
本文版本:7
最后修改于 2010-07-29 00:59:07
折腾Arduino也一个多月了,今天终于搞定了Arduino通过三个数字信号控制四个级联的MAX7219芯片来驱动LED矩阵屏。想想从不知Arduino为何物到现在折腾它实现了各种各样的有趣的功能,有必要写点什么来记录学习的过程,免得以后又忘记。好记性不如烂笔头么:)。那么,作为第一篇笔记,我们不可免俗的从第13号数字端口的LED说起。
在这篇笔记里,会通过实验说明如何使用数字端口进行输出。虽然说是从13号LED说起,但是我要更进一步,多了解一些,因此需要准备如下实验器材:
以上器材请按下图(点击图片放大)来搭建实验环境(图片是我用开源软件Fritzing画的,嘿嘿,很好用呢)。
这个实验环境,可以支持如下的两个实验:
首先看第一个实验,两个LED交替闪烁。
两个LED分别接在Arduino的第9 和第13数字端口。不同的是,第9端口的LED还串联了一个1K欧的电阻,目的是限制最大电流,以免烧坏电路。而13号数字端口由于在Arduino内部已经串联了限流电阻,因此就不需要在连接电阻了(所有端口中,只有13号端口内部串联了限流电阻)。在接下来的实验中,对于13号端口上的LED,在闪烁的时候,Arduino板子上的L LED也会同时闪烁,这是因为L作为测试灯号是与13号数字端口并联了。另外需要注意的是在面包板接线时,注意LED的正负极,正极接数字端口,负极接地。
实验代码如下:
C代码:
在代码中,可以看到有两个函数,setup()和loop(),这是arduino执行代码所必需的两个函数。setup()函数是在代码一开始执行时被执行的,只会执行一次,一般来说在这个函数内,都会做一些初始化的动作。在这个例子中,执行的是将两个数字端口9和13都设置为输出模式。另一个函数loop()则是arduino执行时的主程序体,顾名思义,写在loop()函数内的动作,将被顺序的重复执行,直到arduino板子断电为止。在这个例子中,则是执行两个数字端口交替点亮LED的动作。
这个例子改编自Arduino自带的Blink样例(增加了LED9)。在例子当中,使用了三个arduino函数。pinMode(),digitalWrite()和delay()。这三个函数的使用方法分别如下:
第二个实验,则是通过Arduino控制的数字端口让扬声器奏乐。
实验所需的扬声器通过数字端口4连接到了Arduino,同样的,串联了一个下拉电阻限流(理论上Arduino每个数字端口能输出的最大电流为40mA)。
这个实验的代码来自于Arduino自带的toneMelody样例(将扬声器端口从8改为4了),可以在菜单中通过File > Example > Digital > toneMelody来找到。代码如下。
C代码:
这段代码一开头,便通过#include指令加载了pitches.h头文件,在这个文件里是对所有音符的频率进行了定义,在这里就不详细讲述了。
这段代码中有一个新的数字输出函数tone()。tone()函数有两种使用方法:
另外,这段代码的特点是loop()函数为空,因为音乐只播放一次,因此在setup()函数中就完成了,loop()循环中就不需要做任何事情。
板子加电后,Arduino会控制扬声器演奏一段音乐,只演奏一次。
通过这两个例子,学习了数字端口的简单输出,现在想办法自己做个arduino电子版的hello world吧~
在这篇笔记里,会通过实验说明如何使用数字端口进行输出。虽然说是从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的文章或书本学起,才导致了这样的一个普遍的误解。
请一定注意本注释之后的段落中划线删减部分的修改。
之前我一直有个误解,应该不止于我,很多很多使用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欧的电阻,目的是限制最大电流,以免烧坏电路。
实验代码如下:
C代码:
- int ledPin1 = 9; // 数字端口9上连接的LED
- int ledPin2 = 13; // 数字端口13上连接的LED
- void setup() {
- // 将两个数字端口设置为输出模式
- pinMode(ledPin1, OUTPUT);
- pinMode(ledPin2, OUTPUT);
- }
- void loop()
- {
- digitalWrite(ledPin1, HIGH); // 数字端口9设置为高电平,点亮LED9
- delay(1000); // 等待一秒
- digitalWrite(ledPin1, LOW); // 数字端口9设置为低点平,关闭LED9
- digitalWrite(ledPin2, HIGH); // 数字端口13设置为高电平,点亮LED13
- delay(1000); // 等待一秒
- digitalWrite(ledPin2, LOW); // 数字端口13设置为低电平,关闭LED13
- }
在代码中,可以看到有两个函数,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(毫秒数) 延时函数,毫秒数为需要等待的时间。
第二个实验,则是通过Arduino控制的数字端口让扬声器奏乐。
实验所需的扬声器通过数字端口4连接到了Arduino,同样的,串联了一个下拉电阻限流(理论上Arduino每个数字端口能输出的最大电流为40mA)。
这个实验的代码来自于Arduino自带的toneMelody样例(将扬声器端口从8改为4了),可以在菜单中通过File > Example > Digital > toneMelody来找到。代码如下。
C代码:
- #include "pitches.h"
- // 旋律中的音符 C大调CDEFGAB=1234567,哈哈我音乐学的不错。
- int melody[] = {
- NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
- // 音符的节拍 4 = 四分之一拍, 8 = 八分之一拍, 等等
- int noteDurations[] = {
- 4, 8, 8, 4,4,4,4,4 };
- void setup() {
- for (int thisNote = 0; thisNote < 8; thisNote++) {
- // 计算每个节拍的时间,以一个节拍一秒为例,四分之一拍就是1000/4毫秒,八分之一拍就是1000/8毫秒
- int noteDuration = 1000/noteDurations[thisNote];
- tone(4, melody[thisNote],noteDuration);
- // 每个音符间的停顿间隔,以该音符的130%为佳
- int pauseBetweenNotes = noteDuration * 1.30;
- delay(pauseBetweenNotes);
- }
- }
- void loop() {
- // 不需要做任何事
- }
这段代码一开头,便通过#include指令加载了pitches.h头文件,在这个文件里是对所有音符的频率进行了定义,在这里就不详细讲述了。
这段代码中有一个新的数字输出函数tone()。tone()函数有两种使用方法:
- tone(数字端口号, 频率) 这种使用方法,则是向指定的数字端口一直发送制定频率的方波,直到执行noTone()函数或者使用tone再次改变频率。
- tone(数字端口号, 频率, 发送时间)这种方法比上面的多了一个参数,指定了发送方波的时间,时间以毫秒为单位,到时自动停止发送信号,无需调用noTone()函数。
另外,这段代码的特点是loop()函数为空,因为音乐只播放一次,因此在setup()函数中就完成了,loop()循环中就不需要做任何事情。
板子加电后,Arduino会控制扬声器演奏一段音乐,只演奏一次。
通过这两个例子,学习了数字端口的简单输出,现在想办法自己做个arduino电子版的hello world吧~
日历
| 年 月 | ||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 29 | 30 | 31 | 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 1 | 2 |
日志分类
搜索日志
订阅我的日志
友情链接

[做人要厚道,看帖要回帖,点击发表评论]
显示评论
隐藏评论
评论列表
发布于 2010-07-12 00:02:54 |



