Reset dopo caricamento codice

Ciao,
al momento sto usando il codice della spada laser come riferimento, giusto per avere una base di partenza e fare prove.
Dopo un po’ di prove e modifiche, adesso la scheda funziona solo se carico il codice e la lascio accesa.
Se la spengo non parte più. E’ come se non avviasse il codice al riavvio.

Da notare che non si è mai presentato il difetto noto del “flash iniziale” dei led, fino al momento in cui è apparso il problema (non so se possa essere correlato)

Giulio

Ciao @Mangaman

Spegnere inteso come togliere la alimentazione oppure lasciare che la scheda vada in low-power?

Il codice prevede che dopo 5 minuti la scheda entri in low-power. L’unico modo per svegliarla e’ tramite il bottone, oppure con un reset (caricamento nuovo sketch) o power cycle.

Potresti postare il codice, oppure le modifiche apportate, se non sono tante?

Ciao @Ivan,
si, spegnere e riaccendere la scheda.
Stranamente stamattina è tornato a funzionare.
I casi sono due: o ho fatto qualche stupidaggine io, o c’e’ un problema ma non sono riuscito ad isolarlo e replicarlo.

Ecco le modifiche che ho fatto.

void setup()
{
  // Initialize audio
  Audio.begin();
  Audio.setVolume(-10); // Just for test
  
  // Play start sound
  fx.play("boot.wav");

  // Initialize motion sensor
  Motion.begin();
  Motion.configPulse(AxisAll, 3.78f, 500, 100, MotionInterrupt1 );
  Motion.configTransient(AxisAll, 0.1f, 120, MotionInterrupt2);
  Motion.attachInterrupt(MotionInterrupt1, MotionPulse);
  Motion.attachInterrupt(MotionInterrupt2, MotionTransient);

  // Initialize LEDs
  blue.begin(350);  // Blue LED with 350mA maximum current
  red.begin(350);   // Red LED with 350mA maximum current
  green.begin(350); // Green LED 350mA maximum current

  blue.setValue(0); // load start value in blue LED driver
  red.setValue(0);  // load start value in red LED driver
  green.setValue(0);// load start value in green LED driver

  // Initialize On/Off button
  OnOffButton.begin(BUTTON_PIN, ButtonActiveLow);

  // Configure the OnOffButton to declare a long press after 1000ms
  OnOffButton.setLongPressTime(1000);

  // Initial blinking LED sequence, cycle: 2000ms, time on: 100ms
  OnOffButton.blink(BUTTON_LED_PIN, 2000, 100);

  // We entered in the STATE_OFF state
  time_off = millis();

}

Ho aggiunto al loop setup la riproduzione di un wav, per far capire che la scheda si è accesa.

Praticamente ho aggiunto questo:

Audio.setVolume(-10); // Just for test

// Play start sound
fx.play(“boot.wav”);

Visto che alla accensione della spada (premendo il pulsante) c’era un fastidioso flash del led, ho aggiunto anche questo:

blue.setValue(0); // load start value in blue LED driver
red.setValue(0); // load start value in red LED driver
green.setValue(0);// load start value in green LED driver

Ciao @Mangaman,

Per caso avevi lasciato l’USB collegato quando la scheda era senza alimentazione? Se e’ cosi il micro rimane alimentato dal USB e non si resetta quando dai alimentazione dal connettore di alimentazione. Questo, sommato allo stato di low-power spiegherebbe il comportamento che hai notato, ma comunque sarebbe del tutto normale.

Per curiosità, potresti dirmi la durata (approssimativamente) del WAV?

Quelle righe di codice comunque producono un flash dei LED alla partenza.

In ogni caso, ho messo un paio di schede a girare col tuo codice per vedere se riesco a riprodurre cio’ che hai visto.

Volevo metterlo in allegato ma i wav non sono permessi.
è un WAV da 57K circa preso da un set di suoni per spada laser, solito 22050 Hz mono.
Durata: 1,3 secondi

No. Lo avevo scollegato, poi tolta e rimessa l’alimentazione. Per scrupolo ho controllato col tester e sia la 5v che la 3v3 erano presenti.

Ho cercato di riprodurre il problema col tuo codice e anche un WAV di simili caratteristiche, in diverse situazioni, ma senza successo.

Questo problema da te lo fa sempre?

Da stamattina la scheda va come un orologio.
Potrebbe essere un problema di qualche flag del compilatore?

E’ come se la scheda alla accensione non facesse partire il codice, è possibile forzare un comportamento così?
Io non sono così esperto…

Una possibile spiegazione sarebbe che uno dei 2 dispositivi I2C (ovvero codec o accelerometro) non fossero correttamente inizializzati e il codice rimanesse in qualche loop. Cosa molto strana, sopratutto dopo un power cycle.

Non credo che sia un problema dii flag di compilazione, visto che (se non li hai cambiati esplicitamente) sono gli stessi che stai utilizzando anche oggi.