Arduino笔记,数字/模拟输入
文章信息
关键字:arduino; 输入
本文版本:5
最后修改于 2010-07-29 01:01:31
在了解了如何通过arduino的数字端口来进行输出后,接着就该看看如何让arduino从外界获取信息,通过数字或模拟端口来进行输入了。
arduino Duemilanove有14个数字端口(0-13),6个模拟端口(0-5)。所谓数字端口,其输入或输出的值只能是0和1也就是低电平和高电平两种;而模拟端口则能够输入10位的二进制值,也就是从0-1023,这是通过其端口的电压值与 0-5V (或AREF端口)之间进行比较得来的。
在这篇文章中,将会通过两个实验来了解:
首先,第一个实验是按钮输入数字信号实验。需要如下实验器材:
请按下图连接实验设备
在图中可以看到,在13号数字端口连接了一个LED,而4/5/6三个数字端口则作为三个按钮的数字输入端。按钮模块是如何制作的?按钮其实就是一个接触开关,在开关的一端连接了+5V电源,另一端连接了一个1K欧的下拉电阻限流,在下拉电阻和开关之间,引出导线作为信号输入Arduino。电路图如下:
GND o-/\/\/-o---/ ---o +5V
电阻 | 开关
o
数据输入
不好意思,我懒得用图形软件画了,允许我偷个懒吧,用ASCII字符画电路图……能说明问题就好了
这个实验的目的是按下连接端口4上的按钮,发光二极管闪一下,按下连接端口5的按钮,闪两下,按下连接端口6的按钮,闪三下。
实验代码如下:
C代码:
代码非常容易理解,如果要使用数字输入,在代码中首先要在setup()函数中通过pinMode(端口号, 模式)函数将要输入的端口模式设置为INPUT。例如本例中的
pinMode(Button_A, INPUT);
在loop()函数中,通过digitalRead(端口号)函数来读取指定端口的电平值,返回值为HIGH或者LOW代表高电平或低电平,高电平HIGH的布尔值为true,低电平LOW的布尔值为false,因此可以用这个来进行判断是否按下按键。
好了,运行一下试试:)
第二个实验是通过模拟端口来读取信息。实验需要如下材料:
该模块的一共有五个针脚,分别是 GND接地(-),+5V电源输入(+),Z轴数字输出(B),X轴模拟输出(X)和Y轴模拟输出(Y)。请按下图连接模块与Arduino Duemilanove。
实验代码如下:
C代码:
在代码开头还是按惯例定义引脚,模拟输入的0和1端口分别连接了X和Y轴的模拟输入,Z轴的数字输入被连接到了12号数字端口。
模拟端口与数字端口不同的是,不需要在setup()函数中声明输入输出,因为这六个端口仅仅是模拟输入端口,模拟输出则是使用方波的形式进行的,这个在谈及PWM驱动时会进一步说明。
在setup()函数中,出现了一个新的语句,Serial.begin(9600); 。这一句表明以波特率9600打开了串口输入输出,Arduino可以通过RS232串口与其他设备,例如你的电脑,进行通讯。在arduino进行串口通讯时0和1数字端口将被占用,因为这两个端口正是串口通信所使用的Tx/Rx端口。如果你使用USB连接Arduino和你的电脑,那么设定好波特率后,可以使用串口软件与arduino进行通讯,看到它输出的值或者通过串口进行输入。这一切都是由Arduino板上的使USB转串口的FTDI232RL芯片完成的。在arduino IDE软件中,上传完代码后,只需要点击工具栏上最右面的串口图标就能打开串口通信界面查看Arduino的串口输出或者对其进行输入。
在loop()函数中,可以很清晰地看到使用了analogRead(模拟端口号)这个函数来进行模拟端口信号的读取。这个函数将返回0到1023的整数型值。
在接下来的语句中,可以看到使用了Serial.print(值或字符串)和Serial.println(值或字符串)两个函数来进行串口输出,这两个函数会将输入的值或字符串通过串口输出,如果你打开了串口软件,并且将arduino连接到电脑,你能够看到这些输出。这两个函数的区别是Serial.print()输出完后不会换行,下一次输出会紧接着输出,而Serial.println()函数在输出完后会输出一个换行符,下一次输出就会从新行开始。
为了加深理解,还是建议大家上传代码到Arduino,打开Arduino IDE的串口调试窗口,拿起摇杆试一下手感吧:D
arduino Duemilanove有14个数字端口(0-13),6个模拟端口(0-5)。所谓数字端口,其输入或输出的值只能是0和1也就是低电平和高电平两种;而模拟端口则能够输入10位的二进制值,也就是从0-1023,这是通过其端口的电压值与 0-5V (或AREF端口)之间进行比较得来的。
在这篇文章中,将会通过两个实验来了解:
- 如何制作/使用按钮输入数字信号
- 如何读取模拟信号
- 通过串口输出信息
首先,第一个实验是按钮输入数字信号实验。需要如下实验器材:
- 的确是个“好东西”的面包板
- 轻触按钮
- 1K欧姆电阻
- 导线若干
- 必不可少的arduino Duemilanove
- 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的文章或书本学起,才导致了这样的一个普遍的误解。
在图中可以看到,在13号数字端口连接了一个LED,而4/5/6三个数字端口则作为三个按钮的数字输入端。按钮模块是如何制作的?按钮其实就是一个接触开关,在开关的一端连接了+5V电源,另一端连接了一个1K欧的下拉电阻限流,在下拉电阻和开关之间,引出导线作为信号输入Arduino。电路图如下:
GND o-/\/\/-o---/ ---o +5V
电阻 | 开关
o
数据输入
不好意思,我懒得用图形软件画了,允许我偷个懒吧,用ASCII字符画电路图……能说明问题就好了
这个实验的目的是按下连接端口4上的按钮,发光二极管闪一下,按下连接端口5的按钮,闪两下,按下连接端口6的按钮,闪三下。
实验代码如下:
C代码:
- int LEDPin = 13;
- int Button_A = 4;
- int Button_B = 5;
- int Button_C = 6;
- void setup() {
- pinMode(LEDPin, OUTPUT);
- pinMode(Button_A, INPUT);
- pinMode(Button_B, INPUT);
- pinMode(Button_C, INPUT);
- }
- void loop() {
- digitalWrite(LEDPin, LOW);
- if (digitalRead(Button_A)) {
- digitalWrite(LEDPin, HIGH);
- delay(100);
- digitalWrite(LEDPin, LOW);
- delay(2000);
- }
- if (digitalRead(Button_B)) {
- digitalWrite(LEDPin, HIGH);
- delay(100);
- digitalWrite(LEDPin, LOW);
- delay(100);
- digitalWrite(LEDPin, HIGH);
- delay(100);
- digitalWrite(LEDPin, LOW);
- delay(2000);
- }
- if (digitalRead(Button_C)) {
- digitalWrite(LEDPin, HIGH);
- delay(100);
- digitalWrite(LEDPin, LOW);
- delay(100);
- digitalWrite(LEDPin, HIGH);
- delay(100);
- digitalWrite(LEDPin, LOW);
- delay(100);
- digitalWrite(LEDPin, HIGH);
- delay(100);
- digitalWrite(LEDPin, LOW);
- delay(2000);
- }
- delay(100);
- }
代码非常容易理解,如果要使用数字输入,在代码中首先要在setup()函数中通过pinMode(端口号, 模式)函数将要输入的端口模式设置为INPUT。例如本例中的
pinMode(Button_A, INPUT);
在loop()函数中,通过digitalRead(端口号)函数来读取指定端口的电平值,返回值为HIGH或者LOW代表高电平或低电平,高电平HIGH的布尔值为true,低电平LOW的布尔值为false,因此可以用这个来进行判断是否按下按键。
好了,运行一下试试:)
第二个实验是通过模拟端口来读取信息。实验需要如下材料:
- 手感不错的PS2摇杆模块
- 真的真的非常好用的面包板
- 导线若干
- 少不了的Arduino Duemilanove
该模块的一共有五个针脚,分别是 GND接地(-),+5V电源输入(+),Z轴数字输出(B),X轴模拟输出(X)和Y轴模拟输出(Y)。请按下图连接模块与Arduino Duemilanove。
实验代码如下:
C代码:
- int X = 0; // X axis
- int Y = 1; // Y axis
- int B = 12; // Button
- void setup() {
- pinMode(B, INPUT);
- Serial.begin(9600);
- }
- void loop() {
- int Xvalue=0;
- int Yvalue=0;
- int Bvalue=0;
- // read the value from the sensor:
- Xvalue = analogRead(X);
- Yvalue = analogRead(Y);
- Bvalue = digitalRead(B);
- Serial.print("X: ");
- Serial.println(Xvalue);
- Serial.print("Y: ");
- Serial.println(Yvalue);
- Serial.print("Button: ");
- Serial.println(Bvalue);
- delay(100);
- }
在代码开头还是按惯例定义引脚,模拟输入的0和1端口分别连接了X和Y轴的模拟输入,Z轴的数字输入被连接到了12号数字端口。
模拟端口与数字端口不同的是,不需要在setup()函数中声明输入输出,因为这六个端口仅仅是模拟输入端口,模拟输出则是使用方波的形式进行的,这个在谈及PWM驱动时会进一步说明。
在setup()函数中,出现了一个新的语句,Serial.begin(9600); 。这一句表明以波特率9600打开了串口输入输出,Arduino可以通过RS232串口与其他设备,例如你的电脑,进行通讯。在arduino进行串口通讯时0和1数字端口将被占用,因为这两个端口正是串口通信所使用的Tx/Rx端口。如果你使用USB连接Arduino和你的电脑,那么设定好波特率后,可以使用串口软件与arduino进行通讯,看到它输出的值或者通过串口进行输入。这一切都是由Arduino板上的使USB转串口的FTDI232RL芯片完成的。在arduino IDE软件中,上传完代码后,只需要点击工具栏上最右面的串口图标就能打开串口通信界面查看Arduino的串口输出或者对其进行输入。
在loop()函数中,可以很清晰地看到使用了analogRead(模拟端口号)这个函数来进行模拟端口信号的读取。这个函数将返回0到1023的整数型值。
在接下来的语句中,可以看到使用了Serial.print(值或字符串)和Serial.println(值或字符串)两个函数来进行串口输出,这两个函数会将输入的值或字符串通过串口输出,如果你打开了串口软件,并且将arduino连接到电脑,你能够看到这些输出。这两个函数的区别是Serial.print()输出完后不会换行,下一次输出会紧接着输出,而Serial.println()函数在输出完后会输出一个换行符,下一次输出就会从新行开始。
为了加深理解,还是建议大家上传代码到Arduino,打开Arduino IDE的串口调试窗口,拿起摇杆试一下手感吧:D
日历
| 年 月 | ||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 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-29 00:28:57 |



