Проблема с управляемыми двигателями 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();
}
Итак, мой вопрос заключается в следующем: почему работают только правильные двигатели, когда ИК - приемник подключен?
Это мой водитель:
@Wojtek Hawryluk, 👍-1
Обсуждение1 ответ
Ваша проблема, скорее всего, заключается в следующей строке:
irrecv.blink13(true);
Это предназначено для мигания светодиода на выводе 13 при использовании ИК-пульта дистанционного управления. Однако вывод 13 также используется экраном двигателя как часть последовательного протокола для связи с управляющими чипами.
Используя это, вы вводите в заблуждение моторный щит.
Просто удалите эту линию, чтобы двигатели снова заработали.
не помогло, удалил это, и все равно какое-то время работал только правый мотор, затем выключился через несколько секунд, и мне пришлось снова его включать и выключать., @Wojtek Hawryluk
- Как правильно запустить 4 двигателя постоянного тока с помощью Arduino?
- Управление 2 двигателями постоянного тока с L293D и батарейным блоком 6V?
- Arduino ведет себя странно при отключении от компьютера
- 4 батареи типа АА (6 В) питают мой Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
Возможно, вы захотите отредактировать свой вопрос, чтобы добавить ссылку именно на ваш щит., @timemage
отредактированный, я подумал, что это очевидно, что я хочу знать, почему он не работает с включенным датчиком? я добавил изображение этого драйвера двигателя l293d, @Wojtek Hawryluk
@wojtehawryluk, вполне возможно, что это было не нужно. С другой стороны, может быть, это отражено в ответе, который вы только что получили., @timemage