Arduino permette di memorizzare in modo indelebile una certa quantità di dati utilizzando la eprom disponibile a bordo del suo microcontrollore ATmega328. Ma se i dati diventano tanti e superano i pochi Kbyte disponibili? Una soluzione semplice, affidabile e a basso costo è utilizzare una memory card.
Le schede di memoria
Esistono oggi sul mercato un gran numero di schede di memoria, dalle più antiche Compact Flash alle più recenti micoSD, passando per Smart Media, Memory Stick, MultiMediaCard, xDPictureCard e altri modelli più esotici, ce n’è veramente per tutti i gusti.
Per questo progetto ci siamo concentrati sulla famiglia delle Secure Digital (anche dette semplicemente SD) per quattro ragioni principali:
- perchè di gran lunga le più diffuse, economiche e disponibili in vari tagli
- perchè la comunicazione avviene tramite interfaccia SPI disponibile nativamente su Arduino
- perchè esistono librerie software già sviluppate che ne consentono l’utilizzo nell’ambiente di sviluppo di Arduino
- perchè il socket di una SD è facilmente reperibile ed è facile da saldare grazie al passo largo e al numero limitato dei suoi terminali
Inoltre esistono adattatori che consentono di utilizzare all’interno di un socket SD anche card di tipo MiniSD e MicroSD senza doversi preoccupare di realizzare versioni apposite degli adattatori per questi modelli. Infatti sia i protocolli di comuicazione, sia i livelli di tesione dei tre modelli sono gli stessi.
Figura 1: La famiglia delle schede SD: SD, MiniSD e MicroSD
(da: Wikipedia – File:SD Cards.svg)
Secure Digital nel dettaglio
Dal punto di vista fisico le SD presentano l’equivalente di un connettore a nove contatti (di fatto non si tratta di un connettore vero e proprio ma di contatti striscianti) che permette di trasferire alla scheda l’alimentazione e tutti i segnali necessari per la scrittura e la lettura dei dati.
Figura 2: Pinout di una SD vista dal retro
Il pinout riportato nella Figura 2 si riferisce alla modalità SPI (la scheda può funzionare anche in altre due modalità: One-Bit e Four-Bit. In tal caso il significato dei vari contatti sarà differente);Vediamo di seguito il significato dei vari pin nella modalità SPI.
SS
Il primo pin SS (da notare il “trattino” posto al disopra della sigla che indica che il segnale è attivo quando basso) è il segnale di selezione del dispositivo, o slave select, che deve essere messo a zero per indicare alla SD che il master, cioè Arduino, desidera utilizzarla. Nel caso di sistemi con più slave questo segnale dovrà essere controllato dal microcontrollore mente nel caso in cui ci sia un solo dispositivo slave sarà possibile fissare questo segnale a zero.
MOSI, MISO e SCK
Ai pin 2, 7 e 5 corrispondono rispettivamente i segnali MOSI, MISO e SCK che sono i principali artefici del trasferimento dei dati tra Arduino (master) e la scheda SD (slave). Sono, nell’ordine, gli acronimi di Master Output Slave Input (dati in transito dal master verso lo slave), Master Input Slave Output (dati in transito dallo slave verso il master), Serial ClocK (clock fornito dal master agli slave).
VCC e GND
Collegata al pin 4, VCC è la tensione di alimentazione della SD. Quando si lavora con una SD e la si vuole collegare ad Arduino è importante tenere presente che queste memorie, a differenza della board Arduino che lavora a 5V, devono essere alimentate a 3.3V. Il pin 3 e 6, GND, sono le masse. Sia la VCC che la massa presente sul pin 3 presentano un contatto strisciante più lungo rispetto agli altri per consentire all’elettronica della scheda di ricevere l’alimentazione prima dei segnali dei dati.
Socket o non socket
Veniamo ora a una delle questioni spinose che hanno accompagnato questo progetto: come collegare la memory card all’Arduino? Ovvero, ho veramente bisogno di un socket o esistono alternative?
Figura 3: A sinistra un socket per SD, a destra una soluzione alternativa
La risposta come spesso accade in questi casi è: dipende. L’adattatore realizzato in questo progetto prevede l’utilizzo di un socket per due motivi:
- la semplicità di inserimento e rimozione della memory card
- la maggiore affidabilità dei contatti striscianti
Ci sono però svariate alternative che vanno dalla saldatura di un header a sette pin direttamente sulla SD (o meglio su un adattatore SD/MicroSD nel caso in cui si possano utilizzare MicroSD), all’utilizzo degli header in modo creativo per creare una sorta di connettore “a pinza” come illustrato su instructables nell’articolo Cheap DIY SD card breadboard socket scritto da Kroden
I prossimi passi
Nelle prossime puntate verranno illustrati:
- gli schemi utilizzati per la costruzione dell’adattatore
- i principali componenti utilizzati e il loro principio di funzionamento
- una possibile realizzazione su millefori dell’adattatore
- il collegamento dell’adattatore ad Arduino utilizzando una breadboard
- il test di scrittura e lettura di una SD Card da 2 GB con relativo codice
- il confronto tra i diversi metodi di adattamento dei livelli SPI
- l’ottimizzazione del circuito
A presto!
Non dimenticatevi di seguirci su Twitter per essere sempre informati sui nuovi articoli pubblicati su Sisuino Blog.
Commenti
12.03.2017 Vito
Ciao Silvio, ho interfacciato una SD seguendo quanto ben dettagliato nel tuo articolo, e inizialmente è andato tutto alla perfezione. il mio nano, con un dht e un bmp registrava regolarmente i valori di pressione, umidità, temperatura su un file.txt. ad un certo punto, mentre smanettavo, ho bruciato la SD estraendola dal socket senza staccare l'alimentazione. da qui in poi non sono più riuscito ad ottenere un file da arduino. l'unica, e dico unica cosa che ho cambiato, è stata l'alimentazione, che (me ne sono accorto ricontrollando) precedentemente avevo preso dal pin 5V (però funzionava). con il pin 4 collegato al 3,3V, riesco ad avere le info dalla SD (tipo di SD, dimensione), ma non mi elenca i file presenti e tantomeno me ne scrive. ho passato due giorni a controllare e ricontrollare tutto. le differenze da tuo schema sono i valori dei ripartitori per i segnali 1.2K e 2.2K in sostituzione dei 1.8K e 3.3K, ma i rapporti sono identici, dubito che sia per questo. hai qualche dritta? non so più che pesci prendere. ti ringrazio anticipatamente.
12.03.2017 Vito
Ciao Silvio, finalmente ho risolto! ho reinstallato le librerie sd.h e spi.h funziona tutto alla perfezione. grazie ancora.