以下Arduino代码的目的是与Raspberry Pi发送的高低信号接口;完整的解释很复杂,所以我会及时为您节省时间。从Pi发送的信号(引脚10和11)使顺时针或逆时针旋转连接到A4988驱动器的步进电机。决定这一点的针脚是步进和方向针脚(9和8)。我要完成的工作是在针脚10和11闲置60秒后启用 sleepPin 。
同样,如果它们都读取相同的输入信号超过3秒钟,我想停止接受来自引脚10和11的输入。我已经研究了如何将时间整合到Arduino脚本中的方法,但是不知道如何在这种情况下整合时间。
byte directionPin = 9;
byte stepPin = 8;
byte sleepPin = 12;
byte buttonCWpin = 10;
byte buttonCCWpin = 11;
boolean buttonCWpressed = false;
boolean buttonCCWpressed = false;
long previousMillis = 0;
long interval = 1000;
void setup() {
//determines length of stepper movement
pinMode(directionPin, OUTPUT);
pinMode(stepPin, OUTPUT);
//moves motors clockwise or counterclockwise
pinMode(buttonCWpin, INPUT_PULLUP);
pinMode(buttonCCWpin, INPUT_PULLUP);
}
void loop() {
readButtons();
actOnButtons();
}
void readButtons() {
buttonCCWpressed = false;
buttonCWpressed = false;
if (digitalRead(buttonCWpin) == LOW) {
buttonCWpressed = true;
}
if (digitalRead(buttonCCWpin) == LOW) {
buttonCCWpressed = true;
}
}
void actOnButtons() {
if (buttonCWpressed == true) {
digitalWrite(directionPin, LOW);
for(int x = 0; x < 1; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(515);
digitalWrite(stepPin,LOW);
delayMicroseconds(515);
}
}
if (buttonCCWpressed == true) {
digitalWrite(directionPin, HIGH);
for(int x = 0; x < 1; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(515);
digitalWrite(stepPin,LOW);
delayMicroseconds(515);
}
}
}
任何帮助以及任何提示或疑虑都将不胜感激。
谢谢。
答案 0 :(得分:0)
如果您愿意使用引脚2和3而不是引脚10和11(例如,假设您有Arduino Uno),那么使用external interrupts可能会很有用。
作为第一个问题的解决方案,这是一个最少的代码,应在 方向插针2和3上闲置60秒后将睡眠插针置于高电平。
volatile long int last_activity;
void setup(){
attachInterrupt(2, tstamp, CHANGE);
attachInterrupt(3, tstamp, CHANGE);
pinMode(2, INPUT); // your new CW pin
pinMode(3, INPUT); // your new CCW pin
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
last_activity = millis();
}
void loop(){
if (millis() - last_activity > 60e3) {
digitalWrite(12, HIGH);
// do some other things...
}
}
void tstamp(){
last_activity = millis();
}
第二个问题,“停止接受来自引脚10和11的输入”到底是什么意思?如果您只需要检查它们的状态是否相同,则在序言中添加volatile long int last_common_state;
并在digitalRead(2) == digitalRead(3);
的正文中检查tstamp()
以更新last_common_state
应该可以帮助您正确的轨道。