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);
}