# PROJET : BOUEE DE MESURES OCEANOGRAPHIQUES¶

### Objectifs¶

- Identifier le rôle des capteurs
- Réaliser par programmation un système embarqué

### Pré-requis¶

- Manipulation des principales fonctionnalités de la carte Arduino
- Bases du langage de programmation Arduino (C++)

### Matériel nécessaire¶

- Carte Arduino Uno
- Capteur de température analogique
- Shield SD et une carte SD
- Shield GPS
- Environnement de programmation Arduino

## 1 - BOUEE DERIVANTE DE MESURE DE TEMPERATURE DES OCEANS¶

### 1.1 - Présentation de la bouée dérivante¶

L'océanographie physique, qui étudie les phénomènes observés en mer par les marins ou les satellites, est avant tout une science expérimentale. Les premières mesures de ces phénomènes ont été réalisées au cours d’explorations à partir de navires plus ou moins spécialisés. Il est apparu que certaines de ces mesures n’étaient possibles qu’à partir d’un navire au point fixe. Aussi, dès que l’on a su fabriquer des appareils autonomes, ils ont été placés sous des bouées ancrées sur le fond. Dans d’autres cas, il s’est avéré plus intéressant de laisser l’ensemble dériver avec les courants.

Une bouée dérivante permet d'effectuer des expériences in-situ au niveau de la surface libre de la mer, en dérivant pendant plusieurs mois. Elle contient un ensemble de capteurs notamment un capteur de température qui fournit, après un traitement approprié, les mesures à étudier.

La bouée dérivante est constituée d'un flotteur en forme de sphère, qui contient les équipements de mesure et d'une structure à très forte traînée appelée ancre flottante qui est maintenue immergée à une certaine profondeur.

Les mesures réalisées à bord de la bouée sont envoyées par liaison radio à une station à terre où elles sont enregistrées, contrôlées et diffusées pour servir à des études scientifiques. Pour plus de sûreté, les mesures sont aussi enregistrées sur une carte mémoire interne à la bouée.

Un système de localisation satellite ARGOS permettra de localiser la bouée afin de la récupérer à la fin de la campage de mesures.

### 1.2 - Caractéristiques des mesures¶

- Durée de la campagne : 6 mois
- Fréquence de mesure : toutes les demi-heures

Dans un premier temps on s'interessera uniquement à la mesure de la température. Les mesures seront stockées dans un fichier mesures.txt. Chaque mesure sera inscrite sur une ligne qui comportera la valeur de la température et la date (nombre de minutes écoulées depuis le début de la campagne) à laquelle la mesure a été prise séparées par un point virgule afin de convertir le fichier ".txt" en fichier ".csv" pour un traitement ultérieur. On pourra, par exemple, trouver dans le fichier texte, les lignes suivantes :

$15.3;000030$
$15.4;000060$
$15.4;000090$

Chaque chiffre est un caractère codé sur 8 bits. Chaque ligne (chaque mesure) est constituée de 12 caractères : 4 caractères pour la température, 1 caractère pour le point-virgule ";" entre la température et la date, 6 caractères pour la date et 1 caractère pour le saut de ligne "\n".

Question : Que faut faire pour convertir le fichier mesures.txt en fichier csv ?

## 2 - Matériel utilisé¶

La mesure de température sera réalisée par une sonde de température étanche. Il s'agit d'une thermistances CTN (10K) :

- $\beta = 3380\,\text{K}\pm1\%$
- $R_0 = 10\,\text{k}\Omega\pm1\%$
- plage de mesure:-20 à 105 $^o$C avec $T_0 \simeq 298\,\text{K}$

L'acquisition et le traitement des mesures sera réalisé par une carte Arduino Uno.

Les mesures seront stockée sur une carte SD qui sera placée sur un shield SD de chez Sparkfun. La communication entre le shield SD et la carte Arduino se fera par l'intermédiaire du bus SPI.

