Управление двигателем постоянного тока

KeriLs
Offline
Зарегистрирован: 31.07.2016

Здравствуйте. Хочу протестировать процесс управление двигателем постоянного тока через ИК датчик. Но пока что у меня ничего не получается.

Для подключения двигателя к ардуине использую плату Мотор Шилд. Шилд и датчик проверял отдельно на тестовых скетчах - оба работают.

Соединил всё как показано на рисунке. Написал вот такой скетч. Подскажите, пожалуйста в чём ошибка. Спасибо.

 

#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(); // принимаем следующую команду
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

2. Давайте нормальную схему. На этом рисунке ничего не показано. В какое место шилда Вы воткнули провода датчика, например?

KeriLs
Offline
Зарегистрирован: 31.07.2016

Так понятнее? Датчик подключал ко второму выводу (как указано в скетче). Всё питается от 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(); // принимаем следующую команду
  }
}

 

djplaneta5
Offline
Зарегистрирован: 30.07.2015

а как сперва задать скорость а потом продолжить движение?

KeriLs
Offline
Зарегистрирован: 31.07.2016

Можно поконкретнее. Что именно на ваш взгляд неправлиьно в коде? Насколько мне известно, в операторе void setup задаются все параметры собранного устройства (скорость, режим входа или выхода порта и т.д.) а в void loop задаётся работа этого устройтва.

djplaneta5
Offline
Зарегистрирован: 30.07.2015

вкоде я так понял задаем скорость при програмирование и все. а сделать скорость по кнопкам 1,2,3,4,5 . например 1=51 , 2=102 , 3=153 , 4=204 , 5=255, тобиш сперва выбрали скорость а потом поехали.

djplaneta5
Offline
Зарегистрирован: 30.07.2015

и серву бы добавить в этот кот.

djplaneta5
Offline
Зарегистрирован: 30.07.2015

и на чем дальность лучше на ик или блютуз?

KeriLs
Offline
Зарегистрирован: 31.07.2016

Мне пока не нужно задавать скорость по кнопкам. Это сложнее. Для начала хочу чтоб мотор элементарно мог крутиться вперёд/назад в зависимости от нажатой клавиши

djplaneta5
Offline
Зарегистрирован: 30.07.2015

а с сервой не поможеш?

KeriLs
Offline
Зарегистрирован: 31.07.2016

Серву неплохо бы, но это потом.

Думаю на блютус бальность лучше, плюс может ловить сигнал даже за препядствием. Но нужен модуль и телефон на андроиде. Пока поэкспериментирую с ИК, потом наверное поставлю радиодатчик

 

djplaneta5
Offline
Зарегистрирован: 30.07.2015

вот кстати код тебе должен подойти 


#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);
  }
}

 

djplaneta5
Offline
Зарегистрирован: 30.07.2015

с блютузом я пробывал. обрывов в связи много. не очень понравилось.

KeriLs
Offline
Зарегистрирован: 31.07.2016

С сервой сам не работал ещё. Но думаю что надо делать примерно как здесь http://edurobots.ru/2014/04/arduino-servoprivod/