sabato 30 novembre 2013

Self Balancing Robot - parte 6 - quella magic box chiamata PID

Croce e delizia di ogni progetto di self balancing è il PID.
Il PID è acronimo di Proporzionale/Integrale/Derivativo, ed è un sistema che prendendo come parametro di ingresso un valore di errore, restituisce un valore di uscita che dovrebbe servire a riportare il sistema controllato a un valore di errore pari a zero.
L'argomento è decisamente interessante e anche la sua trattazione matematica, ma se anche voi come me volete capire e fare senza avere una laurea in matematica, allora seguite i miei ragionamenti che forse saranno bestemmie per i colti matematici, ma vi assicuro che permetteranno di capire e di far funzionare le cose, la prova è che io sono riuscito a bilanciare il robot senza nessuna simulazione o calcoli tavolino.

La cosa interessante è che una volta capito cos'è un pid vi renderete conto che tantissime cose che vi circondano sono gestite con un pid, che può essere di volta in volta meccanico, elettronico o software. Vi faccio un esempio: il cruise control dell'automobile, il termostato elettronico della caldaia di casa, ecc.
Vediamo di capire il funzionamento del PID.
Immaginiamo un serbatoio di acqua che deve essere mantenuto il più possibile a livello costante. Un omino guarda ogni 10 minuti nel serbatoio e vigila su di esso. Quando il serbatoio aumenta di livello e supera il livello prestabilito, l'omino deve svuotarlo fino al raggiungimento del livello, se invece il livello cala perchè l'acqua viene usata da qualcuno, allora l'omino deve accendere una pompa e ripristinare il livello attingendo dal ruscello affianco.
L'omino ragiona in base al livello dell'acqua in quel momento e il livello ottimale. La differenza costituisce il nostro valore di ERRORE. 
Se l'acqua sale, l'errore sarà positivo, se l'acqua scende l'errore sarà negativo.
Immaginiamo ora alcune dinamiche:
piove molto e l'acqua sale. L'omino si rende conto del livello accresciuto e scarica l'acqua. Ma quando raggiunge il livello ottimale si accinge a chiudere lo scarico, ma nel farlo il livello ottimale viene raggiunto e sorpassato verso il basso a causa di un ritardo nel chiudere lo scarico. A questo punto l'omino apre la pompa per aggiungere altra acqua ma quando raggiunge il livello, nonostante chiuda la pompa nel più breve tempo possibile, il livello ottimale viene superato verso l'alto, seppur di poco. Di nuovo l'omino scarica ritrovandosi di nuovo sotto livello e poi carica fino ad ottenere un nuovo livello molto più vicino rispetto a prima al valore ottimale.

Self Balancing Robot - parte 5 - Usare gli encoder

Inizio il post premettendo che non servono gli encoder per tenere in equilibrio il robot. Ma se volete ottenere un robot che stia in equilibrio senza mostrare nervosismo e che sappia reagire bene all'azione di forze esterne, allora l'encoder è lo strumento corretto per aggiungere un ulteriore parametro alla stabilità.
In ogni caso avete visto in uno dei post precedenti che l'encoder mi è servito per  determinare la risposta dei motori in funzione del segnale pwm inviato, e calibrarne così la curva di risposta in modo da avere il più possibile due risposte identiche da parte dei due motori.

Esistono vari tipi di encoder, quelli montati sui motori nel mio progetto sono di tipo ad effetto Hall.
Non tratterò qui la teoria degli encoder visto che è ampiamente documentata in rete. Mi limiterò a spiegare come usare il dato che essi possono fornire e come ottenerlo via codice.
Partendo dalla documentazione dei motori, vediamo come collegare gli encoder. Dalla pagina del produttore si può leggere che questo encoder montato sul Pololu 29:1 ha una risoluzione di 1856 count per giro.
Questo potrebbe trarre in inganno. Se voi provate sperimentalmente a leggere il valore restituito dagli encoder troverete un valore molto più basso, per la precisione 1/4 di 1856. 
Qual'è il motivo? L'encoder lavora "in quadratura", ovvero restituisce su 2 pin diversi un'onda quadra alla stessa frequenza ma sfasate tra loro di 90°, in modo che elaborandole si possa capire non solo la velocità (proporzionale alla frequenza dell'onda) ma anche la direzione.

venerdì 29 novembre 2013

Rilevazione presenze con Rfid - parte 2 - La postazione di rilevazione

Vediamo nel dettaglio le componenti della postazione di rilevazione:

a) un lettore rfid costituito da una scheda Mifare Rc522 che si trova facilmente su ebay in accoppiata a una card o tag rfid.


