the famous passe partout of fort boyard

Dependencies:   mbed bloc_io mbed-rtos html EthernetInterface

Committer:
enzo_06800
Date:
Thu Nov 21 15:42:35 2019 +0000
Revision:
1:2cca28a06d74
Parent:
0:e30c9ba95bd4
violer ma mere

Who changed what in which revision?

UserRevisionLine numberNew contents of line
superphil06 0:e30c9ba95bd4 1 //#include "EthernetInterface.h"
superphil06 0:e30c9ba95bd4 2 #include <stdlib.h>
superphil06 0:e30c9ba95bd4 3 #include <string.h>
superphil06 0:e30c9ba95bd4 4 #include "mbed.h"
superphil06 0:e30c9ba95bd4 5 #include "rtos.h" // need for main thread sleep
superphil06 0:e30c9ba95bd4 6 #include "html.h" // need for html patch working with web server
superphil06 0:e30c9ba95bd4 7 #include "bloc_io.h"
superphil06 0:e30c9ba95bd4 8 #define RADIUS 0.2F // wheel size
superphil06 0:e30c9ba95bd4 9 #define NBPOLES 8 // magnetic pole number
enzo_06800 1:2cca28a06d74 10 #define DELTA_T 0.1 // speed measurement counting period
enzo_06800 1:2cca28a06d74 11 #define Nvmax 0.388034
enzo_06800 1:2cca28a06d74 12 #define Nvmin 0.258689
enzo_06800 1:2cca28a06d74 13 #define Vbatmax 30
enzo_06800 1:2cca28a06d74 14 #define P_velo 9
enzo_06800 1:2cca28a06d74 15 #define Ray 0.2
enzo_06800 1:2cca28a06d74 16 #define delta_t 0.2
enzo_06800 1:2cca28a06d74 17 #define pi 3.14159265358979
superphil06 0:e30c9ba95bd4 18
superphil06 0:e30c9ba95bd4 19 Bloc_IO MyPLD(p25,p26,p5,p6,p7,p8,p9,p10,p23,p24);// instantiate object needed to communicate with PLD
enzo_06800 1:2cca28a06d74 20 // analog input connected to mbed
enzo_06800 1:2cca28a06d74 21 // valid pmw mbed pin
superphil06 0:e30c9ba95bd4 22 Serial pc(USBTX, USBRX); // tx, rx
enzo_06800 1:2cca28a06d74 23 // Top_Hall Pin
enzo_06800 1:2cca28a06d74 24 InterruptIn Top_Hall(p22);
enzo_06800 1:2cca28a06d74 25 AnalogIn Vbat(p18);
enzo_06800 1:2cca28a06d74 26 AnalogIn Vtemp(p19);
enzo_06800 1:2cca28a06d74 27 AnalogIn Vgaz(p17);
enzo_06800 1:2cca28a06d74 28 DigitalOut Valid_PWM(p21);
enzo_06800 1:2cca28a06d74 29
superphil06 0:e30c9ba95bd4 30 /************ persistent file parameters section *****************/
superphil06 0:e30c9ba95bd4 31 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
enzo_06800 1:2cca28a06d74 32
enzo_06800 1:2cca28a06d74 33
enzo_06800 1:2cca28a06d74 34
superphil06 0:e30c9ba95bd4 35
enzo_06800 1:2cca28a06d74 36
enzo_06800 1:2cca28a06d74 37
enzo_06800 1:2cca28a06d74 38
enzo_06800 1:2cca28a06d74 39
superphil06 0:e30c9ba95bd4 40 /********************* web server section **********************************/
superphil06 0:e30c9ba95bd4 41
superphil06 0:e30c9ba95bd4 42 var_field_t tab_balise[10]; //une balise est présente dans le squelette
superphil06 0:e30c9ba95bd4 43 int giCounter=0;// acces counting
superphil06 0:e30c9ba95bd4 44
superphil06 0:e30c9ba95bd4 45
superphil06 0:e30c9ba95bd4 46 /*********************** can bus section ************/
enzo_06800 1:2cca28a06d74 47 // determine message ID used to send Gaz ref over can bus
superphil06 0:e30c9ba95bd4 48 #define _CAN_DEBUG // used to debug can bus activity
superphil06 0:e30c9ba95bd4 49 //#define USE_CAN_REF // uncomment to receive gaz ref over can_bus
superphil06 0:e30c9ba95bd4 50 CAN can_port (p30, p29); // initialisation du Bus CAN sur les broches 30 (rd) et 29(td) for lpc1768 + mbed shield
superphil06 0:e30c9ba95bd4 51 bool bCan_Active=false;
superphil06 0:e30c9ba95bd4 52
superphil06 0:e30c9ba95bd4 53
superphil06 0:e30c9ba95bd4 54
superphil06 0:e30c9ba95bd4 55 DigitalOut led1(LED1); //initialisation des Leds présentes sur le micro-controleur Mbed*/
superphil06 0:e30c9ba95bd4 56 DigitalOut led2(LED2);
superphil06 0:e30c9ba95bd4 57 DigitalOut led3(LED3); // blink when can message is sent
enzo_06800 1:2cca28a06d74 58 DigitalOut led4(LED4); // blink when can message is received
enzo_06800 1:2cca28a06d74 59 float gfNMAX=0.71 ,gfNMIN=0.16;
enzo_06800 1:2cca28a06d74 60 float gfNmax ,gfNmin;
enzo_06800 1:2cca28a06d74 61 float gfNGAZ;
enzo_06800 1:2cca28a06d74 62 float gNTemp, gTemp;
enzo_06800 1:2cca28a06d74 63 float gfNVbat,gfVbat;
enzo_06800 1:2cca28a06d74 64 int giPoignee;
enzo_06800 1:2cca28a06d74 65 float gfPoignee;
enzo_06800 1:2cca28a06d74 66 int gicpt_Valid_Hall;
enzo_06800 1:2cca28a06d74 67 float gfcpt_Hall, gfVitmesure;
enzo_06800 1:2cca28a06d74 68 Ticker TGaz,TickDeltaT, TickMod;
superphil06 0:e30c9ba95bd4 69
superphil06 0:e30c9ba95bd4 70
superphil06 0:e30c9ba95bd4 71
superphil06 0:e30c9ba95bd4 72
enzo_06800 1:2cca28a06d74 73 //************ local function prototypes *******************
superphil06 0:e30c9ba95bd4 74
enzo_06800 1:2cca28a06d74 75 void Sauvegarde(void);
enzo_06800 1:2cca28a06d74 76 void Lecture(void);
enzo_06800 1:2cca28a06d74 77 void PoigneeGaz(void);
enzo_06800 1:2cca28a06d74 78 void CalculTemp (void);
enzo_06800 1:2cca28a06d74 79 void CalculVbat (void);
enzo_06800 1:2cca28a06d74 80 void MesVit(void);
enzo_06800 1:2cca28a06d74 81 void Incr_Valid_Hall(void);
enzo_06800 1:2cca28a06d74 82
superphil06 0:e30c9ba95bd4 83 /**************** Read persistent data from text file located on local file system ****************/
superphil06 0:e30c9ba95bd4 84
superphil06 0:e30c9ba95bd4 85
superphil06 0:e30c9ba95bd4 86
superphil06 0:e30c9ba95bd4 87 /**************** write persitant data to text file located on local file system ****************/
superphil06 0:e30c9ba95bd4 88
superphil06 0:e30c9ba95bd4 89
superphil06 0:e30c9ba95bd4 90
superphil06 0:e30c9ba95bd4 91
superphil06 0:e30c9ba95bd4 92
superphil06 0:e30c9ba95bd4 93
superphil06 0:e30c9ba95bd4 94 //************** calibation gaz function needed to record min_gaz and max_gaz value to persistent text file ******************
superphil06 0:e30c9ba95bd4 95
superphil06 0:e30c9ba95bd4 96
superphil06 0:e30c9ba95bd4 97 // ************top hall counting interrupt needed for speed measurement
superphil06 0:e30c9ba95bd4 98
superphil06 0:e30c9ba95bd4 99
superphil06 0:e30c9ba95bd4 100 //********************** timer interrupt for speed measurement each 100ms *************************
superphil06 0:e30c9ba95bd4 101
enzo_06800 1:2cca28a06d74 102
enzo_06800 1:2cca28a06d74 103
enzo_06800 1:2cca28a06d74 104
superphil06 0:e30c9ba95bd4 105
superphil06 0:e30c9ba95bd4 106
superphil06 0:e30c9ba95bd4 107 //********************* Timer Interrupt for gaz ref management each 10ms ********************
superphil06 0:e30c9ba95bd4 108
superphil06 0:e30c9ba95bd4 109
superphil06 0:e30c9ba95bd4 110
superphil06 0:e30c9ba95bd4 111 /********* main cgi function used to patch data to the web server thread **********************************/
superphil06 0:e30c9ba95bd4 112 void CGI_Function(void) // cgi function that patch web data to empty web page
enzo_06800 1:2cca28a06d74 113 {
enzo_06800 1:2cca28a06d74 114 char ma_chaine4[20]= {}; // needed to form html response
superphil06 0:e30c9ba95bd4 115
superphil06 0:e30c9ba95bd4 116 }
superphil06 0:e30c9ba95bd4 117
superphil06 0:e30c9ba95bd4 118
enzo_06800 1:2cca28a06d74 119 /*********************** CAN BUS SECTION **********************/
superphil06 0:e30c9ba95bd4 120
superphil06 0:e30c9ba95bd4 121
superphil06 0:e30c9ba95bd4 122
superphil06 0:e30c9ba95bd4 123
enzo_06800 1:2cca28a06d74 124 void CAN_REC_THREAD(void const *args)
enzo_06800 1:2cca28a06d74 125 {
enzo_06800 1:2cca28a06d74 126 int iCount,iError;
superphil06 0:e30c9ba95bd4 127
enzo_06800 1:2cca28a06d74 128 while (bCan_Active) {
enzo_06800 1:2cca28a06d74 129 Thread::wait(100);// wait 100ms
enzo_06800 1:2cca28a06d74 130 // code todo
enzo_06800 1:2cca28a06d74 131
enzo_06800 1:2cca28a06d74 132 }
enzo_06800 1:2cca28a06d74 133
enzo_06800 1:2cca28a06d74 134 }
enzo_06800 1:2cca28a06d74 135
enzo_06800 1:2cca28a06d74 136
enzo_06800 1:2cca28a06d74 137
enzo_06800 1:2cca28a06d74 138 //*************************** main function *****************************************
enzo_06800 1:2cca28a06d74 139 int main()
enzo_06800 1:2cca28a06d74 140 {
enzo_06800 1:2cca28a06d74 141 char cChoix=0;
enzo_06800 1:2cca28a06d74 142 char cCalibration=0;
enzo_06800 1:2cca28a06d74 143 Top_Hall.mode(PullUp);
enzo_06800 1:2cca28a06d74 144 Top_Hall.rise(&Incr_Valid_Hall);
enzo_06800 1:2cca28a06d74 145 TGaz.attach(&PoigneeGaz,0.1);
enzo_06800 1:2cca28a06d74 146 TickDeltaT.attach(&MesVit,delta_t);
enzo_06800 1:2cca28a06d74 147 Valid_PWM.write(1);
enzo_06800 1:2cca28a06d74 148
superphil06 0:e30c9ba95bd4 149 //***************************************** web section ********************************************/
superphil06 0:e30c9ba95bd4 150 //Init_Web_Server(&CGI_Function); // create and initialize tcp server socket and pass function pointer to local CGI function
superphil06 0:e30c9ba95bd4 151 //Thread WebThread(Web_Server_Thread);// create and launch web server thread
enzo_06800 1:2cca28a06d74 152 /********* main cgi function used to patch data to the web server thread **********************************/
superphil06 0:e30c9ba95bd4 153
enzo_06800 1:2cca28a06d74 154 //******************************************* end web section ************************************* /
superphil06 0:e30c9ba95bd4 155
superphil06 0:e30c9ba95bd4 156
superphil06 0:e30c9ba95bd4 157
superphil06 0:e30c9ba95bd4 158
enzo_06800 1:2cca28a06d74 159 pc.printf(" programme scooter mbed \r\n");
superphil06 0:e30c9ba95bd4 160
superphil06 0:e30c9ba95bd4 161
superphil06 0:e30c9ba95bd4 162
superphil06 0:e30c9ba95bd4 163 //********************* can bus section initialisation *******************************************
superphil06 0:e30c9ba95bd4 164 //bCan_Active=true;// needed to lauchn CAN thread
superphil06 0:e30c9ba95bd4 165 //Thread CanThread(CAN_REC_THREAD);// create and launch can receiver thread
superphil06 0:e30c9ba95bd4 166 //********************* end can bus section *****************************************************
superphil06 0:e30c9ba95bd4 167
superphil06 0:e30c9ba95bd4 168
enzo_06800 1:2cca28a06d74 169 while(cChoix!='q' and cChoix!='Q') {
enzo_06800 1:2cca28a06d74 170 pc.printf(" veuillez saisir un choix parmi la liste proposee: \r\n");
enzo_06800 1:2cca28a06d74 171 pc.printf(" a:saisie consigne pwm \r\n");
enzo_06800 1:2cca28a06d74 172 pc.printf(" b:lecture poignee \r\n");
enzo_06800 1:2cca28a06d74 173 pc.printf(" f:Affichage informations batterie \r\n");
enzo_06800 1:2cca28a06d74 174 pc.printf(" c:calibration de la poignee \r\n");
enzo_06800 1:2cca28a06d74 175 pc.printf(" d:Affichage vitesse \r\n");
enzo_06800 1:2cca28a06d74 176 pc.printf(" q:quitter \r\n");
enzo_06800 1:2cca28a06d74 177
enzo_06800 1:2cca28a06d74 178 /************* multithreading : main thread need to sleep in order to allow web response */
enzo_06800 1:2cca28a06d74 179 while (pc.readable()==0) { // determine if char availabler
enzo_06800 1:2cca28a06d74 180 Thread::wait(10); // wait 10 until char available on serial input
enzo_06800 1:2cca28a06d74 181 }
enzo_06800 1:2cca28a06d74 182
enzo_06800 1:2cca28a06d74 183 /************* end of main thread sleep ****************/
enzo_06800 1:2cca28a06d74 184
enzo_06800 1:2cca28a06d74 185 pc.scanf(" %c",&cChoix);
enzo_06800 1:2cca28a06d74 186 switch (cChoix) {
enzo_06800 1:2cca28a06d74 187 case 'a':
enzo_06800 1:2cca28a06d74 188
enzo_06800 1:2cca28a06d74 189 break;
enzo_06800 1:2cca28a06d74 190
enzo_06800 1:2cca28a06d74 191 case 'b':
enzo_06800 1:2cca28a06d74 192 while(Vgaz.read()<=0.700)
enzo_06800 1:2cca28a06d74 193 {
enzo_06800 1:2cca28a06d74 194 pc.printf("Val poignee=%0.3f \r\n",Vgaz.read());
enzo_06800 1:2cca28a06d74 195 pc.printf("Nmax=%0.3f \r\n",gfNMAX);
enzo_06800 1:2cca28a06d74 196 pc.printf("PLD=%i \r\n",giPoignee);
enzo_06800 1:2cca28a06d74 197 wait(0.1);
enzo_06800 1:2cca28a06d74 198 }
enzo_06800 1:2cca28a06d74 199 break;
enzo_06800 1:2cca28a06d74 200 case 'c':
enzo_06800 1:2cca28a06d74 201 Valid_PWM.write(0);
enzo_06800 1:2cca28a06d74 202 while(cCalibration!='4') {
enzo_06800 1:2cca28a06d74 203 pc.printf("1:Calibrer le max de la poignee et mettre la poignee au maximum \r\n");
enzo_06800 1:2cca28a06d74 204 pc.printf("2:Calibrer le min de la poignee et mettre la poignee au minimum \r\n");
enzo_06800 1:2cca28a06d74 205 pc.printf("3:Affichage des valeurs dans le fichier \r\n");
enzo_06800 1:2cca28a06d74 206 pc.printf("4:Retour au menu principal \r\n");
enzo_06800 1:2cca28a06d74 207 pc.scanf("%c", &cCalibration);
enzo_06800 1:2cca28a06d74 208 switch(cCalibration) {
enzo_06800 1:2cca28a06d74 209 case '1':
enzo_06800 1:2cca28a06d74 210 gfNMAX=Vgaz.read();
enzo_06800 1:2cca28a06d74 211 pc.printf("la valeur max de la poignee est: %0.3f\r\n",gfNMAX);
enzo_06800 1:2cca28a06d74 212 Sauvegarde();
enzo_06800 1:2cca28a06d74 213 break;
enzo_06800 1:2cca28a06d74 214
enzo_06800 1:2cca28a06d74 215 case '2':
enzo_06800 1:2cca28a06d74 216 gfNMIN=Vgaz.read();
enzo_06800 1:2cca28a06d74 217 pc.printf("la valeur min de la poignee est: %0.3f\r\n",gfNMIN);
enzo_06800 1:2cca28a06d74 218 Sauvegarde();
enzo_06800 1:2cca28a06d74 219 break;
enzo_06800 1:2cca28a06d74 220
enzo_06800 1:2cca28a06d74 221 case '3':
enzo_06800 1:2cca28a06d74 222 Lecture();
enzo_06800 1:2cca28a06d74 223 break;
enzo_06800 1:2cca28a06d74 224
enzo_06800 1:2cca28a06d74 225 case'4' :
enzo_06800 1:2cca28a06d74 226 break;
enzo_06800 1:2cca28a06d74 227 }
enzo_06800 1:2cca28a06d74 228 }
enzo_06800 1:2cca28a06d74 229 Valid_PWM.write(1);
enzo_06800 1:2cca28a06d74 230 cCalibration=0;
enzo_06800 1:2cca28a06d74 231 cChoix=0;
enzo_06800 1:2cca28a06d74 232 break;
enzo_06800 1:2cca28a06d74 233
enzo_06800 1:2cca28a06d74 234 case 'f':
enzo_06800 1:2cca28a06d74 235 CalculTemp ();
enzo_06800 1:2cca28a06d74 236 CalculVbat ();
enzo_06800 1:2cca28a06d74 237 pc.printf(" La tension de la batterie est %f \r\n",gfVbat);
enzo_06800 1:2cca28a06d74 238 pc.printf(" La temperature est de %f \r\n",gTemp);
enzo_06800 1:2cca28a06d74 239 break;
enzo_06800 1:2cca28a06d74 240
enzo_06800 1:2cca28a06d74 241 case 'd':
enzo_06800 1:2cca28a06d74 242 pc.printf(" La vitesse de est de %f \r\n",gfVitmesure);
enzo_06800 1:2cca28a06d74 243 break;
enzo_06800 1:2cca28a06d74 244
enzo_06800 1:2cca28a06d74 245 case 'q':
enzo_06800 1:2cca28a06d74 246 break;
enzo_06800 1:2cca28a06d74 247 }
enzo_06800 1:2cca28a06d74 248 } // end while
enzo_06800 1:2cca28a06d74 249
enzo_06800 1:2cca28a06d74 250 //************** thread deinit *********************
enzo_06800 1:2cca28a06d74 251 //DeInit_Web_Server();
enzo_06800 1:2cca28a06d74 252 //bCan_Active=false;
enzo_06800 1:2cca28a06d74 253 //CanThread=false;// close can received thread
enzo_06800 1:2cca28a06d74 254 pc.printf(" fin programme scooter mbed \r\n");
superphil06 0:e30c9ba95bd4 255 } // end main
enzo_06800 1:2cca28a06d74 256
enzo_06800 1:2cca28a06d74 257 void PoigneeGaz()
enzo_06800 1:2cca28a06d74 258 {
enzo_06800 1:2cca28a06d74 259 gfNGAZ=Vgaz.read();
enzo_06800 1:2cca28a06d74 260 gfNmin=gfNMIN;
enzo_06800 1:2cca28a06d74 261 gfNmax=gfNMAX;
enzo_06800 1:2cca28a06d74 262 giPoignee=(gfNGAZ-gfNmin)*(255/(gfNmax-gfNmin));
enzo_06800 1:2cca28a06d74 263 int iVal=MyPLD.read();
enzo_06800 1:2cca28a06d74 264 MyPLD.write(giPoignee);
enzo_06800 1:2cca28a06d74 265 }
enzo_06800 1:2cca28a06d74 266
enzo_06800 1:2cca28a06d74 267 void Lecture ()
enzo_06800 1:2cca28a06d74 268 {
enzo_06800 1:2cca28a06d74 269 FILE* File1 = fopen("/local/CALIB.txt","r");
enzo_06800 1:2cca28a06d74 270 if (File1 == NULL) {
enzo_06800 1:2cca28a06d74 271 pc.printf("Erreur\r\n");
enzo_06800 1:2cca28a06d74 272 } else {
enzo_06800 1:2cca28a06d74 273 fscanf(File1, "%f %f",&gfNMIN,&gfNMAX);
enzo_06800 1:2cca28a06d74 274 pc.printf("NMIN= %f \r\n",gfNMIN);
enzo_06800 1:2cca28a06d74 275 pc.printf("NMAX= %f \r\n",gfNMAX);
enzo_06800 1:2cca28a06d74 276 }
enzo_06800 1:2cca28a06d74 277 fclose(File1);
enzo_06800 1:2cca28a06d74 278 }
enzo_06800 1:2cca28a06d74 279
enzo_06800 1:2cca28a06d74 280
enzo_06800 1:2cca28a06d74 281 void Sauvegarde ()
enzo_06800 1:2cca28a06d74 282 {
enzo_06800 1:2cca28a06d74 283 FILE* File1 = fopen("/local/CALIB.txt","w");
enzo_06800 1:2cca28a06d74 284 if(File1 == NULL) {
enzo_06800 1:2cca28a06d74 285 pc.printf("Erreur\r\n");
enzo_06800 1:2cca28a06d74 286 } else {
enzo_06800 1:2cca28a06d74 287 fprintf(File1, "%f %f",gfNMIN,gfNMAX);
enzo_06800 1:2cca28a06d74 288 pc.printf("Sauvegarde ok min et max \r\n");
enzo_06800 1:2cca28a06d74 289 }
enzo_06800 1:2cca28a06d74 290 fclose(File1);
enzo_06800 1:2cca28a06d74 291 }
enzo_06800 1:2cca28a06d74 292
enzo_06800 1:2cca28a06d74 293 void CalculTemp()
enzo_06800 1:2cca28a06d74 294 {
enzo_06800 1:2cca28a06d74 295 gNTemp=Vtemp.read()*3.3;
enzo_06800 1:2cca28a06d74 296 gTemp=gNTemp*100-275;
enzo_06800 1:2cca28a06d74 297 }
enzo_06800 1:2cca28a06d74 298
enzo_06800 1:2cca28a06d74 299 void CalculVbat()
enzo_06800 1:2cca28a06d74 300 {
enzo_06800 1:2cca28a06d74 301 gfNVbat=Vbat.read();
enzo_06800 1:2cca28a06d74 302 gfVbat=(gfNVbat*Vbatmax/Nvmax);
enzo_06800 1:2cca28a06d74 303 }
enzo_06800 1:2cca28a06d74 304
enzo_06800 1:2cca28a06d74 305 void Incr_Valid_Hall()
enzo_06800 1:2cca28a06d74 306 {
enzo_06800 1:2cca28a06d74 307 gicpt_Valid_Hall++;
enzo_06800 1:2cca28a06d74 308 }
enzo_06800 1:2cca28a06d74 309
enzo_06800 1:2cca28a06d74 310
enzo_06800 1:2cca28a06d74 311 void MesVit()
enzo_06800 1:2cca28a06d74 312 {
enzo_06800 1:2cca28a06d74 313 gfcpt_Hall=gicpt_Valid_Hall;
enzo_06800 1:2cca28a06d74 314 gicpt_Valid_Hall=0;
enzo_06800 1:2cca28a06d74 315 gfVitmesure= (gfcpt_Hall*2*pi*Ray)/(delta_t*6*P_velo);
enzo_06800 1:2cca28a06d74 316 }
enzo_06800 1:2cca28a06d74 317