
In questo articolo vedremo come, utilizzando un comune ed economico accelerometro a 3 assi, un display LCD per visualizzare gli output, e la nostra fidata e collaudata piattaforma di sviluppo e prototipazione Arduino, sia possibile realizzare un inclinometro molto sensibile e compatto. Più precisamente, il dispositivo permetterà di misurare con accuratezza l'inclinazione sugli assi X e Y (roll e pitch), con molteplici applicazioni quali: livella su due assi, inclinometro per applicazioni industriali, macchine utensili, edilizia, fuoristrada, oppure, per chi utilizza spesso la bicicletta o la moto, per misurare l'angolo di incidenza di una salita (o discesa), oppure l'entità di una "piega" in curva, oltre ad altre innumerevoli applicazioni che soltanto la fantasia o le esigenze pratiche del momento possono suggerire. Vediamo insieme come realizzare passo-passo il progetto.
Introduzione
Dal punto di vista hardware, l'inclinometro è composto fondamentalmente da tre elementi:
- accelerometro: si tratta del sensore principale dell'applicazione, un dispositivo in grado di fornire il valore di accelerazione sui tre assi X, Y, e Z. Per questa applicazione abbiamo utilizzato l'accelerometro ADXL345 prodotto da Analog Devices, un accelerometro digitale molto preciso e sensibile, facilmente reperibile già installato su un modulino pronto per essere interfacciato con un microcontrollore. Il modulo accelerometro è completamente configurabile via software tramite una comoda interfaccia I2C;
- display LCD: in questo caso la scelta è ricaduta su un display LCD monocromatico a basso assorbimento, con le stesse caratteristiche di quello originariamente montato sui cellulari Nokia 5110/3110. Trattasi anche in questo caso di un display facilmente reperibile, con dimensione dello schermo pari a 1,5 pollici, e risoluzione di 84 x 48 punti. Indipendentemente da quale sia il loro produttore, questi display presentano tutti la caratteristica di utilizzare il controllore PCD8544 di Philips, che andrà opportunamente programmato durante la fase di inizializzazione dell'applicazione. Il display verrà utilizzato per monitorare in tempo reale i valori correnti di pitch e roll, ma potrebbe essere utilizzato per fornire altre informazioni, quali ad esempio una bitmap che rappresenta il valore corrente di inclinazione su uno dei due assi. Il modulo LCD, dotato anche di apposito circuito di retroilluminazione a led blu oppure bianchi (a seconda del modello), si interfaccerà con il microcontrollore tramite porta SPI;
- microcontrollore: come già anticipato in precedenza, ci servireremo della consolidata piattaforma Arduino, sia per la sua larghissima diffusione che per la semplicità (relativa in questo caso) di programmazione. In questo caso particolare, un vantaggio enorme deriva dalla disponibilità di librerie già pronte all'uso per quanto riguarda sia la comunicazione su bus I2C che su SPI. Potremo quindi concentrarci sull'applicazione vera e propria, senza dover riscrivere codice per implementare le interfacce hardware di comunicazione.
Dal punto di vista software, l'applicazione sarà invece composta da un unico sketch in grado di svolgere tutte le funzioni richieste dall'applicazione, le quali possono essere così sintetizzate:
- inizializzazione dell'accelerometro ADXL345 tramite opportuna configurazione dei registri interni del componente;
- inizializzazione del display LCD, tramite opportuna configurazione dei registri del controllore PCD8544;
- ciclo continuo con:
- acquisizione dei valori grezzi di accelerazione sui tre assi;
- conversione dei valori grezzi di accelerazione in componenti di accelerazione di gravità (numeri espressi in "g");
- calcolo degli angoli di inclinazione sugli assi X e Y (pitch e roll) tramite opportune trasformazioni trigonometriche;
- visualizzazione degli angoli di inclinazione sia su display LCD che su interfaccia seriale di debug.
- calibrazione (eseguita solo su richiesta dell'utente durante la fase di start-up): vengono in questo caso calcolati gli offset di accelerazione sui tre assi X, Y, e Z da inserire negli opportuni registri dell'accelerometro in modo tale da fornire, in condizioni di piano livellato, i valori di accelerazione attesi (Accx=0, Accy=0, Accz=1g).
Per ragioni di semplicità, si è preferito non implementare delle librerie specifiche per l'ADXL345 e per il display LCD. Lo sketch conterrà quindi tutte e sole le funzioni necessarie per implementare i requisiti dell'applicazione. Vedremo più in dettaglio queste funzioni successivamente, quando verrà esaminato il codice sorgente.
ADXL345
L'ADXL345 (il cui schema a blocchi è riportato nell'immagine seguente) è un accelerometro a 3 assi compatto e sottile, con assorbimento ultra-ridotto, elevata risoluzione (fino a 13 bit), e possibilità di misurare accelerazioni fino a ±16 g. I valori di accelerazione sono forniti in uscita su parole a 16-bit in complemento a 2 (due registri a 8-bit per ciascun asse). Il componente dispone di interfacciamento digitale con un microcontrollore esterno sia tramite I2C (il tipo di interfaccia che utilizzeremo nella nostra applicazione), che SPI.
La caratteristica rimarchevole di questo componente è la capacità di misurare le componenti di accelerazione sui 3 assi non solo in modo statico, ma anche dinamico. La prima caratteristica, misurando le componenti dell'accelerazione di gravità sui tre assi, permette di realizzare la funzionalità di tilt, particolarmente utile sui dispositivi mobile (smartphone e tablet) per determinare l'orientamento dello schermo ed eseguire, se abilitata, la rotazione dello stesso. [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3037 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Certo che questi accelerometri stanno trovando spazi in molte applicazioni e questo progetto è un esempio. Basta pensare ad alcune console di giochi, ma anche ad altre soluzioni più importanti come il controllo della sbandata nelle automobili (rilevazione dell’accelerazione laterale). Non sarebbe male affrontare questa tematica come sviluppo di un progetto con arduino.
Sono d’accordo con te. I controller destinati al gaming sono oggi provvisti di accelerometri a 6 assi (in realtà si tratta di un accelerometro a 3 assi analogo a quello impiegato nel progetto, più un giroscopio a 3 assi). Le applicazioni sono molteplici, inclusi i dispositivi indossabili, le attività sportive (per misurare varie grandezze legate al movimento dell’atleta), e altri ancori. Ricordiamo che prima dell’avvento del GPS i sistemi di navigazioni si basavano su accelerometri e giroscopi, con calcoli abbastanza complessi per determinare in ogni istante la posizione corrente.
Leggo sempre con piacere progetti/applicazioni professionali realizzate con Arduino, perché del resto la famosa scheda per artisti, makers ed hobbisti è pur sempre la demoboard dell’ATMEGA328
Bellissimo articolo, vorrei solo considerare la parte debole di questi sistemi per il calcolare yaw/pitch/roll o semplicemente il tilt è l’utilizzo della componente di gravità come vettore di riferimento. Ovviamente un mezzo (bici o motocicletta) in curva hanno più forze in gioco che introducono errori abbastanza significativi.
La fusione tra GPS e sensori 3-6-9DOF è un argomento molto interessante e complesso che serve a limitare questi effetti.
L’integrato MPU6050 ha un algoritmo di fusing interno che sfrutta accelerometro e giroscopio ed è abbastanza facile da utilizzare per chi si vuole cimentare.
Per chi è interessato penso che uno dei campi più attivi nel settore sia quello dei droni che soffrono nel tempo di drifting dei sensori etc, molto interessanti e pieno di project open source.
La matematica diventa abbastanza impegnativa, non per deboli di cuore.
Concordo con Daniele Facchin, questo sistema funziona bene solo per misure statiche. Montato su un veicolo la terna subisce accelerazioni anche forti dovute ai moti e alla irregolarità del suolo.
Io rilevavo i moti di una imbarcazione a sei gradi di libertà elaborando i dati forniti da tre speciali ricevitori GPS “phase carrier” in RTK. Le misure con inclinometri erano parecchio errate. Usavo anche una coppia di rate gyro (giroscopi di velocità) a stato solido, integrando i segnali con elaborazione digitale.
Ci hai offerto un progetto molto interessante. Io posseggo un tornio parallelo per piccole lavorazioni hobbistiche. Ho sempre pensato di poter misurare lo spostamento della torretta porta utensili, ( che si muove su un piano orizzontale in quattro direzioni ortogonali) mediante un sistema automatico che desse su un display la misura di detti spastamenti: in mm, decimi e magari anche centesimi di millimetro. E’ noto che agendo sulle apposite manovelle graduate si possono già avere questi valori. Però, quando si inverte il senso di rotazione delle manovelle la torretta non subito cambia verso a causa dei giochi, inevitabili, introdotti dalla madrevite. Se montassi sulla torretta porta utensili un accelerometro come quello descritto in questo progetto, pensate che esso sia in grado di quantificare con precisione tutti gli spostamente a cui verrebbe sottoposto?
Vi ringrazio per l’attenzione.
Così a spanne la precisione che cerchi non la vedo fattibile sfruttando un accelerometro, gli errori di integrazione nel tempo si andrebbero sommando.
La sparo grossa
Immagino che la torretta sia posta su due assi, forse con un 2 laser (dico laser perchè suppongo sia la soluzione in grado di dare la maggior precisione) posti sulla torretta potresti ricavare la distanza.
Penso anch’io che il sistema laser possa permettere di ricavare buoni valori di distanza. Necessita, però, avere un punto fisso dove collocare il laser e uno mobile dove proiettarne il raggio. O viceversa. Il tutto, comunque, troppo scomodo per un tornio perchè durante le lavorazioni le probabilità di accecamento del raggio sono molto alte.Serve un unico dispositivo, come un accelerometro, che fa tutto da sè. Una volta realizzato il progetto di Slovati, sopra descritto, voglio provarlo sul tornio per vedere cosa succede.
Esistono degli strumenti fatti apposta per i torni, si chiamano righe digitali, li trovi anche su ebay a basso costo. Hanno la risoluzione centesimale e indicatore digitale. Sono degli encoder lineari, del tutto simili a quelli usati per i calibri digitali. Gli accelerometri a semiconduttore non sono molto accurati come inclinometri, se vuoi fare degli esperimenti usa uno smartphone con una delle tante app che trovi in internet . Gli inclinometri più precisi sono i servo-inclinometri che risolvono fino al millesimo di grado. I misuratori laser sono molto costosi e poco adatti a questo tipo di misure.
Ringrazio Giovanni.
Ho subito aperto ebay per cercare informazioni sulle righe digitali. Ho visto, però, che applicarle al mio piccolo tornio è praticamente impossibile. Occuperebbero uno tale spazio che intralcerebbero le normali lavorazioni. Bisognerebbe che il tornio stesso fosse nato con simili accessori. L’unica cosa che si può fare è applicare la classica scatoletta nera a fianco della torretta dalla quale far uscire un cavetto da collegate a un sistema di elaborazione tipo Arduino.
Ecco perchè ho pensato ad un accelerometro che mi pare l’unico dispositivo che da solo può far tutto. Cioè “sentire ” e quantificare gli spostamenti della torretta prodotti dalla rotazione delle manovelle. L’unica incognita è sapere se un accelerometro, inizialmente fermo, e mosso in una delle quattro direzioni, con una velocità che potrebbe essere di 2mm/sec (con accelerazione minima: qualche centesimo se non meno di g) possa dare una risposta precisa circa lo spazio percorso. Ne dubito. Bisogna provare. Intanto ho ordinato, dalla Cina, un ADXL345 e un PCD8544. Vi terrò informati.
Salve picluigi,
l’accelerometro non va bene per misurare spostamenti. Esso misura l’accelerazione che è la derivata seconda dello spostamento nel tempo. Per cui si dovrebbe integrare due volte per risalire ad esso, con tutti gli errori che ne derivano. Anche io posseggo un piccolo tornio cinese da 350 mm. In realtà non ho mai pensato di attrezzarlo per misurare gli spostamenti con sensori, visti gli spazi ridotti. Ma non dovrebbe essere difficile montare una riga digitale da 200mm sul carrello porta torretta. In alternativa puoi montare degli encoder angolari con ruota gommata sulla guida o contare i giri della vite senza fine, sempre con encoder incrementale. Puoi costruire un encoder lineare incrementale con una fotocellula e con la strisciolina a righe che puoi recuperare da alcune stampanti a getto d’inchiostro. La precisione sarebbe, in questo caso, inferiore a quella della riga digitale e non potresti determinare il senso di marcia con una sola fotocellula.
Ciao.Giovanni.
Il mio tornio che ho capito avere all’incirca le stesse dimensioni del tuo è di produzione sovietica, non russa. L’hanno costruito ai tempi di Breznev, in piena guerra fredda. E’ vecchiotto ma funziona perfettamente. Ed è anche preciso e ben attrezzato. L’applicazione di una specie di encoder l’ho gia provata. Ho installato, tempo fa, un motore passo passo coassiale alla madrevite che muove la torretta in senso trasversale all’asse principale. Con un microcontrollore ne comandavo l’avanzamento che veniva effettuato in modo noto e molto preciso. Ma il problema si presentava quando mi serviva invertire il moto della torretta: il motore passo passo girava e la torretta per i primi istanti rimaneva ferma, causa i giochi della madrevite. Così il microcontrollore mi dava un’entità sbagliata dello spostamento. Ho provato via SW a togliere dal conteggio dello spostamento i giri che il motore faceva a vuoto. Ma mi sono accorto che il loro numero non era sempre lo stesso. E allora ho lasciato perdere.
Perché allora non utilizzare l’attuale sistema potenziato con l’accelerometro per individuare i punti morti della torretta?
Ciao picluigi,
l’encoder è un sensore digitale di spostamento angolare o lineare. Il motore passo-passo è un attuatore, cioè crea il movimento. Contando gli step si risale allo spostamento, ma non sempre quello vero se sono inseriti elementi non lineari o giochi meccanici, come nel tuo caso. Se vuoi fare un asservimento di posizione occorre un feedback, ossia un sensore di posizione (encoder o potenziometro) e un regolatore PID che comanda l’attuatore in funzione della differenza tra la posizione voluta e quella effettiva, Il controllore PID lo puoi fare con Arduino, si trovano in rete le librerie. Il motore è meglio sia in corrente continua con riduttore. La cosa è fattibile ma richiede una buona conoscenza dei controlli automatici. Se ti interessa solo la posizione ti rimando a quanto detto nella precedente risposta.
Se ricordate, vorrei utilizzare un accelerometro per misurare gli spostamenti della torretta del mio tornio. (leggi precedenti post). Ho realizzato il circuito di Stefano Slovati con una scheda Arduino Uno, una scheda ADXL345(accelerometro) e il display Nokia LCD5110. Il tutto montato su una breadboar come indicato da lui. E funziona tutto perfettamente. Ovviamente la breadboard è appoggiata sulla mia scrivania, cioè su un piano orizzontale che potrebbe essere la base della torretta del tornio. In stato di quiete leggo: PITCH= 12.47; ROLL=2.72
Ora sposto verso di me la breadboard facendola strisciare sulla scrivania. Ciò equivale a spostare verso di me la torretta del tornio ruorando la manovella. Fatto questo ottengo: PITCH=12.47, ROLL=5.39. Terminato lo spostamento di circa 10cm ROLL torna al valore di prima.
Utilizzando il valore di ROLL così ottenuto (5.39), potrei calcolare l’entità esatta dello spostamento effettuato?
Altro dato. Se sposto la breadboard perpendicolarmente rispetto a prima, (sempre di circa 10 cm) ottengo: PITCH=17.50 , ROLL=2.72. Terminato lo spostamento, PITCH torna come prima (12.47).
Mi sembrano dati interessanti ma utilizzarli per calcolare l’entità degli spostamenti credo sia impossibile perchè non conosciamo il valore della velocità media degli stessi.
Voi che ne dite?
Domanda stupida ma per me significativa: si può modificare questo sketch per costruire una livella elettronica che mi dica l’ inclinazione rispetto il piano? Immaginate una livella con un display, sul display esce zero quando la livella giace sul piano, + o – 90 quando è perpendicolare ad esso. Se la risposta è affermativa, posso contare sul vostro aiuto? Inoltre volevo precisare che io possiedo un altro tipo di display, esattamente questo:
http://ebmstore.it/index.php?route=product/product&product_id=118
Per iniziare mi accontenterei di stampare con serial.println i gradi dell’ inclinazione, il discorso display potrebbe subentrare in seguito (mal che vada posso acquistare quello indicato nell’ Articolo).
Ringrazio chiunque possa aiutarmi