【问题标题】:Control 2 servo motors with 2 buttons Arduino用 2 个按钮控制 2 个伺服电机 Arduino
【发布时间】:2017-11-08 20:38:06
【问题描述】:

我正在从事另一个学校项目,我正在尝试制作障碍课程(模型尺寸)。对于这个项目,我使用了 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;

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

新代码:

#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 来说太多了。 cmets 中的代码运行良好!现在我正在尝试将伺服电机与小型振动电机结合起来。 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;

}

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

【问题讨论】:

    标签: arduino servo


    【解决方案1】:

    您的问题是您在每个 on if 语句中都在休眠代码:

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

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

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

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

    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
        //...
    }
    

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

    【讨论】:

    • 所以代码可以工作,但我现在遇到了另一个问题。我编辑了我的问题,也许你可以帮助我!
    • 在这种情况下,如果您有不同的问题,您应该提出不同的问题
    猜你喜欢
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多