Проблема с добавлением ИК-приемника в смарт-автомобиль.
Я делаю умную машину, используя 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);
}
@AugustinS, 👍1
Обсуждение1 ответ
Лучший ответ:
Наконец-то нашел проблему: она связана с тем, что библиотека IRremote использует те же таймеры, что и Servo.
Решение состоит в том, чтобы изменить указанный таймер, который библиотека IRremote использует в файлах библиотеки (хотя у меня это не сработало) или не использовать библиотеку ни для ИК-приемника, ни для сервопривода или изменить физическое соединение компонента, подключенного к контакту, также используемому таймером.
Ссылка на сообщение на форуме Arduino, предлагающее альтернативу управления Сервопривод без библиотеки
- Использование VS1838B с Arduino
- Tone() конфликтует с библиотекой IRremote (множественное определение `__vector_7')
- Как остановить вращение сервопривода?
- Arduino IRremote перестает работать
- Использование ИК-пульта с Arduino
- ИК приемник принимает только 0
- Использование драйвера L298N вместе с серводвигателями на одном Arduino
- Переключение между циклами Arduino ИК-пульт дистанционного управления
Вы хотите сказать, что код, который работает правильно, отличается *только* тем, что в нем отсутствуют строки, закомментированные
//IR Receiver
? Может быть, вам также следует опубликовать рабочий код (в который не входит код ИК-приемника), чтобы мы могли сами сравнить две версии?, @Greenonline@Greenonline Да, именно. Если вы удалите несколько строк, закомментированных
//IR Receiver
, вы получите рабочий код., @AugustinSПохоже, двигатели конфликтуют с библиотекой IRremote из-за того, что оба используют одни и те же таймеры. Нужно найти другую библиотеку или найти способ заставить ее использовать другой таймер., @AugustinS
Пожалуйста, опубликуйте это как ответ, @Greenonline