Micro SD Card Module

Ultimo aggiornamento 2 gennaio 2019


JLCPCB - 10 PCB per $ 2 (100 * 100 mm, 2-layer)
Il più grande produttore di PCB in Cina, oltre 300.000 clienti e oltre 10.000 ordini online al giorno
Vedi l'interno della fabbrica di PCB: https://www.youtube.com/watch?v=_XCznQFV-Mw


Indice

Descrizione

 

Il piccolo modulo (misura solo 18 x 18 x 11 mm) descritto in questa pagina, permette di dotare i progetti Arduino delle memorie MicroSD  (contrazione di Micro Secure Digital, in precedenza TransFlash T-Flash) , per maggiori informazioni vedere il seguente link.

Questo tipo di memorie sono ormai utilizzati nei principali dispositivi elettronici presenti in commercio, come fotocamera, smartphone, videocamere, etc… e hanno sostituito altri precedenti modelli. I principali motivi del loro utilizzo sono le dimensioni ridotte, la velocità di scrittura/lettura (fino a 32 MB/s) e i costi, ormai molto ridotti.
Sono memorie di tipo non volatile, ovvero non richiedono un’alimentazione per poter mantenere i dati salvati (come dischi i rigidi dei computer).
In realtà il microcontrollore ATMEGA328 possiede al suo interno tre tipi di memoria:

Ma nessuna delle tre è allo stesso tempo non volatile, ampia e con “infinite” letture/scritture. Per questo motivo, è necessario a volte disporre di un lettore microSD per poter utilizzare una memoria di tale tipo per salvare e leggere dati che servono per il programma che è caricato sull’Arduino.

 

 

 

Potete trovare il modulo presso la ICstation.com con codice 5043 Mini Micro SD Card Module Memory Module for Arduino.  Il costo si aggira sui 2€

 

Schema elettrico

