control de motores para robot limpiafondos de piscina

Se rompió el modulo de control de mi robot, pero los motores estaban bien por lo que le he fabricado un control con un arduino nano y usando un modulo L298.

Básicamente es una fuente de alimentación de 28V que alimenta un motor que hace la aspiración y otro motor que tracciona las orugas de desplazamiento .

Necesito que el motor de aspiracion haga ciclos de 1 minuto (aprox) al tiempo que el motor de traccion avance ese minuto en una direccion , y el siguiente minuto en la otra
entre ciclo y ciclo se tienen que detener ambos por unos 6 segundos para que el robot caiga desde la superficie (linea del agua ) donde siempre acaba el ciclo y de forma aleatoria vuelva al fondo para otro ciclo.

El programa esta hecho y va francamente bien , pero no se como terminar el loop al cabo de 90 minutos.

me gustaría que después de estar encadenando 40 - 45 ciclos aproximadamente se pare de forma definitiva, para no tener que está pendiente de apagarlo . He probado con un delay largo al final , pero no se porque no me funciona.

Alguien podría ayudarme soy supernovato en programación , y por mas que leo no acabo de encontrar la manera optima .

Por otro lado si a alguien le resulta util la reparación del robot puedo compartir imágenes y circuitos ,
etc.

/* 
Ejemplo de control de 2 motores DC usando modulo L298

*/

int IN3 = 3;    // motor traccion
int IN4 = 4;    // motor traccion
int ENA = 5;    // PWM motor traccion
int IN6 = 6;    // motor aspiracion
int IN7 = 7;    // motor aspiracion

int VELOCIDAD;  // variable para control PWM
int RUN;        // TIEMPO DE CADA CICLO
int STOP;       // INTERVALO ENTE CICLOS
int DECALAJE;   // ESPERA ENTRE MOTOR ASPIRACION Y MOTOR TRACCION



#define RUN 60000      //  1 minuto
#define STOP 10000     // 10 segundos
#define DECALAJE 2000  //  2 segundos


void setup()
{
 pinMode (IN3, OUTPUT);    // Input3 conectada al pin 3 
 pinMode (IN4, OUTPUT);    // Input4 conectada al pin 5
 pinMode (ENA, OUTPUT);    
 pinMode (IN6, OUTPUT);    
 pinMode (IN7, OUTPUT);

}

void loop(){
 digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
 delay(DECALAJE);                                       // espera hasta incio motor traccion
 for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){   // arranque suave motor traccion
 analogWrite (ENA, VELOCIDAD);
 digitalWrite (IN3, LOW);                               // MOTOR TRACCION low high marcha adelante
 digitalWrite (IN4, HIGH);
 delay(10);                                             // tiempo para incrementos PWM
 }
 delay(RUN);                                            // duracion ciclo 1
 
 digitalWrite (IN3, LOW);                               //paran ambos motores
 digitalWrite (IN6, LOW); 
 analogWrite (ENA, LOW);
 delay(STOP);  

 digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
 delay(DECALAJE);                                       // espera hasta incio motor traccion
 for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){
 analogWrite (ENA, VELOCIDAD);
 digitalWrite (IN3, HIGH);                              // MOTOR TRACCION high low marcha atras
 digitalWrite (IN4, LOW);
 delay(10);  
 }
 delay(RUN); 
  
 digitalWrite (ENA, LOW);
 digitalWrite (IN6, LOW); 
 analogWrite (ENA, LOW);
 delay(STOP);
}
1 Like

Agregas un contador, lo pones a 0 y cuando llega a 40 o 45 lo pones a hacer nada o sea un while(1); que es nada

Acá tu modificación completa

#include <Arduino.h>
/* Ejemplo de control de 2 motores DC usando modulo L298 */

int IN3 = 3;    // motor traccion
int IN4 = 4;    // motor traccion
int ENA = 5;    // PWM motor traccion
int IN6 = 6;    // motor aspiracion
int IN7 = 7;    // motor aspiracion

int VELOCIDAD;  // variable para control PWM
int RUN;        // TIEMPO DE CADA CICLO
int STOP;       // INTERVALO ENTE CICLOS
int DECALAJE;   // ESPERA ENTRE MOTOR ASPIRACION Y MOTOR TRACCION

#define RUN     60000      //  1 minuto
#define STOP    10000     // 10 segundos
#define DECALAJE 2000  //  2 segundos
int contador = 0;

