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

Я пытаюсь управлять одним двигателем постоянного тока с помощью простого двигателя HV 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);
}
}
}

0

Решение

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

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

Непонятно, что вы ожидаете от этой строки, но есть две ошибки:

  1. Serial.print() требует аргумента: данные для печати. Ошибка возникает в результате вызова этого метода без аргумента, поскольку, как говорится в сообщении об ошибке: no matching function for call to 'HardwareSerial::print()'

  2. Меньше ошибки кодирования, чем ошибка использования: Serial.print () возвращает long представляющий количество байтов, записанных еще позже в коде, который вы тестируете, если это String «f» и т. д. Так что вы, вероятно, хотите Serial.read() или один из других методов для чтения входящих данных.

Наконец эта строка if (VariableMove = "f"

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

if (VariableMove == "f" Это распространенная ошибка.

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

Возвращает

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

4

Другие решения

Обновлено ниже.

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 и против часовой стрелки (по часовой стрелке и против часовой стрелки) для любых ваших управляющих контактов. Эта программа просто проверит, работает ли у вас один мотор.

Возьмите это для диаграммы 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 () — это функция, которая читает по одному байту за раз.

-2

По вопросам рекламы [email protected]