Reset ARduino Mega 2650 solo se alimentato esternamente

Ciao a tutti,

ho fatto un piccolo sketch per la gestione di una serie di LED. Durante lo sviluppo nessun problema, ho puoi montato il tutto ed alimentato con un alimentatore esterno a 12V 240W, da qui ho incominciato ad avere un fastidioso problema di riavvio della scheda. Quando accendo più LED contemporaneamente, è come se l'alimentatore non ce la facesse, ma chiaramente non è questo il problema vista la potenza dello stesso. Escluderei anche una anomalia dell'alimentatore perchè ha 3 uscite e le altre due stanno reggendo carichi ben più alti. Il problema si manifesta sia quando le altre due uscite stanno assorbendo sia quando sono disabilitate. ho provato anche ad utilizzare un'altra delle 3 uscite ma non cambia nulla.

Se invece alimento tramite porta USB il problema scompare.

Vi è mai capitato?
consigli?

Mi correghgo... il problema ora lo da anche con la USB, c'è voluto un po più di tempo, infatti ha iniziato dopo circa 30 min ma in maniera del tutto analoga a quando alimentato esternamente.

Potrebbe essere lo sketch? ve lo incollo

#include <SimpleDHT.h> //Sensore di Temperatura
#include <LiquidCrystal.h> //Display LCD
#include <Wire.h> //Orologio
#include <DS3231.h> //Orologio

//Definizione PIN
int ledPinVio = 2;
int buttonBVio = 22; 
int VStartVio = 0; 
int VEndVio = 200; 
int ledPinBia = 3;
int VStartBia=0;  
int VEndBia= 200;   
int buttonCBia = 24;

int ledPinRed = 4;  
int VEndRed= 200;  

int ledPinRedEnable = 26;
int BedStatus_IN = 23;       
int ExtruderStatus_IN = 30; 
int BedStatus_OUT = 31;
int ExtruderStatus_OUT =32;

int pinDHT11 = 33;
SimpleDHT11 dht11;
byte temperature = 0;
byte humidity = 0;
byte data[40] = {0};
long unsigned TimeStart;
long unsigned TimeEnd=0;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int EnableLCD = 1;

DS3231 clock;
RTCDateTime dt;

int buzzer = 6;



void setup() 
{
pinMode(ledPinVio, OUTPUT);
pinMode(buttonBVio, INPUT_PULLUP);  
pinMode(ledPinBia, OUTPUT);
pinMode(buttonCBia, INPUT_PULLUP); 

pinMode(ledPinRed, OUTPUT);        
pinMode(ExtruderStatus_IN, INPUT); 
pinMode(BedStatus_IN, INPUT);      
pinMode(ledPinRedEnable, INPUT_PULLUP); 

pinMode(BedStatus_OUT, OUTPUT);
pinMode(ExtruderStatus_OUT, OUTPUT);

pinMode(buzzer,OUTPUT);

    
analogWrite (ledPinVio, 200);
digitalWrite (ledPinRed, LOW);
analogWrite (ExtruderStatus_IN, 0); 
analogWrite (BedStatus_IN, 0);     
analogWrite (BedStatus_OUT, 0);     
analogWrite (ExtruderStatus_OUT, 0);

Serial.begin(9600); 

clock.begin(); //Inizializza DS3231 (Orologio)



  
//*************************** LCD Print Stringa ********************************************
  lcd.begin(16, 2); // set up the LCD's number of columns and rows:
  
//  lcd.print("      TIME      "); // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print(" Hello");
  lcd.setCursor(0, 1);
  lcd.print("    Good Job    ");
  delay (3000);
  lcd.clear();
}




