Проблема с управляемыми двигателями L293D с помощью ИК-пульта дистанционного управления

У меня есть проблема с моим последователем линии:

Мой робот имеет 4 колеса с двигателями постоянного тока, подключенными к экрану L293D (Arduino Uno).

Робот представляет собой линейный повторитель, управляемый ИК-пилотом с ИК-приемником, он имеет 4 ИК-датчика(два сзади и два спереди). Робот идет вперед, если ни один из датчиков не видит черную линию.

Когда я нажимаю кнопку>, робот должен использовать только датчики спереди и следовать по линии до конца дороги, сделанной из черной ленты, а когда я нажимаю >

Робот должен перестать работать только в том случае, если я нажму кнопку 0 на пилоте (функция CarStop ()). Таким образом, без ИК-кода дистанционного управления робот работает нормально, но когда я добавляю код для пилота, работают только два правых двигателя, они вращаются вперед, и больше ничего не происходит, независимо от того, видит ли линию один, два или ни один датчик.

Все питается от двух батарей 18650.

ИК - пилотный приемник подключается к выводу A0 на выводе 14 экрана (который может быть использован как цифровой).

#include <IRremote.h>
#include <AFMotor.h>

int IRsensorPin = 14;
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
    
IRrecv irrecv(IRsensorPin);
unsigned long key_value = 0;
decode_results results;

const int back_left_sensor_pin = A0;
const int left_sensor_pin = A1;
const int back_right_sensor_pin = A2;
const int right_sensor_pin = A3;
int left_sensor_state;
int back_left_sensor_state;
int right_sensor_state;
int back_right_sensor_state;
    
void CarBackward()
{
  if (back_left_sensor_state > 500 && back_right_sensor_state < 500) 
  {
    Serial.println("turn right");
    motor1.run(BACKWARD); // LP
    motor2.run(RELEASE); // LT
    motor3.run(BACKWARD); // PT
    motor4.run(FORWARD); // PP
              
    motor1.setSpeed(160);
    motor2.setSpeed(130);
    motor4.setSpeed(180);
    delay(20);
  }
              
  if (back_left_sensor_state < 500 && back_right_sensor_state > 500)
  {
    Serial.println("turn left");
    motor1.run(FORWARD); // LP
    motor2.run(BACKWARD); // LT
    motor3.run(RELEASE); // PT
    motor4.run(BACKWARD); // PP
          
    motor1.setSpeed(180);
    motor4.setSpeed(160);
    motor3.setSpeed(130);
    delay(20);
  }
          
  if (back_left_sensor_state < 500 && back_right_sensor_state < 500)
  {
    Serial.println("forward");
    motor1.run(BACKWARD); // LP
    motor2.run(BACKWARD); // LT
    motor3.run(BACKWARD); // PT
    motor4.run(BACKWARD); // PP
              
    motor1.setSpeed(110);
    motor2.setSpeed(110);
    motor3.setSpeed(110);
    motor4.setSpeed(110);
    delay(20);
  }
              
  if (back_left_sensor_state > 500 && back_right_sensor_state > 500)
  {
    Serial.println("stop");
    motor1.setSpeed(0);
    motor2.setSpeed(0);
    motor3.setSpeed(0);
    motor4.setSpeed(0);
    delay(20);
  }
}
    
void CarForward()
{
  if (right_sensor_state > 500 && left_sensor_state < 500) 
  {
    Serial.println("turn right");
    motor1.run(FORWARD); // LP
    motor2.run(FORWARD); // LT
    motor3.run(RELEASE); // PT
    motor4.run(BACKWARD); // PP
            
    motor1.setSpeed(160);
    motor2.setSpeed(130);
    motor4.setSpeed(180);
    delay(20);
  }
            
  if (right_sensor_state < 500 && left_sensor_state > 500)
  {
    Serial.println("turn left");
    motor1.run(BACKWARD); // LP
    motor2.run(RELEASE); // LT
    motor3.run(FORWARD); // PT
    motor4.run(FORWARD); // PP
            
    motor1.setSpeed(180);
    motor4.setSpeed(160);
    motor3.setSpeed(130);
    delay(20);   
  }
              
  if (right_sensor_state < 500 && left_sensor_state < 500)
  {
    Serial.println("forward");
    motor1.run(FORWARD); // LP
    motor2.run(FORWARD); // LT
    motor3.run(FORWARD); // PT
    motor4.run(FORWARD); // PP
            
    motor1.setSpeed(110);
    motor2.setSpeed(110);
    motor3.setSpeed(110);
    motor4.setSpeed(110);
    delay(20);
  }
            
  if (right_sensor_state > 500 && left_sensor_state > 500) 
  {
    Serial.println("stop");
    motor1.setSpeed(0);
    motor2.setSpeed(0);
    motor3.setSpeed(0);
    motor4.setSpeed(0);
    delay(20);
  }
}
    
void CarStop()
{
  Serial.println("stop");
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
  delay(200);
}
    
void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
  motor1.setSpeed(130);
  motor2.setSpeed(130);
  motor3.setSpeed(130);
  motor4.setSpeed(130);  
}
    
void loop()
{
  left_sensor_state = analogRead(left_sensor_pin);
  right_sensor_state = analogRead(right_sensor_pin);
  back_left_sensor_state = analogRead(back_left_sensor_pin);
  back_right_sensor_state = analogRead(back_right_sensor_pin);

  static int wariat_na_lini = 1;  // if = 1 follow the line and go forward, if -1 go backwards
    
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    if (results.value == 0xFFFFFFFF) // if the value is equal to 0xFFFFFFFF
    {
      results.value = key_value; // set the value to the key value
    }
    switch (results.value) 
    {
      case 0xCBA816E1:
      case 0xC078:
        Serial.println("right button");
        wariat_na_lini = 1;
        break;
      case 0x43D69629:
      case 0xC0F8:
        Serial.println("left button");
        wariat_na_lini = -1;
        break;
      case 0xA6F5461D:
      case 0xC004:
        Serial.println("stop button");
        wariat_na_lini = 0;
        CarStop();
        break;
      default:
        Serial.println("different code");
        break;
    }
    key_value = results.value; // store the value as key_value
    irrecv.resume(); // reset the receiver for the next code
  }
    
  if (wariat_na_lini > 0) CarForward();
  else if (wariat_na_lini < 0) CarBackward();
}

Итак, мой вопрос заключается в следующем: почему работают только правильные двигатели, когда ИК - приемник подключен?

Это мой водитель: this is my motor driver

, 👍-1

Обсуждение

Возможно, вы захотите отредактировать свой вопрос, чтобы добавить ссылку именно на ваш щит., @timemage

отредактированный, я подумал, что это очевидно, что я хочу знать, почему он не работает с включенным датчиком? я добавил изображение этого драйвера двигателя l293d, @Wojtek Hawryluk

@wojtehawryluk, вполне возможно, что это было не нужно. С другой стороны, может быть, это отражено в ответе, который вы только что получили., @timemage


1 ответ


0

Ваша проблема, скорее всего, заключается в следующей строке:

  irrecv.blink13(true);

Это предназначено для мигания светодиода на выводе 13 при использовании ИК-пульта дистанционного управления. Однако вывод 13 также используется экраном двигателя как часть последовательного протокола для связи с управляющими чипами.

Используя это, вы вводите в заблуждение моторный щит.

Просто удалите эту линию, чтобы двигатели снова заработали.

,

не помогло, удалил это, и все равно какое-то время работал только правый мотор, затем выключился через несколько секунд, и мне пришлось снова его включать и выключать., @Wojtek Hawryluk