Arduino si resetta da solo

Buongiorno a tutti, sto utilizzando uno schermo lcd con SPI ma dopo 30 secondi di utilizzo dello sketch arduino si resetta da solo. Lo sketch non è impegnativo, leggo un pulsante e stampo lo stato sullo schermetto. Lo stesso problema mi si era presentato andando a fare un programma più complesso ma avevo dato la colpa ad un sensore capacitivo.

questo è lo sketch che vado a caricare :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
//none
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


/*-----( Declare Variables )-----*/
int Butt1=7;
int vButt1;

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters
  pinMode(Butt1, INPUT);
  lcd.begin(20,4);         // initialize the lcd for 20 chars 4 lines and turn on backlight


 
  lcd.backlight(); // finish with backlight on
  lcd.setCursor(0,0);
  lcd.print("Prova menu");
  delay(1000);
}
void loop()
{
  vButt1 = digitalRead(Butt1);
  //lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("bottone: ");
  lcd.setCursor(9,1);
  lcd.print(vButt1);
  Serial.print("Memoria libera: ");
  Serial.println( freeRam() );
  
delay(100);
}
int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Ho anche visualizzato eventuali problemi con la ram di arduino ma dal controllo mi esce sempre il valore :
Memoria libera: 1524

Sapreste aiutarmi?
Grazie in anticipo.

Come alimenti Arduino e LCD?

Li sto alimentando dall'USB del Pc. è sbagliato?

Hai acceso la retroilluminazione? quella é per 5V o per 4,2V?
Ciao Uwe

Si la retroilluminazione è accesa. Non so rispondere con certezza alla tua domanda, ma credo che sia per i 5 volt. L'LCD in questione è questo http://www.ebay.it/itm/Blue-Display-IIC-I2C-TWI-SP-I-Serial-Interface2004-20X4-Character-LCD-Module-/161095107719?ssPageName=ADME:X:RTQ:US:1123 ma la documentazione non è perfetta. Da quello che leggo comunque sembra essere tutto a 5 volt.

Dall'USB?
Dove hai collegato la retroilluminazione?

La retroilluminazione è integrata nella schedina SPI tramite un jumper, se questo è collegato è attiva la retroilluminazione e si puo gestire tramite sketch, se invece non lo si collega allora è disabilitata sempre.
Alimento Arduino dall'usb del pc senza l'utilizzo di nessun alimentatore esterno.

Si resetta anche se disabiliti la retroallimazione?
Ciao Uwe

Si si resetta anche quando disabilito la retroilluminazione.
Ho provato ad inserire una variabile che si incrementa ad ogni ciclo per vedere dopo quanti cicli si resetta, in questo caso non si è mai bloccatoed ha continuato il conteggio correttamente. Ho riprovato diverse volte questo sketch e ha dato sempre esito positivo. Esiste una spiegazione a questo fatto?

Fammi capire, si resetta SOLO se usi lo sketch che hai pubblicato nel 1° post?

Purtroppo no, ho creato un mini menu da far visualizzare allo schermo e anche con questo sketch si resetta ogni tanto. Il problema è che non lo fa dopo un tempo prestabilito ma alcune volte riesce a funzionare per 30 secondi altre per solo 5 e altre ancora per 2 minuti. Non capisco cosa possa dargli fastidio.
questo è quello che ho scritto. In sintesi provo a gestire dall esterno con dei pulsanti e un lcd un motore servo. Giusto per pratica.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
unsigned int menu_y[4]={0,1,2,3};
unsigned int menu_x[4]= {0,5,5,0};
int menu_i=0;

Servo myservo;

// Bottoni
int prev=11;
int next=12;
int conf= 8;
int up=10;
int down=9;

int enc1=10;
int enc2=9;
int dati[2]={0,0};
int posizione;
int destinazione;

void setup(){
  myservo.attach(2);
  lcd.begin(20,4);
  lcd.setCursor(0,0);
  lcd.print("Menu gestione Servo");
  lcd.setCursor(0,1);
  lcd.print("SDV-Pedali");
  delay(1000);
  
  
  Menu();
}
void loop(){
  lcd.cursor();

  lcd.setCursor(menu_x[menu_i],menu_y[menu_i]); 
  int pnext = digitalRead(next);
  int pprev = digitalRead(prev);
  int pconf = digitalRead(conf);
  int pup =digitalRead(up);
  int pdown =digitalRead(down);
  
  if(pnext || pprev || pconf ||pup){
    if(pnext){ menu_i++;}
    if(pprev){ menu_i--;}
    
    if(menu_i>3) menu_i=0;
    if(menu_i<0) menu_i=3;
    
    switch(menu_i){
      case 0:  //sono sul pulsante run
       if(pconf){
         
         
         Go();
         }
         break;
      
      case(1):
         if(pconf && dati[0]<160){
         dati[0]+=10;
         lcd.print(dati[0]);
         }
      break;
      
      case(2):
         if(pconf){
         dati[1]+=10;
         lcd.print(dati[1]);
         }
      break;
      
      case(3):
         if(pconf){
        reset();
         }
      break;
        }
 
      
        
    }

  
  
  delay(200);
}