void setup() {
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 3
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 5
  pinMode (ENA, OUTPUT);    
  pinMode (IN6, OUTPUT);    
  pinMode (IN7, OUTPUT);
}

void loop(){
  if (contador++ > 45 ) {
      while(1); // me quedo aca por siempre.
  }
  digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
  delay(DECALAJE);                                       // espera hasta incio motor traccion
  for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){   // arranque suave motor traccion
      analogWrite (ENA, VELOCIDAD);
      digitalWrite (IN3, LOW);                               // MOTOR TRACCION low high marcha adelante
      digitalWrite (IN4, HIGH);
      delay(10);                                             // tiempo para incrementos PWM
  }
  delay(RUN);                                            // duracion ciclo 1
 
  digitalWrite (IN3, LOW);                               //paran ambos motores
  digitalWrite (IN6, LOW);
  analogWrite (ENA, LOW);
  delay(STOP);  

  digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
  delay(DECALAJE);                                       // espera hasta incio motor traccion
  for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){
      analogWrite (ENA, VELOCIDAD);
      digitalWrite (IN3, HIGH);                              // MOTOR TRACCION high low marcha atras
      digitalWrite (IN4, LOW);
      delay(10);  
  }
  delay(RUN);
 
  digitalWrite (ENA, LOW);
  digitalWrite (IN6, LOW);
  analogWrite (ENA, LOW);
  delay(STOP);
  }
  
}#include <Arduino.h>
/* Ejemplo de control de 2 motores DC usando modulo L298 */

int IN3 = 3;    // motor traccion
int IN4 = 4;    // motor traccion
int ENA = 5;    // PWM motor traccion
int IN6 = 6;    // motor aspiracion
int IN7 = 7;    // motor aspiracion

int VELOCIDAD;  // variable para control PWM
int RUN;        // TIEMPO DE CADA CICLO
int STOP;       // INTERVALO ENTE CICLOS
int DECALAJE;   // ESPERA ENTRE MOTOR ASPIRACION Y MOTOR TRACCION

#define RUN     60000      //  1 minuto
#define STOP    10000     // 10 segundos
#define DECALAJE 2000  //  2 segundos
int contador = 0;

void setup() {
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 3
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 5
  pinMode (ENA, OUTPUT);    
  pinMode (IN6, OUTPUT);    
  pinMode (IN7, OUTPUT);
}

void loop(){
  if (contador++ > 45 ) {
      while(1); // me quedo aca por siempre.
  }
  digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
  delay(DECALAJE);                                       // espera hasta incio motor traccion
  for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){   // arranque suave motor traccion
      analogWrite (ENA, VELOCIDAD);
      digitalWrite (IN3, LOW);                               // MOTOR TRACCION low high marcha adelante
      digitalWrite (IN4, HIGH);
      delay(10);                                             // tiempo para incrementos PWM
  }
  delay(RUN);                                            // duracion ciclo 1
 
  digitalWrite (IN3, LOW);                               //paran ambos motores
  digitalWrite (IN6, LOW);
  analogWrite (ENA, LOW);
  delay(STOP);  

  digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
  delay(DECALAJE);                                       // espera hasta incio motor traccion
  for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){
      analogWrite (ENA, VELOCIDAD);
      digitalWrite (IN3, HIGH);                              // MOTOR TRACCION high low marcha atras
      digitalWrite (IN4, LOW);
      delay(10);  
  }
  delay(RUN);
 
  digitalWrite (ENA, LOW);
  digitalWrite (IN6, LOW);
  analogWrite (ENA, LOW);
  delay(STOP);
  }
  
}

Mil gracias. El que no sabe es como el que no ve. Mañana lo pruebo.
Si que es una forma elegante de resolverlo. Me estaba volviendo loco con If y también milis. Y mira tu. Jeje

Hola, ya que te ofreces me interesaría los diagramas y esquemas que has usado. Me los pasas? por aquí va a ser complicado, no se ajusta al tema. A lo mejor lo podríamos hacer por correo privado.

He puesto este correo en abierto por si a alguien mas le interesa, pero a partir de ahora mejor por privado, no?

Gracias !

--
Albert F.

Lo preparo y lo subo a La sección hardware en unos días

@albertf1970 como conectar un L298 a un Arduino solo debes buscar en google Arduino L298 schematic (click en imágenes) y tienes cientos de esquemas, tal vez no cientos pero si muchos.

