Доброго времени суток. Подскажите, что не так я сделал? Хочу сделать машину на управлении с помощью обычного пульта через ИК приемник. #include <AFMotor.h> #include <IRremote.h> unsigned long Value1 = 0x68733A46; unsigned long Value2 = 0x83B19366; unsigned long Value3 = 0x5F12E8C4; unsigned long Value4 = 0x189D7928; int RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results results; //задние моторы AF_DCMotor motor_b1(1); AF_DCMotor motor_b2(2); //передние моторы AF_DCMotor motor_f1(3); AF_DCMotor motor_f2(4); void set_speed(int speed) { motor_b1.setSpeed(speed); motor_b2.setSpeed(speed); motor_f1.setSpeed(speed); motor_f2.setSpeed(speed); } void robot_forward() { motor_b1.run(FORWARD); motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_f2.run(FORWARD); delay(1000); } // едем назад void robot_backward() { motor_b1.run(BACKWARD); motor_b2.run(BACKWARD); motor_f1.run(BACKWARD); motor_f2.run(BACKWARD); delay(1000); } // останавливаемся void robot_release() { motor_b1.run(RELEASE); motor_b2.run(RELEASE); motor_f1.run(RELEASE); motor_f2.run(RELEASE); delay(1000); } //поворот направо void turning_to_the_right() { motor_b1.run(FORWARD); motor_f2.run(FORWARD); motor_b2.run(BACKWARD); motor_f1.run(BACKWARD); delay(1000); } // поворот налево void turning_to_the_left() { motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_b1.run(BACKWARD); motor_f2.run(BACKWARD); delay(1000); } void setup() { Serial.begin(9600); set_speed(200); robot_forward(); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)); { irrecv.resume(); } if (results.value == Value1) motor_b1.run(FORWARD); motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_f2.run(FORWARD); if (results.value == Value2) motor_b1.run(BACKWARD); motor_b2.run(BACKWARD); motor_f1.run(BACKWARD); motor_f2.run(BACKWARD); if (results.value == Value3) motor_b1.run(FORWARD); motor_f2.run(FORWARD); motor_b2.run(BACKWARD); motor_f1.run(BACKWARD); delay(1000); if (results.value == Value4) motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_b1.run(BACKWARD); motor_f2.run(BACKWARD); delay(1000); }
Скобочки поставить забыли? Код (Text): if (results.value == Value1) { motor_b1.run(FORWARD); motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_f2.run(FORWARD); }
Код (Text): void setup() { //Serial.begin(9600); set_speed(200); //robot_forward(); irrecv.enableIRIn(); } void loop(){ if (irrecv.decode(&results)){ if (results.value == Value1){ robot_forward(); } else if (results.value == Value2){ robot_backward(); } else if (results.value == Value3){ turning_to_the_right(); } else if (results.value == Value4){ turning_to_the_left(); } else{ robot_release(); }; irrecv.resume(); } } как-то так попробуйте. Код (Text): unsigned long Value1 = 0x68733A46; unsigned long Value2 = 0x83B19366; unsigned long Value3 = 0x5F12E8C4; unsigned long Value4 = 0x189D7928; Это вообще от вашего пульта? Или вместе с кодом к Вам перекочевало?
от моего пульта. Код я сам писал, ориентируясь на разные коды. Скажем так собрал один код из массы других
Нужно привести код в порядок, добавить отладочный вывод, запустить и посмотреть в монитор последовательного порта. По поведению программы станет понятна причина затыка. Код (Text): #include <AFMotor.h> #include <IRremote.h> const unsigned long Value_FORWARD = 0x68733A46; const unsigned long Value_BACKWARD = 0x83B19366; const unsigned long Value_LEFT = 0x5F12E8C4; const unsigned long Value_RIGHT = 0x189D7928; const int RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results results; //задние моторы AF_DCMotor motor_b1(1); AF_DCMotor motor_b2(2); //передние моторы AF_DCMotor motor_f1(3); AF_DCMotor motor_f2(4); void set_speed(int speed) { motor_b1.setSpeed(speed); motor_b2.setSpeed(speed); motor_f1.setSpeed(speed); motor_f2.setSpeed(speed); } void robot_forward() { motor_b1.run(FORWARD); motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_f2.run(FORWARD); delay(1000); } // едем назад void robot_backward() { motor_b1.run(BACKWARD); motor_b2.run(BACKWARD); motor_f1.run(BACKWARD); motor_f2.run(BACKWARD); delay(1000); } // останавливаемся void robot_release() { motor_b1.run(RELEASE); motor_b2.run(RELEASE); motor_f1.run(RELEASE); motor_f2.run(RELEASE); delay(1000); } //поворот направо void turning_to_the_right() { motor_b1.run(FORWARD); motor_b2.run(BACKWARD); motor_f1.run(BACKWARD); motor_f2.run(FORWARD); delay(1000); } // поворот налево void turning_to_the_left() { motor_b1.run(BACKWARD); motor_b2.run(FORWARD); motor_f1.run(FORWARD); motor_f2.run(BACKWARD); delay(1000); } void setup() { Serial.begin(9600); set_speed(200); robot_forward(); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)); { irrecv.resume(); Serial.println("command received"); } if (results.value == Value_FORWARD) { robot_forward(); Serial.println("forward"); } if (results.value == Value_BACKWARD) { robot_backward(); Serial.println("backward"); } if (results.value == Value_RIGHT) { turning_to_the_right(); Serial.println("right"); } if (results.value == Value_LEFT) { turning_to_the_left(); Serial.println("left"); } } И еще, наверное, не помешало бы останавливать моторы через некоторое время. Иначе получится так, что робот будет выполнять последнюю команду бесконечно.
Залил Ваш код, но от пульта ничего не заработало. Передние колеса постоянно крутятся вперед. Задние просто "стоят" на месте.
Вот так, например: Код (Text): void setup() { robot_forward(); } void loop() { } Нужно сперва убедиться в работоспособности всех кусков кода по отдельности, а потом уже компоновать из них более сложную программу. И на каждом шаге проверять.
В целом это верно, но в частности иногда ставит в тупик. Например ВОЗМОЖНО здесь. Библиотека IRremote.h "хватает" таймер и блокирует возможность работы ШИМ на 3 и 11 ноге Ардуино. Когда запускаешь "покусочно" - все работает, вместе - нет. От библиотеки IRremote.h можно отказаться, как принимать ИК-сигнал без нее, смотреть здесь. Возможно есть другой путь - отказаться от библиотеки AFMotor.h, если это проще. Но от чего-то придется отказываться точно.
Такая ситуация. С пульта все переключается: вперед, назад, налево, направо. Библиотеки никакие не убирал, но как то странно себя ведут моторы. Почему-то работают только два мотора.