martedì 20 febbraio 2018

Programmare ESP8266-01 con Arduino Uno








Con il passaggio a Windows 10 l'adattatore USB to TTL (1x PL2302HX USB to TTL converter) che usavo per programmare lo ESP8266-01 non funziona più'.

Questo perché'  il chip usato nell'adattatore e' "falso" e non riconosciuto dal driver di windows.

A questo punto avevo due cose da fare: o comprare un nuovo adattatore o ingegnarmi.
Allora ho pensato: "ma in fondo ho una scheda Arduino a casa che sicuramente potrà' aiutarmi"

In effetti dopo un po' di prove ecco come ho rimpiazzato l'adattatore USB - TTL con una scheda Arduino Uno (simile per altre schede Arduino)


Arduino come adattatore Seriale


L'idea e' di utilizzare l'adattatore USB - Serial già' a bordo di Arduino Uno per poter programmare lo ESP8266-01 tramite l'IDE Arduino.

Per fare cio' e' necessario bypassare il bootloader dell'Atmega e far si che su Arduino non giri nessun programma.

Cio' si fa' semplicemente collegando il pin RST (Reset) a  GND. 

Sotto lo schema su breadboard dei collegamenti necessari per poter programmare correttamente lo ESP8266-01 con Arduino.


Nota:

lo ESP8266-01 e' perfettamente tollerante a segnali seriali da 5V

Il lettore che per qualche ragione pensasse che ciò' non e' sicuro e' invitato a non realizzare il circuito.

In ogni caso la responsabilità' del buon funzionamento di Arduino e dello ESP8266 e' demandata al lettore.














Qui sotto il relativo schema elettrico







e la realizzazione su breadboard






Uso dei pulsanti

Come e' possibile notare dallo schema elettrico sono presenti due pulsanti collegati nel seguente modo:


  • SW Reset: sul pin RST di ESP8266
  • SW Flash: sul pin GPIO0 di ESP8266


