Oggi sperimentazione interessante in classe: Arduino bloccato

Oggi, corso di Arduino a scuola, bella giornata di sperimentazione con i ragazzi.

Scopo della lezione/esercitazione:

Imparare per scoperte guidate l’uso del ciclo for.

Sono partito dalla proposta di un mio studente Antonio T. di ampliare l’esempio For Loop che realizza leffetto della famosa auto KITT 🙂  fight between KITT and KARR, cioè una serie di led che si accendono e si spengono in sequenza nelle due direzioni.

Consegne:

  1. Relizzare un circuito con 10 led (invece che 6 come proposto nell’esempio)
  2. Controllare l’accensione della serie di led con un pulsante:
    • premo il pulsante parte l’accensione e lo spegnimento in sequenza dei LED,
    • non premo il pulsante, si spengono i LED
  3. Controllare l’accensione della serie di LED con un pulsante:
    • premo il pulsante parte l’accensione e lo spegnimento in sequenza dei LED,
    • premo una seconda volta il pulsante, si spengono i LED
  4. Stessa funzionalità del punto 3 ma con accensione e spegnimento in fade.

Oggi abbiamo realizzato i primi due punti, ma la parte della lezione più interessante è stata quando due allievi a distanza di qualche minuto hanno bloccato le loro schede Arduino, impossibile effettuare l’upload degli skatch ed il LED Tx perennemente acceso.

La porta seriale che veniva identificata inizialmente era quella corretta dopo di che scompariva dal menu “Serial Port” e ne veniva proposta solamente una non corretta, ogni tentativo da parte degli studenti di effettuare un nuovo upload rallentava enormemente l’IDE e faceva comparire, dopo parecchi secondi, il mesaggio di errore in rosso:

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51.

Gli studenti tentavano di far ripartire il sistema premendo il tasto reset, ma ciò non dava alcuna soluzione. I primi pensieri sono stati:

  • abbiamo mandato in corto circuito la scheda
  • la scheda sta andando in loop infinito e non riusciamo a resettarla
  • booo…

Finalmente vera sperimentazione! 🙂

Incomincia da parte degli studenti la ricerca su internet per trovare una possibile soluzione:

La prima soluzione proposta è stata quella di utilizzare un Arduino funzionante per effettuare un AVR ISP (in-system programmer) ma purtroppo questo sistema non è possibile applicarlo su Arduino UNO perché su questa scheda l’optiboot bootloader non permette di far funzionare lo sketch per caricare il bootloader all’interno dell’AVR.

Una ricerca più attenta ha portato gli studenti a trovare nella sezione playground tra i problemi noti è risolti la soluzione: Arduino bloccato

Come potete leggere sul sito di riferimento:

Il tastino di reset non è come il reset del computer, che fa riavviare la macchina e cancella il programma in memoria. La memoria su cui è memorizzato lo sketch non è RAM, che si cancella senza alimentazione, è di tipo Flash e mantiene quindi il programma fino a successiva riprogrammazione.

La Manovra d’emergenza di solito serve quando il micro è bloccato sulla seriale ma non sembra bloccato sulla seriale, sembra invece “sordo”, nel senso che non comunica più col computer, ed è la sequente:

  1. aprire l’IDE
  2. caricare uno sketch qualunque, anche il “blink” modificato (prova a mettere un delay doppio)
  3. prendere l’Arduino e tenere premuto il pulsante “reset”.
  4. MENTRE si tiene questo tasto pigiato, collegare l’Arduino al PC.
  5. adesso, MENTRE si continua a tenere pigiato il pulsantino, premere il tasto di upload dello sketch
  6. ora rilasciare il pulsantino di reset
  7. se si è trovato la sincronizzazione giusta tra la pressione del pulsante grafico di upload dello sketch ed il rilascio del reset, verrà caricato lo sketch

