如果你的 PC 上位机程序需要使用一个按钮来作为触发源,那么 Arduino 就可以胜任,足以省掉上千元的专业 IO 板卡和专业 SDK 编程。
思路
使用 Arduino 的串口和应用程序交换信息。用一个管脚作为输入检测按钮状态,并通过 Serial 发送指令给上位机程序。上位机程序对串口接收的指令进行相应处理。
按钮输入,首先要考虑电磁感应干扰,可以使用内建的 INPUT_PULLUP 上拉功能。其次需要考虑防抖,通常的做法就是加延时。这和 PLC 中的跳沿检测(参见《PLC 边沿检测原理》)类似但又不一样 。
代码
Arduino Duemilanove + IDE 1.6.12 测试通过。
//LED pin const int ledPin = 13; // input pin, HIGH Normal const int buttonPin = 2; int buttonPinState = HIGH; int lastButtonPinState = HIGH; //press time long lastPressTime = 0; long PressDelayTime = 20; void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } } void loop() { //Button int CurrentButtonPinState = digitalRead(buttonPin); if(CurrentButtonPinState != lastButtonPinState){ lastPressTime = millis(); } if( millis() - lastPressTime > PressDelayTime){ if(CurrentButtonPinState != buttonPinState){ buttonPinState = CurrentButtonPinState; if(buttonPinState == LOW){ //Command Serial.println("fire!"); } } } lastButtonPinState = CurrentButtonPinState; //LED if(Serial.available() > 0){ int readChar = Serial.read(); if(readChar == 'N'){ digitalWrite(ledPin,HIGH); }else{ digitalWrite(ledPin,LOW); } } }
原理
按钮触点接 Pin2 和 GND。Pin2 被设置作为上拉输入端,避免浮动电压干扰,这样,输入有效状态为 LOW 。按下按钮,如果在设定时间 PressDelayTime (默认设置 20 毫秒) 内没有抖动,则继续判断输入状态为 LOW 后输出一次串口字符 “ fire!”
。接着,Arduino 又查询串口接收的字符,一旦为字符 ”N“,则亮 Pin13 的 LED,可作为状态指示使用。
调试
Arduino 的程序和上位机的程序可分开调试。
应用
这个方案被应用在正开发的一套系统,正常情况这套系统是通过与目标设备通讯而完成触发,但是目前在测试环节,还不方便更改目标设备的程序,于是引入这么一个方案,快捷方便。
应用一个多月后的现场情况,积满了灰尘,在所难免啊!
扩展阅读
- 面向过程编程中的阻塞和非阻塞 – 从闪烁LED说起
http://davidrobot.com/2014/12/sequence_and_blocking.html - C#与Arduino通过串口通信来控制LED灯的状态
http://www.cnblogs.com/dddd218/p/3389937.html