
E&R IUT Cachan Geii2
Dependencies: mbed LCD_DISCO_F746NG BSP_DISCO_F746NG
main.cpp@0:07a3605167e8, 2020-09-09 (annotated)
- Committer:
- elaboure
- Date:
- Wed Sep 09 14:19:33 2020 +0000
- Revision:
- 0:07a3605167e8
Essai Lidar IUT Cachan v5
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
elaboure | 0:07a3605167e8 | 1 | #include "mbed.h" |
elaboure | 0:07a3605167e8 | 2 | #include "LCD_DISCO_F746NG.h" |
elaboure | 0:07a3605167e8 | 3 | #include "math.h" |
elaboure | 0:07a3605167e8 | 4 | |
elaboure | 0:07a3605167e8 | 5 | |
elaboure | 0:07a3605167e8 | 6 | //************************** |
elaboure | 0:07a3605167e8 | 7 | // Définition des constantes |
elaboure | 0:07a3605167e8 | 8 | //************************** |
elaboure | 0:07a3605167e8 | 9 | |
elaboure | 0:07a3605167e8 | 10 | // L'ensemble des commandes possibles du LIDAR |
elaboure | 0:07a3605167e8 | 11 | #define LIDAR_STOP 0x25 |
elaboure | 0:07a3605167e8 | 12 | #define LIDAR_RESET 0x40 |
elaboure | 0:07a3605167e8 | 13 | #define LIDAR_SCAN 0x20 |
elaboure | 0:07a3605167e8 | 14 | #define EXPRESS_SCAN 0x82 |
elaboure | 0:07a3605167e8 | 15 | #define GET_INFO 0x50 |
elaboure | 0:07a3605167e8 | 16 | #define GET_HEALTH 0x52 |
elaboure | 0:07a3605167e8 | 17 | #define GET_SAMPLERATE 0x59 |
elaboure | 0:07a3605167e8 | 18 | |
elaboure | 0:07a3605167e8 | 19 | // Les commandes doivent toutes démarrer par ce caractère |
elaboure | 0:07a3605167e8 | 20 | #define START_FLAG 0xA5 |
elaboure | 0:07a3605167e8 | 21 | |
elaboure | 0:07a3605167e8 | 22 | //************************** |
elaboure | 0:07a3605167e8 | 23 | // instantiation des objets |
elaboure | 0:07a3605167e8 | 24 | //************************** |
elaboure | 0:07a3605167e8 | 25 | // Instantiation de l'objet écran LCD |
elaboure | 0:07a3605167e8 | 26 | LCD_DISCO_F746NG lcd; |
elaboure | 0:07a3605167e8 | 27 | |
elaboure | 0:07a3605167e8 | 28 | // Instantiation liaison série ; liaison avec le LIDAR |
elaboure | 0:07a3605167e8 | 29 | Serial LIDAR_link(D1,D0); |
elaboure | 0:07a3605167e8 | 30 | |
elaboure | 0:07a3605167e8 | 31 | // Instatiation d'une sortie PWM sur la pin D3. Son nom est mypwm |
elaboure | 0:07a3605167e8 | 32 | PwmOut pwm_Lidar(D6); |
elaboure | 0:07a3605167e8 | 33 | |
elaboure | 0:07a3605167e8 | 34 | // Instantiation d'un Timer pour l'attente des réponses |
elaboure | 0:07a3605167e8 | 35 | Timer horloge ; |
elaboure | 0:07a3605167e8 | 36 | |
elaboure | 0:07a3605167e8 | 37 | // Instantiation led1 |
elaboure | 0:07a3605167e8 | 38 | DigitalOut led1(LED1); |
elaboure | 0:07a3605167e8 | 39 | |
elaboure | 0:07a3605167e8 | 40 | |
elaboure | 0:07a3605167e8 | 41 | //******************* |
elaboure | 0:07a3605167e8 | 42 | // Variables globales |
elaboure | 0:07a3605167e8 | 43 | //******************* |
elaboure | 0:07a3605167e8 | 44 | float temps_debut, temps_fin; |
elaboure | 0:07a3605167e8 | 45 | |
elaboure | 0:07a3605167e8 | 46 | //************************* |
elaboure | 0:07a3605167e8 | 47 | // Prototypes des Fonctions |
elaboure | 0:07a3605167e8 | 48 | //************************* |
elaboure | 0:07a3605167e8 | 49 | bool initialisation(); |
elaboure | 0:07a3605167e8 | 50 | bool get_health(char* pointeur_etat_sante_lidar); |
elaboure | 0:07a3605167e8 | 51 | void radar(void); |
elaboure | 0:07a3605167e8 | 52 | bool scan(int8_t* ptr_buffer_donnees_lidar, int16_t Nbre_echantillons); |
elaboure | 0:07a3605167e8 | 53 | |
elaboure | 0:07a3605167e8 | 54 | // ************************ |
elaboure | 0:07a3605167e8 | 55 | // Le main |
elaboure | 0:07a3605167e8 | 56 | //************************* |
elaboure | 0:07a3605167e8 | 57 | int main() |
elaboure | 0:07a3605167e8 | 58 | { |
elaboure | 0:07a3605167e8 | 59 | bool test; |
elaboure | 0:07a3605167e8 | 60 | const int16_t Nbre_echantillons = 200; |
elaboure | 0:07a3605167e8 | 61 | int8_t buffer_donnees_lidar[Nbre_echantillons*5] = {0}; |
elaboure | 0:07a3605167e8 | 62 | int8_t* ptr_buffer_donnees_lidar; |
elaboure | 0:07a3605167e8 | 63 | |
elaboure | 0:07a3605167e8 | 64 | led1 = 1; |
elaboure | 0:07a3605167e8 | 65 | |
elaboure | 0:07a3605167e8 | 66 | test = initialisation(); |
elaboure | 0:07a3605167e8 | 67 | |
elaboure | 0:07a3605167e8 | 68 | if (!test) { |
elaboure | 0:07a3605167e8 | 69 | lcd.Clear(LCD_COLOR_WHITE); |
elaboure | 0:07a3605167e8 | 70 | lcd.SetTextColor(LCD_COLOR_ORANGE); |
elaboure | 0:07a3605167e8 | 71 | lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Probleme etat de sante Lidar", CENTER_MODE); |
elaboure | 0:07a3605167e8 | 72 | wait(2); |
elaboure | 0:07a3605167e8 | 73 | return 0; |
elaboure | 0:07a3605167e8 | 74 | } |
elaboure | 0:07a3605167e8 | 75 | |
elaboure | 0:07a3605167e8 | 76 | ptr_buffer_donnees_lidar = buffer_donnees_lidar; |
elaboure | 0:07a3605167e8 | 77 | |
elaboure | 0:07a3605167e8 | 78 | while(1) { |
elaboure | 0:07a3605167e8 | 79 | test = scan(ptr_buffer_donnees_lidar, Nbre_echantillons); |
elaboure | 0:07a3605167e8 | 80 | wait_ms(200); |
elaboure | 0:07a3605167e8 | 81 | |
elaboure | 0:07a3605167e8 | 82 | } |
elaboure | 0:07a3605167e8 | 83 | } |
elaboure | 0:07a3605167e8 | 84 | |
elaboure | 0:07a3605167e8 | 85 | //*************************************** |
elaboure | 0:07a3605167e8 | 86 | //Initialisation : configuration initiale |
elaboure | 0:07a3605167e8 | 87 | //*************************************** |
elaboure | 0:07a3605167e8 | 88 | bool initialisation() |
elaboure | 0:07a3605167e8 | 89 | { |
elaboure | 0:07a3605167e8 | 90 | bool test ; |
elaboure | 0:07a3605167e8 | 91 | char etat_sante_lidar ; |
elaboure | 0:07a3605167e8 | 92 | char affichage[3]; |
elaboure | 0:07a3605167e8 | 93 | char Vidage_buffer_liaison_serie; |
elaboure | 0:07a3605167e8 | 94 | |
elaboure | 0:07a3605167e8 | 95 | // Initialisation Communication LIDAR |
elaboure | 0:07a3605167e8 | 96 | LIDAR_link.baud(115200); |
elaboure | 0:07a3605167e8 | 97 | LIDAR_link.format(8,SerialBase::None,1); |
elaboure | 0:07a3605167e8 | 98 | |
elaboure | 0:07a3605167e8 | 99 | // premier message pour vérifier que tout est OK |
elaboure | 0:07a3605167e8 | 100 | lcd.Clear(LCD_COLOR_WHITE); |
elaboure | 0:07a3605167e8 | 101 | lcd.SetTextColor(LCD_COLOR_ORANGE); |
elaboure | 0:07a3605167e8 | 102 | lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Initialisation OK", CENTER_MODE); |
elaboure | 0:07a3605167e8 | 103 | |
elaboure | 0:07a3605167e8 | 104 | // Initialisation PWM |
elaboure | 0:07a3605167e8 | 105 | pwm_Lidar.period_us(40); |
elaboure | 0:07a3605167e8 | 106 | pwm_Lidar.write(0.7); |
elaboure | 0:07a3605167e8 | 107 | |
elaboure | 0:07a3605167e8 | 108 | // Vidage buffer liaison série |
elaboure | 0:07a3605167e8 | 109 | while (LIDAR_link.readable() == true) { |
elaboure | 0:07a3605167e8 | 110 | Vidage_buffer_liaison_serie = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 111 | } |
elaboure | 0:07a3605167e8 | 112 | // test lidar |
elaboure | 0:07a3605167e8 | 113 | test = get_health(&etat_sante_lidar); |
elaboure | 0:07a3605167e8 | 114 | |
elaboure | 0:07a3605167e8 | 115 | if (test == false) { |
elaboure | 0:07a3605167e8 | 116 | lcd.Clear(LCD_COLOR_BLUE); |
elaboure | 0:07a3605167e8 | 117 | lcd.SetTextColor(LCD_COLOR_ORANGE); |
elaboure | 0:07a3605167e8 | 118 | lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Problemes lidar", CENTER_MODE); |
elaboure | 0:07a3605167e8 | 119 | wait(2); |
elaboure | 0:07a3605167e8 | 120 | |
elaboure | 0:07a3605167e8 | 121 | return false; |
elaboure | 0:07a3605167e8 | 122 | |
elaboure | 0:07a3605167e8 | 123 | } else { |
elaboure | 0:07a3605167e8 | 124 | sprintf(affichage,"%x",etat_sante_lidar); |
elaboure | 0:07a3605167e8 | 125 | lcd.Clear(LCD_COLOR_YELLOW); |
elaboure | 0:07a3605167e8 | 126 | lcd.SetTextColor(LCD_COLOR_ORANGE); |
elaboure | 0:07a3605167e8 | 127 | lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Lidar OK", CENTER_MODE); |
elaboure | 0:07a3605167e8 | 128 | lcd.DisplayStringAt(0, LINE(6), (uint8_t *)affichage, CENTER_MODE); |
elaboure | 0:07a3605167e8 | 129 | wait(2); |
elaboure | 0:07a3605167e8 | 130 | |
elaboure | 0:07a3605167e8 | 131 | radar(); |
elaboure | 0:07a3605167e8 | 132 | |
elaboure | 0:07a3605167e8 | 133 | return true; |
elaboure | 0:07a3605167e8 | 134 | } |
elaboure | 0:07a3605167e8 | 135 | |
elaboure | 0:07a3605167e8 | 136 | } //End Initialisation |
elaboure | 0:07a3605167e8 | 137 | |
elaboure | 0:07a3605167e8 | 138 | //******************************************** |
elaboure | 0:07a3605167e8 | 139 | //Fonction lecture de l'état de santé du LIDAR |
elaboure | 0:07a3605167e8 | 140 | //******************************************** |
elaboure | 0:07a3605167e8 | 141 | |
elaboure | 0:07a3605167e8 | 142 | bool get_health(char *pointeur_etat_sante_lidar) |
elaboure | 0:07a3605167e8 | 143 | { |
elaboure | 0:07a3605167e8 | 144 | char response_descriptor[7] = {0,0,0,0,0,0,0}; |
elaboure | 0:07a3605167e8 | 145 | char response[3]; |
elaboure | 0:07a3605167e8 | 146 | bool test_time_out; |
elaboure | 0:07a3605167e8 | 147 | char ii; |
elaboure | 0:07a3605167e8 | 148 | char affichage[3] = {0}; |
elaboure | 0:07a3605167e8 | 149 | char Vidage_buffer_liaison_serie; |
elaboure | 0:07a3605167e8 | 150 | |
elaboure | 0:07a3605167e8 | 151 | // Vidage buffer liaison série |
elaboure | 0:07a3605167e8 | 152 | while (LIDAR_link.readable() == true) { |
elaboure | 0:07a3605167e8 | 153 | Vidage_buffer_liaison_serie = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 154 | } |
elaboure | 0:07a3605167e8 | 155 | |
elaboure | 0:07a3605167e8 | 156 | // On attend que la liaison série soit prête en éccriture |
elaboure | 0:07a3605167e8 | 157 | while (LIDAR_link.writeable() == false) { |
elaboure | 0:07a3605167e8 | 158 | } |
elaboure | 0:07a3605167e8 | 159 | |
elaboure | 0:07a3605167e8 | 160 | // Envoi de la commande GET_HEALTH |
elaboure | 0:07a3605167e8 | 161 | LIDAR_link.putc(START_FLAG); |
elaboure | 0:07a3605167e8 | 162 | LIDAR_link.putc(GET_HEALTH); |
elaboure | 0:07a3605167e8 | 163 | |
elaboure | 0:07a3605167e8 | 164 | |
elaboure | 0:07a3605167e8 | 165 | // Attente de la réponse |
elaboure | 0:07a3605167e8 | 166 | /* temps_debut = horloge.read(); |
elaboure | 0:07a3605167e8 | 167 | test_time_out = true ; |
elaboure | 0:07a3605167e8 | 168 | |
elaboure | 0:07a3605167e8 | 169 | while ((LIDAR_link.readable() == false) & (test_time_out == true)) { |
elaboure | 0:07a3605167e8 | 170 | temps_fin = horloge.read(); |
elaboure | 0:07a3605167e8 | 171 | test_time_out = (temps_fin - temps_debut) < 2; |
elaboure | 0:07a3605167e8 | 172 | } |
elaboure | 0:07a3605167e8 | 173 | |
elaboure | 0:07a3605167e8 | 174 | if (!test_time_out) { |
elaboure | 0:07a3605167e8 | 175 | return false ; |
elaboure | 0:07a3605167e8 | 176 | } |
elaboure | 0:07a3605167e8 | 177 | */ |
elaboure | 0:07a3605167e8 | 178 | |
elaboure | 0:07a3605167e8 | 179 | // si le délai de réponse n'est pas dépassé |
elaboure | 0:07a3605167e8 | 180 | |
elaboure | 0:07a3605167e8 | 181 | // acquisition des données |
elaboure | 0:07a3605167e8 | 182 | // tout d'abord le descripteur de réponse : 7 octets |
elaboure | 0:07a3605167e8 | 183 | for (ii = 0 ; ii <=6 ; ii++) { |
elaboure | 0:07a3605167e8 | 184 | |
elaboure | 0:07a3605167e8 | 185 | response_descriptor[ii] = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 186 | } |
elaboure | 0:07a3605167e8 | 187 | |
elaboure | 0:07a3605167e8 | 188 | // Et on lit 3 octets pour cette requête |
elaboure | 0:07a3605167e8 | 189 | for (ii = 0 ; ii <= 2 ; ii++) { |
elaboure | 0:07a3605167e8 | 190 | response[ii] = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 191 | } |
elaboure | 0:07a3605167e8 | 192 | |
elaboure | 0:07a3605167e8 | 193 | /* lcd.Clear(LCD_COLOR_WHITE); |
elaboure | 0:07a3605167e8 | 194 | lcd.SetTextColor(LCD_COLOR_ORANGE); |
elaboure | 0:07a3605167e8 | 195 | for (ii = 0 ; ii <= 6 ; ii++) { |
elaboure | 0:07a3605167e8 | 196 | sprintf(affichage,"%x",response_descriptor[ii]); |
elaboure | 0:07a3605167e8 | 197 | lcd.DisplayStringAt(0, LINE(ii),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 198 | } |
elaboure | 0:07a3605167e8 | 199 | |
elaboure | 0:07a3605167e8 | 200 | for (ii = 0 ; ii <= 2 ; ii++) { |
elaboure | 0:07a3605167e8 | 201 | sprintf(affichage,"%x",response[ii]); |
elaboure | 0:07a3605167e8 | 202 | lcd.DisplayStringAt(20, LINE(ii),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 203 | } |
elaboure | 0:07a3605167e8 | 204 | */ |
elaboure | 0:07a3605167e8 | 205 | wait_ms(2); |
elaboure | 0:07a3605167e8 | 206 | |
elaboure | 0:07a3605167e8 | 207 | // l'état de santé du Lidar est donné par le premier octet de la réponse : si 0 pas de problème |
elaboure | 0:07a3605167e8 | 208 | *pointeur_etat_sante_lidar = response[0] ; |
elaboure | 0:07a3605167e8 | 209 | |
elaboure | 0:07a3605167e8 | 210 | return true ; |
elaboure | 0:07a3605167e8 | 211 | } |
elaboure | 0:07a3605167e8 | 212 | |
elaboure | 0:07a3605167e8 | 213 | //******************************************** |
elaboure | 0:07a3605167e8 | 214 | // Fonction Tracé radar sur l'écran |
elaboure | 0:07a3605167e8 | 215 | //******************************************** |
elaboure | 0:07a3605167e8 | 216 | void radar (void) |
elaboure | 0:07a3605167e8 | 217 | { |
elaboure | 0:07a3605167e8 | 218 | float angle[13] = {0,30, 60, 90,120,150, 180, 210,240,270, 300, 330, 360}; |
elaboure | 0:07a3605167e8 | 219 | float distance[13] = {0,1, 2, 3,4,5, 6, 7,8,9, 10, 11, 12}; |
elaboure | 0:07a3605167e8 | 220 | int8_t jj; |
elaboure | 0:07a3605167e8 | 221 | float x, y; |
elaboure | 0:07a3605167e8 | 222 | |
elaboure | 0:07a3605167e8 | 223 | lcd.Clear(LCD_COLOR_WHITE); |
elaboure | 0:07a3605167e8 | 224 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 225 | lcd.DrawCircle(240,136,136); |
elaboure | 0:07a3605167e8 | 226 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 227 | lcd.DrawCircle(240,136,102); |
elaboure | 0:07a3605167e8 | 228 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 229 | lcd.DrawCircle(240,136,68); |
elaboure | 0:07a3605167e8 | 230 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 231 | lcd.DrawCircle(240,136,34); |
elaboure | 0:07a3605167e8 | 232 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 233 | lcd.DrawLine(104,136,376,136); |
elaboure | 0:07a3605167e8 | 234 | lcd.SetTextColor(LCD_COLOR_LIGHTGREEN); |
elaboure | 0:07a3605167e8 | 235 | lcd.DrawLine(240,0,240,136); |
elaboure | 0:07a3605167e8 | 236 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 237 | lcd.DrawLine(240,136,240,272); |
elaboure | 0:07a3605167e8 | 238 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 239 | lcd.DrawLine(240,136,358,68); |
elaboure | 0:07a3605167e8 | 240 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 241 | lcd.DrawLine(240,136,308,18); |
elaboure | 0:07a3605167e8 | 242 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 243 | lcd.DrawLine(240,136,172,18); |
elaboure | 0:07a3605167e8 | 244 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 245 | lcd.DrawLine(240,136,122,68); |
elaboure | 0:07a3605167e8 | 246 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 247 | lcd.DrawLine(240,136,172,254); |
elaboure | 0:07a3605167e8 | 248 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 249 | lcd.DrawLine(240,136,122,204); |
elaboure | 0:07a3605167e8 | 250 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 251 | lcd.DrawLine(240,136,308,254); |
elaboure | 0:07a3605167e8 | 252 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 253 | lcd.DrawLine(240,136,358,204); |
elaboure | 0:07a3605167e8 | 254 | /**********************************************************************************************************************/ |
elaboure | 0:07a3605167e8 | 255 | //**************** |
elaboure | 0:07a3605167e8 | 256 | // test affichage |
elaboure | 0:07a3605167e8 | 257 | //**************** |
elaboure | 0:07a3605167e8 | 258 | |
elaboure | 0:07a3605167e8 | 259 | /* for (jj = 0 ; jj <= 12 ; jj++) { |
elaboure | 0:07a3605167e8 | 260 | angle[jj] = angle[jj] * (3.141592 / 180); |
elaboure | 0:07a3605167e8 | 261 | x= 240 + distance[jj] * 9 * sin(angle[jj]); |
elaboure | 0:07a3605167e8 | 262 | y= 136 - distance[jj] * 9 * cos(angle[jj]); |
elaboure | 0:07a3605167e8 | 263 | lcd.SetTextColor(LCD_COLOR_RED); |
elaboure | 0:07a3605167e8 | 264 | lcd.FillCircle(x,y,3); |
elaboure | 0:07a3605167e8 | 265 | } |
elaboure | 0:07a3605167e8 | 266 | |
elaboure | 0:07a3605167e8 | 267 | wait(10); |
elaboure | 0:07a3605167e8 | 268 | */ |
elaboure | 0:07a3605167e8 | 269 | return; |
elaboure | 0:07a3605167e8 | 270 | } |
elaboure | 0:07a3605167e8 | 271 | |
elaboure | 0:07a3605167e8 | 272 | //******************************************** |
elaboure | 0:07a3605167e8 | 273 | // Fonction Scan du LIDAR |
elaboure | 0:07a3605167e8 | 274 | //******************************************** |
elaboure | 0:07a3605167e8 | 275 | |
elaboure | 0:07a3605167e8 | 276 | bool scan(int8_t *ptr_buffer_donnees_lidar, int16_t Nbre_echantillons) |
elaboure | 0:07a3605167e8 | 277 | { |
elaboure | 0:07a3605167e8 | 278 | char response_descriptor[7] = {0}; |
elaboure | 0:07a3605167e8 | 279 | char response[5]; |
elaboure | 0:07a3605167e8 | 280 | |
elaboure | 0:07a3605167e8 | 281 | char Vidage_buffer_liaison_serie; |
elaboure | 0:07a3605167e8 | 282 | char ii, jj; |
elaboure | 0:07a3605167e8 | 283 | char data, data1, data2; |
elaboure | 0:07a3605167e8 | 284 | |
elaboure | 0:07a3605167e8 | 285 | char affichage[8]; |
elaboure | 0:07a3605167e8 | 286 | |
elaboure | 0:07a3605167e8 | 287 | float angle, distance, x, y; |
elaboure | 0:07a3605167e8 | 288 | uint16_t decodage_angle ; |
elaboure | 0:07a3605167e8 | 289 | uint16_t decodage_distance; |
elaboure | 0:07a3605167e8 | 290 | uint8_t decodage_qualite, S_S; |
elaboure | 0:07a3605167e8 | 291 | |
elaboure | 0:07a3605167e8 | 292 | bool test_time_out; |
elaboure | 0:07a3605167e8 | 293 | |
elaboure | 0:07a3605167e8 | 294 | |
elaboure | 0:07a3605167e8 | 295 | // On attend que la liaison série soit prête en écriture |
elaboure | 0:07a3605167e8 | 296 | while (LIDAR_link.writeable() == false) { |
elaboure | 0:07a3605167e8 | 297 | } |
elaboure | 0:07a3605167e8 | 298 | |
elaboure | 0:07a3605167e8 | 299 | // Envoi de la commande SCAN |
elaboure | 0:07a3605167e8 | 300 | LIDAR_link.putc(START_FLAG); |
elaboure | 0:07a3605167e8 | 301 | LIDAR_link.putc(LIDAR_SCAN); |
elaboure | 0:07a3605167e8 | 302 | |
elaboure | 0:07a3605167e8 | 303 | for (ii = 0 ; ii <=6 ; ii++) { |
elaboure | 0:07a3605167e8 | 304 | // attente de la réponse |
elaboure | 0:07a3605167e8 | 305 | temps_debut = horloge.read(); |
elaboure | 0:07a3605167e8 | 306 | test_time_out = true ; |
elaboure | 0:07a3605167e8 | 307 | while ((LIDAR_link.readable() == false) & (test_time_out == true)) { |
elaboure | 0:07a3605167e8 | 308 | temps_fin = horloge.read(); |
elaboure | 0:07a3605167e8 | 309 | test_time_out = (temps_fin - temps_debut) < 2e-3; |
elaboure | 0:07a3605167e8 | 310 | } |
elaboure | 0:07a3605167e8 | 311 | |
elaboure | 0:07a3605167e8 | 312 | if (test_time_out == false) { |
elaboure | 0:07a3605167e8 | 313 | return false; |
elaboure | 0:07a3605167e8 | 314 | lcd.Clear(LCD_COLOR_GREEN); |
elaboure | 0:07a3605167e8 | 315 | } |
elaboure | 0:07a3605167e8 | 316 | response_descriptor[ii] = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 317 | } |
elaboure | 0:07a3605167e8 | 318 | |
elaboure | 0:07a3605167e8 | 319 | for (jj = 0 ; jj <= (Nbre_echantillons - 1) ; jj++) { |
elaboure | 0:07a3605167e8 | 320 | // Et on lit des paquets de 5 octets pour cette requête |
elaboure | 0:07a3605167e8 | 321 | for (ii = 0 ; ii <= 4 ; ii++) { |
elaboure | 0:07a3605167e8 | 322 | // attente de la réponse |
elaboure | 0:07a3605167e8 | 323 | temps_debut = horloge.read(); |
elaboure | 0:07a3605167e8 | 324 | test_time_out = true ; |
elaboure | 0:07a3605167e8 | 325 | while ((LIDAR_link.readable() == false) & (test_time_out == true)) { |
elaboure | 0:07a3605167e8 | 326 | temps_fin = horloge.read(); |
elaboure | 0:07a3605167e8 | 327 | test_time_out = (temps_fin - temps_debut) < 2e-3; |
elaboure | 0:07a3605167e8 | 328 | } |
elaboure | 0:07a3605167e8 | 329 | |
elaboure | 0:07a3605167e8 | 330 | if (test_time_out == false) { |
elaboure | 0:07a3605167e8 | 331 | return false; |
elaboure | 0:07a3605167e8 | 332 | lcd.Clear(LCD_COLOR_GREEN); |
elaboure | 0:07a3605167e8 | 333 | } |
elaboure | 0:07a3605167e8 | 334 | *(ptr_buffer_donnees_lidar+ ii + 5 * jj) = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 335 | } |
elaboure | 0:07a3605167e8 | 336 | } |
elaboure | 0:07a3605167e8 | 337 | |
elaboure | 0:07a3605167e8 | 338 | //On arrête l'acquisition une fois le nombre d'échantillons demandés atteints |
elaboure | 0:07a3605167e8 | 339 | LIDAR_link.putc(LIDAR_STOP); |
elaboure | 0:07a3605167e8 | 340 | wait_ms(2); |
elaboure | 0:07a3605167e8 | 341 | |
elaboure | 0:07a3605167e8 | 342 | // Vidage buffer liaison série |
elaboure | 0:07a3605167e8 | 343 | while (LIDAR_link.readable() == true) { |
elaboure | 0:07a3605167e8 | 344 | Vidage_buffer_liaison_serie = LIDAR_link.getc(); |
elaboure | 0:07a3605167e8 | 345 | } |
elaboure | 0:07a3605167e8 | 346 | |
elaboure | 0:07a3605167e8 | 347 | /* lcd.Clear(LCD_COLOR_WHITE); |
elaboure | 0:07a3605167e8 | 348 | lcd.SetTextColor(LCD_COLOR_BLACK); |
elaboure | 0:07a3605167e8 | 349 | |
elaboure | 0:07a3605167e8 | 350 | for (ii = 0 ; ii <= 6 ; ii++) { |
elaboure | 0:07a3605167e8 | 351 | sprintf(affichage,"%x",response_descriptor[ii]); |
elaboure | 0:07a3605167e8 | 352 | lcd.DisplayStringAt(0, LINE(ii),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 353 | } |
elaboure | 0:07a3605167e8 | 354 | |
elaboure | 0:07a3605167e8 | 355 | for (jj = 0 ; jj <= (Nbre_echantillons - 1) ; jj++) { |
elaboure | 0:07a3605167e8 | 356 | for (ii = 0 ; ii <= 4 ; ii++) { |
elaboure | 0:07a3605167e8 | 357 | data = (*(ptr_buffer_donnees_lidar + ii + 5*jj)); |
elaboure | 0:07a3605167e8 | 358 | sprintf(affichage,"%x",data); |
elaboure | 0:07a3605167e8 | 359 | lcd.DisplayStringAt(50+80*jj, LINE(ii),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 360 | } |
elaboure | 0:07a3605167e8 | 361 | } |
elaboure | 0:07a3605167e8 | 362 | */ |
elaboure | 0:07a3605167e8 | 363 | |
elaboure | 0:07a3605167e8 | 364 | radar(); |
elaboure | 0:07a3605167e8 | 365 | if ((response_descriptor[0] == 0xA5)&(Nbre_echantillons >=2)) { |
elaboure | 0:07a3605167e8 | 366 | |
elaboure | 0:07a3605167e8 | 367 | for (jj = 1 ; jj <= (Nbre_echantillons - 1) ; jj++) { |
elaboure | 0:07a3605167e8 | 368 | |
elaboure | 0:07a3605167e8 | 369 | // test erreur transmission S et _S |
elaboure | 0:07a3605167e8 | 370 | data = (*(ptr_buffer_donnees_lidar + 5 * jj)); |
elaboure | 0:07a3605167e8 | 371 | S_S = data & 0x03; |
elaboure | 0:07a3605167e8 | 372 | |
elaboure | 0:07a3605167e8 | 373 | // decodage qualité |
elaboure | 0:07a3605167e8 | 374 | |
elaboure | 0:07a3605167e8 | 375 | decodage_qualite = data & 0xFD ; |
elaboure | 0:07a3605167e8 | 376 | decodage_qualite = (decodage_qualite >> 2); |
elaboure | 0:07a3605167e8 | 377 | // sprintf(affichage,"%x",decodage_qualite); |
elaboure | 0:07a3605167e8 | 378 | // lcd.DisplayStringAt(50+80*jj, LINE(6),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 379 | |
elaboure | 0:07a3605167e8 | 380 | if ((decodage_qualite >= 0x08) && ((S_S == 0x01)|(S_S == 0x02))) { |
elaboure | 0:07a3605167e8 | 381 | |
elaboure | 0:07a3605167e8 | 382 | |
elaboure | 0:07a3605167e8 | 383 | //decodage angle |
elaboure | 0:07a3605167e8 | 384 | decodage_angle = 0x0000; |
elaboure | 0:07a3605167e8 | 385 | data2 = (*(ptr_buffer_donnees_lidar + 2 + 5 * jj)); |
elaboure | 0:07a3605167e8 | 386 | data1 = (*(ptr_buffer_donnees_lidar + 1 + 5 * jj)) ; |
elaboure | 0:07a3605167e8 | 387 | decodage_angle = data2; |
elaboure | 0:07a3605167e8 | 388 | decodage_angle = (((decodage_angle << 8) | data1) >> 1); |
elaboure | 0:07a3605167e8 | 389 | |
elaboure | 0:07a3605167e8 | 390 | angle = (decodage_angle/64.0) ; // en degré |
elaboure | 0:07a3605167e8 | 391 | // sprintf(affichage,"%4.0f",angle); |
elaboure | 0:07a3605167e8 | 392 | // lcd.DisplayStringAt(50+80*jj, LINE(7),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 393 | |
elaboure | 0:07a3605167e8 | 394 | |
elaboure | 0:07a3605167e8 | 395 | //decodage distance |
elaboure | 0:07a3605167e8 | 396 | decodage_distance = 0x0000; |
elaboure | 0:07a3605167e8 | 397 | data2 = (*(ptr_buffer_donnees_lidar + 4 + 5 * jj)); |
elaboure | 0:07a3605167e8 | 398 | data1 = (*(ptr_buffer_donnees_lidar + 3 + 5 * jj)) ; |
elaboure | 0:07a3605167e8 | 399 | decodage_distance = data2; |
elaboure | 0:07a3605167e8 | 400 | decodage_distance = ((decodage_distance << 8) | data1); |
elaboure | 0:07a3605167e8 | 401 | |
elaboure | 0:07a3605167e8 | 402 | |
elaboure | 0:07a3605167e8 | 403 | distance = (decodage_distance/4000.0) ; // en mètres |
elaboure | 0:07a3605167e8 | 404 | // sprintf(affichage,"%4.0f",distance); |
elaboure | 0:07a3605167e8 | 405 | // lcd.DisplayStringAt(50+80*jj, LINE(8),(uint8_t*) affichage, LEFT_MODE); |
elaboure | 0:07a3605167e8 | 406 | |
elaboure | 0:07a3605167e8 | 407 | // affichage du point |
elaboure | 0:07a3605167e8 | 408 | angle = angle * (3.141592 / 180); |
elaboure | 0:07a3605167e8 | 409 | x= 240 + distance * 45 * sin(angle); |
elaboure | 0:07a3605167e8 | 410 | y= 136 - distance * 45 * cos(angle); |
elaboure | 0:07a3605167e8 | 411 | lcd.SetTextColor(LCD_COLOR_RED); |
elaboure | 0:07a3605167e8 | 412 | lcd.FillCircle(x,y,1); |
elaboure | 0:07a3605167e8 | 413 | |
elaboure | 0:07a3605167e8 | 414 | |
elaboure | 0:07a3605167e8 | 415 | }// fin if |
elaboure | 0:07a3605167e8 | 416 | |
elaboure | 0:07a3605167e8 | 417 | } // for jj |
elaboure | 0:07a3605167e8 | 418 | } // fin if |
elaboure | 0:07a3605167e8 | 419 | |
elaboure | 0:07a3605167e8 | 420 | return 1 ; |
elaboure | 0:07a3605167e8 | 421 | } |