IniSat Modèle 1 Version 2 TP 5 : Station Sol Exo 1 : Enregistrement GPS sur carte SD Exo 2 : Mise en place d'un protocole de communication avec la station sol

Dependencies:   mbed

Committer:
Giamarchi
Date:
Wed Jul 07 11:39:10 2021 +0000
Revision:
0:278eba15d90b
Child:
1:5fcc88ae8ad4
upadte

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Giamarchi 0:278eba15d90b 1 /*******************************************************************************
Giamarchi 0:278eba15d90b 2 Université de Montpellier
Giamarchi 0:278eba15d90b 3 NemoSpace IUT de Nîmes
Giamarchi 0:278eba15d90b 4 IniSat Modèle 1 Version 2
Giamarchi 0:278eba15d90b 5 *******************************************************************************/
Giamarchi 0:278eba15d90b 6 // La lecture du GPS utilise une liaison série software
Giamarchi 0:278eba15d90b 7
Giamarchi 0:278eba15d90b 8 // TP n°5 : Correction
Giamarchi 0:278eba15d90b 9
Giamarchi 0:278eba15d90b 10 // Exo 1 : Enregistrement des coordonnées GPS sur carte SD
Giamarchi 0:278eba15d90b 11 // Exo 2 : Gestion de messages descendants (Supervision) et montants (Commande)
Giamarchi 0:278eba15d90b 12 // Exo 3 : Tracer sur My Maps votre déplacement autour du batiment (Mission)
Giamarchi 0:278eba15d90b 13
Giamarchi 0:278eba15d90b 14 #include "mbed.h"
Giamarchi 0:278eba15d90b 15 //#include "platform/mbed_thread.h"
Giamarchi 0:278eba15d90b 16 #include "SDFileSystem.h"
Giamarchi 0:278eba15d90b 17
Giamarchi 0:278eba15d90b 18 #include "system.h"
Giamarchi 0:278eba15d90b 19 #include "user.h"
Giamarchi 0:278eba15d90b 20 #include "soft_uart.h"
Giamarchi 0:278eba15d90b 21 #include "gps.h"
Giamarchi 0:278eba15d90b 22
Giamarchi 0:278eba15d90b 23 SDFileSystem sd(PB_5, PB_4, PB_3, PA_11, "sd"); // MOSI, MISO, SCK, CS -> SPI pins on the Inisat
Giamarchi 0:278eba15d90b 24
Giamarchi 0:278eba15d90b 25 uint8_t etat, etat_mem;
Giamarchi 0:278eba15d90b 26 uint16_t compteur;
Giamarchi 0:278eba15d90b 27 float mes_accu;
Giamarchi 0:278eba15d90b 28
Giamarchi 0:278eba15d90b 29 uint8_t xb_ptr;
Giamarchi 0:278eba15d90b 30 char xb_buf[10], cmd[3], param[10];
Giamarchi 0:278eba15d90b 31
Giamarchi 0:278eba15d90b 32 void Rx_interrupt(void);
Giamarchi 0:278eba15d90b 33
Giamarchi 0:278eba15d90b 34 int main()
Giamarchi 0:278eba15d90b 35 {
Giamarchi 0:278eba15d90b 36 Init_System();
Giamarchi 0:278eba15d90b 37 etat = 0;
Giamarchi 0:278eba15d90b 38 Init_Soft_UART();
Giamarchi 0:278eba15d90b 39 // thread_sleep_for(1000);
Giamarchi 0:278eba15d90b 40 xb_ptr = 0;
Giamarchi 0:278eba15d90b 41 // Setup a serial interrupt function to receive data
Giamarchi 0:278eba15d90b 42 xbee.attach(&Rx_interrupt, Serial::RxIrq);
Giamarchi 0:278eba15d90b 43 __enable_irq();
Giamarchi 0:278eba15d90b 44
Giamarchi 0:278eba15d90b 45 wait_ms(1000);
Giamarchi 0:278eba15d90b 46
Giamarchi 0:278eba15d90b 47 while (1) {
Giamarchi 0:278eba15d90b 48 // thread_sleep_for(1); // Boucle toutes les 1 milliseconde environ
Giamarchi 0:278eba15d90b 49 wait_ms(1);
Giamarchi 0:278eba15d90b 50 compteur++;
Giamarchi 0:278eba15d90b 51
Giamarchi 0:278eba15d90b 52 // Gestion des modes avec une machine d'états
Giamarchi 0:278eba15d90b 53 switch (etat) {
Giamarchi 0:278eba15d90b 54 /******************************************************************************/
Giamarchi 0:278eba15d90b 55 // Mode Init : Mise sous tension
Giamarchi 0:278eba15d90b 56 // Initialisation du µC
Giamarchi 0:278eba15d90b 57 case 0: {
Giamarchi 0:278eba15d90b 58 Init_User_Fonctions();
Giamarchi 0:278eba15d90b 59 // thread_sleep_for(1000);
Giamarchi 0:278eba15d90b 60 wait_ms(1000);
Giamarchi 0:278eba15d90b 61 Stop_Led();
Giamarchi 0:278eba15d90b 62 GPS_Init();
Giamarchi 0:278eba15d90b 63 Start_Led();
Giamarchi 0:278eba15d90b 64 Set_Led(Ve);
Giamarchi 0:278eba15d90b 65
Giamarchi 0:278eba15d90b 66 // Création d'un fichier "gps_data.txt" sur la carte SD
Giamarchi 0:278eba15d90b 67 FILE *fp = fopen("/sd/gps_data.txt", "w");
Giamarchi 0:278eba15d90b 68 if(fp == NULL) {
Giamarchi 0:278eba15d90b 69 error("Erreur : fichier non accessible en ecriture\n");
Giamarchi 0:278eba15d90b 70 }
Giamarchi 0:278eba15d90b 71 pc.printf("Fichier cree!\r\n");
Giamarchi 0:278eba15d90b 72 xbee.printf("Liaison Sol\r\n");
Giamarchi 0:278eba15d90b 73
Giamarchi 0:278eba15d90b 74 // Write text in file
Giamarchi 0:278eba15d90b 75 // fprintf(fp, "Hello World, greats from Inisat!");
Giamarchi 0:278eba15d90b 76 // pc.printf("Write some words in sdtest.txt on sd/mydir directory\r\n");
Giamarchi 0:278eba15d90b 77
Giamarchi 0:278eba15d90b 78 // Close file
Giamarchi 0:278eba15d90b 79 fclose(fp);
Giamarchi 0:278eba15d90b 80 // thread_sleep_for(1000);
Giamarchi 0:278eba15d90b 81 wait_ms(1000);
Giamarchi 0:278eba15d90b 82 etat = 1;
Giamarchi 0:278eba15d90b 83 break; }
Giamarchi 0:278eba15d90b 84 /******************************************************************************/
Giamarchi 0:278eba15d90b 85 // Mode Gestion : Gestion des actions
Giamarchi 0:278eba15d90b 86 // Contrôle du système
Giamarchi 0:278eba15d90b 87 case 1:
Giamarchi 0:278eba15d90b 88 mes_accu = Mes_Bat();
Giamarchi 0:278eba15d90b 89 if(mes_accu < BAT_SEUIL_BAS_1) {
Giamarchi 0:278eba15d90b 90 etat = 4;
Giamarchi 0:278eba15d90b 91 Set_Led(Ro);
Giamarchi 0:278eba15d90b 92 } else {
Giamarchi 0:278eba15d90b 93 etat = 2;
Giamarchi 0:278eba15d90b 94 Set_Led(Ve);
Giamarchi 0:278eba15d90b 95 }
Giamarchi 0:278eba15d90b 96 // thread_sleep_for(1000);
Giamarchi 0:278eba15d90b 97 wait_ms(1000);
Giamarchi 0:278eba15d90b 98 break;
Giamarchi 0:278eba15d90b 99 /******************************************************************************/
Giamarchi 0:278eba15d90b 100 // Mode Mission : Acquisition de données
Giamarchi 0:278eba15d90b 101 // Mesure Batterie
Giamarchi 0:278eba15d90b 102 // Mesure Courant faces solaires
Giamarchi 0:278eba15d90b 103 // Stockage
Giamarchi 0:278eba15d90b 104 case 2:
Giamarchi 0:278eba15d90b 105 Lect_GPS();
Giamarchi 0:278eba15d90b 106 GPS_Decodage();
Giamarchi 0:278eba15d90b 107 Mes_SP();
Giamarchi 0:278eba15d90b 108 Mes_Temp();
Giamarchi 0:278eba15d90b 109 mes_accu = Mes_Bat();
Giamarchi 0:278eba15d90b 110 if(mes_accu > BAT_SEUIL_HAUT_1)
Giamarchi 0:278eba15d90b 111 {
Giamarchi 0:278eba15d90b 112 etat = 3;
Giamarchi 0:278eba15d90b 113 Set_Led(Ro_Ve);
Giamarchi 0:278eba15d90b 114 }
Giamarchi 0:278eba15d90b 115 else
Giamarchi 0:278eba15d90b 116 {
Giamarchi 0:278eba15d90b 117 etat = 1;
Giamarchi 0:278eba15d90b 118 }
Giamarchi 0:278eba15d90b 119 // thread_sleep_for(1000);
Giamarchi 0:278eba15d90b 120 // wait_ms(1000);
Giamarchi 0:278eba15d90b 121 break;
Giamarchi 0:278eba15d90b 122 /******************************************************************************/
Giamarchi 0:278eba15d90b 123 // Mode Radio : Transmission de données
Giamarchi 0:278eba15d90b 124 // Mise en forme pour affichage
Giamarchi 0:278eba15d90b 125 case 3:
Giamarchi 0:278eba15d90b 126 Envoi_GPS();
Giamarchi 0:278eba15d90b 127 Envoi_Mes_Bat();
Giamarchi 0:278eba15d90b 128 // Envoi_Mes_SP();
Giamarchi 0:278eba15d90b 129 // Envoi_Mes_Temp();
Giamarchi 0:278eba15d90b 130
Giamarchi 0:278eba15d90b 131 // thread_sleep_for(1000);
Giamarchi 0:278eba15d90b 132 // wait_ms(1000);
Giamarchi 0:278eba15d90b 133 etat = 1;
Giamarchi 0:278eba15d90b 134 break;
Giamarchi 0:278eba15d90b 135 /******************************************************************************/
Giamarchi 0:278eba15d90b 136 // Mode Survie : Attente recharge de l'accu
Giamarchi 0:278eba15d90b 137
Giamarchi 0:278eba15d90b 138 case 4:
Giamarchi 0:278eba15d90b 139 mes_accu = Mes_Bat();
Giamarchi 0:278eba15d90b 140 if(mes_accu < BAT_SEUIL_BAS_2) {
Giamarchi 0:278eba15d90b 141 etat = 5;
Giamarchi 0:278eba15d90b 142 Stop_User_Fonctions();
Giamarchi 0:278eba15d90b 143 }
Giamarchi 0:278eba15d90b 144
Giamarchi 0:278eba15d90b 145 if(mes_accu > BAT_SEUIL_HAUT_1) {
Giamarchi 0:278eba15d90b 146 etat = 1;
Giamarchi 0:278eba15d90b 147 Set_Led(Ve);
Giamarchi 0:278eba15d90b 148 }
Giamarchi 0:278eba15d90b 149 break;
Giamarchi 0:278eba15d90b 150 /******************************************************************************/
Giamarchi 0:278eba15d90b 151 // Mode Zombie : Coupure des consommateurs
Giamarchi 0:278eba15d90b 152 // Passage en mode faible consommation
Giamarchi 0:278eba15d90b 153 // Diminution de la fréquence du CPU
Giamarchi 0:278eba15d90b 154 // Passage en mode Sleep
Giamarchi 0:278eba15d90b 155 case 5:
Giamarchi 0:278eba15d90b 156 sleep();
Giamarchi 0:278eba15d90b 157 mes_accu = Mes_Bat();
Giamarchi 0:278eba15d90b 158 if(mes_accu > BAT_SEUIL_HAUT_1)
Giamarchi 0:278eba15d90b 159 etat = 0;
Giamarchi 0:278eba15d90b 160 break;
Giamarchi 0:278eba15d90b 161 /******************************************************************************/
Giamarchi 0:278eba15d90b 162 default:
Giamarchi 0:278eba15d90b 163 etat = 0;
Giamarchi 0:278eba15d90b 164 break;
Giamarchi 0:278eba15d90b 165 /******************************************************************************/
Giamarchi 0:278eba15d90b 166 } // end switch
Giamarchi 0:278eba15d90b 167 /* if(etat != etat_mem) // Debug des états
Giamarchi 0:278eba15d90b 168 {
Giamarchi 0:278eba15d90b 169 pc.printf("Etat_%d\r\n",etat);
Giamarchi 0:278eba15d90b 170 etat_mem = etat;
Giamarchi 0:278eba15d90b 171 }*/
Giamarchi 0:278eba15d90b 172 /******************************************************************************/
Giamarchi 0:278eba15d90b 173 } // end while
Giamarchi 0:278eba15d90b 174 } // end main
Giamarchi 0:278eba15d90b 175 /******************************************************************************/
Giamarchi 0:278eba15d90b 176 void Rx_interrupt(void) {
Giamarchi 0:278eba15d90b 177 if(xbee.readable())
Giamarchi 0:278eba15d90b 178 {
Giamarchi 0:278eba15d90b 179 xb_buf[xb_ptr] = xbee.getc();
Giamarchi 0:278eba15d90b 180
Giamarchi 0:278eba15d90b 181 if((xb_buf[xb_ptr] == 0x0A) || (xb_buf[xb_ptr] == 0x0D)) // Test touche entrée en mode ASCII
Giamarchi 0:278eba15d90b 182 {
Giamarchi 0:278eba15d90b 183 xb_buf[xb_ptr] = 0; // Transforme le tableau en chaine de caractères
Giamarchi 0:278eba15d90b 184 xb_ptr = 0;
Giamarchi 0:278eba15d90b 185 if (xb_buf[0] == '$') // Entete de message valide
Giamarchi 0:278eba15d90b 186 {
Giamarchi 0:278eba15d90b 187 cmd[0] = xb_buf[1];
Giamarchi 0:278eba15d90b 188 xbee.printf("#%c\r\n",cmd[0]+0x20); // Acquittement
Giamarchi 0:278eba15d90b 189 }
Giamarchi 0:278eba15d90b 190 // xb_ok = 1; // Trame disponible pour décodage
Giamarchi 0:278eba15d90b 191 // pc.printf("%s\n\r",buffer); // Echo
Giamarchi 0:278eba15d90b 192 }
Giamarchi 0:278eba15d90b 193 else {
Giamarchi 0:278eba15d90b 194 xb_ptr++;
Giamarchi 0:278eba15d90b 195 }
Giamarchi 0:278eba15d90b 196 }
Giamarchi 0:278eba15d90b 197 }