void loop() 
{

//*************************** ILLUMINAZIONE Viola-Bianco ********************************************

if (digitalRead(buttonBVio)==LOW)
      {if ( (pulseIn(ledPinVio, HIGH)> 180) )
          { 
            for (int i=VEndVio; i >= VStartVio; i--)
                {
                   analogWrite(ledPinVio, i);
                   delay(5);
                }
             
           }  
          else {
                 for (int i=VStartVio; i <= VEndVio; i++)
                   {
                     analogWrite(ledPinVio, i);
                     delay(5);
                   } 
                }
        delay (300);   
       }  



if (digitalRead(buttonCBia)==LOW)
      {if ( (pulseIn(ledPinBia, HIGH)> 180) )
          { 
            for (int i=VEndBia; i >= VStartBia; i--)
                {
                   analogWrite(ledPinBia, i);
                   delay(10);
                }
             
           }  
         else {
                for (int i=VStartBia; i <= VEndBia; i++)
                  {
                    analogWrite(ledPinBia, i);
                    delay(10);
                  } 
              }
        delay (300);   
       }  
      
              
            
//*************************** ILLUMINAZIONE Rossa *************************************************** 
   
 if (digitalRead (ledPinRedEnable)==LOW) 
          { if (digitalRead(BedStatus_IN)==HIGH || digitalRead(ExtruderStatus_IN)==HIGH) 
                {analogWrite (ledPinRed, VEndRed); }
                    else {analogWrite(ledPinRed, 0); }
           }    
 if (digitalRead (ledPinRedEnable)==HIGH)
           {
              analogWrite(ledPinRed, 0);
           }

           
//******* Presenza Tensione su Piatto ed Estrusore  ******** 
   if (digitalRead (BedStatus_IN) == HIGH)
        {analogWrite (BedStatus_OUT, 200); }
                else {analogWrite (BedStatus_OUT, 0); }
 
  if (digitalRead (ExtruderStatus_IN) == HIGH)
        {analogWrite (ExtruderStatus_OUT, 200); }
                else {analogWrite (ExtruderStatus_OUT, 0); }


//*************************** Sensore di Temperatura - Acquisizione Dati ********



  dht11.read(pinDHT11, &temperature, &humidity, data);
 

//*************************** Orologio - Acquisizione Dati ********

  dt = clock.getDateTime();

//************************************ Display LCD *******************************
   
   
   TimeEnd=TimeStart+30000;
   
   
      if (millis()>TimeEnd || EnableLCD==1)

        {
            lcd.setCursor(0, 0);
            lcd.println(clock.dateFormat("d-m-Y H:i:s", dt));
            lcd.setCursor(0, 1);  // set the cursor to column 0, line 1 (first Row is 0)
            lcd.print(temperature);
            lcd.print(" *C, ");
            lcd.print(" Hum: ");
            lcd.print(humidity);
            lcd.print("%");
               TimeStart = millis();
   
     EnableLCD=0;
     
  
    
  }
  }

Ma i led, quanti sono e come li hai collegati/pilotati? Fai uno schema, anche disegnato su un foglio di carta, purché leggibile ed esatto del tutto e mostracelo.

Per ogni evenienza ti rammeto che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Inoltre, la USB fornisce al massimo 500 mA (ma è veramnete un linite massimo), mentre alimentando con un alimentatore esterno da 12V, dal pin 5V di Arduno NON si possono prelevare più di 250/300 mA causa il regolatore di tensione.

Guglielmo

gpb01:
Ma i led, quanti sono e come li hai collegati/pilotati? Fai uno schema, anche disegnato su un foglio di carta, purché leggibile ed esatto del tutto e mostracelo.

Per ogni evenienza ti rammeto che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Inoltre, la USB fornisce al massimo 500 mA (ma è veramnete un linite massimo), mentre alimentando con un alimentatore esterno da 12V, dal pin 5V di Arduno NON si possono prelevare più di 250/300 mA causa il regolatore di tensione.

Guglielmo

Ok Guglielmo Grazie, mi sa che lo schema a questo punto è superfluo. Mi ero fatto un ragionamento molto diverso, pensavo che la corrente in uscita potesse essere molto più alta.

Ho usato tutti LED ad alta luminosità, il progetto prevede di usare i LED non come segnalazione ma proprio come illuminazione.

I led bianchi sono in parallelo sullo stesso PIN ed hanno una corrente di 30 ma l'uno (quindi non ci siamo)
I Viola Idem, 4 in parallelo sulla stessa uscita da 20 mA.
Stessa cosa per i rossi, due in serie da 30mA l'uno.

Utilizzerò dei MOS pilotati da Arduino ed un alimentatore esterno così da risolvere il problema, concordi?

Giuseppe

Si, guarda ad esempio lo schema allegato, in alto a destra. E' fatto per pilotare LED strip, ma il concetto è lo stesso :wink:

Guglielmo

P.S.: Mi raccomando, prendere MOSFET "logic-level" come gli IRL540 indicati :slight_smile:

scheda_5.pdf (429 KB)

ma hai messo delle resistenze per limitare la corrente dei LED?
Ciao Uwe