void Go(){
  lcd.noCursor();
  lcd.clear();
  lcd.setCursor(1,1);
  lcd.print("Movimento Servo");
  myservo.write(dati[0]);
  delay(1000);
  Menu();
  
}
void Menu(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Run");
  lcd.setCursor(0,1);
  lcd.print("Dest: ");
  lcd.setCursor(5,1);
  lcd.print(dati[0]);
  lcd.setCursor(0,2);
  lcd.print("Pos : ");
  lcd.setCursor(5,2);
  lcd.print(dati[1]);
  lcd.setCursor(0,3);
  lcd.print("Reset");
}

void reset(){
  
  dati[0]=0;
  dati[1]=0;
  
  lcd.noCursor();
  lcd.clear();
  lcd.setCursor(1,1);
  lcd.print("Reset");
  
  myservo.write(dati[0]);
  delay(1000);
  Menu();
  
}

Ma anche questo mi si resetta quando vuole.

Vedo che richiami la Servo, quindi piloti dei motori. Da dove li alimenti?
Escludiamo cioè il problema alimentazione, che potrebbe essere la prima causa di questi reset.

Tutto quello che uso è alimentato dal pc non ho alimentatori esterni. Il servo è uno piccolino da 24,9 oz ma anche se non è presente si resetta tutto. La cosa che mi lascia perplesso è che nella prima prova che ho fatto, cioe' usando lo sketch del primo post, l'arduino si resettava invece andando ad inserire un semplice contatore che si incrementa, nella forma i++, questo continuava a funzionare senza problemi. Non so cosa pensare.

Ho appena fatto una prova. Ho inserito nello sketch del controllo del servo queste righe :

 cont_prova++;
 lcd.setCursor(10,2);
 lcd.print(cont_prova);

Dove semplicemente faccio incrementare la variabile cont_prova e la faccio visualizzare sullo schermo.
In questo modo arduino si resetta sempre quando arriva al ciclo 143. Ho fatto oramai 20 prove e quando il valore sullo schermo arriva a 143 ho sempre il reset.
143*200ms =28,6 secondi di lavoro indipendentemente se la retroilluminazione è attiva o se il servo è collegato.

Se invece inserisco anche la possibilità di visualizzare il tutto tramite terminale seriale :

 Serial.println(cont_prova);

e apro il terminale per visualizzare il valore del contatore, arduino non si resetta mai e continua il suo ciclo all'infinito.
C'e' qualche cosa che non mi torna.

Ma non è che qualcosa ti apre la seriale ogni 30 secondi resettando l'Arduino?

Se hai un alimentatore esterno prova ad alimentare l'Arduino facendolo funzionare senza collegamento al PC.
Il fatto che non si resetti se hai il serial monitor aperto mi fa pensare che un eventuale altro programma trovi la seriale impegnata.

C'è un'ulteriore variazione nelle casistiche :smiley:
Ora ho provato ad aggiungere una batteria da 9V 150mAh. Se la aggiungo mantenendo collegato arduino all'USB il problema del reset si verifica sempre. Se invece collego solo la batteria arduino riesce a contare fino a quando questa nn ha piuù la carica per alimentare lo schermo. Se Stacco la batteria e faccio ricominciare tutto arduino si resetta ma ad un numero di cicli superiore, cioè riesce a funzionare per piuù tempo ma dopo il primo reset ricomincia a bloccarsi al ciclo 143. Secondo voi è l'alimentazione? la connessione con il pc? non so a che conclusioni arrivare

Come faccio a capire se c'e' una applicazione che mi occupa la porta seriale?
Tale traffico potrebbe resettare arduino anche se io non ho abilitato alcuna comunicazione seriale ?cioè senza scrivere nel setup Serial.begin(115200) ?

Se hai un Arduino UNO, MEGA, 2009, anche la semplice apertura della seriale resetta l'Arduino.
Con la Leonardo, la YUN o la DUE il discorso è diverso.

Si ho arduino Uno. Ho fatto pero' una prova con un software che ho scritto per inviare su seriale dei dati e facendo l'apertura e la chiusura della stessa il mio arduino si resetta allo stesso modo. Sapreste darmi qualche indicazione per risolvere questo problema? Grazie mille.

Il reset all'apertura della seriale è normale e voluto.
Quello che non è normale è il continuo riavvio di cui tu parli.