Управление двигателем постоянного тока с помощью Arduino Mega и Simple-H HV Motor Shield

0

Я пытаюсь управлять одним двигателем постоянного тока с использованием прожектора H-HV и 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);
       }
       }
  }
  • 0
    Вопросы, требующие помощи в отладке («почему этот код не работает?») Должны включать желаемое поведение, конкретную проблему или ошибку и самый короткий код, необходимый для его воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы бесполезны для других читателей. См .: Как создать минимальный, полный и проверяемый пример .
  • 0
    Я попытался установить переменную для ввода с последовательного монитора. Я пытался сохранить то, что сказано на мониторе, чтобы двигатель продолжал работать, пока не будет дана другая команда.
Показать ещё 13 комментариев
Теги:
arduino

2 ответа

4

Строка, которую вы говорите, бросает ошибку:

 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"

Один = задание Для проверки эквивалентности вы используете два == как в:

if (VariableMove == "f" Это общая ошибка.

из документации Serial lib:

Возвращает

size_t (long): print() возвращает количество записанных байтов, хотя чтение этого числа является необязательным

  • 0
    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 перейдите к двигателю двух проводов. То же самое относится к любому другому двигателю, который у вас может быть.

ОБНОВЛЕНИЕ (см. Комментарии ниже):

Вам нужно что-то вроде

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

Serial.read() - это функция, которая читает по одному байту за раз.

  • 0
    Помимо вашего вступительного предложения, как все это связано с ошибкой, упомянутой в вопросе?
  • 0
    Ой. У меня сложилось впечатление, что вам нужна общая помощь с моторами. Я указал на ошибку в строке, которую вы просили, и предложил альтернативную программу, которую вы могли бы адаптировать к вашим потребностям, и взять ввод, такой как «f 220» или что-то в этом роде.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню