gpt4 book ai didi

c++ - 为什么我的串行通过串行监视器在 Arduino IDE 上打印两次?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:47 32 4
gpt4 key购买 nike

我只输入了一个“打印命令”,但我得到了两次打印读取。

该程序驱动两个步进电机。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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com