La scheda utilizza lo standard SPI per la comunicazione con arduino. il collegamento é quello classico delle periferiche Spi: 2 piedini di alimentazione 3.3V e Gnd, 5 pin per la comunicazione : miso, mosi, sck, sda e rst. In questa scheda esiste un ottavo piedino scollegato denominato NC.
Per il controllo non ci si deve preoccupare perché esistono in rete molte librerie di controllo giá pronte all'uso. Nel mio caso ho preferito prendere una libreria esistente ed includerla nel progetto, in modo da ripulirla dalle funzioni in eccesso.Tuttavia se preferite utilizzarne una fatta e finita cercate in google con le keyword 'MFRC522 library arduino'
b) una scheda real time clock, ovvero un vero e proprio orologio in grado di fornire l'ora e la data. Tale scheda è autonoma in quanto possiede una batteria tampone che gli permette di mantenere l'ora corrente anche in caso di mancanza di tensione. Io ho utilizzato una Shield basata sul chip DS1307. La comunicazione è basata sullo standard I2C.

mercoledì 27 novembre 2013

Rilevazione presenze con Rfid - parte 1 - Introduzione

Oggi vorrei descrivere una semplice soluzione pensata per la rilevazione delle presenze in azienda. La soluzione, davvero economica, permette di registrare gli ingressi ed uscite dei dipendenti dotandoli di un chip rfid personale, di quelli che ormai si trovano in tutte le forme: portachiavi, tessere, adesivi, ecc. La registrazione dei dati avviene su un database Sql Server (ma la soluzione é facilmente adattabile ad altri db) e la soluzione é completa di interfaccia web per la consultazione dei report mensili di presenza.

Il sistema di fatto é una piccola soluzione client-server dove il client é costituito da un lettore rfid collegato a un Arduino Uno interfacciato via rete lan con un server Windows, dove i dati vengono scambiati con Arduino mediante un semplice protocollo rest basato su un server IIS. 

Descriverò passo passo tutte le componenti, in modo che possiate facilmente replicare e personalizzare questo progetto.


Cosa serve per iniziare:

  • una scheda Arduino Uno (circa € 25)
  • una Ethernet Shield  (circa € 30)
  • un display lcd grafico 84x48 retroilluminato NOKIA 5110 ( circa € 5) 
  • un modulo Lettore RFID mifare RC522 reader (circa € 15)
  • una scheda clock  DS 1307 RTC real time clock  (circa € 5)
  • un buzzer e una resistenza da 220 Ohm ( < € 1 )
  • una protoboard 
  • uno o più chip rfid a standard mifare (€ 3 cadauno)


domenica 24 novembre 2013

Self Balancing Robot - parte 4 - Controllare e calibrare i motori

