Mi proyecto consta de 3 modulos:
El transmisor (Funciona perfectamente)
El Receptor (Funciona perfecto aparentemente)
En Motor Driver (el que me esta dando problemas)
Los tres módulos los hice yo mismo, no son prefabricados pero tanto el receptor como el transmisor funcionan perfectamente, el receptor tiene Led's en cada salida de datos para monitorearlas y no aparenta haber ningún problema hasta ese punto.
El problema en concreto es que de pronto los motores que quedan "pegados" con la ultima orden recibida, por ejemplo si le ordeno "1000" (Adelante) a veces aunque suelte el pulsador y por ende se transmita y reciba "0000" se queda avanzando hacia adelante hasta que lo reseteo o lo apago y lo vuelvo a encender.
también ocurre que esta funcionando todo perfecto y de pronto envío dos ordenes a la vez, por ejemplo: "1010" (Adelante + Izquierda), y, primero, no las obedece, y segundo ocurre que se queda con la orden anterior pegado.
Este comportamiento me hace pensar que probablemente sea un problema en mi código, lo adjuntare como referencia.
Uso un Arduino Nano y 2 L293D para controlar los motores, a continuación el código y el circuito:
Codigo:
int ade = 12;
int atr = 11;
int der = 10;
int izq = 9;
int mtr01 = 8;
int mtr02 = 7;
int velder = 6;
int velizq = 5;
int valade = 0;
int valatr = 0;
int valder = 0;
int valizq = 0;
int vel1 = 0;
int vel2 = 0;
void setup() {
pinMode(ade, INPUT);
pinMode(atr, INPUT);
pinMode(der, INPUT);
pinMode(izq, INPUT);
pinMode(mtr01, OUTPUT);
pinMode(mtr02, OUTPUT);
}
void loop() {
valade = digitalRead(ade);
valatr = digitalRead(atr);
valder = digitalRead(der);
valizq = digitalRead(izq);
if (valade == HIGH)
{
if (valatr == LOW){
adelante();
}
else{
detener();
}
}
else if (valatr == HIGH)
{
if (valade == LOW){
atras();
}
else{
detener();
}
}
else{
detener();
}
}
void adelante() {
if (valder == HIGH)
{
if (valizq == LOW){
vel1 = 100;
vel2 = 250;
digitalWrite(mtr01, HIGH);
digitalWrite(mtr02, LOW);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
else if (valizq == HIGH)
{
if (valder == LOW){
vel1 = 250;
vel2 = 100;
digitalWrite(mtr01, HIGH);
digitalWrite(mtr02, LOW);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
else{
vel1 = 150;
vel2 = 150;
digitalWrite(mtr01, HIGH);
digitalWrite(mtr02, LOW);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
void atras() {
if (valder == HIGH)
{
if (valizq == LOW){
vel1 = 100;
vel2 = 250;
digitalWrite(mtr01, LOW);
digitalWrite(mtr02, HIGH);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
else if (valizq == HIGH)
{
if (valder == LOW){
vel1 = 250;
vel2 = 100;
digitalWrite(mtr01, LOW);
digitalWrite(mtr02, HIGH);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
else {
vel1 = 150;
vel2 = 150;
digitalWrite(mtr01, LOW);
digitalWrite(mtr02, HIGH);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
void detener () {
if (valder == HIGH)
{
if (valizq == LOW){
digitalWrite(mtr01, HIGH);
digitalWrite(mtr02, LOW);
vel1 = 50;
vel2 = 250;
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
else if (valizq == HIGH)
{
if (valder == LOW){
digitalWrite(mtr01, HIGH);
digitalWrite(mtr02, LOW);
vel1 = 250;
vel2 = 50;
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
else{
vel1 = 0;
vel2 = 0;
digitalWrite(mtr01, LOW);
digitalWrite(mtr02, LOW);
analogWrite(velder, vel1);
analogWrite(velizq, vel2);
}
}
Circuito:
De antemano muchas gracias.