用2个按钮控制2个伺服电机Arduino

时间:2017-11-07 19:14:49

标签: arduino servo

我正在开展另一个学校项目,我正在尝试制作障碍课程(模型大小)。对于这个项目,我使用2个伺服电机,我想用2个不同的按钮控制。因此1个按钮连接到1个伺服电机,另一个连接到另一个伺服电机。我实际上很难让两个按钮与伺服电机配合使用。

当我连接1个按钮和1个伺服电机时,一切都按照我想要的方式工作。按下按钮,伺服电机移动90度,5秒后移回。

代码:

#include <Servo.h>
Servo myservo;

const int servoPin = D8;  // Servo pin
const int buttonPin = D7;  // Pushbutton pin

void setup() {
  myservo.attach(servoPin);
  pinMode(buttonPin, INPUT);
}//setup

void loop() {
  if (digitalRead(buttonPin) == HIGH) {
    myservo.write(180);
    delay(50);  // waits 50ms to reach the position
    delay(15000);//15 seconden wachten
    myservo.write(0);
    delay(50);  // waits 50ms to reach the position
  }
}//loop

但是我在论坛上看到,当你想要使用多个伺服电机时,你必须以不同的方式编写代码。你必须包括这样的伺服电机:

#include <Servo.h>
Servo myservoa, myservob;

当我更改代码时,一切都停止了工作,我真的不明白我在这里做错了什么。我希望伺服电机在同一时间工作,有两个不同的按钮。

新代码:

#include <Servo.h>
Servo myservoa, myservob;

const int servoPin1 = D8;  // Servo pin
const int servoPin2 = D6;  // Servo pin 
const int buttonPin1 = D7; // Pushbutton pin
const int buttonPin2 = D5; // Pushbutton pin

void setup() {
  myservoa.attach(servoPin1);
  myservob.attach(servoPin2);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}//setup

void loop() {
  if (digitalRead(buttonPin1) == HIGH) {
    myservoa.write(90);
    delay(50);  // waits 50ms to reach the position
    delay(5000);// 5 seconden wachten
    myservoa.write(0);
    delay(50);  // waits 50ms to reach the position
  }
  if (digitalRead(buttonPin2) == HIGH) {
    myservob.write(90);
    delay(50);  // waits 50ms to reach the position
    delay(5000);// 5 seconden wachten
    myservob.write(0);
    delay(50);  // waits 50ms to reach the position
  }
}//loop

我希望有人可以帮助我!

编辑:

所以我发现2台伺服电机实际上对我的NodeMCU来说很重要。评论中的代码工作得很好!现在我正在尝试将伺服电机与小型振动电机结合起来。 2个传感器可以很好地协同工作,但我无法使振动电机正常工作。

按下按钮后,我希望振动电机振动5秒钟。 5秒后,它必须自动停止。使用该代码时,振动电机仅在按下按钮时振动。未按下按钮时,振动电机直接停止。

代码:

#include <Servo.h>
Servo myservo;

const int servoPin = D8;  // Servo pin
const int vibratiePin = D3;  // Servo pin
const int buttonPin1 = D6;  // Pushbutton pin
const int buttonPin2 = D5;  // Pushbutton Pin

unsigned long stopA = 0;
unsigned long stopB = 0;

bool controlA = false;
bool controlB = false;

void setup() {
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  myservo.attach(servoPin);
  pinMode(vibratiePin, OUTPUT);

}//setup

void loop() {

    unsigned long now = millis();

    if(controlA && stopA < now) {
        myservo.write(0);
        controlA = false;
    } else if (!controlA && digitalRead(buttonPin1) == HIGH) {
        controlA = true;
        myservo.write(90);
        stopA = millis() + 5000;
    }

        if(controlB && stopB < now) {
        digitalWrite(vibratiePin, LOW);
        controlB = false;
        stopB = millis() + 5000;
       } else if  (!controlB && digitalRead(buttonPin2) == HIGH) {
        controlB = true;
        digitalWrite(vibratiePin, HIGH); 
}

stopB = now;

}

我希望有人能在这里看到问题,因为我不明白我做错了什么。

1 个答案:

答案 0 :(得分:0)

你的问题是你在if语句中的每个代码都在睡觉:

if (digitalRead(buttonPin1) == HIGH) {
    ...
    delay(5000);// the code is blocked for 5 seconds here
    ...
}

因此,如果buttonPin1为HIGH,则该块之后的代码将在(至少)之后5100毫秒之后运行。

实际上你不应该在循环中使用像long那样的longs延迟。原因在于您所看到的:当代码停止时,电机仍在运行,对于实际应用来说这是一个真正的危险场景。

解决方案是:不要睡觉!有几种方法可以做到这一点。其中一个是使用程序变量来控制每个电机的状态,另一个是设置运行电机的时间限制:

unsigned long stopA = 0;
unsigned long stopB = 0;

bool controlA = false;
bool controlB = false;

void loop() {

    unsigned long now = mills();

    if(controlA && stopA < now) {
        myservoa.write(0);
        controlA = false;
    } else if (!controlA && digitalRead(buttonPin1) == HIGH) {
        controlA = true;
        myservoa.write(90);
        stopA = mills() + 5050;
    }

    //similar to motor b
    //...
}

这样,代码永远不会被阻塞到休眠命令中,并且循环可以在每个电机运行时执行其他操作。