mercoledì 28 febbraio 2018

L298N Driver Motori con Arduino








Oggi mi e' capitato sotto mano una scheda driver motore basata sull'integrato L298N.

In questo post faccio la prova della scheda e la interfaccio ad Arduino.


Scheda Motori L298N


La schedina e' un controller/driver per 2 motori DC che si può' interfacciare ad Arduino e ESP8266 e ovviamente a moltissimi altri micro o schede di sviluppo.

Questa scheda può' essere usata anche per controllare dei motori passo passo ma non e' oggetto di questo post.











La scheda si basa sull'integrato L298N che e' un doppio H-Bridge e può' controllare 2 motori DC per un totale di 4A.



Scheda L298N Piedinatura


In foto vediamo i pin ed i connettori disponibili sulla scheda




I due connettori laterali sono dedicati alla connessione dei due motori DC. L'ordine di connessione dei fili non e' importante.

Il connettore frontale serve per l'alimentazione:

  • +12V: alimentazione fino a 12V
  • GND
  • +5V: questo pin e' un uscita e fornisce 5 Volt. L'uscita e' attiva solo se il relativo ponticello (+5V Enable) e' presente

Il successivo connettore e' formato da 2 ponticelli e 4 pin:

  • Enable Output A: abilita il motore A
  • IN1 - IN2: controllo rotazione motore A
  • IN3 - IN4: controllo rotazione motore B
  • Enable Output B: abilita motore B


E' importante notare come i pin di Enable Output A/B permettano di controllare la velocità' di rotazione dei due motore.










Rotazione senza controllo di velocità


Vediamo ora l'utilizzo di questa scheda driver con Arduino.

Nell'esempio sotto riportato vediamo come effettuare il circuito su breadboard per controllare la rotazione in senso orario e antiorario di un motore DC.






Qui la realizzazione su breadboard






Come si può' osservare in questo case ho lasciato il ponticello su Enable Output A.

Vediamo ora un semplice codice di controllo




Come si vede ci sono tre stati per i GPIO 7 e 8:


  1. GPIO 7 = HIGH - GPIO 8 = LOW --> il motore ruota in senso orario
  2. GPIO 7 = LOW - GPIO 8 = HIGH --> il motore ruota in senso antiorario
  3. GPIO 7 = LOW - GPIO 8 = LOW --> il motore e' fermo

Quindi questa scheda ci permette di controllare la rotazione di uno o due motori DC in maniera semplicissima utilizzando solamente 2 GPIO per motore.

I motori ovviamente sono controllabili indipendentemente l'uno dall'altro. 

Questo per esempio e' molto utile nei classici progetti di RobotCar o simili














Rotazione con controllo di velocità'


Nell'esempio sotto riportato vediamo come effettuare il circuito su breadboard per controllare la rotazione in senso orario e antiorario di un motore DC con controllo di velocità'.