Questo e' necessario in quanto per poter programmare correttamente lo ESP8266-01 e' necessario portarlo nello stato UART Download Mode (piu' informazioni qui)


Questo si ottiene con la seguente procedura:


  1. si mantiene premuto il pulsante SW Flash
  2. si preme e si rilascia il pulsante SW Reset
  3. si rilascia il pulsante SW Flash

Suggerisco di effettuare tale procedura solo alcuni secondi prima dell'inizio del caricamento dello sketch dal PC allo ESP8266-01










ESP8266-01 Dev Board

Siccome i pin dello ESP8266-01 non sono compatibili con una breadboard io utilizzo una dev board realizzata da me.

Potete trovare tutti i dettagli qui se volete divertirvi a costruirla.






Test

Qui un semplice Sketch di test per verificare che in effetti si riesce a caricare uno sketch su EPS8266-01




Qui sotto il dettaglio di cosa dovreste ottenere nel vostro ambiente se il caricamene avviene con successo.

















venerdì 16 febbraio 2018

Arduino e Demultiplexer SN74LS138








Quando si inizia a realizzare i primissimi progetti con Arduino i dispositivi esterni da controllare sono pochi (1 o 2 Led oppure 1 motore DC) e i GPIO forniti da Arduino sono sufficienti.

Tuttavia quando si inizia a realizzare progetti più complessi con un numero maggiore di dispositivi da controllare (un numero di led superiore ai GPIO di Arduino) iniziano le prime perplessità'. La domanda tipica  é : "Come faccio a controllare 20 led se ho solo 8 GPIO?"

Ci sono vari modi ed il più comune é utilizzare un Demultiplexer.

Demultiplexer

Il demultiplexer e' circuito elettronico che permette di selezionare una delle N uscite tramite M pin di controllo o indirizzo.

dove

M  = log2(N)


Quindi all'atto pratico un demultiplexer ad 8 uscite si controlla con 3 pin d'indirizzo.

Questa proprietà'  ci fa immediatamente capire che in questo modo si può' ridurre notevolmente l'uso dei GPIO di Arduino.

Quindi senza demultiplexer per controllare 8 Led devo impiegare 8 GPIO di Arduino.
Al contrario tramite l'uso di un demultiplexer sono necessari solo 3 GPIO di Arduino, lasciandone 5 liberi per altri scopi.

Chiaramente i demultiplexer si possono collegare in cascata per controllare un numero ancora maggiore di uscite. Questo post non tratta la cascata di demultiplexer

SN74LS138

Sul mercato ci sono moltissimi tipi di demultiplexer forniti dai vari produttori con molte sigle, ma fondamentalmente funzionano tutti nello stesso modo e seguendo lo stesso principio.

Io ho in casa un SN74LS138 e quindi lo uso in quest post e faccio vedere come pilotare 8 Led con 3 GPIO di Arduino Uno.

Se voi avete un demultiplexer con un'altra sigla, niente paura: controllate il suo datasheet per vedere come sono disposti e chiamati i pin.


Qui il datasheet del SN74L38




In figura riporto la disposizione dei pin sul chip.

I piedini hanno la seguente funzione:

  • A - B - C: 3 pin di indirizzo per selezionare una delle 8 uscite Y0-Y7
  • G2A - G2B : Input Enable attivi LOW controllano lo stato delle uscite
  • G1: Input Enable attivo HIGH controlla lo stato delle uscite
  • Y7: uscita #8
  • GND 
  • VCC
  • Y0- Y6: uscita da #1 a #7







Gli input enable sono utilizzati quando si crea una cascata.

Nel nostro caso di demultiplexer singolo gli Input Enable devono assumere questi stati:


  • G2A: LOW
  • G2B: LOW
  • G1: HIGH


Qui sotto la "tabella di verità'" che indica chiaramente come vengono attivate le uscite al variare dei pin di indirizzo.

Da notare che i pin sono chiamati C,B, A corrispondono ai pin A, B, C della figura sopra






Quindi da questa tabella si vede che per attivare l'uscita #1 (Y0) bisogna settare i pin di indirizzo in questo modo:


  • A: LOW
  • B: LOW
  • C: LOW
mentre per attivare l'uscita #6 (Y5) bisogna settare i pin di indirizzo in questo modo:


  • A: HIGH
  • B: LOW
  • C: HIGH

Realizzazione con Arduino

Sotto vedete lo schema dei collegamenti su breadboard per usare il demultiplexer con Arduino.




Da datasheet il SN74LS138 puo' assorbire al max 8mA per uscita, quindi ho dimensionato al resistenza a 470 Ohm rimanendo perciò' sotto il limite massimo.







Qui la mia realizzazione





Codice di prova

Qui un semplice codice di prova che implementa la classica barra a led scorrevole usando solo 3 GPIO di Arduino





Qui un codice "naive" per chi mastica poco il C.


 Qui il video di funzionamento











venerdì 2 febbraio 2018

Pulsanti e Resistenze di Pull Up-Down con Arduino







In questo post tratto un tema base per chi si avvicina ad Arduino ed in particolare come leggere correttamente lo stato di un pulsante ed accendere un led di conseguenza.

Il tema puo' sembrare banale ma ho visto sul gruppo Facebook che moltissime persone che si avvicinano ad Arduino non hanno ben chiaro il concetto di Resistenza di Pull-Up e di Pull-Down.

In questo post spiego questo concetto e lo applico ad un pulsante. 

Questo e' un concetto base che poi e' utilizzato in altri scenari nell'uso di Arduino e nella realizzazione di progetti.


Alta Impedenza

Quando in uno sketch impostiamo (tipicamente nel setup) un digital pin a input




Il pin in questione viene portato in uno stato di Alta Impedenza,  come se in serie al pin ci sia una resistenza da 100 MOhM. In tale stato il pin in ingresso richiede una piccolissima corrente per cambiare stato logico.

In altre parole il pin in alta impedenza si comporta come una "semplicissima "antenna" e puo' captare qualsiasi tipo di rumore o perturbazione e di conseguenza cambiare stato logico in maniera casuale e non controllabile.




Per esempio nel codice qui sopra in cui accendiamo un led in base allo stato di un pulsante, non riusciremo a raggiungere l'effetto desiderato in quanto il led si accenderà' anche senza una pressione del pulsante.


Pull-Up e Pull-Down

Il problema sopra evidenziato si risolve collegando opportunamente una resistenza al pin in question.







Piu' nello specifico ci sono due configurazioni possibili:

  • Pull-Up: si inserisce un'opportuna resistenza (10-100K Ohm) tra il piedino e l'alimentazione (VCC)
  • Pull-Down:si inserisce un'opportuna resistenza (10-100K Ohm) tra il piedino e la massa (GND)


Vediamo piu' in dettaglio il funzionamento (la linea blu rappresenta il flusso di corrente).





Pull-Up


In questo caso si vede che con il pulsante OFF (non premuto) il pin assume stato logico stabile 1 (HIGH).
Contrariamente al caso in cui la resistenza non e' presente lo stato logico 1 permane all'ingresso del pin di arduino in modo stabile e permanente.





In questo caso si vede che alla pressione del pulsante la corrente fluisce verso massa portando il pin allo stato logico 0 (LOW).

Pull-Down





In questo caso si vede che con il pulsante OFF (non premuto) il pin assume stato logico stabile 0 (LOW).
Contrariamente al caso in cui la resistenza non e' presente lo stato logico 0 permane all'ingresso del pin di arduino in modo stabile e permanente.






In questo caso si vede che alla pressione del pulsante la corrente fluisce verso massa portando il pin allo stato logico 1 (HIGH).



Circuito con Pulsante e resistenza di Pull-Up

Qui il classico schema elettrico per il collegamento di un pulsante ad arduino in modo corretto (a meno del bouncing)





Qui lo schema su breadboard





Qui un semplice codice di test.





Circuito con Pulsante e resistenza di Pull-Down

Qui il classico schema elettrico per il collegamento di un pulsante ad arduino in modo corretto (a meno del bouncing)



Qui lo schema su breadboard






Qui un semplice codice di test







Circuito con Pulsante senza Resistenza

Ora che il concetto di Pull-Up e Pull-Down e' chiaro possiamo sfruttare una caratteristica del micro Atmel 328 (quello di arduino).
In particolare questo micro controllore fornisce internamente per ogni pin di I/O digitale una resistenza di Pull-Up.

Questo e' un grande vantaggio in quanto ci permette di risparmiare una resistenza e di semplificare il nostro circuito.

Qui il classico schema elettrico per il collegamento di un pulsante ad arduino in modo corretto (a meno del bouncing) senza resistenza di Pull.









Qui un semplice codice di test



Come si vede basta durante la configurazione del pin di input usare il valore INPUT_PULLUP e la resistenza interna al micro viene abilitata.

Si fa notare che la resistenza interna e' solo di Pull-UP.
Se si vuole usare la configurazione Pull-Down e' necessario inserire la resistenza esternamente come mostrato sopra.

Spero con questo post di fare un po' di chiarezza per chi e' alle prime armi e non ha le nozioni base di elettronica ed elettrotecnica.