Per il controllo dei motori la mia scelta è andata su una economica scheda della Microbot (http://www.microbot.it/product/60/Dual-DC-Motor-Shield.html). Questa scheda dispone di 2 canali, ovvero può controllare fino a 2 motori in corrente continua. La scheda è la classica shield che si monta a castello sopra la scheda arduino. La fonte di alimentazione, a scelta tramite apposito jumper, può essere scelta tra i 5V interni provenienti dalla scheda arduino (sconsigliato), oppure da una fonte esterna.
Scegliendo la seconda, è possibile pilotare motori con tensioni ben superiori ai 5V, come è il caso dei motori Pololu scelti che funzionano a 12V.
Il controllo dei motori è davvero facile: per ogni motore sono necessarie 3 uscite di arduino, due in digitale per determinare la direzione di rotazione oppure lo stato di stop ("freno a mano"), uno in analogico (pwm) per determinare la velocità di rotazione.
Come già descritto in uno dei post precedenti, uno dei problemi è proprio quello di determinare il vero "zero" del motore, ovvero il valore di segnale minimo fino al quale il motore non si muove. Il secondo problema è la differenza di velocità tra un motore e l'altro.
Nel mio caso, ma forse è un problema della scheda, ho notato differenze significative sulla tensione in uscita nei due canali della scheda a parità di segnale pwm in ingresso.
Prima di iniziare a lavorare con logiche PID e algoritmi di filtraggio è bene predisporre al meglio l'hardware su cui lavoreremo, per essere sicuri di avere una risposta il più possibile lineare, compensando in modo software i problemi dovuti ad attrito interno nei motori, di peso del robot e di differenza di velocità.

Per fare questo ho predisposto un semplice sketch arduino che fa ruotare entrambi i motori a velocità costante, incrementando la velocità ogni 5 secondi, e misurando tramite gli encoder la velocità reale delle ruote. In output, sulla console seriale, viene mostrato per ogni valore pwm in ingresso, il rapporto tra la velocità dei motori, in particolare il rapporto di velocità tra il primo motore e il secondo.
Lo scopo è raccogliere questi valori (256 valori) e utilizzarli per creare una funzione che restituisca il corretto valore da applicare al 2° motore (quello più lento nel mio caso), in modo che il valore diverso pwm applicato provochi una velocità di rotazione identica (o il più possibile simile) ad entrambi i motori.

Self Balancing Robot - parte 3 - reinventare la ruota

Scegliere un buon motore può essere insufficiente se poi viene applicata una ruota troppo piccola. Non servono formule matematiche per capire che una ruota piccola deve fare molti più giri per percorrere la stessa distanza di una ruota grande. Un motore lento accoppiato a una ruota piccola difficilmente vi permetterà di avere i giusti tempi di reazione per recuperare l'equilibrio, mentre un motore veloce accoppiato a una ruota grande vi permetterà di raggiungere più facilmente il vostro obiettivo.
Ci sono nella rete e in particolare su Youtube parecchi progetti dove si vedono ruote piccole: in realtà osservando bene la natura dei progetti, si potrà notare che la dimensione della ruota è spesso dimensionata alla massa dell'oggetto. Un oggetto grande e pesante tenderà potenzialmente a "correre di più" in caduta, e quindi per i motivi espressi nel precedente post, una ruota più grande migliorerà la stabilità.
Vorrei far notare come tanti video in realtà mostrano dei self balancing robot che operano su un tappeto o comunque su una superficie morbida. La superficie morbida incrementa moltissimo la stabilità perchè da una parte rallenta tutti i movimenti compresa la caduta, e dall'altra permette il mantenimento dell'equilibrio senza applicare forze sul robot. Se non siete convinti, prendete un uovo e provate a farlo stare in equilibrio su una piastrella, poi provate sulla sabbia. Oppure provate ad andare con la bicicletta nella ghiaia. Il principio è lo stesso.
Ovviamente l'obiettivo del progetto è riuscire a mantenere in equilibrio il robot sulla peggior superficie esistente, ovvero quella perfettamente liscia.

sabato 23 novembre 2013

Self Balancing Robot - parte 2 - scegliere i motori


Il primo errore di chi tenta di realizzare un progetto di self balancing è quello di scegliere un motore sbagliato.
La prima cosa da dire è che quello che tutti chiamano motore nella realtà quello che serve è un motoriduttore, ovvero un motore accoppiato a una serie di ingranaggi in grado di demoltiplicare di molto i giri del motore. 
Tutti noi da piccoli (beh, forse non tutti, ma se state leggendo questo articolo forse lo avete fatto) abbiamo smontato il trenino Lima o il motorino della Lego, e ricordiamo come all'interno di esso vi fossero degli ingranaggi. Perchè sono necessari questi ingranaggi? Perchè i motorini elettrici normalmente fanno migliaia di giri al minuto, e così sono inutilizzabili per la maggiorparte degli usi pratici, a meno di non ridurre in modo significativo il numero di giri. Il secondo vantaggio nell'utilizzare un demoltiplicatore, è quello di aumentare la coppia, ovvero la forza che ha il motore. Infatti qualcuno potrebbe obiettare che un motore elettrico in corrente continua si può facilmente pilotare variando la tensione, ma se il numero di giri voluto è significativamente basso rispetto al numero massimo di giri che il motore è in grado di ottenere alla tensione massima, il controllarlo con una tensione ridottissima comporterebbe avere un motore con una forza estremamente debole.

Self Balancing Robot - parte 1 - un progetto con Arduino senza conoscere la fisica e la matematica

Inizio con questo post a documentare un progettino che mi ha occupato nel tempo libero per circa 3 mesi. Era quasi una sfida personale riuscire a progettare e realizzare un progetto di self balancing robot, ovvero un dispositivo in grado di mantenersi in equilibrio su 2 ruote basandosi sui principi del pendolo inverso. 
Avendo concluso l'università da quasi un ventennio, ho ben presto realizzato quanto le mie competenze nel campo della matematica e della fisica, necessarie per questo progetto, fossero ormai svanite e ridotte praticamente a zero. Sono uno sviluppatore, lo faccio di professione, programmare Arduino è facile per me quanto preparare un caffè, ma qui la sfida vera e propria era riuscire a realizzare il tutto senza tornare pesantemente sui libri di scuola. 
A dispetto di quanto si può facilmente trovare in rete, dove la problematica viene affrontata e spiegata a colpi di teoremi di fisica e matematica, il mio obiettivo era basarsi su pochi concetti e arrivare a una soluzione del problema in modo sperimentale, per successivi tentativi, senza troppe formule e simulazioni a tavolino. 
Il percorso è stato molto lungo, perchè a differenza dei molti problemi di ingegneria del software che quotidianamente seguo, in questo caso la soluzione del problema era non solo legata alla pura traduzione di algoritmi in codice, ma al trovare la giusta ed unica combinazione di variabili necessarie a permettere al sistema di ottenere la situazione di equilibrio e di riportarla in tutti i casi in cui l'equilibrio venisse alterato. 
Gli errori sono stati molti, forse inevitabili, e cercherò di documentarli qui nei prossimi post il più possibile. 

 Da dove partire? Cosa serve? Per la realizzazione del progetto servono relativamente poche cose:
  • un microcontroller Arduino 
  • 2 motoriduttori con encoder
  • una scheda controller per i motori
  • una IMU (non la tassa!)
  • minuteria elettronica: qualche resistenza, dei led, interruttori e pulsanti 
  • 2 ruote, nel mio caso ottenute in pieno stile DIY (Do It Yourself) 
  • ovviamente un computer dove programmare
  • tanto ma tanto tempo (ed altrettanta pazienza).


 Nel prossimo post: quali motori scegliere