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



我正在进行另一个学校项目,试图制作一个障碍课程(模型大小)。对于这个项目,我使用了两个伺服电机,我想用两个不同的按钮来控制它。因此,一个按钮连接到一个伺服电机,另一个连接到另一个伺服。实际上,我很难让两个按钮都和伺服电机一起工作。

当我连接一个按钮和一个伺服电机时,一切都按照我想要的方式工作。我按下按钮,伺服电机移动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来说太多了。评论中的代码运行良好!现在我正在尝试将伺服电机与小型振动电机结合起来。这两个传感器配合得很好,但我无法使振动电机正常工作。

我想让振动电机在我按下按钮后振动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;
}

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

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

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

因此,如果按钮Pin1为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
//...
}

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

最新更新