我只输入了一个“打印命令”,但我得到了两次打印读取。
该程序驱动两个步进电机。 moveSteps 值 = 48
当程序开始运行时,电机会短暂停止并打印“48”,然后在程序结束前触发 if 时再次打印“48”。
只应打印一个“48”。知道为什么会这样吗?
/*
Precise movement with stop
Moves the robot 20mm forwards and 20mm backwards
Rob Miles (edited by Dileepa Ranawake)
April 2017
Version 1.0
*/
int motorDelay;
byte left1,left2,left3,left4;
byte right1,right2,right3,right4;
float wheelDiameter = 68.5;
float stepsPerRevolution = 512;
float mmsPerStep = (wheelDiameter * 3.1416) / stepsPerRevolution;
int moveCount;
int moveSteps; // number of steps the motor is to move
void leftForwards()
{
left1=7; left2=6; left3=5; left4=4;
}
void leftReverse()
{
left1=4; left2=5; left3=6; left4=7;
}
void rightForwards()
{
right1=8; right2=9; right3=10; right4=11;
}
void rightReverse()
{
right1=11; right2=10; right3=9; right4=8;
}
int calculateDistanceSteps(float distanceInMM)
{
return distanceInMM / mmsPerStep + 0.5;
}
void setup() {
leftForwards();
rightForwards();
pinMode(left1,OUTPUT);
pinMode(left2,OUTPUT);
pinMode(left3,OUTPUT);
pinMode(left4,OUTPUT);
digitalWrite(left1,HIGH);
pinMode(right1,OUTPUT);
pinMode(right2,OUTPUT);
pinMode(right3,OUTPUT);
pinMode(right4,OUTPUT);
digitalWrite(right1,HIGH);
motorDelay=1200;
moveCount=0;
moveSteps = calculateDistanceSteps(20);
Serial.begin(9800);
}
void loop() {
moveCount = moveCount + 1;
if (moveCount==moveSteps)
{
digitalWrite(left1,LOW);
digitalWrite(right1,LOW);
Serial.println(moveCount);
exit(0);
}
digitalWrite(left2,HIGH);
digitalWrite(right2,HIGH);
delayMicroseconds(motorDelay);
digitalWrite(left1,LOW);
digitalWrite(right1,LOW);
delayMicroseconds(motorDelay);
digitalWrite(left3,HIGH);
digitalWrite(right3,HIGH);
delayMicroseconds(motorDelay);
digitalWrite(left2,LOW);
digitalWrite(right2,LOW);
delayMicroseconds(motorDelay);
digitalWrite(left4,HIGH);
digitalWrite(right4,HIGH);
delayMicroseconds(motorDelay);
digitalWrite(left3,LOW);
digitalWrite(right3,LOW);
delayMicroseconds(motorDelay);
digitalWrite(left1,HIGH);
digitalWrite(right1,HIGH);
delayMicroseconds(motorDelay);
digitalWrite(left4,LOW);
digitalWrite(right4,LOW);
delayMicroseconds(motorDelay);
}
串口监视器打印出4848
我还注意到只要打开串口监视器就会使步进电机移动!
最佳答案
在 Arduino 上使用 exit()
不是标准的。它基本上禁用所有中断并进入无限循环。您可以像这样重构您的 loop()
以避免它:
void loop()
{
// Still moving?
if (moveCount < moveSteps) {
moveCount = moveCount + 1;
// Move complete
if (moveCount == moveSteps)
{
digitalWrite(left1,LOW);
digitalWrite(right1,LOW);
Serial.println(moveCount);
}
else {
digitalWrite(left2,HIGH);
digitalWrite(right2,HIGH);
//etc.....
}
}
}
此外,您的循环延迟 1200µs 8 倍。那只是 1200 × 8 = 9600 微秒 = 9.6 毫秒。如果 moveSteps = 48
那么整个循环只需要 460.8 毫秒。该程序在您打开串行监视器之前运行一次,然后再运行一次。如果在打开串行监视器后按下重置按钮会发生什么情况?
您是否考虑过使用 Arduino 的内置 Stepper Library ?
最后,将来考虑在 [arduino.se] 上发布这样的问题.
关于c++ - 为什么我的串行通过串行监视器在 Arduino IDE 上打印两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43717639/