1. A breve aggiorneremo la piattaforma di Reboot per risolvere alcuni problemi con i plug-in, quindi chiediamo ancora un po' di pazienza, Lo staff di Reboot

Guida LED lampeggiante su ESP8266 tramite IDE Arduino

Discussione in 'ESP8266' iniziata da StandardBus, 25 Giu 2015.

  1. StandardBus

    StandardBus Staff Alan Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    4.092
    Like ricevuti:
    5.291
    Tutto inizia da un LED...

    Anzi, non tutto, ma sicuramente tutto quello che riguarda la sperimentazione sui microcontroller e le board Arduino. L'ESP8266 non fa eccezione: abbiamo a disposizione 512KB/1MB o più di memoria a seconda del modello da dividere tra il bootloader, il firmware della casa produttrice ed i nostri programmi.

    Il programma "hello, blink" è perfetto per capire come si inizia a programmare su questi dispositivi: immediato, con un effetto visibile, e semplice da capire.
    La chiave per imparare è sempre quella di divertirsi mentre si fanno le cose: pasticciare con il codice per vedere cosa succede e cosa cambia è sempre molto utile. Quindi non bisogna limitarsi a prendere il codice da questo articolo, flasharlo e vedere cosa fa... ma modificarlo cercando di capire come funziona.

    Questo tutorial può essere seguito da chiunque abbia a disposizione:
    • Un PC con installato l'Arduino IDE (va modificato solo la prima volta con questo metodo per renderlo compatibile con l'ESP8266)
    • Un convertitore USB :arrowright: Seriale (Compatibili con tutti i tutorial di Reboot: su Amazon / su AliExpress)
    • Una scheda basata sul chip ESP8266 (quindi ok per ESP-01, ESP-02, ESP-03, ESP-04 e via dicendo fino all'ESP-12). Su Amazon (consegna in 24H) / su AliExpress (costa meno)
    • Qualche cavetto per collegare il convertitore all'ESP8266
    • Nient'altro.
    Hello, blink!

    [​IMG]
    1. Collega l'ESP8266 al PC tramite il convertitore seriale, come spiegato nel punto 1 di questa guida (vedi link e foto qui sopra) e mettilo in modalità programmazione ponticellando GPIO0 a GND prima di collegarlo al PC. I driver del convertitore seriale dovranno essere già installati sul PC. (Se stai usando un convertitore USB :arrowright: seriale basato su chip FTDI FT232 puoi installare questi driver
      Suggerimento: Il collegamento tra adattatore seriale ed ESP8266 non cambia mai. Può essere utile costruirsi un adattatore che permetta di collegarlo rapidamente e senza errori, come in questa foto. In questo modo diventa immediata la programmazione, e resta solo da costruire il circuito, se necessario

    2. Collega un LED tra GND e GPIO2 come in questa immagine:
      [​IMG]
      Il piedino lungo sul led è l'anodo (+) ed andrà collegato su GPIO2, mentre il piedino più corto è il catodo (-) e andrà collegato a GND. Se viene inserito al contrario non succederà nulla, semplicemente rimarrà spento, quindi non aver paura sbagliare verso.
      In quest'ultima immagine non si vede il resto dei cavi che vanno al programmatore, ma è sott'inteso che siano ancora tutti collegati. Potranno essere scollegati solo dopo aver programmato il chip, che per funzionare avrà bisogno solo dell'alimentazione a +3,3V, del CHIP_ENABLE (CH_PD) collegato a +3,3V e del GND collegato a 0V.

    3. Apri L'Arduino IDE
    4. Nel menù "Strumenti" di Arduino IDE seleziona "Scheda" :arrowright: "Generic ESP8266 module" per dire all'IDE che dovrà utilizzare il giusto interprete per 'parlare' con l'ESP8266. Ovviamente se avete un'altro modello, come l'OLIMEX o un ESP con il firmware NodeMCU dovrete selezionare una delle altre due opzioni. Se non sapete cosa sia il firmware NodeMCU e avete appena ricevuto per posta il vostro primo ESP8266 con cui sperimentare, selezionate "Generic ESP8266 module".
    5. Cancella tutto quello che è già presente nel campo di scrittura del codice all'interno dell'IDE e copia al suo posto questo codice:
      Codice:
      void setup() {
        pinMode(2, OUTPUT);
      }
      
      void loop() {
        digitalWrite(2, HIGH);    // accende il led (HIGH è il livello logico alto)
        delay(1000);                  // attende un secondo
        digitalWrite(2, LOW);     // spegne il led (LOW è il livello logico basso)
        delay(1000);                  // attende un secondo
      
      }
    6. Per inviare il codice all'ESP8266 premi sul pulsante "Carica" [​IMG]
      Nella barra nera dell'IDE compariranno una serie di scritte, prima bianche (fase di compilazione) poi rosse (fase di scrittura, ma è così solo con gli ESP8266) ed una serie di puntini che indicano l'avanzamento del flash.
      Al termine della scrittura, Se è stato fatto tutto giusto l'IDE ci rassicurerà con un messaggio "Caricamento completato", mentre in caso di errore bisogna capire se il problema è di comunicazione con la scheda o se il codice è stato copiato sbagliato in qualche punto.
      [​IMG]
      La shell (la parte nera sotto l'IDE) in genere spiega che cosa è andato storto, quindi può essere utile riportare in risposta a questa guida almeno le ultime frasi apparse, per farsi aiutare da altri.
    Una volta programmato il chip, per utilizzarlo come blinker stand-alone (che funziona per conto suo) potremmo collegarlo a due batterie da 1,5V, in questo modo:
    [​IMG]
    • GND è collegato al polo (-) delle due batterie in serie (1,5V+1,5V)
    • +3,3V è collegato al polo (+) delle due batterie in serie
    • Il cavetto azzurro serve per abilitare la scheda, infatti collega CH_PD (CHIP_ENABLE) ad un qualsiasi punto a +3,3V tra quelli disponibili nell'immagine. Se scollegato, il chip ESP8266EX si spegne, nonostante il led rosso di stato sulla scheda rimanga acceso.
    Spiegazione del codice

    La funzione setup viene eseguita dopo ogni accensione della board, e serve ad inizializzare le variabili, i pin, richiamare le librerie, ecc.
    void setup() {
    pinMode(2, OUTPUT);
    }

    In questo caso il comando pinMode dice all'IDE che il pin 2 (GPIO2) andrà utilizzato come output. L'IDE Arduino converte automaticamente il numero dei pin che gli vengono indicati nel codice... nelle porte GPIO che hanno i numeri corrispondenti.

    La funzione loop ripete il programma all'infinito. Qui deve essere inserito il programma vero e proprio.
    void loop() {
    digitalWrite(2, HIGH);
    delay(1000);
    digitalWrite(2, LOW);
    delay(1000);
    }

    È già stato anticipato durante il tutorial. digitalWrite(2, HIGH) dice all'esp8266: "ehi, ti ho già detto che GPIO2 va usata come OUTPUT, quindi ora voglio che sia a livello alto".
    Nell'elettronica digitale i valori possono essere solo 1 e 0, acceso e spento, livello alto e livello basso. Il valore "1" viene codificato da una tensione a 3,3V o 5V. Siccome l'ESP8266 funziona a 3,3V, il livello logico alto è proprio 3,3V... e 0V corrisponde al livello logico basso.
    delay invece inserisce un ritardo (espresso in millisecondi) dall'esecuzione di quel comando a quello successivo. 1000 millisecondi corrispondono ad un secondo.
    Quindi, in linea teorica il led verrà prima acceso, poi il programma si fermerà per 1000 millisecondi (1sec) prima di eseguire il comando successivo, ovvero di spegnere il led. Dopo averlo spento si fermerà per un altro secondo, ed il ciclo ricomincerà da loop().

    Nel prossimo esperimento sfrutteremo il wifi dell'ESP8266 per pilotare il led tramite il cellulare.

     
    #1
    Ultima modifica: 27 Giu 2015
    A marcyvee, Ghiardi Daniel, Wombat e 1 altro utente piace questo messaggio.
  2. DoctorD90

    DoctorD90 Livello 8

    Iscritto:
    23 Gen 2015
    Messaggi:
    186
    Like ricevuti:
    70
    Grazie! :sunglasses:
    Posso chiederti come fare il "richiamo di funzione"?

    tipo, in loop() metti delay, e poi LED 1 o LED 0, e lui chiama una funzione LED a cui se il parametro è 1, accende, se 0 spegne? ….su un esempio così banale, non penso sia difficile da implementare :smiley: almeno così imparo ancheil richiamo di funzione :smiley: che è sempre una cosa utilissima :smiley:
     
    #2
  3. StandardBus

    StandardBus Staff Alan Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    4.092
    Like ricevuti:
    5.291
    Non c'è nessuna funzione LED. Volendo si può creare una variabile che si chiama LED per facilitare la scrittura del codice, ma nel programma di esempio il LED è identificato dal numero 2, ovvero la porta GPIO2, l'unica a cui ho collegato un LED. High e low determinano se il LED deve essere acceso o spento.
    Comunque ho aggiunto all'articolo un pezzo che parla della funzione delay.
     
    #3
  4. DoctorD90

    DoctorD90 Livello 8

    Iscritto:
    23 Gen 2015
    Messaggi:
    186
    Like ricevuti:
    70
    Si, ma intendo, se si volessero creare sotto routine, che richiedono robe complicate, ma che vanno richiamate più volte durante l'esecuzione del codice, come si fa? Nel caso di cui ti chiedevo prima, ho ipotizzato una funzione "LED" a cui si manda 1 o 0, ed a seconda che sia 1 mette high, se = mette low....pensavo una cosa del genere (non so il C)

    void loop() {
    LED(2,1);
    delay(1000);
    LED(2,0);
    delay(1000);
    }


    void LED(pin, state) {
    if {$state == 1} {
    digitalWrite($pin, HIGH);
    } else {
    digitalWrite($pin, LOW);
    }

    }

    Qualcosa simile, giusto per capire le nidificazioni di processi :smiley: che in questo caso sono MOLTO semplici :smiley: ma in programmi più complicati aiutano molto alle volte, anzicchè ricopiare/incollare intere parti :smiley:
     
    #4
  5. lokiu.ox

    lokiu.ox Livello 10

    Iscritto:
    14 Feb 2015
    Messaggi:
    296
    Like ricevuti:
    129
    Stavo pensando di acquistare l'ESP8266 per espandere le funzionalità del mio Arduino Due, utile perché lavorano entrambi a 3.3v, quindi non avrei neanche problemi di compatibilità. Praticamente nel mio progetto l'ESP8266 fungerebbe solo da estensione Wi-Fi per l'Arduino, in modo da potergli passare comandi via internet. Il modo più semplice e funzionale a cui avevo pensato è questo: dopo aver configurato l'ESP8266 per connettersi alla rete di casa, il codice si dividerebbe in due parti, la parte dell'ESP8266, costituito dal server web, consisterebbe in una semplice pagina (o qualcosa di simile, non ho ancora approfondito la parte "web") che accetta parametri e valori (e.g. 127.0.0.1/?ledblink=1 o 127.0.0.1/?command=blinkled1). Questi parametri poi non verrebbero elaborati/eseguiti dall'ESP8266, ma verrebbero passati, sfruttando la comunicazione seriale, direttamente ad Arduino Due, il quale (questa sarebbe la seconda parte del codice) provvederebbe ad elaborarli e ad eseguire l'azione (pre-programmata) corrispondente, per poi restituire un feedback all'ESP8266 che verrebbe visualizzato sull'interfaccia web (qualcosa di molto semplice come "comando eseguito" o "parametro non corretto"). In questo modo non sarei limitato ai pochi pin dell'ESP8266 e potrei realizzare lavori più complessi...
    E' una buona tecnica o c'è un modo più semplice per farlo? :smiley:
     
    #5
  6. RyujiAndy

    RyujiAndy Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿ Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    557
    Like ricevuti:
    390
    La funzione da te creata è superflua perchè HIGH non è altro che una variabile costante con valore 1 e viceversa per LOW
     
    #6
  7. DoctorD90

    DoctorD90 Livello 8

    Iscritto:
    23 Gen 2015
    Messaggi:
    186
    Like ricevuti:
    70
    Ryuji, so che è superflua....totalmente inutile! era solo per imparare come creare sotto processi a cui mandare variabili :smile: per il resto so perfettamente la sua inutilità :smiley: ma saper creare sottoprocessi in cose più complicate l'ho sempre trovato di una utilità estrema! questo scenario è banalissimo, e quindi buono per imparare una cosa simile :smile: era lo spirito :P perchè non penso che il mio processo sia giusto xD ..per questo chiedevo xD

    Se cerchi sul web, una rapidissima ricerca, ricordo che hanno gi sviluppato (tra i primi progetti) un web server per mandare comandi....male che vada (mi pare di capire che sai programare da te), editi qualche riga ed anzicchè processare il comando da te(ESP8266), lo mandi ad arduino :smiley: ..se cerchi mi pare ci dovrebbe essere qualcsa di già quasi fatto :smiley:
     
    #7
  8. RyujiAndy

    RyujiAndy Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿ Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    557
    Like ricevuti:
    390
    Mi dispiace correggere ma non sono sottoprocessi ma funzioni che possono essere richiamate poi ci sono le librerie anchesse semplici funzioni che però devono essere prima richiamate, peccato che non ho tempo al momento per continuare le lezioni sul wiring
     
    #8
  9. DoctorD90

    DoctorD90 Livello 8

    Iscritto:
    23 Gen 2015
    Messaggi:
    186
    Like ricevuti:
    70
    TI DISPIACE?? Ma scherzi? :smiley: anzi! grazie mille per la precisazione :smiley: così imparo :smile: sappi che quando le comincerai/tornerai a scrivere, io sarò ben felice di seguirle :smiley:
    Se però fino ad allora mi mostri giusto un banale esempio di richiamo di funzione mi faresti na cosa graditissima xD io lo faccio in altro linguaggio, quindi mi basta vedere "la struttura" per capire bene o male come funziona l'utilizzo della variabile e l'invio di una variabile :smiley: grazie millle!
     
    #9
  10. RyujiAndy

    RyujiAndy Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿ Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    557
    Like ricevuti:
    390
    prendo in esempio il tuo codice
    Codice:
    void loop() {
        LED(2,1);
        delay(1000);
        LED(2,0);
        delay(1000);
    }
    
    void LED(pin, state) {
        if ($state == 1) {
           digitalWrite($pin, HIGH);
        } else {
           digitalWrite($pin, LOW);
        }
    }
    
    e ti dico subito che non siamo in "php" ma in "c" quindi le variabili devono essere definite
    in questo caso il tutto diventa:
    Codice:
    void loop() {
      LED(2,1);
      delay(1000);
      LED(2,0);
      delay(1000);
    }
    
    void LED(int pin, int state) {
      if (state == 1) {
      digitalWrite(pin, HIGH);
      } else {
      digitalWrite(pin, LOW);
      }
    }
    
    c'erano un po' di errori di punteggiatura per il resto tutto bene.
     
    #10
    Ultima modifica: 26 Giu 2015
    A DoctorD90 piace questo elemento.
  11. DoctorD90

    DoctorD90 Livello 8

    Iscritto:
    23 Gen 2015
    Messaggi:
    186
    Like ricevuti:
    70
    Oh! grande :smiley: bello :smiley: quindi mi ci ero avvicinato parecchio, a come si scrive in ….c++ ? mi pare che per arduino si usi il c++….che neanche conosco xD ...cmq, quindi devo inizializzare il tipo di variabile che gli passo stesso tra le ( ) ...ok ottimo :smiley: ora resta solo capire il "return" xD e poi ci si può sbizzarrire un pò con le cavolatine di inizio :smiley: ..grazie mille :smiley:
     
    #11
  12. RyujiAndy

    RyujiAndy Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿ Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    557
    Like ricevuti:
    390
    Arduino si programma in wiring simile al c c++
     
    #12
    A DoctorD90 piace questo elemento.
  13. DoctorD90

    DoctorD90 Livello 8

    Iscritto:
    23 Gen 2015
    Messaggi:
    186
    Like ricevuti:
    70
    Ok...ora quindi devo imparare il c, il c++, ed il wiring :smiley: che bello xD sempre di più xD …….lol
     
    #13
  14. smartgatto

    smartgatto Livello 1

    Iscritto:
    2 Nov 2015
    Messaggi:
    2
    Like ricevuti:
    0
    Ciao, ho fatto esattamente tutto ciò che è descritto qui ma stranamente il mio led rimane acceso fisso...
    cosa potrebbe essere che non va? grazie!
     
    #14
  15. StandardBus

    StandardBus Staff Alan Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    4.092
    Like ricevuti:
    5.291
    Controlla se i collegamenti sono giusti, assicurati che l'alimentazione al led non arrivi da qualche altra parte e assicurati che lo sketch venga inviato correttamente all'ESP8266 (niente errori nell'ide arduino)
     
    #15
Sto caricando...

Condividi questa Pagina