Здравствуйте. Хочу протестировать процесс управление двигателем постоянного тока через ИК датчик. Но пока что у меня ничего не получается. Для подключения двигателя к ардуине использую плату Мотор Шилд. Шилд и датчик проверял отдельно на тестовых скетчах - оба работают. Соединил всё как показано на рисунке. Написал вот такой скетч. Подскажите, пожалуйста в чём ошибка. Спасибо. Код (C++): #include "IRremote.h" #include <AFMotor.h> IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; // создаем объект motor №2, ШИМ 64 кГц AF_DCMotor motor2(2, MOTOR12_64KHZ); void setup() { irrecv.enableIRIn(); // запускаем прием Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод motor2.setSpeed(200); // устанавливаем скорость вращения 200/255 } void loop() { if ( irrecv.decode( &results )) { // если данные пришли switch ( results.value ) { case 0xFD00FF: // нажимаем кнопку "1" motor2.run(FORWARD); // вращение вперед break; case 0xFD807F: // нажимаем кнопку "2" motor2.run(BACKWARD); // в другую сторону break; } irrecv.resume(); // принимаем следующую команду } } Датчик подключал ко второму выводу (как указано в скетче). Всё питается от 5 вольт подаваемых через юсб кабель на ардуино. Я также пробовал зажигать и гасить светодиод через датчик с помощью команд от пульта- у меня всё работало.
возможно у выхода USB не хватает мощности для запуска мотора. Нужен внешний БП. У меня нет такой библиотеки, но есть подозрение что метод .run требует постоянного обращения, а не разового. Вот этот код как работает? Код (C++): #include "IRremote.h" #include <AFMotor.h> IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; // создаем объект motor №2, ШИМ 64 кГц AF_DCMotor motor2(2, MOTOR12_64KHZ); void setup() { irrecv.enableIRIn(); // запускаем прием Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод motor2.setSpeed(200); // устанавливаем скорость вращения 200/255 } void loop() { motor2.run(FORWARD); // вращение вперед delay(10000); // а если убрать эту строку, то как будет работать? }
У этой библиотеки есть тестовый скетч. С помощью него я тестировал шилд. Также питал через юсб и мотор крутился 3 секунды в одну сторону и 3 секунды в другую. Ваш код не работает. Мотор не крутится. Совсем. Даже после удаления строки
а если убрать все, что относится к IRremote? Код (C++): //#include "IRremote.h" #include <AFMotor.h> //IRrecv irrecv(2); // указываем вывод, к которому подключен приемник //decode_results results; // создаем объект motor №2, ШИМ 64 кГц AF_DCMotor motor2(2, MOTOR12_64KHZ); void setup() { // irrecv.enableIRIn(); // запускаем прием Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод motor2.setSpeed(200); // устанавливаем скорость вращения 200/255 } void loop() { motor2.run(FORWARD); // вращение вперед delay(10000); // а если убрать эту строку, то как будет работать? }
Если убрать всё от IRremote, то можно составить примерно следующее: Код (C++): #include <AFMotor.h> // создаем объект motor №2, ШИМ 64 кГц AF_DCMotor motor2(2, MOTOR12_64KHZ); void setup() { Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод motor2.setSpeed(200); // устанавливаем скорость вращения 200/255 } void loop() { motor2.run(FORWARD); // вращение вперед delay(3000); motor2.run(BACKWARD); // в другую сторону delay(3000); } Этот код работает
значит библиотеки IRremote.h и AFMotor.h используют одно и то же прерывание и вместе работать не могут (без ковыряния в недрах).
дело действительно было в несовместимости работы этих двух библиотек. Но я с этим разобрался. Теперь работает. Сейчас другая проблема. При нажатии на кнопку двигатель начинает вращаться. Вращается он так до тех пор, пока не поступит другая команда. Я хочу сделать так, чтобы при нажатии на кнопку он как обычно вращался, а как отпускаю кнопку - прекращал работу. Вот что я составил: Код (C++): #include <IRremote.h> #include <IRremoteInt.h> #include <AFMotor.h> IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; // создаем объект motor №2, ШИМ 64 кГц AF_DCMotor motor2(2, MOTOR12_64KHZ); char 1_BUTTON = "FD00FF" char 2_BUTTON = "FD807F" void setup() { irrecv.enableIRIn(); // запускаем прием Serial.begin(9600); // устанавливаем скорость передачи по посл. порту 9600 бод motor2.setSpeed(200); // устанавливаем скорость вращения 200/255 } void loop() { if (digitalRead(1_BUTTON) ==HIGH) { // нажимаем кнопку "1" digitalWrite(motor2.run(FORWARD); // вращение вперед } else { digitalWrite(motor2.run(RELEASE); } if (digitalRead(2_BUTTON) ==HIGH) { // нажимаем кнопку "2" digitalWrite(motor2.run(BACKWARD); // вращение назад } else { digitalWrite(motor2.run(RELEASE); } irrecv.resume(); // принимаем следующую команду } } Но, дело в том, что мои переменные BUTTON_1 и BUTTON_2 программа бракует. Как следует их задать? Может есть и другие замечания по коду?
переменные не должны начинаться с цифры. char - это строго один символ, а ты впихиваешь строку. digitalRead считывает состояние пина, т.е. применим только для физически подключенных проводами кнопок. Насколько я вижу, у тебя кнопки на пульте, digitalRead их не увидит.