Arduino Nano se Congela

Hola a todos!

Alguien que me ayude a saber por que mi arduino nano se congela

Controla un motor dc con dos sensores. Cuando uno deja de sensar, el motor gira en sentido horario, y al contrario con el segundo sensor.
Tiene un modo manual, para que se accione con botones también. Se activa con un botón y subiendo un contador al presionarlo para cambiar de subrutina. El modo en el que se encuentra trabajando (manual o auto) se proyecta en una pantalla oled. De igual forma les dejo el código.

Para manejar el motor uso un Monster motor shield VNH2SP30 por que el amperaje es un poco alto para un L298 (como 3a en pico). Lo alimento todo con una fuente de 12v 10a (sensores, arduino, motor, etc). El problema es que trabaja muy bien hasta que llega un punto donde el arduino se congela de la nada y ya no hace nada, se tiene que reiniciar.

Antes el proceso era solo con un sensor y cada que se activaba el modo automático se movía hasta lograr una posición y se paraba cambiándolo de modo. Ahora por esto, cambié a dos sensores y me ha gustado más pero sigue ese problema. Incluso, le coloqué una fuente independiente por si fuera caída de tensión por los picos que genera el motor al moverse y nada. También cambié el arduino por otro nano para ver si era eso y lo mismo, en determinado momento se congela.

Tengo un mecanismo idéntico a lado, incluso compartiendo fuente de poder, y va de maravilla. La única diferencia es que aquí sí uso un L298 por que el motor es pequeño.

No había pasado esto hasta que cambiaron el dispositivo de habitación. Aquí la toma de corriente (110v), me marca continuidad entre el neutro y la tierra fisca, no sé si tenga algo que ver, y espero que no, porqué no creo que sea posible se pararlos, ya que creo que viene desde la toma principal.

Como nota, recablee por que estaba todo desordenado, las fuentes antes estaban aterrizadas y ahora no, pero sigue existiendo el problema.

Espero que alguien me pueda ayudar. De antemano, gracias.

Saludos!!

Código:

#include<Wire.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>

#define ANCHO 128
#define ALTO 64

#define OLED_RESET 4
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);


int der = 12;
int izq = 11;
int centrar = 10;
int modo = 9;
int sender = 5;
int senizq = 4;
int sencen =3;
int sentido = 6;
int velocidad = 7;
int conta = 0;
int v=0;

void setup() {


Wire.begin();
oled.begin(SSD1306_SWITCHCAPVCC,0x3C);
  
pinMode(der, INPUT_PULLUP);
pinMode(izq, INPUT_PULLUP);
pinMode(centrar, INPUT_PULLUP);
pinMode(modo, INPUT_PULLUP);
pinMode(sencen, INPUT_PULLUP);
pinMode(sender, INPUT_PULLUP);
pinMode(senizq, INPUT_PULLUP);
pinMode(sentido, OUTPUT);
pinMode(velocidad, OUTPUT);

oled.clearDisplay();

}

void loop(){
 

oled.setTextColor(WHITE);
oled.setCursor(10,0);
oled.setTextSize(1);
oled.print("Guia de banda WGL-2");
oled.setCursor(42,17);
oled.setTextSize(2);
oled.print("MODO");
oled.display();

  
if (digitalRead (modo) == LOW){
  conta++;
  oled.clearDisplay();
  delay(200);

}
//digitalWrite(10, LOW);

if (conta==0){
  manual();

}
if (conta==1){
  autom();
}
if(conta>1){
  conta=0;
}
delay(10);

}


void manual(){

oled.setCursor(10,0);
oled.setTextSize(1);
oled.print("Guia de banda WGL-2");
oled.setCursor(42,17);
oled.setTextSize(2);
oled.print("MODO");
oled.display();
oled.setCursor(34,38);
oled.setTextSize(2);
oled.print("MANUAL");
oled.display();
delay(10);
  
  while(digitalRead (der) == LOW){
        digitalWrite(velocidad, HIGH);
   digitalWrite(sentido, LOW);
   //delay(1);
      //oled.setCursor(10,0);
 }

  
  while(digitalRead (izq) == LOW){

     digitalWrite(velocidad, LOW);
   digitalWrite(sentido, HIGH);
   //delay(10);
      //oled.setCursor(10,0);
      }


 digitalWrite(velocidad, LOW);
 digitalWrite(sentido, LOW);
 
 //delay(10);
} 

void autom(){

oled.setCursor(10,0);
oled.setTextSize(1);
oled.print("Guia de banda WGL-2");
oled.setCursor(42,17);
oled.setTextSize(2);
oled.print("MODO");
oled.display();
oled.setCursor(28,38);
oled.setTextSize(2);
oled.print("AUTOMAT");
oled.display();
delay(10);

  
    while(digitalRead (sender) == HIGH && digitalRead (modo)== HIGH){
      
       digitalWrite(velocidad, HIGH);
   digitalWrite(sentido, LOW);
   //delay(10);
      //oled.setCursor(10,0);
      
  }
      
    
    
  while(digitalRead (senizq) == HIGH && digitalRead(modo) == HIGH){
     digitalWrite(velocidad, LOW);
   digitalWrite(sentido, HIGH);
   //delay(10);
      //oled.setCursor(10,0); 
  }

     digitalWrite(velocidad, LOW);
   digitalWrite(sentido, LOW);
 
      //oled.setCursor(10,0);
    }

Hi,
Un consejo es de que pongas un print el los while ya que si no cumples la condicion se va a quedar en el loop. Asi sabras si es que se estan quedando en uno de los while. Otra cosa cuando esto suceda lee el volatajes que alimenta el motor.

Hola @tauro0221
No entendí lo del voltaje del motor

El código no me gusta del todo pero no esta mal.
Lo único que puede estar fallando es el mismo OLED.
Quita todo lo que sea OLED y suplántalo por comandos que envien al monitor Serie y que te informen lo mismo, basicamaente manual o automático. Eso es todo lo que hace tu código.
Luego mueve a un lado o a otro y si no estan los switch detiene.
Comenta todo lo que sea OLED y usa Serial.prints para todo.

Hola @Surbyte

Soy tu fan

Voy a intentar eso, pero para que el usuario monitoree el modo? De plano el oled no es opción?

Estoy pensando en poner toda la instruccion en los 'if' del void loop en vez de las subrutinas

Entiendo que lo que te sugiere @Surbyte es que lo pongas a prueba sin la oled para confirmar o descartar que es la que causa el fallo.

@MaximoEsfuerzo sí, entiendo esa parte. Pero me pregunto para la interfaz visual, la oled ya no es una opción? O estará averiada?

¡Si desde frrente a la pantalla pudiese responderte eso, ya habría ganado la lotería! :rofl:

jaja es verdad. Pero me refiero a que sea la posibilidad para que falle. Aunque pareces que sí, le quité esa parte al código y esta funcionando. Intentaré reemplazarla

No descartes la pantalla OLED.
Prueba en un código aparte usando algun ejemplo de la librería para ver si funciona correctamente, si lo hace, el problema está en como has dispuesto tu código.
Haz la prueba y luego nos comentas a ver como seguimos.
Si ya mandaste a pedir la OLED lo peor es que tengas dos.. asi que ve pensando en otro proyecto pero hoy seguramente le darás utilidad.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.