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

标签 c++ arduino

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

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

相关文章:

c++ - libboost_log_setup.a 库的原因?

c++ - 允许用户在内部实现链表时与 std::strings 交互?

c++ - .h 文件中的客户端结构与实现结构

c++ - C++ 的 Vector 元素顺序

c - 使用 strtok 解析字符串数组

c++ - 如何从 Arduino 正确接收和发送原始红外数据

mysql - Arduino mega + 以太网扩展板 : Mysql connector to xampp local server

c++ - 如何在Windows上安装带多媒体的Qt

arduino - STK500v2 引导加载程序仅在上电复位时加载,而不是在引脚/WDT 复位时加载

c - Arduino 中的空字符数组