De todos modos eso no quita que te pase sus esquemas, pero no se limiten jamás a lo que leen.
Aprendan a buscar del modo mas simple que es usando el buscador.

lo lamento pero seguro que se me ha escapado algún detalle, el caso es que el bucle no se interrumpe , he puesto 3 vueltas para poderlo verificar antes ( cuanto lo tenga pondré los intervalos mas largos y 45 ciclos)

lo cierto es que no entiendo el significado de la sentencia while(1);

#include <Arduino.h>
/* Ejemplo de control de 2 motores DC usando modulo L298 */

int IN3 = 3;    // motor traccion
int IN4 = 4;    // motor traccion
int ENA = 5;    // PWM motor traccion
int IN6 = 6;    // motor aspiracion
int IN7 = 7;    // motor aspiracion

int VELOCIDAD;  // variable para control PWM
int RUN;        // TIEMPO DE CADA CICLO
int STOP;       // INTERVALO ENTE CICLOS
int DECALAJE;   // ESPERA ENTRE MOTOR ASPIRACION Y MOTOR TRACCION

#define RUN     6000      //  6 segundos
#define STOP    1000     // 1 segundos
#define DECALAJE 200  //  2 milisegundos
int contador = 0;

void setup() {
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 3
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 5
  pinMode (ENA, OUTPUT);   
  pinMode (IN6, OUTPUT);   
  pinMode (IN7, OUTPUT);
}

void loop(){
  if (contador++ > 3 ) {
      while(1); // me quedo aca por siempre.
  }
  digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
  delay(DECALAJE);                                       // espera hasta incio motor traccion
  for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){   // arranque suave motor traccion
      analogWrite (ENA, VELOCIDAD);
      digitalWrite (IN3, LOW);                               // MOTOR TRACCION low high marcha adelante
      digitalWrite (IN4, HIGH);
      delay(10);                                             // tiempo para incrementos PWM
  }
  delay(RUN);                                            // duracion ciclo 1
 
  digitalWrite (IN3, LOW);                               //paran ambos motores
  digitalWrite (IN6, LOW);
  analogWrite (ENA, LOW);
  delay(STOP); 

  digitalWrite (IN6, HIGH);                              // arranca motor aspiracion
  delay(DECALAJE);                                       // espera hasta incio motor traccion
  for (VELOCIDAD = 100; VELOCIDAD < 256; VELOCIDAD++){
      analogWrite (ENA, VELOCIDAD);
      digitalWrite (IN3, HIGH);                              // MOTOR TRACCION high low marcha atras
      digitalWrite (IN4, LOW);
      delay(10); 
  }
  delay(RUN);
 
  digitalWrite (ENA, LOW);
  digitalWrite (IN6, LOW);
  analogWrite (ENA, LOW);
  delay(STOP);
  }

Gracias de antemano

while(1) se va a quedar ahí pro siempre como te escribí.

me gustaría que después de estar encadenando 40 - 45 ciclos aproximadamente se pare de forma definitiva, para no tener que está pendiente de apagarlo .

agrega algo que lo pare y luego no haga nada.

Con while(1) no se para pero no hace nada. Para detener el motor indica que se detenga. y luego el while(1).
Si quieres que con alguna acción vuelva a ponerse en marcha sales del while(1) con algo y repites.
Por ahora solo respondi a lo que pediste.

Gracias Surbyte, aunque te puedo asegurar que ayer estuve trasteando hasta las tantas y que hoy no he parado de probar cosas. sigo sin conseguir que una vez realizado un numero de ciclos, la ejecución del bucle se pare hasta que la placa arduino nano sea reiniciada , o se le corte la alimentación y vuelva a alimentarse.

He modificado un poco el código generando tres funciones por lo que el bucle es mucho mas simples

También he visto que los delays largos ( otra opción que manejaba para, si no paralo , poner el arduino durante una rato largo (30 minutos ) contando milisegundos), pero no realiza esas interrupciones , a los pocos segundos se reinicia el bucle. Ignoro también la causa pero eso es secundario al menos de momento.

En fin copio el código actual por ver si tienes a bien poderme indicar donde puede estar el error o incluso , corregir el skeck si tienes a bien.

estoy haciendo las pruebas con unos led pues los motores me estaban volviendo loco con el ruido

Gracias de antemano

