mercoledì 21 febbraio 2018

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.





venerdì 5 gennaio 2018

The DrawingBot







In this post I describe the making of a small robot called DrawingBot which draws some simple shapes or lines on a sheet of paper using a simple felt tip pen.





For the impatient one below the video of the making and the video of drawing executed by DrawingBot.

















Project


The project is intended for everyone that want to realize a small robot from scratch and the ones with the main purpose to learn and experiment.

Once realized the DrawingBot it is possible to draw some simple drawing which are not really accurate. However the main goal is not to draw but to build and understand how the DrawingBot works from mechanical, electrical and software point of view.


The project is made by the major elements:
  • the  STL files for the 3D printing of the chassis 






  • the Arduino code (sketch) to control the robot
  • a simple python app which allow the user to pro grammatically generate drawings on screen  and that automatically generates the DrawingBot commands

All the files are available on my github [here]

Making

Let's now see the steps to build and make the DrawingBot


1- Printing of the  DrawingBot


Download the STL file for each component from my  github [here] and print them with your 3D printer


2- DrawingBot Assembling- Mechanical part


In the initial video I have assembled the DrawingBot from scratch hence all the steps are available in the video.

Below the Bill of Material of the  DrawingBot containing all the necessary components







The assembling of the mechanical parts is quite simple and can be complete with a normal screw driver and just few bolt and nuts.


3- DrawingBot Assembling- Electrical part

Once all the 3D printed components are assembled it is time for the electronics which is based on standard and inexpensive components: 1x Arduino Uno, 2x stepper and  1x Servo.

The assembling of the circuit is very simple and it is done through the use of few rainbow DuPont wires, hence using a color code. For this reason this circuit can be made by everyone including kids and beginners.















In order to achieve a quite clean and ordered cabling I have realized a simple connection board by using a small strip board.
















Software forArduino

The DrawingBot's software is avaiable on my github [here].


There are few parameters that can be tweaked based on your specific needs:

  • PEN_DOWN:  rotation angle of the servo when the pen is down (drawing)
  • PEN_UP: rotation angle of the servo when the pen is up (moving)
  • wheel_dia: wheel's diameter in mm
  • wheel_dia_correction: correction factor to make the DrawingBot more accurate
  • wheel_base: width wheel-to-wheel in mm

Drawing Software

The drawingbot.py file contains a simple app in python that allow:

  • create and show on screen a programmatic drawing
  • automatically generate the commands for the DrawingBot

The programmatic drawing should be included in the following method: def drawing()





This generates a drawing on the screen





and in the console the DrawingBot's command will be printed




Now in the  drawingbot.ino file, after the below line just add the commands generated in the previous step

/* Insert here the drawing commands */


Compile and upload your sketch and after 5 seconds the DrawingBot will automatically start to execute the drawing

Happy DrawingBot-ting!!!! :)









DrawingBot







In questo post descrivo la realizzazione di un piccolo robot chiamato DrawingBot che realizza dei semplici disegni su un foglio di carta usando un comune pennarello.




Per chi e' impaziente ecco qui il video della realizzazione del Drawing Bot ed il video delle'esecuzione di un semplice disegno

















Progetto


Il progetto e' destinato a chiunque voglia realizzare un piccolo robot partendo da zero e che abbia come scopo principale l'apprendere ed il capire.
Una volta realizzato il DrawingBot si possono realizzare dei semplici disegni che risultano abbastanza imprecisi. Come detto lo scopo finale e' la realizzazione e non l'uso del DrawingBot.


Il progetto e' composto da 3 elementi principali:

  • i file STL per la stampa in 3D dello chassis






  • il codice per Arduino per il controllo del Robot
  • un file in python che permette di disegnare a video e generare automaticamente i comandi da fornire a DrawingBot per effettuare il disegno 

Tutti i file sono disponibili sul mio github [qui]

Realizzazione Pratica

Vediamo i passi per la realizzazione pratica del DrawingBot


1- Stampa del DrawingBot


Scaricare i file STL di tutti gli elementi del DrawingBot dal mio github [qui] e stamparli con una stampante 3D.


2- Assemblaggio del DrawingBot - Meccanica


Nel video iniziale ho assemblato il DrawingBot partendo da zero, quindi potete vedere tutti i passi.

Riporto qui la Bill of Material del DrawingBot con tutti i componenti necessari







In ogni caso l'assemblaggio della parte meccanica e' semplicissimo in quanto richiede solo un cacciavite e alcune viti e bulloni.


3- Assemblaggio del DrawingBot - Elettrico

Una volta assemblato i pezzi stampati del DrawingBot bisogna montare la parte elettrica che e' basata su Arduino Uno, 2x motori passo-passo ed 1x Servo.

L'assemblaggio del circuito elettrico utilizza una serie di rainbow cable e quindi si basa su un codice colore ed e' quindi di facilissima realizzazione adatta anche ai meno esperti.














Per ottenere un cablaggio pulito ho realizzato una semplicissima basetta che mi permette di connettere i vari cavi in modo chiaro e pulito
















Software per Arduino

Il software per il DrawingBot e' disponibile sul mio github [qui].


Ci sono pochissimi parametri che potete regolare in base alle vostre esigenze:

  • PEN_DOWN:  angolo di rotazione del servo quando la penna e' giu'
  • PEN_UP: angolo di rotazione del servo quando la penna e' su'
  • wheel_dia: diametro in millimetri della ruota
  • wheel_dia_correction: fattore di correzione per rendere il DrawingBot piu' preciso
  • wheel_base: larghezza da ruota a ruota in millimetri (lato esterno della ruota)

Software per Disegnare

Il file drawingbot.py contiene un semplice programma in python che permette di:

  • visualizzare su schermo un disegno algoritmico
  • generare automaticamente i comandi per il DrawingBot

Il disegno va realizzato nel metodo: def drawing()





Questo genera un disegno sullo schermo




e nella console vengono stampati i comandi da fornire a DrawingBot




Ora nel file drawingbot.ino aggiungete/sostituite i comandi generati dopo la seguente linea

/* Insert here the drawing commands */


Compilate e caricate lo Sketch su Arduino e dopo 5 secondi il DrawingBot iniziera' a realizzare il disegno autonomamente

Buon divertimento!!!! :)