Lo schema elettrico del modulo è molto semplice in quanto si limita al collegamento dei pin della scheda di memoria al connettore. In commercio esistono dei moduli più complessi, che montano anche dei regolatori di tensione, in quanto la scheda micro SD necessita di una tensione di alimentazione di 3,3V, sono inoltre presenti dei circuiti traslatori di livelli in quanto la scheda funziona con livelli di 3,3V.
Comunque da prove effettuate si è rilevato che non vi sono problemi, basterà utilizzare l'alimentazione 3,3V fornita dal Arduino.
La comunicazione tra il microcontrollore e la scheda SD utilizza il protocollo SPI (Serial Peripheral Interface) che è un sistema di comunicazione tra un microcontrollore e altri circuiti integrati o tra più microcontrollori. È un bus standard di comunicazione ideato dalla Motorola e sviluppato, in una sua variante, anche dalla National Semiconductor con il nome di bus MicrowireTM. La trasmissione avviene tra un dispositivo detto master e uno o più slave (letteralmente dall'inglese padrone e schiavo). Il master controlla il bus, emette il segnale di clock, decide quando iniziare e terminare la comunicazione.
Esso si basa su 4 segnali :

NOTA: il Chip Select (CS ) non è indispensabile in tutte le applicazioni.

Per l'utilizzo di Arduino questa comunicazione si svolge sui pin digitali 11 (MOSI), 12(MISO) e 13(CLK) (sulla maggior parte delle schede Arduino) o 50, 51 e 52 (Arduino Mega). Inoltre, un altro pin deve essere utilizzato per selezionare la scheda CS. Questo può essere il pin 10(CS) dell'hardware SS (sulla maggior parte delle schede Arduino) o il pin 53 (sul Mega) - o un altro pin specificato nella chiamata a SD.begin () della libreria che vedremo in seguito.

 

Libreria Arduino

L'utilizzo della scheda MicroSD con Arduino è semplice in quanto la libreria SD già presente nell’IDE di Arduino (vedere link). Questa consente di leggere e scrivere su schede SD. La libreria supporta i file system FAT16 e FAT32 su schede SD standard e schede SDHC. Usa nomi brevi di 8.3 per i file. I nomi di file passati alle funzioni della libreria SD possono includere percorsi separati da barre di avanzamento, /, ad es. "Directory / nomefile.txt". Poiché la directory di lavoro è sempre la radice della scheda SD, un nome fa riferimento allo stesso file indipendentemente dal fatto che includa o meno una barra iniziale (ad esempio "/file.txt" equivale a "file.txt").
Per la localizzazione dei programmi di esempio, basterà accedere sotto File - Esempi - SD, dove son presenti i programmi:

Primo programma di test

Vediamo adesso l'utilizzo di uno sketch presenti per testare il nostro modulo.
Per fare questo dovremo aver già una scheda MicroSD su cui abbiamo salvato preventivamente dei files. Provvederemo poi al collegamento del nostro modulo alla scheda Arduino seguendo lo schema sotto riportato, ed effettuando i seguenti collegamenti:

Caricheremo lo sketch CardInfo e verificheremo che il pin collegato al chipSelect sia il 10

 
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

Il programma è semplice e si limita a mostrare le informazioni sullo stato e tipo di memoria microSD, che è stata inserito nel lettore, collegato ad Arduino. Comunque se i collegamenti sono errati, sarà mostrato un errori in quanto non sarà possibile inizializzare la SD card.
Come è visibile dalla copia di quanto mostrato sul monitor seriale, è mostrata il tipo di SD, il tipo di formattazione, le dimensioni della memoria e l'elenco dei files presenti. Come visibile, essendo nomi più lunghi di 8 caratteri sono stati troncati.

Realizzazione di un data logger

Vediamo ora la realizzazione di un data logge low cost, per il monitoraggio ambientale di temperature , con successiva registrazione dei valori  su una SD-Card.
Il cuore del progetto è Arduino, il programma che si scrive su Arduino sarà naturalmente avviato a loop() finché non si toglie l'alimentazione dal dispositivo. Quando lo colleghiamo ad una fonte di alimentazione (ad esempio la USB del PC o anche una comunissima Batteria da 9V) si accende e avvia il programma caricato dall'IDE a loop infinito. Questo continua fino a quando non togliamo la batteria o stacchiamo il cavo.
Il programma legge i valori di temperatura e umidità tramite il sensore DHT11 e salva i valori in contemporanea con i dati di dell'ora e del giorno forniti da un modulo con un DS1302, in cui è effettuata la misura su una memoria SD.
Un led Bicolore segnala eventuali problemi o l'avvenuta registrazione dei dati.

Materiale necessario

Per la realizzazione del nostro progetto si sono utilizzati i seguenti componenti:

 

KY-015 Temperature and humidity sensor module

Il modulo KY-015 Temperature and humidity sensor module fa parte della serie "37 In 1 Sensor Module Board Set Kit For Arduino", si presenta come un piccolo circuito, su di esso sono montati, il sensore DHT11, due resistenze, un led e un connettore a 3 pin.
Il modulo compatibile con le piattaforme di elettronica più popolari come Arduino, Raspberry Pi e ESP8266.
I campi di applicazione del modulo possono essere: HVAC test e apparecchiature di controllo , auto motive, data logger, controllo automatico, stazione Meteo, regolatori di umidità , deumidificatori.

 

 

Alimentazione

 3-5.5V DC

Segnale di uscita

 digitale del segnale tramite single-bus

Elemento sensibile

 Resistenza in Polimero

Campo di misura umidità

 20-90% di umidità relativa, temperatura di 0-50 gradi Celsius

Precisione

Umidità + -4% RH (Max + -5% di umidità relativa)
Temperatura +-2.0Celsius

Risoluzione o la sensibilità

 umidità 1% di umidità relativa, temperatura 0.1 Celsius

Ripetibilità umidità

 + -1% di umidità relativa temperatura +-1Celsius

Umidità isteresi

 + -1% RH

Stabilità a lungo termine

 + -0.5% UR / anno

Tempo di rilevazione

 medio: 2s

Dimensioni

 12 * 15,5 * 5,5 millimetri

Modulo RTC con IC DS1302

Il modulo MH-Real-Time Clock Module - 2 si basa sull' integrato DS1302 al cui interno è presente un orologio in tempo reale / calendario e 31 byte di RAM statica.

Il chip comunica con il microprocessore tramite un'interfaccia seriale. Il RTC (Real Time Clock) / calendario fornisce: secondi, minuti, ore, giorno, data, informazioni Mese, e Anno.
Per l'interfaccia, oltre all'alimentazione, sono necessari solo tre fili : CE (RST), I/O (linea dati), e SCLK (serial clock).
I dati possono essere trasferiti da e verso l'orologio/RAM 1 byte alla volta o in un inico invio fino a 31 byte.
Il DS1302 è progettato per funzionare con una potenza molto bassa e per conservare dati e informazioni di clock con meno di 1μW.
Il DS1302 ha pin di alimentazione doppi, una primaria (Pin #1 #4) e un altro per la batteria di backup (Pin #8 #4), corrente 260mAh, batteria non ricaricabili. tempo di conservazione dei dati teorica è più di 10 anni.
In questa applicazione per esempio l'alimentazione primaria  è fornita da Arduino, e quella secondaria da una batteria CR2032.

DS1302 Trickle-Charge Timekeeping Chip

Piedinatura Datasheet Foto dell'integrato

Schema di collegamento del modulo ad Arduino

Attenzione: la disposizione dei pin non è standard, controllare la loro disposizione prima del collegamento

Pin Arduino Pin moduli

GND

DHT11, RTC, Micro SD Card Module, Led bicolore

+5V

DHT11 e RTC
+ 3V3 Micro SD Card Module
Digital 2 Pin CE - RST modulo RTC
Digital 3 Pin I/O - DAT modulo RTC
Digital 4 Pin CLCK - CLK modulo RTC
Digital 5 - Pin data - DHT11
Digital 6 Pin LED rosso
Digital 7 Pin LED verde
Pin Digital 11 Pin MOSI - Micro SD Card Module
Pin Digital 12 Pin MISO - Micro SD Card Module
Pin Digital 13 Pin CLK - Micro SD Card Module

 

Listato del programma

Per il funzionamento del programma, visto l'utilizzo di più moduli diversi sono necessarie alcune librerie, per questo motivo vi dovrete riferire alle singole pagine per come dovrete caricarle.

Programma 
/*
  datalogger.ino
  Il programma legge i valori di temperatura e umidità tramite
  il sensore DHT11 e salva i valori in contemporanea con i dati
  di dell'ora e del giorno in cui è effettuata la misura su una memoria SD
  Un led Bicolore segnala eventuali problemi o l'avvenuta registrazione dei dati.

  Sono utilizzati i seguenti pin
  Pin +5V           -> VCC - DHT11 e RTC
  Pin +3,3V         -> VCC - Micro SD Card Module
  Pin GND           -> GND - DHT11, RTC, Micro SD Card Module, Led bicolore
  Pin Digital 2     -> Pin CE - RST modulo RTC
  Pin Digital 3     -> Pin I/O - DAT modulo RTC
  Pin Digital 4     -> Pin CLCK - CLK modulo RTC
  Pin Digital 5     -> Pin data - DHT11
  Pin Digital 6     -> Pin LED rosso
  Pin Digital 7     -> Pin LED verde
  Pin Digital 11    -> Pin MOSI - Micro SD Card Module
  Pin Digital 12    -> Pin MISO - Micro SD Card Module
  Pin Digital 13    -> Pin CLK - Micro SD Card Module

  Creato il 02/01/2019 da Adriano Gandolfo
  Sito web https://www.adrirobot.it
  Blog https://it.emcelettronica.com/author/adrirobot
  Pagina Facebook https://www.facebook.com/Adrirobot-318949048122955
  Istagram https://www.instagram.com/adrirobot/
  This example code is in the public domain.
*/

// Impostazione RTC
#include <Wire.h>
#include <DS1302.h>
DS1302 rtc(2, 3, 4);
char buffer[50];

//Impostazione led bicolore
#define Led_Rosso 6 // seleziona il pin per il LED rosso
#define Led_Verde 7 // seleziona il pin per il LED verde
short i = 0;

// Impostazione SD card
#include <SD.h>
#define CS 10
File myFile;

// Impostazione del sensore DHT11
#include "DHT.h"
#define DHTPIN 5         // Pin a cui è collegato il sensore
#define DHTTYPE DHT11    // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup () {
  Serial.begin(9600);
  dht.begin();

  //inizializziamo i pin 3 e 4 per i led rosso-verde
  //pin 10 riservato al card reader
  pinMode(CS, OUTPUT);
  pinMode(Led_Rosso, OUTPUT);
  pinMode(Led_Verde, OUTPUT);

  Serial.print("Initializing SD card...");
  pinMode(CS, OUTPUT);

  if (!SD.begin(CS)) {
    Serial.println("initialization failed!");

    for (i = 0; i < 10; i++) {
      //blinking del led rosso
      digitalWrite(Led_Rosso, HIGH);
      delay(100);
      digitalWrite(Led_Rosso, LOW);
      delay(100);
    }
    return;
  }
  Serial.println("initialization done.");
  //blinking led verde
  digitalWrite(Led_Verde, HIGH);
  delay(500);
  digitalWrite(Led_Verde, LOW);

  // Imposta RTC in run-mode e disabilita' la protezione da scrittura
  rtc.halt(false);
  rtc.writeProtect(false);

  //Le seguenti linee possono essere commentate per utilizzare i
  //valori già memorizzati nel DS1302
  //  rtc.setDOW(WEDNESDAY);        // Imposta il giorno della settimana
  //  rtc.setTime(9, 55, 0);     // Imposta l'ora come 11:32:00 (Formato 24hr)
  //  rtc.setDate(2, 1, 2018);   // Imposta la data cone 12 febbraio 2017
  Wire.begin();
}

void loop () {

  // -----------------------------------------------------------------------
  float t = dht.readTemperature();
  float h = dht.readHumidity();

  Serial.println("\n");

  // Inviamo giorno della settimana
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");

  // Inviamo data
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Inviamo ora
  Serial.println(rtc.getTimeStr());

  // inviamo Temperatura e umidità

  Serial.print("Temperatura (C): ");
  Serial.println(t, 1);

  Serial.print("Umidita' (%): ");
  Serial.println(h, 1);

  // -----------------------------------------------------------------------
  // Apertura in scrittura il file sulla SD
  myFile = SD.open("dati.log", FILE_WRITE);

  //Scriviamo: giorno mese anno - ORA:MINUTI:SECONDI - temperatura - Umidità
  if (myFile) {
    myFile.print(rtc.getDOWStr());
    myFile.print("/");
    myFile.print(rtc.getDateStr());
    myFile.print("/");
    myFile.print(rtc.getTimeStr());
    myFile.print("/");
    myFile.print(t, 1);
    myFile.print("/");
    myFile.println(h, 1);

    //chiudiamo il file
    myFile.close();

    //blinking led verde
    digitalWrite(Led_Verde, HIGH);
    delay(100);
    digitalWrite(Led_Verde, LOW);
  }
  else {
    Serial.println("error opening data.log");
    for (i = 0; i < 10; i++) {
      //blinkig led rosso
      digitalWrite(Led_Rosso, HIGH);
      delay(100);
      digitalWrite(Led_Rosso, LOW);
      delay(100);
    }
  }
  delay(10000);
}

una volta terminata la misurazione, la SD potrà essere rimossa, e il file memorizzato potrà essere letto tramite un normate editor di testo, il formato sarà simile a quello sotto riportato.

I dati potranno essere manipolati tramite un foglio di calcolo e le misure potranno essere riportate su un grafico

 

Elenco revisioni

02/01/2019

Aggiornato pagina inserito programma data logger

31/12/2018

Emissione preliminare