#include <Arduino.h>
/* Ejemplo de control de 2 motores DC usando modulo L298 */

int IN3 = 3;    // motor traccion variable en funcion T1
int IN4 = 4;    // motor traccion variable en funcion T2
int ENA = 5;    // PWM motor traccion variable en funcion T3
int IN6 = 6;    // motor aspiracion variable en funcion A1
int IN7 = 7;    // motor aspiracion variable en funcion A2

int VELOCIDAD;  // variable para control PWM
int RUN;        // TIEMPO DE CADA CICLO
int STOP;       // INTERVALO ENTE CICLOS
int DECALAJE;   // ESPERA ENTRE MOTOR ASPIRACION Y MOTOR TRACCION
int INIRAMP;    // INICIO RAMPA PWM  

#define RUN 5000      //  5 segundos
#define STOP 2000     //  2 segundos
#define DECALAJE 500  //  1/2 segundo
#define INIRAMP 100    //  inicio valor rampa pwm

int contador = 0;

void setup()
{
  pinMode (IN3, OUTPUT);    // Input3 conectada al pin 3 
  pinMode (IN4, OUTPUT);    // Input4 conectada al pin 4
  pinMode (ENA, OUTPUT);    // Input5 conectada al pin 5 
  pinMode (IN6, OUTPUT);    // Input6 conectada al pin 6 
  pinMode (IN7, OUTPUT);    // Input7 conectada al pin 7 
}

void cicloavance(int T1, int T2, int T3, int A1,int A2, int ms){
   digitalWrite (IN6, A2);                                    // arranca motor aspiracion
   delay(DECALAJE);                                           // espera hasta incio motor traccion
   for (VELOCIDAD = INIRAMP; VELOCIDAD < 256; VELOCIDAD++){   // arranque suave motor traccion
   analogWrite (ENA, VELOCIDAD);
   digitalWrite (IN3, T1);                                    // MOTOR TRACCION low high marcha adelante high low marcha atras
   digitalWrite (IN4, T2);
   delay(10); }                                               // tiempo para incrementos PWM
   delay(ms);                                                 // duracion del despalzamiento   
}

void cicloparo(int T1, int T2, int T3, int A1,int A2, int ms){ // detencion motores ente desplazamientos 
   digitalWrite (IN3, T2);
   digitalWrite (IN6, A1); 
   analogWrite  (ENA, T3);
   delay(ms);    
}

void detencion(int T1, int T2, int T3, int A1,int A2, int ms){  // parada final
   digitalWrite (IN3, T2);
   digitalWrite (IN6, A1); 
   analogWrite  (ENA, T3);
   delay(ms);    
}

void loop(){
  if (contador++ > 2 ) {
     detencion(LOW, LOW, 0, LOW, LOW, 15000);// me quedo aca por siempre.
      while(1);        
      }
  cicloavance(LOW, HIGH, 0, LOW, HIGH, RUN);  // AVANCE
  cicloparo(LOW, LOW, 0, LOW, LOW, STOP);     // PARADA
  cicloavance(HIGH, LOW, 0, LOW, HIGH, RUN);  // RETROCESO 
  cicloparo(LOW, LOW, 0, LOW, LOW, STOP);     // PARADA
    
}

Tu problema es que no incrementas la variable contador en ningun sitio.Cuando acabas un ciclo ,deberias incrementar el valor de contador en 1.

entendia que contador++ ya incrementaba la variable

void loop(){
  if (contador++ > 2 ) {

Cierto,se me paso al ir dentro del condicional.Antes de seguir viendo que pasa ,cambia el nombre de las variables o eliminalas si no las usas,que son iguales que en los #define ,para evitar fallos:

int RUN;        // TIEMPO DE CADA CICLO
int STOP;       // INTERVALO ENTE CICLOS
int DECALAJE;   // ESPERA ENTRE MOTOR ASPIRACION Y MOTOR TRACCION
int INIRAMP;    // INICIO RAMPA PWM 

#define RUN 5000      //  5 segundos
#define STOP 2000     //  2 segundos
#define DECALAJE 500  //  1/2 segundo
#define INIRAMP 100    //  inicio valor rampa pwm

Tambien tendrias que cambiar los parametros A1 y A2 para evitar confusiones con las constantes definidas en el core para nombrar las salidas analogicas:

void cicloavance(int T1, int T2, int T3, int A1,int A2, int ms)