Le bus série SPI (Synchronous Peripheral Interface) a été développé par Motorola pour les échanges de données entre des périphériques (mémoires, afficheurs, cartes SD…) au sein de systèmes à base de microcontrôleurs (téléphones mobiles, robots...). Le protocole de transmission est très simple. Il consiste à transmettre uniquement les données codées sur un octet.

La carte arduino possède une interface SPI qui permet de commander un périphérique via ce bus par les broches 13 (SCK), 12 (MISO), 11 (MOSI) et 10 (SS).

Présentation du bus SPI

## 3 - Schéma de câblage¶

Le shield SD est connecté directement à la carte Arduino. La sonde est alimentée en $+5V$. La sortie du capteur est connectée à l'entrée analogique $A0$.

## 4 - Stockage interne des données¶

Question : Calculer le nombre d'octet correspondant au stockage d'une ligne dans le fichier text

Question : Déterminer le nombre d'octets nécessaires pour le stockage des mesures pendant une campagne de 6 mois. Vérifier si une carte SD d'un capacité de 2Go est suffisante pour stocker l'ensemble des mesures.

Les mesures seront stockées dans le fichier "mesures.txt" qui sera contenu dans la carte SD insérée dans le shield SD. Le programme de stockage des données dans la carte SD est donné ci-dessous. Pour faciliter les tests, les mesures seront réalisées toutes les 3s au lieu des 30mn.

    #include <SPI.h>
    #include <SD.h>

    const int chipSelect = 8;  // Broche de sélection du shield SD
    const int broche_Temp = 0;  // Broche de connection du capteur de température
    long temps = 0;   // Initialisation chronomètre

    void setup()
    {
      Serial.begin(9600);
      pinMode(chipSelect, OUTPUT);  // Broche 8 en sortie

      // Test si la carte sd est bien placée dans le slot
      if (!SD.begin(chipSelect)) {
        Serial.println("Carte SD non détectée");
        return;
      }
      Serial.println("Initialisation carte SD réussie");
    }

    void loop()
    {
      String dataString = "";
      delay(30000);
      temps += 30000;
      int valeur_num = analogRead(A0)     // Valeur numérique de la tension du capteur
                                              // Calcul de la température
      dataString += String(valeur_num);
      dataString += "\t";
      dataString += String(temps);
      dataString += "\n";

      // Ouverture du fichier en mode écriture
      File dataFile = SD.open("mesures.txt", FILE_WRITE);

      // Si le fichier existe
      if (dataFile)
      {
          dataFile.println(dataString);
          dataFile.close();
          Serial.println(dataString);
          }
      // Sinon afficher un message d'erreur
      else
      {
          Serial.println("Erreur ouverture fichier mesures.txt");
          }
       }

Question : Compléter les lignes de programme permettant de calculer la température à partir de la valeur numérique de la tension fournie par le capteur.

Question : Copier le programme et coller-le dans l'environnement de programmation Arduino. Vérifier le bon fonctionnement du programme.

## 5 - Acquisition des coordonnées géographiques¶

Afin de pouvoir établir une cartographie des températures, un module GPS permettra de faire l'acquisition des coordonnées géographiques au moment de la prise des mesures.

Pour mesurer les coordonnées géographiques nous utilserons le module shield GPS SEN10752P du fabricant SEEED. Il s'agit d'un shield équipé d'un capteur GPS "E-1612-UB" et d’un module GPS SIM28 compatible avec le protocole NMEA. La communication entre le module et la carte Arduino est réalisée au moyen d’une liaison série asynchrone (UART). Présentation du Shield GPS

La carte arduino possède une interface de communication série UART accessible, grâce aux broches numériques 0 (Rx) et 1 (Tx). Or cette interface matérielle est également utilisée par la liaison USB. Pour éviter certains disfonctionnements notamment lors de l'utilisation du moniteur série, il souvent préférable d'utiliser d'autres broches. La bibliothèque « SoftwareSerial » a été développée pour permettre la communication série sur d'autres broches numériques de l'Arduino de manière logicielle. Il est possible de gérer plusieurs ports séries logiciels avec des vitesses allant jusqu'à 115 200 bps (voir le document de présentation du Shield GPS).

