Siete pronti per questa nuova puntata? Oggi partiamo in quarta con un esperimento davvero interessante: vediamo di giocare con il magnetometro a bordo della nostra FRDM-KL46Z. È facile lavorare con i sensori? Come si pilota la comunicazione I2C su questa scheda? Servono componenti aggiuntivi? Quante linee di codice saranno necessarie? Scopritelo insieme a noi in questa nuova puntata del nostro corso di programmazione su ARM.
Siamo al quarto appuntamento della nostra terza fase del corso di programmazione su ARM. Vi avevamo annunciato che saremmo scesi nel dettaglio, che avremmo fatto degli esperimenti e ogni giorno stiamo diventando più approfonditi nello studio di questa straordinaria piattaforma di sviluppo.
Oggi vogliamo divertirci con il magnetometro. Lo piloteremo, lo controlleremo, acquisiremo dei valori e verificheremo il suo funzionamento.Tutto questo con la facilità che questa scheda permette.
Intanto cominciamo col dire che il magnetometro dovreste essere riusciti a trovarlo sulla scheda… Non è vero? Lo avete visto? Si tratta di un dispositivo dalle dimensioni davvero piccole: appena 2 mm x 2 mm e lo trovate localizzato vicino a C38 ed R31. Lo avete visto?
Parliamone
Per poterci lavorare sicuramente abbiamo bisogno prima di conoscerlo e tante delle sue caratteristiche saranno importanti anche per capire come si fa ad utilizzarlo. Già perchè lo abbiamo accennato: la cosa fondamentale è riuscire a comunicare con questo sensore così come con tutti gli altri.
Il Freescale
Xtrinsic MMA3110 è un sensore digitale a tre assi con le seguenti caratteristiche:
- interfaccia I2C con frequenza fino a 400 kHz;
- profondità 16bit X, Y e Z;
- fondo scala ±1000 µT e sensibilità 0.10 µT;
- "Fast" mode, per la lettura di soli 8 bit;
- Multiple data e oversampling rates;
- sensore di temperatura (è necessaria la calibrazione!).
Naturalmente queste sono le caratteristiche che noi teniamo a conoscere ma c'è dell'altro se vogliamo lavorarci: serve che anche il Processor Expert le conosca. Per questo motivo andiamo subito a vedere come si fa a far lavorare il sensore.
Il componente ha tra le sue proprietà, le sue impostazioni, la possibilità di connettersi al bus I2C e di abilitare un pin di interrupt opzionale.
Ricordate il "Component Inspector"? Quel tool che vi permette di esaminare il dettaglio delle proprietà di un determinato componente che sia presente all'interno delle librerie? Ecco come viene rappresentato il magnetometro:
Anche per questo particolare sensore, se vi dovesse servire, sappiate che c'è la possibilità di inserire comandi opzionali direttamente da linee di codice.
Misuriamo la temperatura
La dotazione di questa scheda non smette di sorprendere soprattutto perché, all'interno del magnetometro, un registro dedicato permette la lettura della temperatura. Si tratta del DIE_TEMP, indirizzo 0x0F.
Potrebbe esserci qualche problema relativo alla componente di OFFSET di cui si parla nel datasheet. Al suo interno, infatti, si spiega che il registro contiene la temperatura del die espressa in gradi centigradi come un numero ad 8 bit in complemento a due. La sensibilità del sensore di temperatura è pari a 1°C/LSB mentre la componente di offset deve essere calibrata dall'utente a cui è richiesto di scrivere un software dedicato che gli permetta di raggiungere una maggiore precisione.
Vediamo, con la prossima immagine, proprio queste proprietà ed anche il campo in cui l'offset di temperatura può essere impostato
Questo componente, così come molti altri, di base non compare tra quelli disponibili e selezionabili all'interno del programma; è necessario, infatti, importare dei pacchetti che contengano, tra gli altri, anche il magnetometro.
Per farlo, come certamente avrete già imparato a fare per altri sensori e su altre piattaforme di sviluppo con altri programmi ed altri tool di scrittura e debug, la ricerca della documentazione e delle librerie opportune è la prima fase per poter lavorare correttamente. Questo
post è stato di grande ispirazione. Seguendo i link suggeriti ho trovato che
l'autore ha utilizzato GitHUB nel modo migliore: distribuire e divulgare documentazione!
Seguendo le indicazioni ci si ritrova di fronte ad un pacchetto davvero completo. Ecco alcuni dei componenti contenuti al suo interno di cui proprio non potete fare a meno:
- 24AA_EEPROM;
- 74HC164;
- BitIO_to_PCA9554;
- Bluetooth_EGBT;
- BootLoaderDisk;
- BootLoaderUSB;
- ChLCD;
- CTouchScanner;
- CTouchSensor;
- FAT_FileSystem;
- FontDisplay;
- FreeRTOS;
- FreeRTOSTrace;
- GDisplay;
- GenericBitIO;
- GenericI2;
- I2CSpy;
- LEDMatrix;
- LEDSensor;
- MAG3110;
- MaxonF2140;
- MC13192;
- MMA7260Q;
- MMA7455L;
- MMA8451Q;
- OLED;
- RingBuffer;
- RingBufferUInt8;
- RTC_Maxim;
- Servo;
- Shell;
- Timeout;
- TouchScreen;
- TouchScreenSensor;
- Trigger;
- Wait.
Naturalmente l'elenco è largamente più numeroso di quello che vi abbiamo riportato e sebbene si intuisca che tra accelerometri e touchscreen questo elenco sia piuttosto variegato, sappiate che c'è molto di più per tutti i gusti per equipaggiare i vostri software per la gestione di ben altro che questa semplice scheda.
Prendetevi del tempo per studiare con attenzione questo riferimento perché è davvero di grande valore. Oltre al fatto che notevole è l'impegno dell'autore nell'aggiornare costantemente questi stessi file.
Una volta che vi siete procurati questo materiale, la strada è relativamente in discesa.
Come tutti i componenti, anche il magnetometro è dotato di metodi per l'accesso alle singole funzioni ed ai registri che contiene
Se consideriamo come esempio il codice riportato
qui (driver del dispositivo), al suo interno troviamo una serie di definizioni, com'è chiaro aspettarci, che rappresentano, per esempio, i registri della temperatura
/* die temperature (needs to add an offset as not factory trimmed) */
#define %'ModuleName'%.DIE_TEMP 0x0F /* die temperature register, signed 8bit in C */
quelli dei dati
/* data registers */
#define %'ModuleName'%.OUT_X_MSB 0x01 /* X output MSB address */
#define %'ModuleName'%.OUT_X_LSB 0x02 /* X output LSB address */
#define %'ModuleName'%.OUT_Y_MSB 0x03 /* Y output MSB address */
#define %'ModuleName'%.OUT_Y_LSB 0x04 /* Y output LSB address */
#define %'ModuleName'%.OUT_Z_MSB 0x05 /* Z output MSB address */
#define %'ModuleName'%.OUT_Z_LSB 0x06 /* Z output LSB address */
e così via dicendo. Una volta finito con i registri, si comincia a documentare le funzioni e i metodi, ad esempio
%-BW_METHOD_BEGIN GetXYZ16
%ifdef GetXYZ16
uint8_t %'ModuleName'%.%GetXYZ16(int16_t *xyz);
%define! Parxyz
%define! RetVal
%include Common\MAG3110GetRaw8XYZ.inc
%endif %- GetXYZ16
%-BW_METHOD_END GetXYZ16
oppure
%-BW_METHOD_BEGIN GetX
%ifdef GetX
word %'ModuleName'%.%GetX(int16_t *value);
%define! Parvalue
%define! RetVal
%include Common\MAG3110GetX.Inc
%endif %- GetX
%-BW_METHOD_END GetX
Volete sapere come lavora la correzione dell'Offset? Ecco il metodo che la realizza:
%-BW_METHOD_BEGIN GetUserOffsetCorrection
%ifdef GetUserOffsetCorrection
%define! Parx
%define! Pary
%define! Parz
%define! RetVal
%include Common\MAG3110GetUserOffsetCorrection.Inc
byte %'ModuleName'%.%GetUserOffsetCorrection(int16_t *x, int16_t *y, int16_t *z)
{
uint8_t res;
res = %'ModuleName'%.Read16bitBEValue(%'ModuleName'%.OFF_X_MSB, (uint16_t*)x);
if(res!=ERR_OK) {
return res; /* failure */
}
res = %'ModuleName'%.Read16bitBEValue(%'ModuleName'%.OFF_Y_MSB, (uint16_t*)y);
if(res!=ERR_OK) {
return res; /* failure */
}
res = %'ModuleName'%.Read16bitBEValue(%'ModuleName'%.OFF_Z_MSB, (uint16_t*)z);
if(res!=ERR_OK) {
return res; /* failure */
}
return ERR_OK;
}
%endif %- GetUserOffsetCorrection
%-BW_METHOD_END GetUserOffsetCorrection
Se volete utilizzare l'interfaccia seriale per lavorare con questi dati e comunicarli, potete sempre utilizzare tool come
Terminal per il controllo del traffico su questa interfaccia. Tra l'altro la sua interfaccia risulta davvero completa.
Questa è certamente una lunga discussione che richiede l'analisi di tante proprietà.
Ma se siete già venuti a capo di quanto vi abbiamo raccontato, sappiate che il componente MAG3110 ha tanto da offrire e le sue applicazioni dimostrative non sono affatto concluse qui: Freescale, infatti, ha a disposizione un pacchetto software che prende il nome di eCompass. Lo trovate disponibile a
questo indirizzo e sinceramente ve lo consigliamo caldamente.
Il software permette la calibrazione dei sensori Xtrinsic ed unisce i dati degli accelerometri e dei magnetometri per ottenere un'accurata misura dell'heading. Questo ambiente potrebbe essere molto utile per tutti coloro che debbano sviluppare applicazioni anche professionali su smartphone, tablet e dispositivi portatili più in generale.
Parlando delle caratteristiche di questo tool, abbiamo:
- e-compass Tilt compensated;
- calibrazione Hard e soft;
- Codice ANSI C standard fornito come codice sorgente;
- Flash footprint 20 KB (circa);
- RAM richiesta 6.5 KB (circa).
Conclusioni
Con questa puntata abbiamo raccolto delle idee necessarie per lavorare con il magnetometro studiando le proprietà, metodi e l'interfacciamento. Dal momento che lavorare con questo sensore ha imposto di iniziare a parlare di un'interfaccia di comunicazione complessa ed importantissima come l'I2C, nella prossima puntata ne approfondiremo un caso particolare.
Nel frattempo, come sempre, vi invitiamo a commentare questo articolo per chiarire eventuali dubbi, domande, perplessità e così via dicendo. Alla prossima.
Per ulteriori informazioni potete scrivere a questa email: [email protected]
Ti potrebbe interessare anche:
Complimenti! leggo sempre con attenzione e interesse questo corso, anche se quasi in silenzio dovuto al fatto che molti dettagli mi sono oscuri (una cosa è la teoria, ben altra è la pratica), intanto faccio bagaglio dei tanti interessanti consigli e informazioni che inserisci, in futuro saranno molto utili (se riuscirò a fare pratica).
Ciao
Mario
Mi è arrivata la scheda di sviluppo, quindi ho riletto tutto dall’inizio, ma ancora insisto: ci sono troppi passaggi oscuri, lasciati a chi sa già cosa fare.
Per esempio: devo scaricare la versione corretta del compilatore, e devo destreggiarmi tra 200 sigle di prodotti “oscuri”, ma che a sentire il relatore dovrebbe essere di “chiarissimo utilizzo”.
La versione corretta della suite sembra essere la Special, in quanto free (mi domando quali altri dovrebbe scegliere l’utente di un corso…), ma se vado al link della pagina, vedo che ci sono 7 Special edition e devo districarmi a capire qual’è quella utile (ma non potevate essere più chiari e diretti su questo punto?? Un resume con una lista di passaggi univoci!).
Quindi la domanda nr1: che versione devo installare tra le 7 che sono presenti nel link?
Lo so che sembro polemico, ma sfido qualunque principiante a capire al volo, ed in maniera chiara, quanto descritto nella puntata dei sistemi di sviluppo. Insisto sul fatto che è facile per chi sa già cosa fare…
Thanks
Ciao Ultron
è giusto che sia così! nessun principiante può capire al volo, ogni principiante si sente confuso all’inizio, mica solo tu! anche il più semplice dei dettagli sembra una montagna insormontabile, e anche se sembrerà un controsenso, è proprio questo che ci darà la soddisfazione, alla fine, di dire “ce l’ho fatta, ci sono riuscito finalmente”. Penso che se tutto fosse così facile da riuscire a capire tutto solo leggendo un paio di pagine di un semplice corso, non sarebbero più necessarie ne le scuole ne le università perchè basterebbe che i docenti scrivessero solo qualche pagina di un semplicissimo corso e tutti imparano e tutti diventano maestri.
Per cui consentimi di darti un consiglio: per come imposti il commento non è che sembri polemico, cioè chiunque legge dirà che “SEI POLEMICO”. Ben diversa è la cosa se ad esempio si scrive “scusatemi non ho ben capito quale file devo scaricare, qualcuno mi aiuta?”.
Io nemmeno ho capito tutto quello che Piero ha scritto ma non certo per colpa sua, la colpa è mia che sono troppo indietro in questo campo, infatti se leggi bene ho scritto che faccio tesoro delle informazioni che mi torneranno utili quando riuscirò a fare pratica.
Ciao
Mario
Mario non sono d’accordo. Per programmare i PIC32 ho seguito un Corso in inglese ed altro materiale sempre in inglese, e non ho avuto la minima difficoltà. Qua sono ancora a capire che cosa installare di preciso per fare il corso. Rileggiti la puntata dove si parla di sistemi di sviluppo, e vedi se riesci a capire cosa devi installare.
Speravo venisse spiegato in un secondo tempo, ma non è cosi. Quanto alla polemica, deve essere intesa come costruttiva, non fine a se stessa.
I metodi di insegnamento sono molteplici, così come sono molteplici le varie situazioni ed il know-how dei lettori. Il bello del Blog, di questo Blog, è che si può interagire con gli autori degli articoli/corsi/progetti e quindi chiedere spiegazioni.
Per alcuni alcuni passaggi possono essere delle ovvietà noiose, per altri invece una necessità. Questo su un argomento, mentre su un altro le parti possono invertirsi….. siamo tutti diversi, sono diversi i microcontrollori e sono diversi i metodi di insegnamento 🙂
Io ho un’esperienza ventennale con i PIC quindi non li porto come esempio, ma quando ho iniziato con TI (MSP430), in mezzora ho utilizzato a pieno il sistema di sviluppo e fatto girare il primo firmware. Con Freescale (ARM Cortex M0+) mi ci è voluto un po’ di più ma alla fine mi sono reso conto di avere maggiori possibilità di utilizzo. Ovviamente questo è dato anche dalla diversità di microcontrollore…. insomma i fattori di differenza sono tanti.
Piero saprà intervenire al meglio e sciogliere ogni dubbio 😉
Colgo al volo l’osservazione di Emanuele: Anchio ho seguito il Corso sui Texas proposto dall’ottimo Mauro Laurenti. In quelle pagine viene spiegato, passo passo, cosa installare e cosa fare. La chiarezza è prontamente avvertita e porta ad avere risultati nell’immediato.
Ribadisco: rileggetevi la puntata sulla Suite di sviluppo e ditemi se si capisce bene cosa bisogna installare.
Sarei lieto di confrontarmi con altri utenti che hanno il mio stesso background per vedere se è il Corso ad essere “un pò ambiguo”, oppure io ad essere limitato… (e ci sta eh!)
Intanto aspetto Lunedì per vedere se mi si suggerisce cosa e come installarlo, così inizio a fare qualcosa con la board.
Sarò breve, efficace, sintetico, conciso e compendioso.
Non mi interessa neanche valutare la polemica. Voglio dare risposte.
Le sei versioni proposte sono:
Special Edition: CodeWarrior for Microcontrollers 10.5 (Eclipse, Online)
Special Edition: CodeWarrior for Microcontrollers 10.5 (Eclipse, Offline)
Special Edition: CodeWarrior for MPC55xx/MPC56xx v2.10 (Classic)
Special Edition: CodeWarrior for 56800/E Digital Signal Controllers – code …
Special Edition: CodeWarrior for ColdFire Architectures (Classic, Windows …
Special Edition: CodeWarrior for Microcontrollers (Classic, Windows hosted)
Special Edition: CodeWarrior for HCS12(X) Microcontrollers (Classic)
Le prime due, naturalmente, sono la stessa soluzione solo che una utilizza un installer online e il pacchetto da scaricare è più snello mentre le seconda utilizza un installer offline e c’è un gigabyte e passa di roba da scaricare…
Naturalmente è quello il pacchetto da installare perchè è l’editor con Eclipse che meglio supporta la scheda.
Gli altri sono relativi a micro che non hanno a che fare con il Cortex-m0+.
Altre domande?
Ragazzi, qui non ci sono colpe!
Siamo su internet, non è una lezione frontale e io certamente ho talmente tanto da imparare che tutto sono meno che un docente.
Sono a disposizione, è questo il valore aggiunto, e se non sono chiaro voi DOVETE DIRMELO! 🙂
Imparare significa imparare anche ad imparare! 😀
Sembra un gioco di parole ma non lo è! 😀
Segnalatemi con ogni modo possibile, entro i limiti del regolamento di questa comunità, tutto ciò che non è chiaro e io farò di tutto per spiegarmi meglio!
Infondo è mio dovere, se voglio essere parte di questa comunità! 🙂
Me lo auguro 😉
Scusate il ritardo nella risposta ma ero (e sono) al lavoro 😀
La puntata sulle suite non serviva a dirvi nello specifico cosa installare. Per questa dritta c’era la puntata sulla scheda 😉
Comunque, ti ho risposto prima. Sono sicuro che ora sarà più chiaro. 🙂
Siccome però non voglio correre il rischio di essere ancora una volta poco chiaro, ecco i nomi dei file (dei pacchetti) che dovete installare:
CW_MCU_v10.5_SE.exe, da 450 MB circa;
PExDrv_v10_2.exe, da 280 MB circa.
Spero di essere stato inequivocabile ora…! 😀
Visto che abbiamo attivato il filo diretto, ti pregherei, per i prossimi dubbi, di inserire come oggetto “Domanda n.ro (numerodelladomanda)”.
Così saranno tutte, subito, evidenti.
E servirà, di sicuro, anche agli altri utenti.
SIETE TUTTI CORTESEMENTE PREGATI DI SEGUIRE QUESTA INDICAZIONE perchè così sarà molto semplice rispondere.
Potremmo anche pubblicare un sezione FAQ con le vostre domande sul corso, non appena ne avremo raccolte almeno una decina, se per Emanuele va bene!
Grazie, installo subito quanto indicato così posso dedicare questo nevoso (Piemonte) fine settimana a produrre i primi esempi…
Per ora è sufficiente la risposta alla domanda numero uno, visto che nemmeno posso fare nulla senza installare il software di base.
Se qualcosa non funziona, mi precipiterò su queste pagine a lamentarmi polemicamente! 😀
Ci sono diversi Upgrade e Patches per il Processor Expert.
Per ora ignoro tutto, va bene?
Si, esatto.
Per il momento non ti servono.
Ricordati che, ma vale sempre, usare un upgrade “serve solo se serve”, cioè se sai che quell’upgrade aggiorna una funzione che non c’è oppure ne sistema una che funzionava male & so on…
Nella lezione dell’accensione del LED viene suggerito che nel New Project deve essere selezionata “applicazione” piuttosto che “Libreria”, però viene “dimenticato” di indicare cosa scegliere delle numerose opzioni che si presentano.
Cosa devo scegliere tra le innumerevoli opzioni?
1) Choose the connection to use for this project
2) Language and Build Tools Options
3) Rapid Application Development
Incrociando le dita sono andato avanti senza effettuare alcuna scelta tra quelle proposte (lasciando le opzioni di default).
Arrivando al progetto, non sono riuscito a trovare da nessuna parte dell’IDE la voce “Components Library” e nell’articolo ci si è “dimenticati” di indicare bene come ci si arriva… quindi mi sono fermato.
Dunque, quando apri un nuovo progetto devi:
– selezionare un nuovo nome
– selezionare il workspace di riferimento
– selezionare la scheda
Dopodichè, cerchiamo di fare chiarezza: il tipo di connessione dipende dal driver che volete usare. Eseguire il flash del fimware è una cosa moooolto semplice, basta seguire la procedura indicata nell’articolo in cui abbiamo nominato il bootloader per la prima volta. Basta connettere l’USB giusto (l’OpenSDA) COME indicato nella procedura e copiare con operazione di drag&drop il firmware giusto.
Quindi, quando vi chiede che connessione utilizzare, selezionate OpenSDA.
D’altronde, se abbiamo dedicato ben 2 puntate del corso per spiegare OpenSDA, cos’altro avresti mai potuto scegliere!? 😀
– nelle altre schede non c’è bisogno di toccare nulla rispetto alle scelte predefinite.
Naturalmente per quanto riguarda il linguaggio non sta scritto da nessuna parte che voi dobbiate per forza usare il C. Vuoi scrivere in C++? FALLO! ;D Sei libero!
L’I/O support mi sembra il caso di non toccarlo, dato che openSDA ed UART su USB dovrebbero dire qualcosa, leggendo le puntate…o no? 😀
– in ultimo, qui stiamo parlando di Processor expert e codewarrior, e stiamo parlando di sviluppo software “rapido”… Molto meglio scegliere “Processor Expert” quando chiede “Rapid Application Development”.
Esattamente come avevamo segnalato in questo articolo quando abbiamo scritto ” e non dimenticate di selezionare il Processor Expert quando vi chiederà l’ambiente di sviluppo che vorrete utilizzare.” 🙂
Più chiaro ora? 🙂
Ho ripreso il progetto, anzi, sono ripartito da zero. Avevo già correttamente inserito il driver OpenSDA (era spiegato chiaramente come fare), ho inserito i parametri che mi hai detto, ma c’è un ultimo punto oscuro:
Nella pagina finale, dove si indica se utilizzare un RAD, c’è anche l’opzione di “perspective” se “Hardware” oppure “current”. Di default c’è “Use current perspective”. Ho lasciato quest’ultima, giisto?
Giusto 😉