Управление ИК мотор шилдом L293D на 4 двигателя

torresok
Offline
Зарегистрирован: 18.07.2015

Мужики, выручайте! Имеется моторшилд на 4 двигателя на L293D. Есть скетч для управления всем этим делом, но с ним что-то не так. При заливке скетча работает корректно только одна кнопка, остальные только выводятся в монитор порта. Если вместо операторов else вставляю delay, то все работает. Помогите, пожалуйста, разобраться. (требуется, чтобы при нажатии кнопки двигатель крутился, при повторном нажатии останавливался).

#include <AFMotor.h>

#include <IRremote.h>



int RECV_PIN = 14;



AF_DCMotor motor_a(1, MOTOR12_64KHZ);

AF_DCMotor motor_b(2, MOTOR12_64KHZ);

AF_DCMotor motor_c(3, MOTOR12_64KHZ);

AF_DCMotor motor_d(4, MOTOR12_64KHZ);



IRrecv irrecv(RECV_PIN);





decode_results results;



void setup()

{

Serial.begin(9600);

irrecv.enableIRIn();

motor_a.setSpeed(255);

motor_b.setSpeed(255);

motor_c.setSpeed(255);

motor_d.setSpeed(255);

// motor_a.run(RELEASE);

// motor_b.run(RELEASE);

// motor_c.run(RELEASE);

// motor_d.run(RELEASE);

}

void loop()

{

if (irrecv.decode(&results))

{



Serial.println(results.value);

Serial.println(results.value,HEX);

Serial.println("====");



if (results.value == 16771605) //мотор(а) вперед

{

Serial.println("vverhlev");

motor_a.run(FORWARD);

}

else

{

motor_a.run(RELEASE);

}

if (results.value == 16755285) //мотор(б) вперед

{



Serial.println("sgiblev");

motor_b.run(FORWARD);

}

else

{

motor_b.run(RELEASE);

}

if (results.value == 16767525)//мотор(с) вперед

{

Serial.println("vverhprav");

motor_c.run(FORWARD);

}

else

{

motor_c.run(RELEASE);

}

if (results.value == 16751205)//мотор(д) вперед

{

Serial.println("sgibprav");

motor_d.run(FORWARD);

}

else

{

motor_d.run(RELEASE);

}



if (results.value == 16738965) //мотор(а) назад

{

Serial.println("vnizlev");

motor_a.run(BACKWARD);

}

else

{

motor_a.run(RELEASE);

}

if (results.value == 16722645) //мотор(б) назад

{

Serial.println("razgiblev");

motor_b.run(BACKWARD);

}

else

{

motor_b.run(RELEASE);

}

if (results.value == 16734885) //мотор(с) назад

{

Serial.println("vnizprav");

motor_c.run(BACKWARD);

}

else

{

motor_c.run(RELEASE);

}

if (results.value == 16718565)

{

Serial.println("razgibprav");//мотор(д) назад

motor_d.run(BACKWARD);

}

else

{

motor_d.run(RELEASE);

}



irrecv.resume();

}

}

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

