BLOG > Arduino > Arduino笔记,数字/模拟输入

Arduino笔记,数字/模拟输入

在了解了如何通过arduino的数字端口来进行输出后,接着就该看看如何让arduino从外界获取信息,通过数字或模拟端口来进行输入了。

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的文章或书本学起,才导致了这样的一个普遍的误解。


在图中可以看到,在13号数字端口连接了一个LED,而4/5/6三个数字端口则作为三个按钮的数字输入端。按钮模块是如何制作的?按钮其实就是一个接触开关,在开关的一端连接了+5V电源,另一端连接了一个1K欧的下拉电阻限流,在下拉电阻和开关之间,引出导线作为信号输入Arduino。电路图如下:

 GND o-/\/\/-o---/ ---o +5V
        电阻  |  开关
             o
           数据输入

不好意思,我懒得用图形软件画了,允许我偷个懒吧,用ASCII字符画电路图……能说明问题就好了

这个实验的目的是按下连接端口4上的按钮,发光二极管闪一下,按下连接端口5的按钮,闪两下,按下连接端口6的按钮,闪三下。
实验代码如下:

C代码:
  1. int LEDPin = 13;
  2.  
  3. int Button_A = 4;
  4. int Button_B = 5;
  5. int Button_C = 6;
  6.  
  7. void setup() {
  8.   pinMode(LEDPin, OUTPUT);
  9.   pinMode(Button_A, INPUT);
  10.   pinMode(Button_B, INPUT);
  11.   pinMode(Button_C, INPUT);
  12. }
  13.  
  14. void loop() {
  15.  
  16.   digitalWrite(LEDPin, LOW);
  17.  
  18.   if (digitalRead(Button_A)) {
  19.     digitalWrite(LEDPin, HIGH);
  20.     delay(100);
  21.     digitalWrite(LEDPin, LOW);
  22.     delay(2000);
  23.   }
  24.  
  25.   if (digitalRead(Button_B)) {
  26.     digitalWrite(LEDPin, HIGH);
  27.     delay(100);
  28.     digitalWrite(LEDPin, LOW);
  29.     delay(100);
  30.     digitalWrite(LEDPin, HIGH);
  31.     delay(100);
  32.     digitalWrite(LEDPin, LOW);
  33.     delay(2000);
  34.   }
  35.  
  36.   if (digitalRead(Button_C)) {
  37.     digitalWrite(LEDPin, HIGH);
  38.     delay(100);
  39.     digitalWrite(LEDPin, LOW);
  40.     delay(100);
  41.     digitalWrite(LEDPin, HIGH);
  42.     delay(100);
  43.     digitalWrite(LEDPin, LOW);
  44.     delay(100);
  45.     digitalWrite(LEDPin, HIGH);
  46.     delay(100);
  47.     digitalWrite(LEDPin, LOW);
  48.     delay(2000);
  49.   }
  50.  
  51.   delay(100);
  52. }


代码非常容易理解,如果要使用数字输入,在代码中首先要在setup()函数中通过pinMode(端口号, 模式)函数将要输入的端口模式设置为INPUT。例如本例中的
pinMode(Button_A, INPUT);
在loop()函数中,通过digitalRead(端口号)函数来读取指定端口的电平值,返回值为HIGH或者LOW代表高电平或低电平,高电平HIGH的布尔值为true,低电平LOW的布尔值为false,因此可以用这个来进行判断是否按下按键。

好了,运行一下试试:)



第二个实验是通过模拟端口来读取信息。实验需要如下材料:
  • 手感不错的PS2摇杆模块
  • 真的真的非常好用的面包板
  • 导线若干
  • 少不了的Arduino Duemilanove
在这个实验中,将使用一个PS2手柄摇杆模块来进行输入。这个模块可以方便的从万能的淘宝买到。玩过PS2游戏机的人都知道,PS2手柄上的摇杆在X Y Z三个轴上都能够控制,在X和Y轴上是控制上下左右的方向,在游戏中还能通过控制摇杆的幅度来控制被控物体运行的速度,而在Z轴上,则是一个简单的类似按钮的输入,可以将摇杆按下,以触发一个事件。因此,这个PS2摇杆模块也一样,在X和Y轴上是模拟输入,能够获得摇杆被扳动的幅度值(0-1023),而在Z轴上则是一个数字输入,和前面实验中的按钮模块一样,通过高低电平来判断是否被按下。

该模块的一共有五个针脚,分别是 GND接地(-),+5V电源输入(+),Z轴数字输出(B),X轴模拟输出(X)和Y轴模拟输出(Y)。请按下图连接模块与Arduino Duemilanove。


实验代码如下:

C代码:
  1. int X = 0;    // X axis
  2. int Y = 1;    // Y axis
  3. int B = 12;      // Button
  4.  
  5. void setup() {
  6.   pinMode(B, INPUT)
  7.   Serial.begin(9600);
  8. }
  9.  
  10. void loop() {
  11.   int Xvalue=0;
  12.   int Yvalue=0;
  13.   int Bvalue=0;
  14.  
  15.   // read the value from the sensor:
  16.   Xvalue = analogRead(X);
  17.   Yvalue = analogRead(Y);
  18.   Bvalue = digitalRead(B);
  19.  
  20.   Serial.print("X: ");
  21.   Serial.println(Xvalue);
  22.   Serial.print("Y: ");
  23.   Serial.println(Yvalue);
  24.   Serial.print("Button: ");
  25.   Serial.println(Bvalue);
  26.  
  27.   delay(100);                 
  28. }


在代码开头还是按惯例定义引脚,模拟输入的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
如果您喜欢这篇文章,您可以点击下列链接收藏
Del.icio.us Yahoo书签 365Key网摘 天极网摘 我摘 POCO网摘 YouNote网摘 和讯网摘 博啦网
发布时间 发布于 2010-07-29 00:28:57 | 阅读次数 阅读过165次 | 分类 Arduino | 评论 2条评论