Arduino nano se congela

Buenas, tengo un pequeño problema. Estoy haciendo un dispensador de croquetas para mascotas, pero después de un rato conectado se queda congelado y ya no hace nada. Le pregunté a un amigo que sabe un poco más que yo y me dijo que le agregara un watchdog, pero sigue sin funcionar. Estuve leyendo un poco y al parecer puede ser el ruido de las fuentes, ya que tengo todo en una caja relativamente pequeña.
La pantalla es una lcd 16x2, el reloj es el modulo DS3231, el servo es un MG9095, de ahí en fuera es un buzzer, 3 pulsadores y las 2 fuentes, una de 5.5v exclusivamente para el servomotor y el reloj y otra de 12v con un regulador de 6v para el arduino, la pantalla, el buzzer y los demás componentes.
Agradezco mucho su ayuda
Les adjunto el código, el esquema y las fotos del montaje.

//WATCH DOG
#include <avr/wdt.h>

//COMUNICACION I2C
#include <Wire.h>

//PANTALLA
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); 

//RELOJ
#include <DS3231.h>                             
#include <RTClib.h>
RTC_DS3231 rtc;
Time  t;

//SERVOMOTOR
#include <Servo.h>
Servo servo_mot; 

//ENTRADAS Y SALIDAS
int but1 = 4; 
int but2 = 2; 
int but3 = 3;
int servo_pin = 9;
int Buzzer = 5;
int mot = 7;

//VARIABLES
  
  //APAGADO DE PANTALLA
  unsigned int millis_before = 0;
  unsigned int millis_now = 0;
  int apagado = 60000;

  //BOTONES
  bool state_but1 = true;
  bool state_but2 = true;
  bool state_but3 = true;

  //SERVO
  int close = 20;           
  int open = 95;

  //PORCIONES Y DISPENSAR
  int porciones = 9;
  int max_portions = 30;
  int min_portions = 1;
  bool feed_active = true;
  int portion_delay = 50;

  //SIGUIENTE PORCION
  String next = "08:00";

void setup() {

  //DESACTIVAR WATCH DOG 
  wdt_disable();
  
  //RELOJ
  rtc.begin(); 

  //PANTALLA
  lcd.init();
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print("BIENVENIDO");
  delay(3000);
  lcd.clear();

  //APAGADO DEPANTALLA
  millis_before = millis();
  millis_now = millis();

  ///SERVO
  servo_mot.attach(servo_pin);  
  servo_mot.write(close);

  //VIBRADOR
  pinMode(mot, OUTPUT);
  //BUZZER
  digitalWrite(Buzzer, LOW);
  pinMode(Buzzer, OUTPUT);

  //CONFIGURACION DE LOS BOTONES
  pinMode(but1, INPUT_PULLUP);
  pinMode(but2, INPUT_PULLUP);
  pinMode(but3, INPUT_PULLUP);

  //ACTIVAR WATCH DOG
  wdt_enable(WDTO_4S);
}

