需要打破" for循环"内的步进电机操作。但是我写的代码在循环完成后中断了操作,它不会破坏循环之间的操作。请检查代码并告诉我任何可能的方法来停止循环..
代码:
#include <Stepper.h>
int in1Pin = 8;
int in2Pin = 9;
int in3Pin = 10;
int in4Pin = 12;
bool entry = false;
int j;
Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin);
void setup() {
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(in3Pin, OUTPUT);
pinMode(in4Pin, OUTPUT);
while (!Serial);
Serial.begin(9600);
motor.setSpeed(300);
Serial.println("Type in your selection");
entry = false;
}
void loop() {
if (Serial.available() > 0){
switch(Serial.read()){
case 'a':
entry = true;
break;
case 'b':
entry = false;
break;
default:break;
}
}
if(entry == true){
for(j = -20; j <= 20; j++){
motor.step(j/0.176);
}
}
else if(entry == false){
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,LOW);
digitalWrite(in3Pin,LOW);
digitalWrite(in4Pin,LOW);
}
}
来自评论:当我发送&#39; a&#39;通过串行监视器,步进器开始旋转,当我发送&#39; b&#39;通过串行它应该打破步进电机旋转,但它只在完成循环后断开(不在循环内)
答案 0 :(得分:0)
如果你没有机会 Arduino 在执行for
循环之间解析串行输入,那么显然不会像你想的那样工作。
你应该做类似的事情:
...
void loop() {
static int j;
if (Serial.available() > 0){
switch(Serial.read()){
case 'a':
entry = true;
/**
* replace next 3 lines with `j = -20` if you want to start
* the loop from scratch each time `a` is received,
* instead of resuming from where you stopped.
*/
if (j >= 20) {
j = -20;
}
break;
case 'b':
entry = false;
break;
default:break;
}
}
if (entry) {
if (j <= 20) {
motor.step(j/0.176);
++j;
}
} else {
digitalWrite(in1Pin, LOW);
digitalWrite(in2Pin, LOW);
digitalWrite(in3Pin, LOW);
digitalWrite(in4Pin, LOW);
}
}
在此代码中,我让 Arduino 在每次调用motor.step()
后解析一个新字符。请注意,此方法在对motor.step()
wrt的后续调用中引入了 tiny 延迟。你原来的解决方案,但在实践中应该可以忽略不计。
如果您使用此代码连续向 Arduino 发送多个a
,但 Arduino 尚未完成for
循环,则使用此代码,将忽略其他a
。如果您想将它们作为额外的for
请求处理,那么您应该添加counter
以跟踪要执行的for
循环的待处理(完整)迭代次数