Arduino I/O 之数字输入输出

来自Jack's Lab
跳转到: 导航, 搜索

数字输出即:用于输出的 pin(管脚,可以叫 GPIO)只能输出 '0' 和 '1' 即低电平 (0V) 和高电平 (5V)

Arduino 普通板(相对于有 50 个数字 I/O 的 Arduino ADK 而言)把 ATMEGA 8 位单片机(Atmega16/32/64/128/48/88/168/328/640/1280/2560 系列皆为 8 位单片机)的数字 I/O 端口汇总为 14 条,并编号为 0 ~ 13,下图的绿色编号即是:


Atmega-pin.png


特别地,带 ADC(用于模拟信号到数字信号转换)的管脚(可用于模拟输入),不开启 ADC 也能用于数字输入输出(不使用 analogRead() 操作这些管脚)

数字 I/O 端口是输入还是输出,Arduino 通过 pinMode() 这个函数来设置,比如设置 pin 12 为输出, pin 0 为输入(接受信号),则:


pinMode(12, OUTPUT);
pinMode(0, INPUT);


Arduino 的引脚默认是输入,因此可以不用 pinMode() 显式声明为输入。


设置输出模式后就可以使用 digitalWrite() 函数往针脚上输出电平;同样输入模式使用 digitalRead() 读取对应针脚上的信号:

digitalWrite(12, HIGH);    // pin 12 output 1
digitalWrite(12, LOW);     // pin 12 output 0
digitalRead(0);            // Read the pin 0


Arduino 引脚电气特性


数字 I/O 端口的信号,5V 的电压表示 '1',0V 电压表示 '0'


Arduino (ATMEGA) 引脚可以提供最高40mA的电流输出,供外部设备/电路使用。这足够点亮一个LED(最好串联一个电阻限流,以防电流过大烧坏引脚),或给大多数传感器供电。若要驱动大多数继电器和电机,Arduino I/O 口提供的电流是不够的,得加额外的驱动电路模块。

Arduino (ATMEGA) 引脚设置为输入时,其能吸收最高40mA的电流流入


深入数字输出


Arduino 的 I/O 输出即是 ATMEGA 单片机的 I/O 输出。

用 pinMode() 配置引脚为输出时,引脚处于低阻抗模式,即:其能为外部模块提供一定的电流(最大 40mA)

不加驱动能力扩展板(电路)的 Arduino,只能驱动很小功率的外设,对诸如:电机,大功率 LED 灯(1W 以上),其驱动能力是不够的,需要对其进行扩流;对需要大电压(比如 220v)的外设,需要对其进行扩展(添加外围驱动电路,暂时可参考:Arduino 输出引脚扩流


Arduino (ATMEGA) 引脚的输出电流过大,可能会破坏引脚内的输出晶体管,甚至烧毁整个 Atmega 芯片。多数情况下会导致单片机的一个引脚烧毁而其他引脚仍然正常工作。

输出电流过大的情形,通常会出现在:


  • 直接将 Arduino 的数字输出引脚接地
  • 直接驱动需要大工作电流的设备(比如继电器和电机,通常需要 1A 以上的电流)


因此,在输出引脚连接其他设备时,除非必需使用最大的电流驱动,最好串联一个 470Ω 或 1kΩ 的电阻


实验时,在任意一个数字输出针脚与 GND (接地)之间直接串一个小功率 LED,当我们让该针脚输出 '1'(高电平,5V),去点亮 LED 时,最好串一个 1kΩ 的电阻,以防电流过大


深入数字输入


Arduino (ATMEGA) 引脚默认为输入模式

读数字输入引脚获得的值要不为 0,要不为 1,则其需要“测量”的就是引脚的输入电压,高电平为 '1',低电平为 '0'

配置为输入模式的引脚,处于高阻态(可以视为引脚内串联了一个 100MΩ 的电阻)。输入电阻高则输入电流就小,因此数字输入引脚采样时(测电压是 HIGH 还是 LOW)只需消耗极小的电流。因此外部设备或电路只要微小的电流就能改变输入引脚的状态,其对外部电压的感觉很灵敏。对于像电容触摸屏这样的传感器,接入 Arduino 数字输入口完全没有压力。

当然,灵敏也会有副作用,如果引脚配置为输入且没有连接外部电路(悬空),则该引脚的状态会因环境的原因(电子杂波或靠近电容)而变成随机值,对于这种情形,则需要给输入端加一个上拉电阻(连接到 5V)或者下拉电阻(连接到 GND 地),使其在悬空时保持一个已知的状态。

关于上拉电阻,可以看看这个需要开关的通断作为输入量的应用(比如按码开关作为按键输入):


开关输入-上拉电阻1.png


Pin 1 配置为输入引脚,开关一端接地,一端接 Pin 1,设计本意是低电平表示开关闭合。则当开关断开时 Pin 1 处于悬空状态,其值随机。因此我们需将其电平“拉”高,以示开关处于断开状态。直接将 Pin 1 连接 Vcc 5V 是个最简单的拉高电平的方法,但直接连接电源会导致输入电流过大,容易烧坏引脚,因此需要在 Vcc 和 Pin 1 间加一个电阻,通常称这个电阻为上拉电阻:

开关输入-上拉电阻2.png

所谓上拉电阻即:拉高引脚电压的电阻,关于上拉电阻的进一步信息可以参考 上拉电阻


下拉电阻的原理类似:

开关输入-下拉电阻.png


特别地,ATMEGA 芯片内置了一个可以用软件设置的 20kΩ 的上拉电阻,可以通过以下方法设置:

pinMode(pin, INPUT);           // 设置为输入
digitalWrite(pin, HIGH);       // 开启上拉电阻


需要注意的是,上拉电阻的电流足够使接在输入引脚上的LED发出微光。如果一个项目里的LED看起来已经工作了,但是亮度却很低,那么很可能是忘了用 pinMode() 设置引脚为输出端

另一个需要注意的事是控制上拉电阻和控制引脚保持高/低电平使用的是同一个寄存器。因此当一个配置为输入端又开启了上拉电阻的引脚在程序中用 pinMode() 改为输出端时,该引脚就被设置为高电平输出。同样的,高电平状态的输出端用 pinMode() 转为输入端时就同时开启了上拉电阻


特殊的 Pin 13

13号数字引脚在大多数Arduino板上已经焊接了一个LED和电阻。若要使用这个引脚内部的 20kΩ 上拉电阻,其电平将不是你期望的5V,而是因LED和串联电阻的作用被拉低到了1.7V,也就是说这个引脚会保持在低电平状态。如果你一定要把13号引脚作为数字输入,需要使用一个外置的下拉电阻。














个人工具
名字空间

变换
操作
导航
工具箱