【问题标题】:Controlling DC motor with Arduino Mega and Simple-H HV Motor Shield [closed]使用 Arduino Mega 和 Simple-H HV Motor Shield 控制直流电机 [关闭]
【发布时间】:2014-06-11 00:03:28
【问题描述】:

我正在尝试使用 Simple-H HV Motor Shield 和 H 桥连接来控制单个直流电机。我需要使用串行监视器控制速度和方向(例如“f 220”表示以 220 的速度前进)。这是我的代码:

M1 使电机前进,M2 使电机后退。

这里是错误:没有匹配的函数调用'HardwareSerial::print()'

我不知道这是否是正确的编码方式。我只是想在编程方面得到一些帮助,因为我是 Arduino 编码的新手。

const int PWM1 = 2;  //PA - PWM A (M1)
const int PWM2 = 3;  //PB - PWM B (M2)
const int MotorEnable = 4;  //EA - Enable A
const int TestLED = 13;  //LED that tests whether going forward or back. LED lights up = forward, //non-lit = reverse

void setup() {
  pinMode(PWM1, OUTPUT);
  pinMode(PWM2, OUTPUT);

  Serial.begin(9600);
}
void loop() {

   int VariableMove = Serial.print(); // *** ERROR is here! ***
   int speed = Serial.parseInt();

  if (Serial.available() > 0) {
      if (VariableMove = "f" && speed >= 0 && speed <= 255) {
        digitalWrite(MotorEnable, HIGH);
        digitalWrite(PWM1, HIGH);
        digitalWrite(PWM2, LOW);
        Serial.println("Going Forward");
        analogWrite(PWM1, speed);
        }
     if (VariableMove = "r" && speed >= 0 && speed <= 255)  {
        digitalWrite(MotorEnable, HIGH); 
        digitalWrite(PWM1, LOW);
        digitalWrite(PWM2, HIGH); 
        Serial.println("Coming Back");
        analogWrite(PWM2, speed);
       }
       }
  }

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • 我尝试为串行监视器的输入设置一个变量。我试图将所说的内容存储在监视器中,以便电机继续运行,直到给出另一个命令。
  • '这是错误:没有匹配函数调用HardwareSerial::print()' 您显示的代码与此错误消息没有任何关系(除非您显示Serial 是什么,实际上你在哪里打电话给 HardwareSerial::print())!
  • 这一行出现错误:int VariableMove = Serial.print();
  • 编译你的代码是向前迈出的第一步(双关语)...

标签: c++ c arduino motordriver


【解决方案1】:

你说的那一行是报错:

 int VariableMove = Serial.print(); // *** ERROR is here! ***

目前尚不清楚您希望该行做什么,但它有两个问题:

  1. Serial.print() 需要一个参数:要打印的数据。错误是由于在没有参数的情况下调用该方法导致的,因为错误消息指出:no matching function for call to 'HardwareSerial::print()'

  2. 编码错误少于使用错误:Serial.print() 返回一个 long,表示稍后在您正在测试的代码中写入的字节数,如果它是字符串“f”等。所以你可能想要Serial.read() 或其他读取传入数据的方法之一。

最后这一行if (VariableMove = "f"

一个=assignment 要测试等价性,您可以使用两个==,如下所示:

if (VariableMove == "f" 这是一个常见的错误。

来自串行库文档:

返回

size_t (long): print() 返回写入的字节数,不过 读取该数字是可选的

【讨论】:

  • VariableMove == "f" 这也是公然错误的,很可能应该VariableMove == 'f' OP 修复他的代码以从用户输入中读取单个字符。
【解决方案2】:

以下更新。

Serial.print() 是一个“返回写入的字节数”的函数,但您没有对该函数的输入,因此存在编译时错误。

const int rightCW = 6, leftCW = 11, rightCCW = 5, leftCCW = 10;

void setup()
{
  Serial.begin(9600);
  initMotors();

}

void loop()
{
  delay(10);
  analogWrite(rightCW,255);     
}

void initMotors()
{
  //initialize motors
  pinMode(rightCW, OUTPUT);
  pinMode(leftCW, OUTPUT);
  pinMode(rightCCW, OUTPUT);
  pinMode(leftCCW, OUTPUT);
}

假设您已正确连接电机,您可以将右、左 CW 和 CCW(顺时针和逆时针)引脚编辑为您的控制引脚。该程序将简单地测试您是否可以让一个电机工作。

将此作为 H 桥图,以防:http://9m.no/쵉쀨 拐角连接到电源轨,每侧的内部两个接地,1A、2A 连接到 Arduino 上的控制引脚,1Y、2Y 连接到电机的两根电线。这同样适用于您可能拥有的任何其他电机。

更新(见下面的 cmets):

你会想要类似的东西

String input = "";
String result = "";
while (Serial.available() > 0)
{
  char temp = Serial.read();
  if (temp == '\n')
  {
    result = input;
    input = "";
    break; 
  }
  else
  {
    input += temp; 
  }
}

Serial.read() 是一次读取一个字节的函数。

【讨论】:

  • 除了你的介绍性句子之外,所有这些东西与问题中提到的错误有什么关系??
  • 哦。我的印象是您需要有关电机的一般帮助。我指出了您要求的行中的错误,并建议了一个替代程序,您可以适应您的需求,并接受诸如“f 220”之类的输入。
  • 对不起,可能想把所有的analogWrite东西都放在void loop()中。
  • 谢谢你的回答,但我不相信这是我需要的。我的电机确实可以工作——我之前已经测试过了。我需要的是如何使电机按照用户输入串行监视器的方向和速度进行
  • 我想我可能已经解决了您的问题。更详细地说,代码的最后一个 sn-p 将输入字母并将它们添加到字符串中,直到您按下回车或“返回”字符。然后它将当前积累的字符存储在一个新变量中并重置旧变量(可能有点多余,但我认为它有效)。就个人而言,我认为为了简单起见,您可能希望在不同的行上采用前向/后向输入和电源输入,因为如果字符串中有非整数字符,您的 parseInt() 函数将无法正常工作。
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多