Управление двигателем постоянного тока
- Войдите на сайт для отправки комментариев
Пнд, 05/09/2016 - 15:40
Здравствуйте. Хочу протестировать процесс управление двигателем постоянного тока через ИК датчик. Но пока что у меня ничего не получается.
Для подключения двигателя к ардуине использую плату Мотор Шилд. Шилд и датчик проверял отдельно на тестовых скетчах - оба работают.
Соединил всё как показано на рисунке. Написал вот такой скетч. Подскажите, пожалуйста в чём ошибка. Спасибо.
#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:
motor2.run(FORWARD); // вращение вперед
break;
case 0xFD807F:
motor2.run(BACKWARD); // в другую сторону
break;
}
irrecv.resume(); // принимаем следующую команду
}
}

1. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
2. Давайте нормальную схему. На этом рисунке ничего не показано. В какое место шилда Вы воткнули провода датчика, например?
Так понятнее? Датчик подключал ко второму выводу (как указано в скетче). Всё питается от 5 вольт подаваемых через юсб кабель на ардуино. Я также пробовал зажигать и гасить светодиод через датчик с помощью команд от пульта- у меня всё работало.
#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(); // принимаем следующую команду } }а как сперва задать скорость а потом продолжить движение?
Можно поконкретнее. Что именно на ваш взгляд неправлиьно в коде? Насколько мне известно, в операторе void setup задаются все параметры собранного устройства (скорость, режим входа или выхода порта и т.д.) а в void loop задаётся работа этого устройтва.
вкоде я так понял задаем скорость при програмирование и все. а сделать скорость по кнопкам 1,2,3,4,5 . например 1=51 , 2=102 , 3=153 , 4=204 , 5=255, тобиш сперва выбрали скорость а потом поехали.
и серву бы добавить в этот кот.
и на чем дальность лучше на ик или блютуз?
Мне пока не нужно задавать скорость по кнопкам. Это сложнее. Для начала хочу чтоб мотор элементарно мог крутиться вперёд/назад в зависимости от нажатой клавиши
а с сервой не поможеш?
Серву неплохо бы, но это потом.
Думаю на блютус бальность лучше, плюс может ловить сигнал даже за препядствием. Но нужен модуль и телефон на андроиде. Пока поэкспериментирую с ИК, потом наверное поставлю радиодатчик
вот кстати код тебе должен подойти
#include "IRremote.h" IRrecv irrecv(11); decode_results results; const int in3 = 6; // подкючаем in3 (L298n) к pin 6 Arduino const int in4 = 7; // подкючаем in4 (L298n) к pin 7 Arduino void setup() { irrecv.enableIRIn(); Serial.begin(9600); pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, OUTPUT); // connection to L298n } void loop() { if (irrecv.decode(&results)) { int res = results.value; Serial.println(res, HEX); if(res==0xFFFF9867)// Если нажата кнопка "Вперед" { digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // едем вперед } if(res==0xFFFFB847)// Если нажата кнопка "Назад" { digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // едем назад } if(res==0x50AF)// Если нажата кнопка "Стоп" { digitalWrite(in3, LOW); digitalWrite(in4, LOW); } irrecv.resume(); delay(200); } }с блютузом я пробывал. обрывов в связи много. не очень понравилось.
С сервой сам не работал ещё. Но думаю что надо делать примерно как здесь http://edurobots.ru/2014/04/arduino-servoprivod/