Le datalogging

Le datalogging est un dispositif électronique programmable qui
enregistre des valeurs de mesure individuelles et des séries de
mesure sur une longue période.
Les grandeurs sont automatiquement mesurées, numérisées et
enregistrées sur un support (ici une carte SD).
Les grandeurs mesurées sont pour nous : température intérieure et
extérieure, humidité relative (% HR), pression, intensité lumineuse,
l’accélération selon 3 axes, coordonnées GPS, altitude, vitesse.
Le branchement sur une carte MEGA
Les cartes SD utilisent la liaison série SPI
(pour Serial Peripheral Interface) pour communiquer avec un
microcontrôleur tel que l’Arduino uno.
Le bus SPI utilise 4 signaux logiques :
·
·
MOSI — Master Output, Slave Input
(généré par le maître l’Arduino
uno, patte D11)
·
MISO — Master Input, Slave Output
(généré par l'esclave vers l’Arduino
uno, patte D12)
·
SS — Slave Select ou Chip Select
(CS), actif à l'état bas
(généré par le maître). Sur l’Arduino uno c’est la seule patte
paramétrable (par ex : int
chipSelect = 10;). Pour les
shields SD (carte d’extension) le CS est inscrit sur la carte en
général il s’agit de D4 ou D10 (valeur par défaut).
Remarques : il peut y avoir plusieurs Chip Select si l’Arduino
communique avec plusieurs périphériques en SPI.
C’est
la plus rapide des liaisons séries de l’Arduino : l’horloge est à 4
MHz par défaut.
Arduino Board | MOSI | MISO | SCK | SS (slave) | SS (master) |
Uno or Duemilanove | 11 or ICSP-4 | 12 or ICSP-1 | 13 or ICSP-3 | 10 | - |
Mega1280 or Mega2560 | 51 or ICSP-4 | 50 or ICSP-1 | 52 or ICSP-3 | 53 | - |
Leonardo | ICSP-4 | ICSP-1 | ICSP-3 | - | - |
Due | ICSP-4 | ICSP-1 | ICSP-3 | - | 4, 10, 52 |
La bibliothèque
La programmation d’un lecteur de carte SD est
grandement facilitée par l’usage de la bibliothèque SD et de
l’exemple associé Datalogger (Fichier/Exemples/SD/Datalogger
) :
Principales fonctions utilisées, exemple :
SD
class : SD.begin(cspin),
SD.open(filepath, mode),
SD.remove(filename)
File
class : file.print(data)
, file.println(data),
file.close()
pinMode(chipSelect, OUTPUT);
// Seule pinMode à
déclarer dans le setup : chipSelect
if (!SD.begin(chipSelect)){
// Initialisation +
contrôle, s’il y a un pb
Serial.println("Erreur
carte SD");
// écrire un message
d’erreur
return ;}
// return nous
fait sortir du sous programme setup Serial.println("Carte
presente");
// Sinon
l’initialisation est correcte
La struture du programme :
Remarque : Nous avons eu des problèmes lors de la compilation de ce programme avec la bibliothèque SD.h
Résolu en remplaçant la bibliothèque de l'IDE Arduino 1.5.8 par une plus ancienne : SD.h
/* 1) Zone 1 : les déclarations */
// 1.a) Les bibliothèques et création d'objets
#include <SD.h>
// 1.c) Les variables globales
// Pattes Arduino
int chipSelect=53; // chipSelect est la seule patte à déclarer :
// Les autres sont déjà déclarées par la bibliothèque
/* 2) Zone 2 : Initialisation (le setup) */
void setup() {
pinMode(chipSelect, OUTPUT);
digitalWrite(chipSelect,LOW);
entete(); // Fin de l'initialisation de la carte SD + entête du fichier
}
}
/* 3) Zone 3 : le Programme Principal */
void loop() {
ecritureSD();
}
/* 4) Zone 4 : les sous programmes (ou fonctions) */
void entete(){ // Exemple d'une série de mesure à stocker
// Initialisation carte SD
if (!SD.begin(chipSelect)) { Sdebug.println("Erreur carte SD");erreurSD=1;return;}
else {Sdebug.println("Carte presente");}
// Format csv le séparateur de colonne est : ";"
File GPStab = SD.open("Mesures.csv", FILE_WRITE);
if (GPStab) {
GPStab.print("date"); GPStab.print(";");
GPStab.print("latitude"); GPStab.print(";");
GPStab.print("longitude"); GPStab.print(";");
GPStab.print("Altitude"); GPStab.print(";");
GPStab.print("Vitesse"); GPStab.print(";");
GPStab.print("Tint"); GPStab.print(";");
GPStab.print("Text"); GPStab.print(";");
GPStab.print("tdht"); GPStab.print(";");
GPStab.print("tBMP"); GPStab.print(";");
GPStab.print("tPT"); GPStab.print(";");
GPStab.print("tCTN"); GPStab.print(";");
GPStab.print("BMP180 P"); GPStab.print(";");
GPStab.print("MPX5100"); GPStab.print(";");
GPStab.print("ADXL X"); GPStab.print(";");
GPStab.print("ADXL Y"); GPStab.print(";");
GPStab.print("ADXL Z"); GPStab.print(";");
GPStab.print("ADXL A"); GPStab.print(";");
GPStab.print("BPW34 (1)"); GPStab.print(";");
GPStab.print("BPW34 (2)"); GPStab.print(";");
GPStab.print("DHT22 Hr"); GPStab.print(";");
GPStab.println();
GPStab.close();
}
}
void ecritureSD() {
File GPStab = SD.open("Mesures.csv", FILE_WRITE);
if (GPStab) {
GPStab.print(Date); GPStab.print(";");
GPStab.print(N,5); GPStab.print(";");
GPStab.print(E,5); GPStab.print(";");
GPStab.print(Alti); GPStab.print(";");
GPStab.print(Vitesse,1); GPStab.print(";");
GPStab.print(Tint,1); GPStab.print(";");
GPStab.print(Text,1); GPStab.print(";");
GPStab.print(tdht,1);GPStab.print(";");
GPStab.print(tBMP,1);GPStab.print(";");
GPStab.print(tPT,1); GPStab.print(";");
GPStab.print(tCTN,1); GPStab.print(";");
GPStab.print(Pext); GPStab.print(";");
GPStab.print(pMPX); GPStab.print(";");
GPStab.print(Ax); GPStab.print(";");
GPStab.print(Ay); GPStab.print(";");
GPStab.print(Az); GPStab.print(";");
GPStab.print(A); GPStab.print(";");
GPStab.print(L1); GPStab.print(";");
GPStab.print(L2); GPStab.print(";");
GPStab.print(h); GPStab.print(";");
GPStab.println();
GPStab.close();
erreurSD=0;
}
else {
Sdebug.println("Erreur Mesures.csv");
erreurSD=1;
}
}