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
main.cpp@0:278eba15d90b, 2021-07-07 (annotated)
- Committer:
- Giamarchi
- Date:
- Wed Jul 07 11:39:10 2021 +0000
- Revision:
- 0:278eba15d90b
- Child:
- 1:5fcc88ae8ad4
upadte
Who changed what in which revision?
User | Revision | Line number | New 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 | } |