Le module GPS, après avoir déterminer les différentes paramètres de géolocalisation, transmet à la carte Arduino, via la liaison série, les données sous forme de trames NMEA.

Le protocole NMEA (National Marine Electronics Association) utilise la transmission série de caractères ASCII. Chaque séquence commence par un en-tête de longueur fixe (5 lettres) précédé par le préfixe $. La longueur de la séquence suivant l'en tête est variable. La chaîne de caractères se termine par un retour à la ligne. Dans le cas d’une trame GPS, l’entête commence par l’identifiant GP suivi d’un code de 3 lettres selon le type de trame transmise (voir le document de présentation des principales trames NMEA pour les GPS).

Dans la suite de l'activité, nous nous intéresserons uniquement aux trames GPGGA. Ces trames GPGGA fournissent l’heure du système GPS, la latitude, la longitude et toutes les données relatives à la précision de la mesure et du repère.

- GPGGA : En-tête représentant le type de trame
- 081954.000 : Heure du système = 08:19:54 UTC
- 4856.4290,N : Lattitude = 48°56,4290' Nord = 48°56'25,8" Nord
- 00213.4983,E : longitude = 2°13,4983' Est = 2°13'29,9" Est

Le schéma de câblage est le suivant :

Question : Aller sur le site du fabricant du shield GPS. Copier le programme de test fourni par le constructeur sur l'IDLE Arduino et tester-le.

Question : A partir d'une trame GPGGA affichée sur le moniteur série, relever l'heure, la lattitude et la longitude.

Question : Vérifier à partir du site Géoportail de l'IGN que les coordonnées géographiques sont correctes.

A chaque trame reçue, le programme arduino permet de récupérer les différents caractères et les place dans le buffer de l'interface, puis affiche sur le moniteur les différents caractères.

Afin de récupérer et manipuler les données de géolocalisation, il va falloir placer le contenu du buffer dans une chaîne de caractères à l'aide de l'instruction suivante :

    String trame (buffer);   // Le contenu du buffer est placé dans la chaîne de caractères nommée trame

Pour récupérer les différentes données, il faut alors découper la chaîne en sous-chaîne grâce à la fonction substring().

Par exemple pour récupérer le type de la trame GPGGA par exemple, il faut récupérer du second au sixième caractère de la chaîne, c'est-à-dire les caractères de l'indice 1 à 5. Pour cela il faut utiliser l'instruction ci-dessous.

    type = trame.substring(1,6);

Question : Donner la ligne de code permettant de récupérer l'heure et de l'affecter à la variable heure.

Question : Donner la ligne de code permettant de récupérer la lattitude et de l'affecter à la variable lattitude.

Question : Donner la ligne de code permettant de récupérer la longitude et de l'affecter à la variable longitude.

Question : Modifier le programme arduino donné par le constreur afin d'afficher les données type, heure, lattitude et longitude uniquement si la trame est de type GPGGA et affiche "Attente trame GPGGA" dans le cas contraire.

## 6 - Programme Final¶

On désire mettre au point l'ensemble final en interconnectant la carte Arduino, le capteur de température, le shield SD et le shield GPS afin que pour chaque mesure on enregistre sur la carte SD une ligne qui comportera l'heure de la mesure, la longitude, la lattitude et la température. On pourra, par exemple, trouver sur le fichier texte, les lignes suivantes :

08:00:00;4448.4914N;00035.8431W;15.3
08:30:00;4448.5623N;00035.9656W;15.4
09:00:00;4448.7644N;00036.0013W;15.5

Question : A partir des programmes déjà réalisés, éditer le programme final. Vérifier le bon fonctionnement.