void loop() {

  wdt_reset();
  DateTime t = rtc.now();

  //IMPRESION DE DATOS
  lcd.setCursor(2, 0);
  if (porciones < 10){
    lcd.print("0");
    lcd.print(porciones);
    lcd.print(":porciones");
  }
  else{
    lcd.print(porciones);
    lcd.print(":porciones");
  }
  lcd.setCursor(0, 1);

  //HORA
  if (t.hour() < 10){
    lcd.print("0");
    lcd.print(t.hour());
    lcd.print(":");
  }
  else {
    lcd.print(t.hour());
    lcd.print(":");
  }
  if (t.minute() < 10){
    lcd.print("0");
    lcd.print(t.minute());
  }
  else{
    lcd.print(t.minute());
  }
  lcd.print(" Next:");
  lcd.print(next);

  //CONFIGURACION DE LAS PORCIONES
    if(porciones > 30){
    porciones = min_portions;
  }
  if(porciones < 0){
    porciones = min_portions;
  }

  //DISPENSAR
  if ((t.hour() ==  8) && (t.minute() == 0) && (t.second() == 0)) {
    lcd.backlight();
    lcd.display();
    next = "14:00";
    if(feed_active){                            
      int i = 0;
      while(i<porciones){                        
        servo_mot.write(open);          
        i++;
        lcd.clear();   
        lcd.setCursor(3, 0);      
        lcd.print("SIRVIENDO");    
        lcd.display();    
        digitalWrite(mot, HIGH);  
        delay(portion_delay);                 
      }
    if(i=porciones){
      servo_mot.write(close);             
      feed_active = false;
      lcd.clear();
      lcd.setCursor(4, 0);
      lcd.print("SERVIDO");
      digitalWrite(mot, LOW);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500); 
    }                     
    }
  }
  if ((t.hour() ==  14) && (t.minute() == 00) && (t.second() == 0)) {
    lcd.backlight();
    lcd.display();
    next = "08:00";
    if(feed_active){                            
      int i = 0;
      while(i<porciones){                        
        servo_mot.write(open);
        i++;
        lcd.clear();   
        lcd.setCursor(3, 0);      
        lcd.print("SIRVIENDO");    
        lcd.display();      
        digitalWrite(mot, HIGH);
        delay(portion_delay);                 
      }
    if(i=porciones){
      servo_mot.write(close);             
      feed_active = false;
      lcd.clear();
      lcd.setCursor(4, 0);
      lcd.print("SERVIDO");
      digitalWrite(mot, LOW);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500); 
    }
    } 
  }

  //BOTONES
    //Boton 1(Incrementar porciones)   
  if(!digitalRead(but1) && state_but1){
    lcd.backlight();
    lcd.display();
    porciones++;
    if(porciones > max_portions){          
      porciones = min_portions;
    }
    state_but1 = false;
  }
  else if(digitalRead(but1) && !state_but1){
    state_but1 = true;
  }  

  //Boton 2(Decrementar porciones)
  if(!digitalRead(but2) && state_but2){
    lcd.backlight();
    lcd.display();
    porciones--;
    if(porciones < min_portions){         
      porciones = max_portions;
    }
    state_but2 = false;
  }
  else if(digitalRead(but2) && !state_but2){
    state_but2 = true;
  }

  //Boton 3(Servir manualmente)
  if(!digitalRead(but3) && state_but3){     
    lcd.backlight();
    lcd.display();                                            
    int i = 0;
    while(i<porciones){       
      digitalWrite(mot, HIGH);                 
      servo_mot.write(open);          
      i++;
      lcd.clear();   
      lcd.setCursor(3, 0);      
      lcd.print("SIRVIENDO");    
      lcd.display();      
      delay(portion_delay);                 
    }
    if(i=porciones){
      servo_mot.write(close);             
      feed_active = false;
      lcd.clear();
      lcd.setCursor(4, 0);
      lcd.print("SERVIDO");
      digitalWrite(mot, LOW);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500);
      digitalWrite(Buzzer, HIGH);
      delay(500);
      digitalWrite(Buzzer, LOW); 
      delay(500); 
    }                     
  }
  else if(digitalRead(but3) && !state_but3){
    state_but3 = true;
  }

  //APAGAR PANTALLA
   millis_now = millis();                                  
  if((millis_now - millis_before) > apagado){   
    millis_before = millis_now;   
    lcd.noBacklight();
    lcd.noDisplay();
  }
}





He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @kars123.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

¿En cuál pin del Nano conectas los 6V?

En el pin "VIN"

Primero 6V es baja tensión para el NANO
Segundo. Alimentas el servo desde el NANO, no es buena idea. Deberías hacerlo desde los 6V, y colocar un capacitor de al menos 470uF entre sus bornes (+ con 5V y negativo con GND).
El NANO necesita al menos 6.5V y ahi entras en conflicto con el servo, que toleran en general 6V máximo.
El servo mira sus datos

From the TowerPro website from the MG995:

Specification:

  • Weight: 55 g
  • Dimension: 40.7×19.7×42.9 mm
  • Stall torque: 9.4 kg/cm (4.8v); 11 kg/cm (6 V)
  • Operating speed: 0.20 sec/60° (4.8 V); 0.16 sec/60° (6.0 V)
  • Operating voltage: 4.8~ 6.6 V
  • Gear Type: Metal gear
  • Temperature range: 0- 55 °C
  • Dead band width: 1 µs
  • servo wire length: 32 cm
  • Current draw at idle 10 mA
  • No load operating current draw 170 mA
  • Stall current draw 1200 mA
    Consume 170mA normal pero puede llegar cargado a 1.2A.
    Ni loco alimentes eso con el NANO.
    Tendras que usar una fuente para el Servo y otra para el NANO de al menos 6.5V

Creo que no me entendiste bien, tengo dos fuentes distintas, una de 5.4v para el servo, solo para el servo y otra de 12 con el regulador de 6.
Voy a cambiar el regulador por uno de 8, tal vez funcione mejor.
Gracias por su ayuda

:+1:

Tienes razón, ajusta entonces el regulador que veo que ya lo hiciste. En el futuro no uses mas en tus diseños regladores lineales. Calientan y son menos eficientes que una fuente DC DC como esta
image

Esta fuente pequeña entrega hasta 2A y es una Step down que uso entodos los proyectos. mas barata que la tipica que usa el LM2596

La unica contra el preset de pesima calidad pero con paciencia lo ajustas y luego le pones una gota de silicona plastica y no se mueve mas. (IMPORTANTE)

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