Проблема с добавлением ИК-приемника в смарт-автомобиль.

Я делаю умную машину, используя Arduino Uno, сенсорный щит v5, управление двигателем с помощью L298N и серводвигателя + ультразвуковой датчик HC-SR04. Я хочу добавить на плату ИК-приемник, чтобы можно было управлять машиной с пульта.

Проблема в том, что когда я добавляю код для ИК-приемника и делаю 3 дополнительных подключения, правый мотор больше не реагирует, он движется только вначале, хотя и медленнее, чем левый во время первоначальной настройки, тогда только левый мотор работает правильно.

Вот весь код с комментариями рядом с кодом ИК-приемника:

#include <Servo.h>
#include <IRremote.h> //ИК-приемник
Servo servo ;
const int trigPin = 13;
const int echoPin = 12;
const int servoPin = 11;
const int enAPin = 6;
const int in1Pin = 7;
const int in2Pin = 5;
const int in3Pin = 4;
const int in4Pin = 2;
const int enBPin = 3;
const int receiverPin = 9; //ИК-приемник

IRrecv irrecv(receiverPin);  //ИК-приемник
decode_results signals; //ИК-приемник


enum Motor { LEFT, RIGHT };
void go(enum Motor m, int speed)
{
  digitalWrite (m == LEFT ? in1Pin : in3Pin , speed > 0 ? HIGH : LOW );
  digitalWrite (m == LEFT ? in2Pin : in4Pin , speed <= 0 ? HIGH : LOW );
  analogWrite(m == LEFT ? enAPin : enBPin, speed < 0 ? -speed : speed );
}



void testMotors ()
{
  static int speed[8] = { 128, 255, 128, 0 , -128, -255, -128, 0};
  go(RIGHT, 0);
  for (unsigned char i = 0 ; i < 8 ; i++)
    go(LEFT, -speed[i]), delay(200);
  
  for (unsigned char i = 0 ; i < 8 ; i++)
    go(RIGHT, speed[i]), delay(200);
}

unsigned int readDistance()
{
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  unsigned long period = pulseIn(echoPin, HIGH);
  return period * 343 / 2000;
}



#define NUM_ANGLES 7
unsigned char sensorAngle[NUM_ANGLES] = {60, 70, 80, 90, 100, 110, 120};
unsigned int distance [NUM_ANGLES];

void readNextDistance()
{
  static unsigned char angleIndex = 0;
  static signed char step = 1;
  distance[angleIndex] = readDistance();
  angleIndex += step ;
  if (angleIndex == NUM_ANGLES - 1) step = -1;
  else if (angleIndex == 0) step = 1;
  servo.write(sensorAngle[angleIndex]);
}


void setup () {
  Serial.begin(9600);  //ИК-приемник
  irrecv.enableIRIn();  //ИК-приемник

  pinMode(trigPin , OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  pinMode(enAPin, OUTPUT);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);
  pinMode(enBPin, OUTPUT);
  servo.attach(servoPin);
  servo.write(90);
  go(LEFT, 0);
  go(RIGHT, 0);
  testMotors();
  servo.write(sensorAngle[0]);
  delay(200);
  for (unsigned char i = 0 ; i < NUM_ANGLES ; i ++)
    readNextDistance(), delay (200);
}



void loop () {

 //ИК-приемник:
  if (irrecv.decode(&signals)) {
        Serial.println(signals.value);
        irrecv.resume();
        if (signals.value == 0xFFA25D) {
          Serial.println("yeees");
        }
  }


  readNextDistance ();
  
  unsigned char tooClose = 0;
  for (unsigned char i = 0 ; i < NUM_ANGLES ; i++)
    if (distance[i] < 200)
      tooClose = 1;
  
  if (tooClose) {
    go(LEFT, 180);
    go(RIGHT, -80);
  } else {
    go(LEFT, -180);
    go(RIGHT, 180);
  }
  delay (50);
}

, 👍1

Обсуждение

Вы хотите сказать, что код, который работает правильно, отличается *только* тем, что в нем отсутствуют строки, закомментированные //IR Receiver? Может быть, вам также следует опубликовать рабочий код (в который не входит код ИК-приемника), чтобы мы могли сами сравнить две версии?, @Greenonline

@Greenonline Да, именно. Если вы удалите несколько строк, закомментированных //IR Receiver, вы получите рабочий код., @AugustinS

Похоже, двигатели конфликтуют с библиотекой IRremote из-за того, что оба используют одни и те же таймеры. Нужно найти другую библиотеку или найти способ заставить ее использовать другой таймер., @AugustinS

Пожалуйста, опубликуйте это как ответ, @Greenonline


1 ответ


Лучший ответ:

1

Наконец-то нашел проблему: она связана с тем, что библиотека IRremote использует те же таймеры, что и Servo.

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

Ссылка на сообщение на форуме Arduino, предлагающее альтернативу управления Сервопривод без библиотеки

,