Код в комментарий нужно вставлять с помощью кнопки "Вставка-редактирование кода", а так он совсем нечитаем. :(

Есть похожий вариант: http://blockduino.blogspot.ca/2014/08/ir-rider-w-any-irremote.html

torresok
Offline
Зарегистрирован: 18.07.2015
Прошу прощения. Вот так? 

#include <AFMotor.h>

#include <IRremote.h>



int RECV_PIN = 14;



AF_DCMotor motor_a(1, MOTOR12_64KHZ);

AF_DCMotor motor_b(2, MOTOR12_64KHZ);

AF_DCMotor motor_c(3, MOTOR12_64KHZ);

AF_DCMotor motor_d(4, MOTOR12_64KHZ);



IRrecv irrecv(RECV_PIN);





decode_results results;



void setup()

{

Serial.begin(9600);

irrecv.enableIRIn();

motor_a.setSpeed(255);

motor_b.setSpeed(255);

motor_c.setSpeed(255);

motor_d.setSpeed(255);

// motor_a.run(RELEASE);

// motor_b.run(RELEASE);

// motor_c.run(RELEASE);

// motor_d.run(RELEASE);

}

void loop()

{

if (irrecv.decode(&results))

{



Serial.println(results.value);

Serial.println(results.value,HEX);

Serial.println("====");



if (results.value == 16771605) //мотор(а) вперед

{

Serial.println("vverhlev");

motor_a.run(FORWARD);

}

else

{

motor_a.run(RELEASE);

}

if (results.value == 16755285) //мотор(б) вперед

{



Serial.println("sgiblev");

motor_b.run(FORWARD);

}

else

{

motor_b.run(RELEASE);

}

if (results.value == 16767525)//мотор(с) вперед

{

Serial.println("vverhprav");

motor_c.run(FORWARD);

}

else

{

motor_c.run(RELEASE);

}

if (results.value == 16751205)//мотор(д) вперед

{

Serial.println("sgibprav");

motor_d.run(FORWARD);

}

else

{

motor_d.run(RELEASE);

}



if (results.value == 16738965) //мотор(а) назад

{

Serial.println("vnizlev");

motor_a.run(BACKWARD);

}

else

{

motor_a.run(RELEASE);

}

if (results.value == 16722645) //мотор(б) назад

{

Serial.println("razgiblev");

motor_b.run(BACKWARD);

}

else

{

motor_b.run(RELEASE);

}

if (results.value == 16734885) //мотор(с) назад

{

Serial.println("vnizprav");

motor_c.run(BACKWARD);

}

else

{

motor_c.run(RELEASE);

}

if (results.value == 16718565)

{

Serial.println("razgibprav");//мотор(д) назад

motor_d.run(BACKWARD);

}

else

{

motor_d.run(RELEASE);

}



irrecv.resume();

}

}
BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

Опять не очень...

Может лучше отформатировать примерно так?

#include <AFMotor.h>
#include <IRremote.h>
int RECV_PIN = 14;
AF_DCMotor motor_a(1, MOTOR12_64KHZ);
AF_DCMotor motor_b(2, MOTOR12_64KHZ);
AF_DCMotor motor_c(3, MOTOR12_64KHZ);
AF_DCMotor motor_d(4, MOTOR12_64KHZ);

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
	Serial.begin(9600);
	irrecv.enableIRIn();
	motor_a.setSpeed(255);
	motor_b.setSpeed(255);
	motor_c.setSpeed(255);
	motor_d.setSpeed(255);
// motor_a.run(RELEASE);
// motor_b.run(RELEASE);
// motor_c.run(RELEASE);
// motor_d.run(RELEASE);
}

void loop()
{
	if (irrecv.decode(&results))
	{
		Serial.println(results.value);
		Serial.println(results.value,HEX);
		Serial.println("====");
		if (results.value == 16771605) //мотор(а) вперед
		{
			Serial.println("vverhlev");
			motor_a.run(FORWARD);
		}
		else
		{
			motor_a.run(RELEASE);
		}
	
		if (results.value == 16755285) //мотор(б) вперед
		{
			Serial.println("sgiblev");
			motor_b.run(FORWARD);
		}
		else
		{
			motor_b.run(RELEASE);
		}
	
		if (results.value == 16767525)//мотор(с) вперед
		{
			Serial.println("vverhprav");
			motor_c.run(FORWARD);
		}
		else
		{
			motor_c.run(RELEASE);
		}
	
		if (results.value == 16751205)//мотор(д) вперед
		{
			Serial.println("sgibprav");
			motor_d.run(FORWARD);
		}
		else
		{
			motor_d.run(RELEASE);
		}
	
		if (results.value == 16738965) //мотор(а) назад
		{
			Serial.println("vnizlev");
			motor_a.run(BACKWARD);
		}
		else
		{
			motor_a.run(RELEASE);
		}
	
		if (results.value == 16722645) //мотор(б) назад
		{
			Serial.println("razgiblev");
			motor_b.run(BACKWARD);
		}
		else
		{
			motor_b.run(RELEASE);
		}
		if (results.value == 16734885) //мотор(с) назад
		{
			Serial.println("vnizprav");
			motor_c.run(BACKWARD);
		}
		else
		{
			motor_c.run(RELEASE);
		}
	
		if (results.value == 16718565)
		{
			Serial.println("razgibprav");//мотор(д) назад
			motor_d.run(BACKWARD);
		}
		else
		{
			motor_d.run(RELEASE);
		}
		
		irrecv.resume();
	}
}

 

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

Так становится видно, что 112я строка

irrecv.resume();

выполняется только если выполняется условие

if (irrecv.decode(&results))

Вынеси эту функцию за скобки условия, по-моему она должна выполняться всегда, это функция считывания IR. Т.е. поменяй местами 112ю и 113ю строки.