问题
描述
最近开始玩 Arduino, 在设置数字引脚为输入端时,发现了一个现象,当引脚没有用杜邦线连接到下拉电阻或上拉电阻时,串口的信号就会发生震荡,很不稳定。引脚用杜邦线接出来但没有连接也是一样的效果。
这个现象与我正常理解的不太一样,我理解的是在不接地或者没有信号时,引脚的串口信号会保持一个稳定的状态(保持高电压或者低电压),但事实是,信号会随机变化。
但是由于引脚信号在使用过程中需要变化,作为控制单元,在受到外部信号的影响时,由低变到高或者由高变到低。因此不能简单地只接下拉电阻或是只接上拉电阻。
接线
Arduino 板的说明图如下:
图片来自 W3Cschool :Arduino 板的说明
我连接的引脚口是图中15号数字I/O中的 2 号引脚,简化后的代码如下:
const int pinLight = 2;
void setup() {
// put your setup code here, to run once:
pinMode(pinLight, INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int read_light = digitalRead(pinLight);
if (read_light == HIGH) {
Serial.println("3");
}
else if (read_light == LOW) {
Serial.println("4");
}
}
最后利用串口监视器监视的效果就是 3
和 4
在震荡。
解决过程
主要查了以下几个资料:
最初找到的就是这篇博客,上面说: 引脚作为数字输入,但是不连接任何的拉电阻,处于悬空转态,容易受电子噪声干扰而随机的改变其电平状态。
不过,个人尝试了一下,发现不是噪声这么简单,信号的震荡频率很大,有时会一直保持高电位;有时又会一直保持低电位。基本上一直不会稳定下来。
这个教程里说: 如果你将数字引脚悬空(没接下拉电阻),LED可能会不规律的闪烁。这是因为此时Arduino引脚的输入一直在”漂移”。就是说,程序不能判定它是高电压还是低电压,故而只会随机的返回HIGH或LOW
我觉得这个说得比较对,不只是噪声的问题。
后来又问了一下学长,得到的解释是,在悬空时,会输出三个0连着三个1,实际中并不是这么有规律的,但确实见到过三个0连着三个1的情况,网上没有查到具体细节。
最后的解决方案
唯一的解决方案就是让串口接触稳定,就算是更换输入信号,也要很快完成改变,尽量不能悬空。
我使用的是 欧姆龙(OMRON)MY2NJ继电器,按照继电器上的连线情况,在另一端的连线处,增加一根连接 Arduino 上接地的线。这样,无论开关是打开或是闭合,都可以接一个稳定的信号源了。