Nello sketch vedremo come e' possibile anche variare la velocità' di rotazione del motore permettendo di accelerare e decelerare (io lo faccio vedere con accelerazione costante per semplicità').





Come si vede l'unica differenza con lo schema precedente e' che ho rimosso il ponticello Enable Output A ed ho collegato il pin and un GPIO PWM (#9) di Arduino.

E' importante che sia connesso ad un GPIO con uscita PWM, solo cosi' potremo controllare la velocità' proporzionalmente al valore in uscita sul pin PWM.


Qui la realizzazione su breadboard






Vediamo ora un semplice codice di controllo




Come si vede la gestione dei GPIO 7 e 8 e' uguale al caso precedente.

Nella funzione motor_accel ho aggiunto il controllo della velocità' accelerando in modo uniforme da zero alla massima velocità' e analogamente decelerando fino a zero prima di cambiare senso di rotazione.

Nella funzione si vede chiaramente che il controllo della velocità' di rotazione e' determinato dalla scrittura sul GPIO 9 di un valore tra 0 (fermo) e 255 (massima velocità').












mercoledì 21 febbraio 2018

Simple HTTP REST Server on ESP8266








My follower and my friends know that I am not a fan of Web Server on ESP8266 as this has negative architectural implications. In any case this is not the topic of this post.

In the past few days I have received some requests on how to create a Web Server on ESP8266.

As the typical use for ESP8266 is mostly as IoT device I think it make much more sense to show how to create a simple HTTP REST server on ESP8266 in order to manage some resources.

In this post I show how to manage 1 Led through a RESTful API on ESP8266.


Testing Circuit


The testing circuit is quite simple and is shown below











Code


The code of the REST server is available on my GitHub here











Testing


In order to test the REST server I use the curl command from command line (for the one who prefer a graphical interface I suggest the great  postman)

GET ROOT


The first command I execute is a HTTP GET of the server's root

The IP address will be certainly different in your case, so please replace it with your own (it is printed on Serial Monitor during ESP boot).






As you can see the string defined on line 118 is provided back by the server.


GET leds


Now time to query the REST server for leds resource through a HTTP GET





As you can see the HTTP code 204 is provided back meaning that the resource is neither available nor is empty.




POST leds


Now let's create the resource by providing a JSON body as part of the HTTP POST request. The JSON contains the following information:

  • id: a unique identifier of the resource
  • gpio: GPIO number on which the resource (led) is connected
  • status: resource's status (0 or LOW)





Now the server replies back with a 201 meaning that the resource has been successfully created.


Now I query again the resource through GET and this time server replies with 200 and with the JSON representation of the resource.




PUT leds


Now that the resource is available it is possible to modify it with a HTTP PUT


Also in this case I need to pass a JSON representation in the body of the request in which I set the status to 1(HIGH).






The server replies with a 200 code meaning that the update is successful and the led is turning on





In the same manner I can updated it with status = 0






and the led turns off





In the sample code I also manage other cases.

As an example if I update (PUT) a resource with id = 2





Server replies with 404 telling me that the resource is not existing 


I let to the reader the implementation of the DELETE method.

That's it folks!!! :)










Simple HTTP REST Server con ESP8266








Chi mi segue e conosce sa che non sono un supporter dell'implementazione di un Web Server su un modulo IoT come ESP8266. Fondamentalmente e' per ragioni architetturali che non discuto qui.

Tuttavia nei giorni passati ho ricevuto alcune richieste da utenti che inizia a cimentarsi con ESP8266 sul come realizzare un Web Server con ESP8266.

Ritengo che dato l'uso tipico di un dispositivo come ESP8266 nei progetti sia più' appropriato far vedere come si implementa un semplice HTTP REST server in modo da poter gestire delle risorse.

In questo articolo faccio vedere come gestire 1 Led tramite un API REST con ESP8266.


Circuito di Prova


Il circuito di prova e' banale e raffigurato qui sotto










Codice


Il codice e' disponibile sul mio GitHub qui











Test


Per fare il test uso il comando curl da linea di comando (per chi preferisce un client grafico puo' usare l'ottimo postman)

GET ROOT


il primo comando che eseguo e' un HTTP GET della root del server

L'indirizzo IP sara' certamente diverso nella vostra rete e quindi dovete sostituirlo con il vostro (viene stampato sul monitor seriale al boot del ESP8266)






Come si vede ci viene restituita la stringa definita nel codice nella linea 118

GET leds


Adesso interrogo la mia risorsa chiamata leds tramite una HTTP GET




Come si vede mi viene restituito uno stato uguale a 204 indicando che la risorsa non e' disponibile.



POST leds


Adesso creo la risorsa leds fornendo nel body del HTTP POST un json che contiene i seguenti attributi:

  • id: un numero identificastivo univoco
  • gpio: il numero di GPIO su cui la mia risorsa (led) e' collegato
  • status: lo stato della risorsa (0 o LOW)





Come si vede il server mi risponde con un codice 201 indicandomi che la mia risorsa e' stata creata correttamente.


Ora se invio nuovamente un GET sulla risorsa il server mi risponde con 200 e mi fornisce come risposta il JSON che rappresenta la risorsa





PUT leds


Ora che la risorsa esiste posso modificarla con un HTTP PUT.

Anche in questo caso nel body della richiesta inserisco un JSON in cui imposto status a 1 (HIGH)






il server mi risponde con  200 indicando che l'update della risorsa e' andato a buon fine e come si vede sotto il led si accende e rimane acceso.




Analogamente se invio un update con status = 0 





il led si spegne e rimane spento.




Nel codice di esempio ho anche gestito altri casi.

Per esempio se faccio l'update (PUT) di una risorsa con id = 2




ottengo un 404 indicandomi che tale risorsa non esiste.


Lascio al lettore l'implementazione del metodo DELETE.









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.