用 Arduino 给 PC 上位机程序增加一个按钮输入

目录 Content
[hide]

如果你的 PC 上位机程序需要使用一个按钮来作为触发源,那么 Arduino 就可以胜任,足以省掉上千元的专业 IO 板卡和专业 SDK 编程。

arduino_pc_io

思路

使用 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 的程序和上位机的程序可分开调试。

arduino_io应用

这个方案被应用在正开发的一套系统,正常情况这套系统是通过与目标设备通讯而完成触发,但是目前在测试环节,还不方便更改目标设备的程序,于是引入这么一个方案,快捷方便。

pc_io_arduino_application

应用一个多月后的现场情况,积满了灰尘,在所难免啊!

pc_io_arduino_app_running

扩展阅读

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.