Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso...

43

Transcript of Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso...

Page 1: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Laboratorio microcontrollori e open sourceTerza parte

Politecnico Open unix Labs

20 aprile 2012

POuL Laboratorio microcontrollori e open source Terza parte 1/ 43

Page 2: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Introduzione Per chi si è perso le prime lezioni

Questo corso è una breve introduzione ai microcontrollori, concentrandosi sia sugliaspetti software di programmazione che hardware di costruzione di circuiti.

Verranno presentate due piattaforme per lo sviluppo di applicazioni:

Arduino che è una piattaforma molto popolare basata su microcontrolloriAtmel a 8bit

STM32, una architattura di microcontrollori più potente a 32bit, usando ilsistema operativo Miosix.

Tutto il corso sarà tenuto in ambiente Linux, usando solo strumenti Open Source.

POuL Laboratorio microcontrollori e open source Terza parte 2/ 43

Page 3: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Struttura del corso Per chi si è perso le prime lezioni

Il corso si compone di tre lezioni.

Lezione 1: Basi di Arduino

Breve introduzione ai microcontrollori

Breve introduzione ad Arduino

Ampia sessione di sperimentazione pratica con semplici esempi usando Arduino

Lezione 2: Basi di STM32 e Miosix

Breve introduzione ai microcontrollori STM32

Breve introduzione a Miosix

Ampia sessione di sperimentazione pratica con semplici esempi usando STM32

e Miosix

Lezione 3 (oggi): Progetti avanzati

Verranno mostrati progetti più complessi basati sia su STM32 che Arduino

POuL Laboratorio microcontrollori e open source Terza parte 3/ 43

Page 4: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Prima di cominciare

Questa sarà l'ultima lezione di questo corso. Per chi, dopo aver seguito il corso,volesse comprarsi un Arduino o una stm32f4discovery è possibile acquistarli online.

