Я пытаюсь управлять одним двигателем постоянного тока с использованием прожектора 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);
}
}
}
Строка, которую вы говорите, бросает ошибку:
int VariableMove = Serial.print(); // *** ERROR is here! ***
Неясно, чего вы ожидаете от этой линии, но в этом есть две вещи:
Serial.print()
требует аргумента: данные для печати. Ошибка возникает из вызова этого метода без аргумента, поскольку, как указано в сообщении об ошибке: no matching function for call to 'HardwareSerial::print()'
Меньшая ошибка кодирования, чем ошибка использования: Serial.print() возвращает long
представляя количество байтов, написанных еще позже в тестируемом коде, если это строка "f" и т.д. Поэтому вам, вероятно, понадобится Serial.read()
или один из других способов считывания входящих данных.
Наконец, эта строка if (VariableMove = "f"
Один =
задание Для проверки эквивалентности вы используете два ==
как в:
if (VariableMove == "f"
Это общая ошибка.
из документации Serial lib:
Возвращает
size_t (long): print() возвращает количество записанных байтов, хотя чтение этого числа является необязательным
VariableMove == "f"
Это также явно неправильно, скорее всего, VariableMove == 'f'
как только OP исправил свой код для чтения одного символа из пользовательского ввода.
Обновлено ниже.
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() - это функция, которая читает по одному байту за раз.