0

我正在使用 HC-05 和 arduino 并控制电机。每次我从我的应用程序向蓝牙发送一个字符(例如'R')时,我都希望电机运行到特定值(k)。我可以一次,但是当我再次发送“R”时,它不起作用。我希望每当我发送字符“R”时电机都应该运行。

Arduino code

#define stpwm 13
#define stdir 12
int j=0;
int k=20;
char inChar;

void setup() {
  Serial.begin(9600);
  pinMode(stpwm, OUTPUT);
  pinMode(stdir, OUTPUT);

}
void loop() {
 if (Serial.available() > 0 ) { // Checks whether data is comming from the serial port
    inChar = (Serial.read()); // Reads the data from the serial port

  }

  if (inChar == 'R')
  {

  if (j<=k)

  {
    analogWrite(AN2, 100);
    analogWrite(AN1, 50);
    analogWrite(stpwm, 50);

    digitalWrite(stdir, HIGH);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    delay(100);  
    Serial.println(j);
    j++;
}
analogWrite(stpwm,0);
}
4

2 回答 2

0

尝试

  if (inChar == 'R')
  {

  while (j<=k)

  {
    analogWrite(AN2, 100);
    analogWrite(AN1, 50);
    analogWrite(stpwm, 50);

    digitalWrite(stdir, HIGH);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    delay(100);  
    Serial.println(j);
    j++;
}
      j=0;
analogWrite(stpwm,0);
}
于 2019-09-11T10:27:36.317 回答
0

您的代码存在一个主要问题:

用于控制if 语句的变量永远不会重置,因此有一段时间(当j >= k时)它永远不会为真,除非您重新启动系统;

尽管 Pradeep 的答案有可能起作用,但它会将您的系统锁定在一个循环中,而 j 小于 k

因此,如果您想在系统中实现未来的控制代码,这可能会成为一个问题。例如,如果您需要将紧急停止设置为另一个字母,则只有在您没有卡在while 循环中时才会读取它。

我建议使用一个非常简单的结构:else ; 如下所示:

#define stpwm 13
#define stdir 12
#define k 20

uint8_t j=0;
char inChar[1];

void setup() {
  Serial.begin(9600);
  pinMode(stpwm, OUTPUT);
  pinMode(stdir, OUTPUT);

}
void loop() {
 if (Serial.available() > 0 ) { // Checks whether data is comming from the serial port
    inChar = (Serial.read()); // Reads the data from the serial port

  }

  if (inChar == 'R')
  {

     if (j<=k)

     {
       analogWrite(AN2, 100);
       analogWrite(AN1, 50);
       analogWrite(stpwm, 50);

       digitalWrite(stdir, HIGH);
       digitalWrite(IN1, HIGH);
       digitalWrite(IN2, LOW);
       delay(100);  
       Serial.println(j);
       j++;
     }
  }
  else{
     //  resets both j and inChar, so that the iteration does not restart
     j = 0;
     inChar = "";
     // turn off signal only when this criteria is met: j > k
     analogWrite(stpwm, 0);
  }
}

我还对您的代码做了一些小改动:

  • 将k定义为常数,因为您不会在程序中更改它
  • 将 j 声明为8 位整数,其值范围为 0 到 255;这样可以节省内存
  • 修改了您关闭stpwm的位置。按照它的设置方式,您的信号总是在每次迭代结束时关闭,这可能会损坏您的电机(您在某种程度上实现了另一个脉冲调制)

希望这可以帮助。

于 2019-09-11T16:51:00.847 回答