Alcune precisazioni, almeno per quello che io ed i ragazzi abbiamo constatato su sistema Ubuntu:

  1. se la scheda è bloccata scollegate il cavo USB ed uscite dall’IDE, il successivo avvio dell’IDE deve essere effettuato con cavo USB collegato alla scheda,
  2. se partite dal punto 2 in avanti senza uscire dall’IDE potreste non risolvere il problema;
  3. dal punto 1 il pulsante reset deve essere premuto;
  4. assicuratevi che compaia tra le varie scelte di “Serial Port” nel menu “Tools” la seriale corretta, se non compare attendete alcuni secondi, almeno nella versione di Ubuntu usato da noi, l’individuazione della seriale da parte dell’IDE  richiede qualche secondo;
  5. qualche istante dopo che avete premuto il tasto di upload dello sketch rilasciate il pulsante reset;
  6. se la procedura non va a buon fine dipende dal punto 7 della procedura indicata sopra, non preoccupatevi, la paura di aver reso Arduino un mattone inutilizzabile è elevata e le mani son sudate 🙂 riprovate vedrete che tutto tornerà a funzionare.

Oggi credo che gli studenti abbiano imparato il significato della frase che spesso dico “imparare a saper fare”.

10 pensieri su “Oggi sperimentazione interessante in classe: Arduino bloccato

  1. Fiorenzo Degli Esposti

    Buongiorno Maffucci,
    Volevo farle i miei complimenti, mi sarebbe piaciuto avere un insegnante come lei !
    Sono un tecnico elettronico appena in pensione.
    Diplomato nel 1970, mi sono fatto tutta l’evoluzione elettronica da solo,dagli studi scolastici di valvole e transistor, mi sono occupato nel mondo del lavoro di integrati,microprocessori( il classico Z80 di Faggin), PIC, microcontrollori.
    Ora ho scoperto Arduino come hobbista, per me e’ un sogno, da vecchio hardwarista sempre occupato a saldare componenti, ora faccio un paio di collegamenti tra due schedine, e posso variare completamente il risultato finale della mia elettronica agendo solo sul software !
    Lo faccia presente ai suoi studenti.
    P.S. mi si era bloccato Arduino, ho trafficato, reinstallato,ect ect, poi ho visto il suo articoletto, e seguendo la procedura in un paio di secondi ho risolto tutto.
    Grazie ancora
    Fiorenzo

    Rispondi
    1. admin Autore articolo

      Grazie per la sua testimonianza, farò presente sicuramente ai miei studenti sottolinenado durante le lezioni l’evoluzione storica della programmazione su microprocessori e microcontrollori.

      Grazie ancora.

      Saluti.

      Rispondi
  2. Luigi

    Grazie per la soluzione!!!! il mio arduino non comunicava più dopo gli esperimenti con firmata (sto cercando di arrivare al monitoraggio real time sul web attraverso pachube) ho trovato il tuo articolo ed al secondo tentativo il mio arduino è tornato in vita!!!non potendoti ringraziare in altro modo ti lascio un consiglio se mai un giorno proverai a usare arduino+processing+pachube: con firmata e il nuovo arduino 1.0 nei file da includere si deve cambiare il file WProgram.h con Arduino.h inoltre i serial.print che danno errori di compilazione devono essere sostituiti con serial.write comunque è tutto scritto nella software release note http://arduino.cc/en/Main/ReleaseNotes solo che ho impiegato il pomeriggio per venirne fuori!!

    Rispondi
    1. admin Autore articolo

      Grazie a te Luigi

      I consigli che mi hai lasciato sono preziosi e ti ringrazio fin d’ora.
      In questo anno scolastico sto usando ancora la versione 0023 dell’IDE Arduino su Ubuntu, ma per la fine dell’anno scolastico incomincerò il passaggio graduale per tutti i computer dei laboratori della scuola alla versione Arduino 1.0.
      Proprio in questa settimana, con la mia 5′ elettronici abbiamo incominciato ad usare Pachube ma stiamo sperimentando anche Partcl e noto che i ragazzi sono estremamente interessati.

      Grazie ancora.
      Saluti.

      Rispondi
  3. gilberto

    grazie per il suggerimento dopo aver letto diversi siti che parlavano di ricaricare il boot loader usando il file avr ma non me la sono sentita.
    poi seguendo queste semplici istruzioni ho risolto il problema e i il mio leonardo 328 e il mio arduino namo sono rinati.
    anche se nn capisco come ho fatto a bloccarli.
    ho scritto un programma che su arduino mega funziona benissimo lo stesso programma caricato su arduino nano e su leonardo 328 blocca la cpu lampeggia il led sul pin 13 e arduino non da risposta.
    ho scritto un programma cx decodificare i tasti di un telecomando senza usare la libreia ir.h in quanto mi andava in conflitto con la libreia tone.h
    il programma ad ogni pressione di un tasto suona una diversa canzone natalizia.

    questo codice su arduino mega funziona senza problema ma su arduino nano e leonardo 328 si blocca e la cup di arduino e lampeggia in continuazione il led sul pin 13.
    iniziamelte il codice prevedeva la decodifica di tutti i 52 tasti del telcomando
    ho caricato il codice su arduino leonardo 328 ed e’ andato in blocco
    ho provato lo stesso codice su arduino mega nn lo eseguiva ma almeno nn e’ andato in blocco
    ho ridotto il codice per decodificare solo 32 tasti e su arduino mega funziona benissimo
    nn contento ho caricato il nuo codice su arduino mano e sono riuscito a bloccare anche quello
    da quello che ho intuito il problema sono il numero di di if dentro un if principale ma nn ho trovato specifiche su questa cosa e sono riuscito a bloccare due arduino
    ora grazie a queste semplici istruzioni li ho sbloccati e sono tornati in funzione
    e cosi ho terminato il mio albero di natale
    uso arduino leonardo 328 pre pilotare le luci con due intrfaccie che ho costruito io ciascuna con 4 rele e pilotate da transistor generano luci casuali uno spettacolo
    e arduino mega per riprodurre le canzoni natalizie collegato a quattro autoparlanti da pc portale due per canale ho quasi ottenuto un effeto stereo facendo suonare ad arduino le vecchie suonerie dei cellulari
    allego i codici:

    1) codice telecomando pre fare riprodurre le canzoni di natale collegato ad arduiono mega
    #include

    Tone tone1,tone2;// uscite audio per ottenere effetto quasi stereo

    long test;

    #define OCTAVE_OFFSET 0

    int pinData= 2; //ingresso ricevitore ir
    unsigned long lengthHeader;
    unsigned long bit;
    int byteValue;

    int notes[] = { 0,
    NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
    NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
    NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
    NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
    };

    void setup(void)
    {
    Serial.begin(9600);
    tone1.begin(7); // uscita audio speaker dx
    tone2.begin(6);// uscita audio speaker sn

    pinMode(pinData, INPUT);
    }
    void loop()
    {
    ir();
    // Serial.println(byteValue);
    // ciclo decodifica teleconando test valore letto dal telecomando moltiplicato per //1048576 per differenziare i valori letti in quanto la lettura in digitale risultava valori //piccolissimi e il codice confondeva i tasti del telecomando
    if ( byteValue = ‘0’ && n 0) default_dur = num;
    p++; // skip comma
    }

    // Serial.print(“ddur: “); Serial.println(default_dur, 10);

    // get default octave
    if(*p == ‘o’)
    {
    p++; p++; // skip “o=”
    num = *p++ – ‘0’;
    if(num >= 3 && num 1024)
    {
    //step through each of the 32 bits that streams from the remote
    byteValue = 0;
    for(int i = 1; i 16 && i 1024)
    byteValue = byteValue + (1 << (i – 17));
    }

    //send the key code to the processing.org program
    Serial.println(byteValue*1048576);
    test=byteValue*1048576;

    Serial.flush();
    }

    delay(100);
    }

    2) codice che gestisce le luci dell 'albero collegato ad arduino leonardo 328

    int i=0;
    int i1=50;

    int cas1=0;
    int cas2=0;
    int cas3=0;
    int cas4=0;
    int cas5=0;
    int cas6=0;
    int cas7=0;
    int cas8=0;

    int t=0;
    int t1=100;
    int t2=500;

    int t3=1000;

    void setup()
    {
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);

    }

    void loop()
    {
    digitalWrite(1, HIGH);
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);

    cas4=random(10,t3); //genera dei numeri casuali da 10 a t3-1
    delay(cas4);
    // pin collegati hai rele
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);

    cas4=random(10,t3); //genera dei numeri casuali da 10 a t3-1

    cas3=random(1,i1); //genera dei numeri casuali da 1 a i1-1
    for (i=0; i <= cas3; i=i+1)
    {
    // 1

    cas2=random(1,3); //genera dei numeri casuali da 1 A 2 1=SPENTO 2=ACCESO

    if (cas2=2)
    {
    cas1=random(1,8); //genera dei numeri casuali da 1 a 4
    digitalWrite(cas1, HIGH);
    t=random(t1,t2); // t= RITARDO CASUALE DA t1 a t2-1
    delay(t);

    cas2=random(1,8); //genera dei numeri casuali da 1 a 4
    digitalWrite(cas2, HIGH);
    t=random(t1,t2); // t= RITARDO CASUALE DA t1 a t2-1
    delay(t);

    cas3=random(1,8); //genera dei numeri casuali da 1 a 4
    digitalWrite(cas3, HIGH);
    t=random(t1,t2); // t= RITARDO CASUALE DA t1 a t2-1
    delay(t);

    cas4=random(1,8); //genera dei numeri casuali da 1 a 4
    digitalWrite(cas4, HIGH);
    t=random(t1,t2); // t= RITARDO CASUALE DA t1 a t2-1
    delay(t);

    }
    if (cas2=1)
    {
    digitalWrite(cas1, LOW);
    digitalWrite(cas2, LOW);
    digitalWrite(cas3, LOW);
    digitalWrite(cas4, LOW);

    t=random(t1,t2); // t= RITARDO CASUALE DA t1 a t2-1
    delay(t);
    }

    }
    }

    ho deciso di usare due arduino per evitare di bloccare di nuovo la cpu visto che gia il codice per la decodifica del telecomando era critico e per gestire i due eventi separatamnete
    devo ora solo risolvere il problema del rumore in quanto ho usato otto rele tradizionali a bobina e quindi un po rumorosi ma ci sto lavorando per ora ho usato tre contenitori di riciclo che contenevano mirtilli secchi che mi sono serviti per fare la grappa hai mirtilli uno per contenere arduino e due per le schede a rele ora pensavo di rimpire i contenitori di polistorolo o patatine di polistirolo per attenuare il rumore
    poi ho utlizzato due contenitori di crema al gorgonzola per relizzare le casse audio e contenere i due speaker per canale in totale quatro speaker in due casse e un altro contenitore di ricilo per contenere arduino mega e il ricevitore ir montato su bread board
    quindi ho realizzato un albero di natale ai mirtilli e gorgonzola uno spettqacolo per la vista e l'udito
    grazie per la disponibilita e per le lezioni sempre chiarissime

    Rispondi
  4. Mauro

    Buongiorno,

    ho comprato un Arduino Pro Mini 5V-16MHz (ATMEGA328) e, visto che già dal principio non riuscivo ad uploadare lo sketch al suo interno, tramite un convertitore USB to Uart (CP2102), ho provato ad eseguire la procedura da Lei indicata con successo. Il problema è che ogni qualvolta voglia eseguire l’upload di uno sketch, poco prima della fine devo premere il pulsante di reset per effettuare questa “sincronizzazione”.

    Se nel mio sketch è previsto l’utilizzo del monitor seriale, quando viene aperto non si leggono i messaggi inviati dall’arduino finché non premo il pulsante di reset con il monitor seriale già aperto.

    Tenga presente che il convertitore CP2102 funziona perfettamente con lo stesso pc e con un’altro modello di arduino (quello assemblato su basetta di test con i vari componenti necessari)

    Grazie dell’interesse
    Mauro

    Rispondi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.