Per esempio, è possibile comprarli da RS (https://it.rs-online.com/web/) con ilvantaggio che si può scegliere se farsi spedire a casa il materiale (pagando le spesedi spedizione) oppure andare diretamente a ritirare i componenti a Vimodrone(raggiungibile con la metro).

Oltre alle board di sviluppo sullo stesso sito è possibile comprare anche lebreadboard, led, resistenze, pulsanti, �li, etc.

POuL Laboratorio microcontrollori e open source Terza parte 4/ 43

Page 5: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Prima di cominciare

POuL Laboratorio microcontrollori e open source Terza parte 5/ 43

Page 6: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Prima di cominciare

POuL Laboratorio microcontrollori e open source Terza parte 6/ 43

Page 7: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #1: Giochino LCD

Speci�che del progettino:

Realizzare un piccolo gioco collegando un pulsante e lo schermo LCD. Il giocatoredeve schiacciare il pulsante quando sul display appare un determinato simbolo (X)e non deve schiacciarlo quando ne esce un altro (O).

I simboli devono apparire in una posizione casuale dello schermo e rimanerevisualizzati per un numero variabile di millisecondi. Due LED (rosso e verde)segnaleranno all'utente se ha premuto il pulsante correttamente.

POuL Laboratorio microcontrollori e open source Terza parte 7/ 43

Page 8: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #1: Interrupt

Esistono tecniche per controllare lo stato di un ingresso in Arduino.

Polling Si controlla periodicamente lo stato dell'ingresso per controllare seè cambiato.

Interrupt Con l'aiuto di hardware dedicato l'evento viene noti�catodirettamente al software.

POuL Laboratorio microcontrollori e open source Terza parte 8/ 43

Page 9: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #1: Interrupt in Arduino

Il funzionamento degli interrupt è analogo a quello che (forse) avete studiato in uncorso di informatica. Usano la funzione attachInterrupt è possibile associare alcambiamento di stato di un ingresso la chiamata di una funzione.

attachInterrupt(<interrupt>, <function>, <mode>)

interrupt Numero dell'interrupt. In Arduino sono disponibili l'interrupt 0associato al pin 2 e l'interrupt 1 associato al pin 3.

function La funzione da richiamara quando si veri�ca l'evento.

mode Modo in cui devi veri�carsi l'evento:

LOW Quando il segnale diventa bassoCHANGE Quando il segnale cambia valoreRISING Quando il segnale passa da basso ad alto

FALLING Quando il segnale passa da alto a basso

POuL Laboratorio microcontrollori e open source Terza parte 9/ 43

Page 10: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #1: Numeri casuali

Vogliamo che il nostro gioco non sia prevedibile. Il posizionamento del simbolo, lascelta del simbolo e il tempo di visualizzazione devono essere casuali.

In arduino esistono delle funzioni per generare un numero casuale.

randomSeed(<value>) Inizializza il generatore di numeri casuali.

random(<min>, <max>) Genera un numero casuale tra un minimo (incluso)e un massimo (escluso).

Tipicamente si sceglie come seed iniziale il valore letto da un input analogico checollegato (questop garantisce una discreta casualità).

POuL Laboratorio microcontrollori e open source Terza parte 10/ 43

Page 11: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #1: Giochino LCD

Pratica: costruzione del circuito

POuL Laboratorio microcontrollori e open source Terza parte 11/ 43

Page 12: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox

Conoscete gli internet meme?

Speci�che:Collegare due pulsanti e delle cu�e alla board stm32f4discovery, il primo pulsantedeve far partire il sad trombone, il secondo un rickroll.

POuL Laboratorio microcontrollori e open source Terza parte 12/ 43

Page 13: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox

Organizzazione del progettino

Hardware: il DAC audio

Hardware: la periferica I2S

Teoria: il DMA

Software: compressione audio

Software: come embeddare un �le audio in un programma

Software: la classe ADPCMSound e la classe Player

Pratica: costruzione del circuito

POuL Laboratorio microcontrollori e open source Terza parte 13/ 43

Page 14: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | DAC Audio

La board stm32f4discovery ha tra le sue periferiche un DAC di tipo CS43L22.Questo DAC non è interno al microcontrollore, si tratta di un circuito integratoseparato.

Le sue principali caratteristiche sono:

Uscita stereo per cu�e e per altoparlante (la board usa solo l'uscita cu�e)

Il DAC è a 24bit, ed è in grado di decodi�care segnali campionati �no a96KHz

Il microcontrollore comunica con il DAC attraverso due bus, uno di tipo I2Sper inviare i dati audio, e uno di tipo I2C per inviare comandi, come alzare oabbassare il volume.

POuL Laboratorio microcontrollori e open source Terza parte 14/ 43

Page 15: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | I2S

I2S è un protocollo per trasferire dati audio non compressi, come può essere lostream tra un processore e un DAC audio.

Il microcontrollore STM32 ha una periferica I2S. Tale periferica può essere usatain modalità

Polled: il processore invia un campione audio, aspetta che venga trasmesso,poi invia il successivo...

Interrupt: il processore invia il primo campione audio direttamente, poiquando è stato trasmesso, un interrupt viene generato che provvede a inviareil secondo. Trasmesso anche il secondo campione verrà generato un altrointerrupt che invia il terzo campione...

DMA: il processore prepara un bu�er con un certo numero di campioni, poiavvia il DMA che invierà al DAC audio i vari campioni, uno dopo l'altromentre la CPU ha la possibilità di riempire un secondo bu�er. Una voltatrasmesso l'intero bu�er il DMA genera un interupt che con�gurerà il DMAper trasmettere il bu�er che nel frattempo la CPU avrà preparato...

POuL Laboratorio microcontrollori e open source Terza parte 15/ 43

Page 16: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | DMA

Stime dei tempi:Il DAC è stato con�gurato per produrre un segnale audio stereo a 44.1KHz.Quindi occorre che la CPU invii due campioni (destro e sinistro), 44100 volte alsecondo, ossia un campione ogni 11µs. Si tratta di un tempo troppo piccoloperchè la CPU possa fare altro, non conviene usare la modalità polled.

D'altronde, usando gli interrupt la CPU dovrebbe servire 2*44100=88200interrupt al secondo, che considerando l'overhead richiesto per entrare e uscire daun interrupt porterebbe a uno spreco della CPU.

Il DMA è quindi la soluzione più attraente per questo genere di appliazioni, ancheconsiderando che se lo stream audio dovesse interrompersi anche per pochimillisecondi, l'utente se ne accorgerebbe.

POuL Laboratorio microcontrollori e open source Terza parte 16/ 43

Page 17: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | compressione

I �le audio raggiungono facilmente anche grandi dimensioni, quindi convienememorizzarli compressi.

La CPU dell'STM32 è abbastanza potente da decodi�care formati come l'MP3,ma decodi�care formati così complessi richiederebbe troppe linee di codice.

Una soluzione semplice è la codi�ca ADPCM che riduce la dimensione dei �leaudio a un quarto della dimensione originale, ed è abbastanza semplice.

POuL Laboratorio microcontrollori e open source Terza parte 17/ 43

Page 18: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | embedding

Dove memorizzare un �le audio nella board?

Se la board avesse un connettore per memorie microSD si potrebbe usare ilbackend di �lesystem di Miosix, ma la board non ha questa possibilità. Però lamemoria FLASH interna dell'STM32 è molto grande, ben 1MB, quindi si puòpensare di memorizzare l'audio al suo interno.

Per fare questo, si può usare un tool come xxd, una utility da linea di comandoper Linux che converte qualunque �le in un �le .h con un vettore in C contenete ilcontenuto del �le:

const unsigned char sad_trombone_bin[] = {

0xbf, 0x81, 0x90, 0x19, 0x96, 0xa3, 0x13, 0x04, 0x4a, 0x1b, 0x9b, 0x30,

0x59, 0x38, 0xa0, 0x91, 0x15, 0x23, 0x71, 0x40, 0x10, 0x01, 0x11, 0x91,

...

0xa1, 0x08, 0x1b, 0xbb, 0xf3, 0xa1, 0xa1, 0xb2, 0xa1, 0x91

};

const unsigned int sad_trombone_bin_len = 73618;

Nota: xxd non dichiara il vettore const, bisogna aggiungerlo a mano per far sìche il compilatore lo allochi in FLASH e non in RAM.

POuL Laboratorio microcontrollori e open source Terza parte 18/ 43

Page 19: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | la classe Player

Insieme con il kernel Miosix ci sono degli esempi, e uno di questo è proprio undriver per il DAC audio della board stm32f4discovery.

Per usare questo esempio occorre copiare il contenuto della directorymiosix/examples/sad_trombone nella top level directory (ossia quella con ilmain.cpp).

Questa cartella contiene anche il �le .h con il suono del sad trombone.

POuL Laboratorio microcontrollori e open source Terza parte 19/ 43

Page 20: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox | la classe Player

Il codice del main() di esempio è il seguente:

#include "player.h"

#include "sad_trombone.h"

int main()

{

ADPCMSound sound(sad_trombone_bin,sad_trombone_bin_len);

Player::instance().play(sound);

}

Potete partire da questo per implementare il progetto.

POuL Laboratorio microcontrollori e open source Terza parte 20/ 43

Page 21: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #2: Memebox

Pratica: costruzione del circuito

POuL Laboratorio microcontrollori e open source Terza parte 21/ 43

Page 22: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #3: LED RGB

Speci�che:Collegare un LED RGB a un Arduino. Collegare l'Arduino a un PC tramite il cavoUSB. Scrivere un programma lato PC per cambiare il colore del LED.

POuL Laboratorio microcontrollori e open source Terza parte 22/ 43

Page 23: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #3: LED RGB

Pratica: costruzione del circuito

POuL Laboratorio microcontrollori e open source Terza parte 23/ 43

Page 24: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro

Speci�che:Usando l'accelerometro interno alla board stm32f4discovery, leggere il valoredell'accelerazione sui tre assi, trasferirla ad un PC e plottarla a schermo.

POuL Laboratorio microcontrollori e open source Terza parte 24/ 43

Page 25: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro

Organizzazione del progettino

Teoria: I registri di periferica

Hardware/Software: La periferica SPI dell'STM32

Hardware: l'accelerometro LIS302DL

Software: La seriale in Miosix e printf()

Software: GUI in Qt preconfezionata

Pratica: costruzione del circuito

POuL Laboratorio microcontrollori e open source Terza parte 25/ 43

Page 26: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | Registri di periferica

Molti programmatori, anche esperti, non hanno un idea precisa di come il softwareinteragisca con l'hardware. Questa slide si propone di risalire i vari livelli diastrazione all'interno di un sistema operativo come GNU/Linux, �no al punto checi interessa, l'interazione diretta con l'hardware.

Libreria userspace. E' normalmente il livello di astrazione a cui i programmatorisono maggiormente abituati. Ad esempio, se un programmatore volesse interagirecon la USB su GNU/Linux, utilizzerebbe libusb. (http://www.libusb.org)

Ok, ma... come fanno queste librerie a interagire con l'hardware? Facendochiamate al kernel del sistema operativo.

Ok, ma... come sono implementate nel kernel queste chiamate? Facendo altrechiamate ad un driver di periferica.

(ci stiamo avvicinando...) Ok, ma... come sono implementati i device driver?,come comunicano con l'hardware?

POuL Laboratorio microcontrollori e open source Terza parte 26/ 43

Page 27: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | Registri di periferica

Il metodo più comune è quello dei registri di periferica. Le periferiche hardware sipresentano al software come un set registri, che non sono altro che locazioni dimemoria mappate a speci�ci indirizzi nello spazio di indirizzamento, e quindiaccessibili tramite software.

Caveat: I registri di periferica non vanno confusi coi registri della CPU.

POuL Laboratorio microcontrollori e open source Terza parte 27/ 43

Page 28: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | Registri di periferica

I registri di periferica sono per certi versi paragonabili a delle variabili allocate inRAM, in quanto

sono accessibili allo stesso modo (essendo mappati nello stesso spazio diindirizzamento)

in molti casi sono leggibili e scrivibili dal software (alle volte però capita diavere a che fare con registri read-only).

hanno una dimensione, solitamente di 8, 16 o 32bit, esattamente come gliunsigned char, unigned short e unsigned int.

POuL Laboratorio microcontrollori e open source Terza parte 28/ 43

Page 29: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | Registri di periferica

Ciononostante, ci sono delle di�erenze fondamentali tra i registri di periferica e levariabili

Quello che viene scritto in questi registri causa azioni nel mondo reale(l'accensione di un LED, l'attivazione di un ADC, l'invio di un caratteretramite una porta seriale, etc.)

Si trovano a speci�ci indirizzi di memoria. Quando una variabile vieneallocata sullo stack o sull'heap, al programmatore non importa se vieneallocata all'indirizzo 0xb��c60 o 0xb��e12, mentre se il registro di perifericasi trova all'indirizzo 0x101e5018 occorre essere sicuri di stare scrivendoesattamente a quell'indirizzo, o non si otterranno i risultati voluti.

I registri di periferica non sono ad uso esclusivo del programmatore, come levariabili. Sono condivisi tra il software e l'hardware. Per esempio l'hardwarepuo` decidere di �ippare bit all'interno dei registri per segnalare eventispeci�ci, cosa che non succede con le normali variabili.

POuL Laboratorio microcontrollori e open source Terza parte 29/ 43

Page 30: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | Registri di periferica

Come si fa a sapere quali periferiche si hanno a disposizione, quali registri ha unaspeci�ca periferica, a che indirizzo sono mappati e come usarli? Per unmicrocontrollore le periferiche disponibili sono documentate dal produttore in undocumento, solitamente chiamato �datasheet� o �programming guide�.

Inoltre, il produttore del microcontrollore fornisce un �le .h con la de�nizione ditutti i registri spesso raggruppati per periferica, ad esempio la periferica GPIO puòavere molti registri, uno dei quali si chiama CRL. Per scrivere 0 in questo registrosi può scrivere:

void clearReg()

{

GPIO->CRL = 0;

}

POuL Laboratorio microcontrollori e open source Terza parte 30/ 43

Page 31: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Il bus SPI è un bus di comunicazione molto usato per trasferire dati tra duecircuiti integrati posti sulla stessa board.

In questo caso lo useremo per comunicare tra l'accelerometro e il microcontrollore.

Guardando lo schema elettrico della board stm32f4discovery, l'accelerometro ha leseguenti connessioni:MOSI PA7MISO PA6SCK PA5CS PE3

POuL Laboratorio microcontrollori e open source Terza parte 31/ 43

Page 32: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Finora abbiamo scoperto che la maggior parte dei piedini di un microcontrolloresono GPIO, ossia sono con�gurabili e usabili via software. In realtà, nella maggiorparte dei microcontrollori i piedini hanno anche una o più alternate function.

Quando si con�gura un GPIO come alternate function viene assegnato ad unaperiferica. Non è più controllabile in software, ma viene gestito in hardware dallaperiferica.

In questo caso quindi vogliamo con�gurare i GPIO a cui è collegato l'accelerometrocome alternate function, in modo che siano gestiti dalla periferica SPI in hardware.

POuL Laboratorio microcontrollori e open source Terza parte 32/ 43

Page 33: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Guardando il datasheet, si scopre che l'alternate function 5 dei GPIO PA5, PA6 ePA7 li collega alla periferica SPI1, che è quello che vogliamo.

Il quarto segnale, PE3 che gestisce il CS o �Chip select� lo gestiremo invece noi insoftware tramite un normale GPIO.

POuL Laboratorio microcontrollori e open source Terza parte 33/ 43

Page 34: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Il codice per con�gurare i GPIO da Miosix è:

typedef Gpio<GPIOA_BASE,7> mosi;

typedef Gpio<GPIOA_BASE,6> miso;

typedef Gpio<GPIOA_BASE,5> sck;

typedef Gpio<GPIOE_BASE,3> cs;

int main()

{

mosi::mode(Mode::ALTERNATE);

mosi::alternateFunction(5);

miso::mode(Mode::ALTERNATE);

miso::alternateFunction(5);

sck::mode(Mode::ALTERNATE);

sck::alternateFunction(5);

cs::mode(Mode::OUTPUT);

cs::high();

...

POuL Laboratorio microcontrollori e open source Terza parte 34/ 43

Page 35: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Il primo registro che vedremo si chiama RCC->APB2ENR

Questo registro fa parte del gruppo di registri RCC o Reset and Clock Control. Inquesto registro c'è un bit, il numero 12, chimato SPI1EN, che attiva la perifericaSPI1. Nel �le fornito da ST c'è anche una macro che de�nisce #defineRCC_APB2ENR_SPI1EN (1�12).

Il codice per attivare questo bit (senza toccare gli altri bit del registro) è quindi:

RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;

POuL Laboratorio microcontrollori e open source Terza parte 35/ 43

Page 36: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Una volta con�gurati i GPIO come alternate function e accesa la periferica SPI1,occorre con�gurarla come scritto nel reference manual.Per farlo, esiste il registro SPI1->CR1. Questo registro ha i seguenti bit cheandranno settati:

SPI_CR1_SSM e SPI_CR1_SSI per dire alla periferica che il CS lo gestiamonoi in software.

SPI_CR1_MSTR mette la periferica in master mode

SPI_CR1_BR_2 per con�gurare una velocità di 2.6MHz

SPI_CR1_SPE serve per attivare la periferica dopo la con�gurazione

Il codice da scrivere è

SPI1->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR

| SPI_CR1_BR_2 | SPI_CR1_SPE;

POuL Laboratorio microcontrollori e open source Terza parte 36/ 43

Page 37: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

Ok, adesso la con�gurazione è �nita. A questo punto abbiamo �nito?No, occorre scrivere delle funzioni per andare a leggere e scrivere dalla SPI.

Per farlo esistono altri due registri:

SPI1->DR Data register, scrivendo in questo registro si trasmette un byteattraverso la SPI, leggendo si preleva un byte ricevuto dalla SPI.

SPI1->SR Status register, contiene il bit SPI_SR_RXNE, settato dall'hardwareper per sapere quando il trasferimento di un byte attraverso la SPI ècompletato.

POuL Laboratorio microcontrollori e open source Terza parte 37/ 43

Page 38: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La periferica SPI

void spiSend(unsigned char byte)

{

SPI1->DR=byte;

while((SPI1->SR & SPI_SR_RXNE)==0) ; //Wait

byte=SPI1->DR; //Dummy read, causa l'azzeramento del bit RXNE

}

unsigned char spiReceive()

{

SPI1->DR=0; //Dummy write, causa la ricezione di un byte dalla SPI

while((SPI1->SR & SPI_SR_RXNE)==0) ; //Wait

return SPI1->DR;

}

POuL Laboratorio microcontrollori e open source Terza parte 38/ 43

Page 39: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | LIS302DL

Prima di poter leggere l'accelerometro bisogna inizializzarlo con il seguente codice:

void accelInit()

{

cs::low();

spiSend(0x20);

spiSend(0x47);

cs::high();

}

Questa procedura e i numeri 0x20 e 0x47 sono riportati sul datasheetdell'accelerometro LIS302DL.

POuL Laboratorio microcontrollori e open source Terza parte 39/ 43

Page 40: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | LIS302DL

A questo punto, si può scrivere il codice per leggere l'accelerazione lungo un asse:

// axis==0 : read X axis

// axis==1 : read Y axis

// axis==2 : read Z axis

signed char accelRead(int axis)

{

cs::low();

spiSend(0x80 | (0x29+2*axis));

signed char result=spiReceive();

cs::high();

return result;

}

Anche questo codice è stato scritto a partire dal datasheet dell' accelerometro.

POuL Laboratorio microcontrollori e open source Terza parte 40/ 43

Page 41: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | La seriale e printf()

Su Miosix, si può stampare sulla seriale con printf().

Solo che la board stm32f4discovery non ha un adattatore USB/seriale comel'Arduino, il che rende di�cile collegare la seriale a un computer.

Si potrebbe usare la USB, ma Miosix non ha ancora i driver per la periferica USBdi questa board.

Allora si può ricorrere a un convertitore USB/seriale esterno, acquistabileseparatamente.

Si può anche usare un Arduino come se fosse un adattatore USB/seriale, bastatogliere l'ATmega328. Questa è la soluzione che useremo.

POuL Laboratorio microcontrollori e open source Terza parte 41/ 43

Page 42: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro | GUI in Qt

Lato PC si può usare (da Linux) il comando

screen /dev/ttyUSB0 19200

per vedere cosa viene stampato sulla seriale.

Per plottare i gra�ci delle accelerazioni è stata fatta una GUI in Qt che apre laseriale e plotta a schermo i dati.

POuL Laboratorio microcontrollori e open source Terza parte 42/ 43

Page 43: Laboratorio microcontrollori e open source Terza parte - POuL · Introduzione Per chi si è perso le prime lezioni Questo corso è una breve introduzione ai microcontrollori, concentrandosi

Progetto #4: Accelerometro

Pratica: costruzione del circuito

POuL Laboratorio microcontrollori e open source Terza parte 43/ 43