我正在开展另一个学校项目,我正在尝试制作障碍课程(模型大小)。对于这个项目,我使用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;
}
我希望有人能在这里看到问题,因为我不明白我做错了什么。
答案 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
//...
}
这样,代码永远不会被阻塞到休眠命令中,并且循环可以在每个电机运行时执行其他操作。