123
Dependencies: mbed bloc_io mbed-rtos html EthernetInterface
main.cpp@1:76bf7ede6bce, 2019-03-01 (annotated)
- Committer:
- ghostrider06
- Date:
- Fri Mar 01 10:19:33 2019 +0000
- Revision:
- 1:76bf7ede6bce
- Parent:
- 0:e30c9ba95bd4
123
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
superphil06 | 0:e30c9ba95bd4 | 1 | |
superphil06 | 0:e30c9ba95bd4 | 2 | |
ghostrider06 | 1:76bf7ede6bce | 3 | #include "EthernetInterface.h" |
superphil06 | 0:e30c9ba95bd4 | 4 | #include <stdlib.h> |
superphil06 | 0:e30c9ba95bd4 | 5 | #include <string.h> |
superphil06 | 0:e30c9ba95bd4 | 6 | #include "mbed.h" |
superphil06 | 0:e30c9ba95bd4 | 7 | #include "rtos.h" // need for main thread sleep |
superphil06 | 0:e30c9ba95bd4 | 8 | #include "html.h" // need for html patch working with web server |
ghostrider06 | 1:76bf7ede6bce | 9 | #include "bloc_io.h" //need for stating the PLD |
superphil06 | 0:e30c9ba95bd4 | 10 | #define RADIUS 0.2F // wheel size |
ghostrider06 | 1:76bf7ede6bce | 11 | #define NBPOLES 20 // magnetic pole number |
superphil06 | 0:e30c9ba95bd4 | 12 | #define DELTA_T 0.1F // speed measurement counting period |
ghostrider06 | 1:76bf7ede6bce | 13 | #define Ioffset 0.17 // offset value added to the current measurement (measurement uncertainty correction) |
ghostrider06 | 1:76bf7ede6bce | 14 | #define dT 1 // battery capacity measurement counting period in second |
ghostrider06 | 1:76bf7ede6bce | 15 | Bloc_IO MyPLD(p25,p26,p5,p6,p7,p8,p9,p10,p23,p24);// instantiate object needed to communicate with PLD |
ghostrider06 | 1:76bf7ede6bce | 16 | AnalogIn ngaz(p17); // reading handle command analog input connected to mbed |
ghostrider06 | 1:76bf7ede6bce | 17 | AnalogIn Tension(p18); //Voltage measurement variable |
ghostrider06 | 1:76bf7ede6bce | 18 | AnalogIn iTemperature(p19); //iTemperature measurement variable |
ghostrider06 | 1:76bf7ede6bce | 19 | AnalogIn Imes(p20); //Current measurement variable |
ghostrider06 | 1:76bf7ede6bce | 20 | DigitalOut valid_pwm(p21);// valid pwm mbed pin |
ghostrider06 | 1:76bf7ede6bce | 21 | InterruptIn Hall(p22);// Top_Hall Pinw |
ghostrider06 | 1:76bf7ede6bce | 22 | Serial pc(USBTX, USBRX); // tx, rx |
superphil06 | 0:e30c9ba95bd4 | 23 | |
superphil06 | 0:e30c9ba95bd4 | 24 | |
superphil06 | 0:e30c9ba95bd4 | 25 | /************ persistent file parameters section *****************/ |
superphil06 | 0:e30c9ba95bd4 | 26 | LocalFileSystem local("local"); // Create the local filesystem under the name "local" |
superphil06 | 0:e30c9ba95bd4 | 27 | |
ghostrider06 | 1:76bf7ede6bce | 28 | |
superphil06 | 0:e30c9ba95bd4 | 29 | /********************* web server section **********************************/ |
superphil06 | 0:e30c9ba95bd4 | 30 | |
superphil06 | 0:e30c9ba95bd4 | 31 | var_field_t tab_balise[10]; //une balise est présente dans le squelette |
ghostrider06 | 1:76bf7ede6bce | 32 | int iCounter=0; |
superphil06 | 0:e30c9ba95bd4 | 33 | int giCounter=0;// acces counting |
ghostrider06 | 1:76bf7ede6bce | 34 | int iREF_PWM=0; |
ghostrider06 | 1:76bf7ede6bce | 35 | int iREF_PWMfin=0; |
ghostrider06 | 1:76bf7ede6bce | 36 | int iFrein=0; |
ghostrider06 | 1:76bf7ede6bce | 37 | int iTemperature; |
ghostrider06 | 1:76bf7ede6bce | 38 | float fngazmin=0; |
ghostrider06 | 1:76bf7ede6bce | 39 | float fngazmax=0; |
ghostrider06 | 1:76bf7ede6bce | 40 | float fnbhall=0; |
ghostrider06 | 1:76bf7ede6bce | 41 | float fVRoue=0; |
ghostrider06 | 1:76bf7ede6bce | 42 | float fBride=50; |
ghostrider06 | 1:76bf7ede6bce | 43 | float fImes; |
ghostrider06 | 1:76bf7ede6bce | 44 | float fVmes; |
ghostrider06 | 1:76bf7ede6bce | 45 | float fPositionPoignee; |
ghostrider06 | 1:76bf7ede6bce | 46 | float fCapaInit;//en mAs |
ghostrider06 | 1:76bf7ede6bce | 47 | float fCapa; |
ghostrider06 | 1:76bf7ede6bce | 48 | float fdistance=0;//Variable pour compteur kilometrique |
ghostrider06 | 1:76bf7ede6bce | 49 | float fdistpartiel=0; |
ghostrider06 | 1:76bf7ede6bce | 50 | float ftop_hall_total=0;//nbre de top hall |
ghostrider06 | 1:76bf7ede6bce | 51 | float ftop_hall_partiel=0;//nbre de top hall |
ghostrider06 | 1:76bf7ede6bce | 52 | float fngaz; |
ghostrider06 | 1:76bf7ede6bce | 53 | char cChoix='e'; //Variable pour choisir l'état |
ghostrider06 | 1:76bf7ede6bce | 54 | Ticker Tgaz; //Handle reading Tick |
ghostrider06 | 1:76bf7ede6bce | 55 | Ticker Vitesse; //Speed reading Tick |
ghostrider06 | 1:76bf7ede6bce | 56 | Ticker Tbat; //Battery reading Tick |
superphil06 | 0:e30c9ba95bd4 | 57 | |
superphil06 | 0:e30c9ba95bd4 | 58 | /*********************** can bus section ************/ |
ghostrider06 | 1:76bf7ede6bce | 59 | // determine message ID used to send Gaz ref over can bus |
superphil06 | 0:e30c9ba95bd4 | 60 | #define _CAN_DEBUG // used to debug can bus activity |
superphil06 | 0:e30c9ba95bd4 | 61 | //#define USE_CAN_REF // uncomment to receive gaz ref over can_bus |
superphil06 | 0:e30c9ba95bd4 | 62 | CAN can_port (p30, p29); // initialisation du Bus CAN sur les broches 30 (rd) et 29(td) for lpc1768 + mbed shield |
superphil06 | 0:e30c9ba95bd4 | 63 | bool bCan_Active=false; |
superphil06 | 0:e30c9ba95bd4 | 64 | |
superphil06 | 0:e30c9ba95bd4 | 65 | |
superphil06 | 0:e30c9ba95bd4 | 66 | |
superphil06 | 0:e30c9ba95bd4 | 67 | DigitalOut led1(LED1); //initialisation des Leds présentes sur le micro-controleur Mbed*/ |
superphil06 | 0:e30c9ba95bd4 | 68 | DigitalOut led2(LED2); |
superphil06 | 0:e30c9ba95bd4 | 69 | DigitalOut led3(LED3); // blink when can message is sent |
ghostrider06 | 1:76bf7ede6bce | 70 | DigitalOut led4(LED4); // blink when can message is received |
superphil06 | 0:e30c9ba95bd4 | 71 | |
superphil06 | 0:e30c9ba95bd4 | 72 | |
superphil06 | 0:e30c9ba95bd4 | 73 | |
superphil06 | 0:e30c9ba95bd4 | 74 | |
superphil06 | 0:e30c9ba95bd4 | 75 | |
ghostrider06 | 1:76bf7ede6bce | 76 | //************ local function prototypes ******************* |
ghostrider06 | 1:76bf7ede6bce | 77 | |
ghostrider06 | 1:76bf7ede6bce | 78 | /**************** Read persistent data from text file located on local file system ****************/ |
ghostrider06 | 1:76bf7ede6bce | 79 | |
ghostrider06 | 1:76bf7ede6bce | 80 | /**************** write persitant data to text file located on local file system ****************/ |
ghostrider06 | 1:76bf7ede6bce | 81 | |
superphil06 | 0:e30c9ba95bd4 | 82 | //************** calibation gaz function needed to record min_gaz and max_gaz value to persistent text file ****************** |
superphil06 | 0:e30c9ba95bd4 | 83 | |
superphil06 | 0:e30c9ba95bd4 | 84 | // ************top hall counting interrupt needed for speed measurement |
superphil06 | 0:e30c9ba95bd4 | 85 | |
superphil06 | 0:e30c9ba95bd4 | 86 | //********************** timer interrupt for speed measurement each 100ms ************************* |
superphil06 | 0:e30c9ba95bd4 | 87 | |
superphil06 | 0:e30c9ba95bd4 | 88 | //********************* Timer Interrupt for gaz ref management each 10ms ******************** |
superphil06 | 0:e30c9ba95bd4 | 89 | |
superphil06 | 0:e30c9ba95bd4 | 90 | /********* main cgi function used to patch data to the web server thread **********************************/ |
superphil06 | 0:e30c9ba95bd4 | 91 | void CGI_Function(void) // cgi function that patch web data to empty web page |
ghostrider06 | 1:76bf7ede6bce | 92 | { |
ghostrider06 | 1:76bf7ede6bce | 93 | char ma_chaine4[20]= {}; // needed to form html response |
ghostrider06 | 1:76bf7ede6bce | 94 | |
ghostrider06 | 1:76bf7ede6bce | 95 | sprintf (ma_chaine4,"%g",fVRoue*3.6);// convert speed as ascii string |
ghostrider06 | 1:76bf7ede6bce | 96 | Html_Patch (tab_balise,0,ma_chaine4);// patch first label with dyn.string |
ghostrider06 | 1:76bf7ede6bce | 97 | sprintf (ma_chaine4,"%g",fPositionPoignee*100);// convert speed as ascii string |
ghostrider06 | 1:76bf7ede6bce | 98 | Html_Patch (tab_balise,1,ma_chaine4);// patch second label with dyn.string |
ghostrider06 | 1:76bf7ede6bce | 99 | sprintf (ma_chaine4,"%d",iTemperature);// convert speed as ascii string |
ghostrider06 | 1:76bf7ede6bce | 100 | Html_Patch (tab_balise,2,ma_chaine4);// patch third label with dyn.string |
ghostrider06 | 1:76bf7ede6bce | 101 | sprintf (ma_chaine4,"%g",fImes);// convert speed as ascii string |
ghostrider06 | 1:76bf7ede6bce | 102 | Html_Patch (tab_balise,3,ma_chaine4);// patch fourth label with dyn.string |
ghostrider06 | 1:76bf7ede6bce | 103 | sprintf (ma_chaine4,"%g",fVmes);// convert speed as ascii string |
ghostrider06 | 1:76bf7ede6bce | 104 | Html_Patch (tab_balise,4,ma_chaine4);// patch fourth label with dyn.string |
ghostrider06 | 1:76bf7ede6bce | 105 | } |
ghostrider06 | 1:76bf7ede6bce | 106 | |
ghostrider06 | 1:76bf7ede6bce | 107 | /*********************** CAN BUS SECTION **********************/ |
ghostrider06 | 1:76bf7ede6bce | 108 | void CAN_REC_THREAD(void const *args) |
ghostrider06 | 1:76bf7ede6bce | 109 | { |
ghostrider06 | 1:76bf7ede6bce | 110 | int iCount,iError; |
ghostrider06 | 1:76bf7ede6bce | 111 | |
ghostrider06 | 1:76bf7ede6bce | 112 | while (bCan_Active) { |
ghostrider06 | 1:76bf7ede6bce | 113 | Thread::wait(100);// wait 100ms |
ghostrider06 | 1:76bf7ede6bce | 114 | // code todo |
ghostrider06 | 1:76bf7ede6bce | 115 | |
ghostrider06 | 1:76bf7ede6bce | 116 | } |
superphil06 | 0:e30c9ba95bd4 | 117 | |
superphil06 | 0:e30c9ba95bd4 | 118 | } |
ghostrider06 | 1:76bf7ede6bce | 119 | |
ghostrider06 | 1:76bf7ede6bce | 120 | void GazRead(void) |
ghostrider06 | 1:76bf7ede6bce | 121 | { |
ghostrider06 | 1:76bf7ede6bce | 122 | if(cChoix == 'a'){} |
ghostrider06 | 1:76bf7ede6bce | 123 | else |
ghostrider06 | 1:76bf7ede6bce | 124 | { |
ghostrider06 | 1:76bf7ede6bce | 125 | nGaz=ngaz.read(); |
ghostrider06 | 1:76bf7ede6bce | 126 | fImes=(((Imes.read()*3.3*1.81818 - 2.5)/0.185)+Ioffset)*1000; //Current measurement (A to mA conversion) (on p20) |
ghostrider06 | 1:76bf7ede6bce | 127 | fVmes=(Tension.read()*15/0.19); //Voltage measurement (on p18) |
ghostrider06 | 1:76bf7ede6bce | 128 | iTemperature=iTemperature.read()*3.3/0.01-273; //Temperature measurement (on p19) |
ghostrider06 | 1:76bf7ede6bce | 129 | |
ghostrider06 | 1:76bf7ede6bce | 130 | fPositionPoignee=(ngaz.read()-ngazmin)/(ngazmax-ngazmin); // 0 to 1 float value meaning handle position |
ghostrider06 | 1:76bf7ede6bce | 131 | if(fPositionPoignee>1) |
ghostrider06 | 1:76bf7ede6bce | 132 | { |
ghostrider06 | 1:76bf7ede6bce | 133 | fPositionPoignee=1; |
ghostrider06 | 1:76bf7ede6bce | 134 | } |
ghostrider06 | 1:76bf7ede6bce | 135 | if(fPositionPoignee<0) |
ghostrider06 | 1:76bf7ede6bce | 136 | { |
ghostrider06 | 1:76bf7ede6bce | 137 | fPositionPoignee=0; |
ghostrider06 | 1:76bf7ede6bce | 138 | } |
ghostrider06 | 1:76bf7ede6bce | 139 | iREF_PWM=(255/(ngazmax-ngazmin))*(nGaz-ngazmin); //calibrate PWM (0 to 255) |
ghostrider06 | 1:76bf7ede6bce | 140 | iFrein=MyPLD.read()&32; //testing 6th Bit value |
ghostrider06 | 1:76bf7ede6bce | 141 | if(iFrein==32) //if brake is off |
ghostrider06 | 1:76bf7ede6bce | 142 | { |
ghostrider06 | 1:76bf7ede6bce | 143 | if(iREF_PWM>=255) iREF_PWM= 255; |
ghostrider06 | 1:76bf7ede6bce | 144 | if(iREF_PWM<1) iREF_PWM = 0; |
ghostrider06 | 1:76bf7ede6bce | 145 | if (fVRoue*3.6<=fBride) //speed flange |
ghostrider06 | 1:76bf7ede6bce | 146 | { |
ghostrider06 | 1:76bf7ede6bce | 147 | /******************* Progressive speed control *****************/ |
ghostrider06 | 1:76bf7ede6bce | 148 | if(iREF_PWMfin<iREF_PWM) iREF_PWMfin=iREF_PWMfin+1; |
ghostrider06 | 1:76bf7ede6bce | 149 | else iREF_PWMfin=iREF_PWM; |
ghostrider06 | 1:76bf7ede6bce | 150 | MyPLD.write(iREF_PWMfin); |
ghostrider06 | 1:76bf7ede6bce | 151 | } |
ghostrider06 | 1:76bf7ede6bce | 152 | else |
ghostrider06 | 1:76bf7ede6bce | 153 | { |
ghostrider06 | 1:76bf7ede6bce | 154 | if(iREF_PWMfin>0) |
ghostrider06 | 1:76bf7ede6bce | 155 | { |
ghostrider06 | 1:76bf7ede6bce | 156 | iREF_PWMfin=iREF_PWMfin-1; |
ghostrider06 | 1:76bf7ede6bce | 157 | MyPLD.write(iREF_PWMfin); |
ghostrider06 | 1:76bf7ede6bce | 158 | } |
ghostrider06 | 1:76bf7ede6bce | 159 | else iREF_PWMfin=0; |
ghostrider06 | 1:76bf7ede6bce | 160 | } |
ghostrider06 | 1:76bf7ede6bce | 161 | } |
ghostrider06 | 1:76bf7ede6bce | 162 | /******************* End of speed control *******************/ |
ghostrider06 | 1:76bf7ede6bce | 163 | |
ghostrider06 | 1:76bf7ede6bce | 164 | if(iFrein==0) //if brake is on |
ghostrider06 | 1:76bf7ede6bce | 165 | { |
ghostrider06 | 1:76bf7ede6bce | 166 | iREF_PWM=0; |
ghostrider06 | 1:76bf7ede6bce | 167 | MyPLD.write(iREF_PWM); |
ghostrider06 | 1:76bf7ede6bce | 168 | } |
ghostrider06 | 1:76bf7ede6bce | 169 | } |
ghostrider06 | 1:76bf7ede6bce | 170 | } |
ghostrider06 | 1:76bf7ede6bce | 171 | |
ghostrider06 | 1:76bf7ede6bce | 172 | void cpt (void){ |
ghostrider06 | 1:76bf7ede6bce | 173 | nbhall++; |
ghostrider06 | 1:76bf7ede6bce | 174 | } |
ghostrider06 | 1:76bf7ede6bce | 175 | |
ghostrider06 | 1:76bf7ede6bce | 176 | void VitesseRoue (void) |
ghostrider06 | 1:76bf7ede6bce | 177 | { |
ghostrider06 | 1:76bf7ede6bce | 178 | fVRoue=(nbhall*2*3.14*RADIUS)/(6*DELTA_T*NBPOLES); //Wheel speed in m/s |
ghostrider06 | 1:76bf7ede6bce | 179 | ftop_hall_total=nbhall+ftop_hall_total; |
ghostrider06 | 1:76bf7ede6bce | 180 | ftop_hall_partiel=nbhall+ftop_hall_partiel; |
ghostrider06 | 1:76bf7ede6bce | 181 | nbhall=0; |
ghostrider06 | 1:76bf7ede6bce | 182 | } |
ghostrider06 | 1:76bf7ede6bce | 183 | |
ghostrider06 | 1:76bf7ede6bce | 184 | void Battery(void){ |
superphil06 | 0:e30c9ba95bd4 | 185 | |
ghostrider06 | 1:76bf7ede6bce | 186 | fCapa = fCapa - 1000*dT; //Init battery capacity with dT : counting period and 1000 the current value in mA |
superphil06 | 0:e30c9ba95bd4 | 187 | |
ghostrider06 | 1:76bf7ede6bce | 188 | if(fCapa<0){ |
ghostrider06 | 1:76bf7ede6bce | 189 | fCapa=0; |
ghostrider06 | 1:76bf7ede6bce | 190 | } |
ghostrider06 | 1:76bf7ede6bce | 191 | } |
ghostrider06 | 1:76bf7ede6bce | 192 | |
ghostrider06 | 1:76bf7ede6bce | 193 | /*char getValeur(char octet, char n) |
ghostrider06 | 1:76bf7ede6bce | 194 | { |
ghostrider06 | 1:76bf7ede6bce | 195 | return (octet & (1 << n)); |
ghostrider06 | 1:76bf7ede6bce | 196 | }*/ |
superphil06 | 0:e30c9ba95bd4 | 197 | |
superphil06 | 0:e30c9ba95bd4 | 198 | |
ghostrider06 | 1:76bf7ede6bce | 199 | //*************************** main function ***************************************** |
ghostrider06 | 1:76bf7ede6bce | 200 | int main() |
ghostrider06 | 1:76bf7ede6bce | 201 | { |
ghostrider06 | 1:76bf7ede6bce | 202 | valid_pwm.write(0); |
ghostrider06 | 1:76bf7ede6bce | 203 | MyPLD.write(0); |
ghostrider06 | 1:76bf7ede6bce | 204 | char cClavier= 0; |
ghostrider06 | 1:76bf7ede6bce | 205 | valid_pwm.write(1); |
superphil06 | 0:e30c9ba95bd4 | 206 | |
ghostrider06 | 1:76bf7ede6bce | 207 | FILE *fp = NULL; |
ghostrider06 | 1:76bf7ede6bce | 208 | fp = fopen("/local/Config2.txt", "r"); |
ghostrider06 | 1:76bf7ede6bce | 209 | if(fp != NULL){ |
ghostrider06 | 1:76bf7ede6bce | 210 | fscanf(fp,"%g %g %g %g %g %g %g",&ngazmin,&ngazmax,&fBride,&ftop_hall_total,&ftop_hall_partiel,&fCapa,&fCapaInit); //Writing values in file |
ghostrider06 | 1:76bf7ede6bce | 211 | fclose(fp); |
ghostrider06 | 1:76bf7ede6bce | 212 | pc.printf("Max=%g\n\r",ngazmax); |
ghostrider06 | 1:76bf7ede6bce | 213 | pc.printf("Min=%g\n\r\n",ngazmin); |
ghostrider06 | 1:76bf7ede6bce | 214 | pc.printf("Bride=%g\n\r\n",fBride); |
ghostrider06 | 1:76bf7ede6bce | 215 | fdistance=(ftop_hall_total/(6*NBPOLES)*2*3.14*RADIUS); // meters |
ghostrider06 | 1:76bf7ede6bce | 216 | fdistpartiel=(ftop_hall_partiel/(6*NBPOLES)*2*3.14*RADIUS); // meters |
ghostrider06 | 1:76bf7ede6bce | 217 | pc.printf("Distance totale enregistree=%g m\n\r\n",fdistance); |
ghostrider06 | 1:76bf7ede6bce | 218 | pc.printf("Distance partiel enregistree=%g m\n\r\n",fdistpartiel); |
ghostrider06 | 1:76bf7ede6bce | 219 | pc.printf("Capa batterie restante: %g\n\r",fCapa); |
ghostrider06 | 1:76bf7ede6bce | 220 | pc.printf("Capa initale batterie: %g\n\r",fCapaInit); |
ghostrider06 | 1:76bf7ede6bce | 221 | } |
ghostrider06 | 1:76bf7ede6bce | 222 | else printf("Fichier introuvable\n\r"); |
superphil06 | 0:e30c9ba95bd4 | 223 | |
ghostrider06 | 1:76bf7ede6bce | 224 | //***************************************** web section ********************************************// |
superphil06 | 0:e30c9ba95bd4 | 225 | |
ghostrider06 | 1:76bf7ede6bce | 226 | Init_Web_Server(&CGI_Function); // create and initialize tcp server socket and pass function pointer to local CGI function |
ghostrider06 | 1:76bf7ede6bce | 227 | Thread WebThread(Web_Server_Thread);// create and launch web server thread |
superphil06 | 0:e30c9ba95bd4 | 228 | |
ghostrider06 | 1:76bf7ede6bce | 229 | /********* main cgi function used to patch data to the web server thread **********************************/ |
ghostrider06 | 1:76bf7ede6bce | 230 | |
ghostrider06 | 1:76bf7ede6bce | 231 | Gen_HtmlCode_From_File("/local/pagecgi2.htm",tab_balise,5);*/// read and localise ^VARDEF[X] tag in empty html file |
superphil06 | 0:e30c9ba95bd4 | 232 | |
ghostrider06 | 1:76bf7ede6bce | 233 | //******************************************* end web section ************************************* / |
superphil06 | 0:e30c9ba95bd4 | 234 | |
ghostrider06 | 1:76bf7ede6bce | 235 | pc.printf("\rprogramme scooter mbed \n\r"); |
superphil06 | 0:e30c9ba95bd4 | 236 | |
superphil06 | 0:e30c9ba95bd4 | 237 | //********************* can bus section initialisation ******************************************* |
superphil06 | 0:e30c9ba95bd4 | 238 | //bCan_Active=true;// needed to lauchn CAN thread |
superphil06 | 0:e30c9ba95bd4 | 239 | //Thread CanThread(CAN_REC_THREAD);// create and launch can receiver thread |
superphil06 | 0:e30c9ba95bd4 | 240 | //********************* end can bus section ***************************************************** |
ghostrider06 | 1:76bf7ede6bce | 241 | fCapaInit=1000*60; |
ghostrider06 | 1:76bf7ede6bce | 242 | Tgaz.attach(&GazRead,0.005); |
ghostrider06 | 1:76bf7ede6bce | 243 | Tbat.attach(&Battery,dT); |
ghostrider06 | 1:76bf7ede6bce | 244 | Hall.mode(PullUp); |
ghostrider06 | 1:76bf7ede6bce | 245 | Hall.rise(&cpt); |
ghostrider06 | 1:76bf7ede6bce | 246 | Vitesse.attach(&VitesseRoue,DELTA_T); |
ghostrider06 | 1:76bf7ede6bce | 247 | pc.printf("commande moteur par poignee\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 248 | |
ghostrider06 | 1:76bf7ede6bce | 249 | while (1) |
ghostrider06 | 1:76bf7ede6bce | 250 | { /****************************** MBed IHM **********************/ |
ghostrider06 | 1:76bf7ede6bce | 251 | pc.printf("veuillez saisir une commande parmi la liste proposee: \n\r"); |
ghostrider06 | 1:76bf7ede6bce | 252 | pc.printf("a:saisie consigne pwm \n\r"); |
ghostrider06 | 1:76bf7ede6bce | 253 | pc.printf("z:calibration poignee \n\r"); |
ghostrider06 | 1:76bf7ede6bce | 254 | pc.printf("e:controle vitesse poignee \n\r"); |
ghostrider06 | 1:76bf7ede6bce | 255 | pc.printf("r:Affichage registre interne\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 256 | pc.printf("t:vitesse roue\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 257 | pc.printf("y:bride en vitesse\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 258 | pc.printf("u:affichage mesures\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 259 | pc.printf("i:distance totale et partielle en metre\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 260 | pc.printf("o:RAZ compteur kilometrique\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 261 | pc.printf("p:Capacite restante \n\r"); |
ghostrider06 | 1:76bf7ede6bce | 262 | pc.printf("d:Recharge\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 263 | pc.printf("q:quitter \n\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 264 | /**************************** END IHM ***********************/ |
ghostrider06 | 1:76bf7ede6bce | 265 | |
ghostrider06 | 1:76bf7ede6bce | 266 | /************* multithreading : main thread need to sleep in order to allow web response ****************/ |
ghostrider06 | 1:76bf7ede6bce | 267 | while (pc.readable()==0) // determine if char availabler |
ghostrider06 | 1:76bf7ede6bce | 268 | {Thread::wait(10);} // wait 10 until char available on serial input |
ghostrider06 | 1:76bf7ede6bce | 269 | /************* end of main thread sleep ****************/ |
ghostrider06 | 1:76bf7ede6bce | 270 | |
ghostrider06 | 1:76bf7ede6bce | 271 | pc.scanf("%c",&cChoix); |
ghostrider06 | 1:76bf7ede6bce | 272 | switch (cChoix) { |
ghostrider06 | 1:76bf7ede6bce | 273 | case 'a': //Manual PWM command |
ghostrider06 | 1:76bf7ede6bce | 274 | pc.printf("Entrez la valeur PWM entre 0 et 255 : \n\r"); |
ghostrider06 | 1:76bf7ede6bce | 275 | while (pc.readable()==0) { // determine if char available |
ghostrider06 | 1:76bf7ede6bce | 276 | Thread::wait(10); |
ghostrider06 | 1:76bf7ede6bce | 277 | } |
ghostrider06 | 1:76bf7ede6bce | 278 | pc.scanf("%d",&iREF_PWM); |
ghostrider06 | 1:76bf7ede6bce | 279 | if(iREF_PWM<=255 & iREF_PWM>=0) { |
ghostrider06 | 1:76bf7ede6bce | 280 | printf("Envoie d'une commande %d/255 dans la roue\n\r",iREF_PWM); |
ghostrider06 | 1:76bf7ede6bce | 281 | MyPLD.write(iREF_PWM); |
ghostrider06 | 1:76bf7ede6bce | 282 | } |
ghostrider06 | 1:76bf7ede6bce | 283 | else |
ghostrider06 | 1:76bf7ede6bce | 284 | pc.printf("value %d out of range PWM remains unchanged\n\r",iREF_PWM); |
ghostrider06 | 1:76bf7ede6bce | 285 | break; |
ghostrider06 | 1:76bf7ede6bce | 286 | |
ghostrider06 | 1:76bf7ede6bce | 287 | |
ghostrider06 | 1:76bf7ede6bce | 288 | case 'z': //Manual Handle calibration |
ghostrider06 | 1:76bf7ede6bce | 289 | pc.printf("Mettez la poignee a la valeur min puis entrez o\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 290 | pc.scanf("%c",&cClavier); |
ghostrider06 | 1:76bf7ede6bce | 291 | if(cClavier=='o') { |
ghostrider06 | 1:76bf7ede6bce | 292 | ngazmin=ngaz.read(); |
ghostrider06 | 1:76bf7ede6bce | 293 | } else { |
ghostrider06 | 1:76bf7ede6bce | 294 | while(cClavier!='o') { |
ghostrider06 | 1:76bf7ede6bce | 295 | pc.printf("tapez o\n"); |
ghostrider06 | 1:76bf7ede6bce | 296 | pc.scanf("%c",&cClavier); |
ghostrider06 | 1:76bf7ede6bce | 297 | } |
ghostrider06 | 1:76bf7ede6bce | 298 | } |
ghostrider06 | 1:76bf7ede6bce | 299 | |
ghostrider06 | 1:76bf7ede6bce | 300 | pc.printf("Mettez la poignee a la valeur max puis entrez o\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 301 | pc.scanf("%c",&cClavier); |
ghostrider06 | 1:76bf7ede6bce | 302 | if(cClavier=='o') { |
ghostrider06 | 1:76bf7ede6bce | 303 | ngazmax=ngaz.read(); |
ghostrider06 | 1:76bf7ede6bce | 304 | } else { |
ghostrider06 | 1:76bf7ede6bce | 305 | while(cClavier!='o') { |
ghostrider06 | 1:76bf7ede6bce | 306 | pc.printf("tapez o\n"); |
ghostrider06 | 1:76bf7ede6bce | 307 | pc.scanf("%c",&cClavier); |
ghostrider06 | 1:76bf7ede6bce | 308 | } |
ghostrider06 | 1:76bf7ede6bce | 309 | } |
ghostrider06 | 1:76bf7ede6bce | 310 | |
ghostrider06 | 1:76bf7ede6bce | 311 | pc.printf("Max=%g\n\r",ngazmax); |
ghostrider06 | 1:76bf7ede6bce | 312 | pc.printf("Min=%g\n\r\n",ngazmin); |
ghostrider06 | 1:76bf7ede6bce | 313 | fp = fopen("/local/Config2.txt", "w"); |
ghostrider06 | 1:76bf7ede6bce | 314 | fprintf(fp,"%g %g %g %g %g", ngazmin, ngazmax,fBride,ftop_hall_total,ftop_hall_partiel); |
ghostrider06 | 1:76bf7ede6bce | 315 | fclose(fp); |
ghostrider06 | 1:76bf7ede6bce | 316 | break; |
superphil06 | 0:e30c9ba95bd4 | 317 | |
superphil06 | 0:e30c9ba95bd4 | 318 | |
ghostrider06 | 1:76bf7ede6bce | 319 | case 'e': //Wheel speed control only (using handle) |
ghostrider06 | 1:76bf7ede6bce | 320 | pc.printf("commande moteur par poignee\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 321 | break; |
ghostrider06 | 1:76bf7ede6bce | 322 | |
ghostrider06 | 1:76bf7ede6bce | 323 | case 'r': //Internal register : reading PLD 1st to 6th bits ( |
ghostrider06 | 1:76bf7ede6bce | 324 | |
ghostrider06 | 1:76bf7ede6bce | 325 | int RegPLD = MyPLD.read(); |
ghostrider06 | 1:76bf7ede6bce | 326 | |
ghostrider06 | 1:76bf7ede6bce | 327 | pc.printf("Registre interne : %d\n\r",RegPLD ); //Reading all Bits in PLD |
ghostrider06 | 1:76bf7ede6bce | 328 | |
ghostrider06 | 1:76bf7ede6bce | 329 | pc.printf("Numero secteur hall : %d\n\n\r",RegPLD & 7); //Current sector |
ghostrider06 | 1:76bf7ede6bce | 330 | |
ghostrider06 | 1:76bf7ede6bce | 331 | if((RegPLD & 0x20) == 0x00) pc.printf("Etat frein: actif\n\n\r"); //Testing brake |
ghostrider06 | 1:76bf7ede6bce | 332 | else pc.printf("Etat frein: inactif\n\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 333 | |
ghostrider06 | 1:76bf7ede6bce | 334 | if((RegPLD & 0x08) == 0x08) pc.printf("Direction: avant \n\n\r"); //Testing direction |
ghostrider06 | 1:76bf7ede6bce | 335 | else pc.printf("Direction: arriere \n\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 336 | |
ghostrider06 | 1:76bf7ede6bce | 337 | if((RegPLD & 0x10) == 0x10) pc.printf("Defaillance detecte \n\n\r");//Testing system failure |
ghostrider06 | 1:76bf7ede6bce | 338 | else pc.printf("Pas de defaillance \n\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 339 | |
ghostrider06 | 1:76bf7ede6bce | 340 | if((RegPLD & 0x40) == 0x00) pc.printf("Surintensite detecte \n\n\r");//Testing overcurrent |
ghostrider06 | 1:76bf7ede6bce | 341 | else pc.printf("Pas de surintensite \n\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 342 | break; |
ghostrider06 | 1:76bf7ede6bce | 343 | |
ghostrider06 | 1:76bf7ede6bce | 344 | case 't': |
ghostrider06 | 1:76bf7ede6bce | 345 | pc.printf("Vitesse roue : %gm/s\n\r",fVRoue); //Reading wheel speed : km/h and m/s |
ghostrider06 | 1:76bf7ede6bce | 346 | pc.printf("Vitesse roue : %gkm/h\n\r",fVRoue*3.6); |
ghostrider06 | 1:76bf7ede6bce | 347 | break; |
ghostrider06 | 1:76bf7ede6bce | 348 | |
ghostrider06 | 1:76bf7ede6bce | 349 | case 'y': |
ghostrider06 | 1:76bf7ede6bce | 350 | pc.printf("Choisissez une vitesse limite en km/h \n\r"); //Wheel speed flange configuration |
ghostrider06 | 1:76bf7ede6bce | 351 | pc.scanf("%g",&fBride); |
ghostrider06 | 1:76bf7ede6bce | 352 | fp = fopen("/local/Config2.txt", "w"); |
ghostrider06 | 1:76bf7ede6bce | 353 | fprintf(fp,"%g %g %g %g %g", ngazmin, ngazmax,fBride,ftop_hall_total,ftop_hall_partiel); |
ghostrider06 | 1:76bf7ede6bce | 354 | fclose(fp); |
ghostrider06 | 1:76bf7ede6bce | 355 | break; |
ghostrider06 | 1:76bf7ede6bce | 356 | |
ghostrider06 | 1:76bf7ede6bce | 357 | case 'u': |
ghostrider06 | 1:76bf7ede6bce | 358 | pc.printf("Mesure courant: %gA\n\r",fImes/1000); //Ampere |
ghostrider06 | 1:76bf7ede6bce | 359 | pc.printf("Mesure tension: %gV\n\r",fVmes); //Voltage |
ghostrider06 | 1:76bf7ede6bce | 360 | pc.printf("iTemperature: %d\n\r",iTemperature); //°C |
ghostrider06 | 1:76bf7ede6bce | 361 | pc.printf("Poignee a: %g",fPositionPoignee*100); //0 to 100% |
ghostrider06 | 1:76bf7ede6bce | 362 | pc.puts("%\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 363 | break; |
ghostrider06 | 1:76bf7ede6bce | 364 | |
ghostrider06 | 1:76bf7ede6bce | 365 | case 'i': |
ghostrider06 | 1:76bf7ede6bce | 366 | fdistance=(ftop_hall_total/(6*NBPOLES)*2*3.14*RADIUS); // total distance traveled in meters |
ghostrider06 | 1:76bf7ede6bce | 367 | fdistpartiel=(ftop_hall_partiel/(6*NBPOLES)*2*3.14*RADIUS); // current session distance traveled in meters |
ghostrider06 | 1:76bf7ede6bce | 368 | pc.printf("distance totale=%g m\n\r",fdistance); |
ghostrider06 | 1:76bf7ede6bce | 369 | pc.printf("distance partiel=%g m\n\r",fdistpartiel); |
ghostrider06 | 1:76bf7ede6bce | 370 | break; |
ghostrider06 | 1:76bf7ede6bce | 371 | |
ghostrider06 | 1:76bf7ede6bce | 372 | case 'o': |
ghostrider06 | 1:76bf7ede6bce | 373 | pc.printf("RAZ\n\r"); |
ghostrider06 | 1:76bf7ede6bce | 374 | ftop_hall_partiel = 0; //Current session distance reset |
ghostrider06 | 1:76bf7ede6bce | 375 | break; |
ghostrider06 | 1:76bf7ede6bce | 376 | |
ghostrider06 | 1:76bf7ede6bce | 377 | case 'p': |
ghostrider06 | 1:76bf7ede6bce | 378 | pc.printf("Capa batt restante:%.2f\n\r",(fCapa/fCapaInit)*100); //battery remaining |
ghostrider06 | 1:76bf7ede6bce | 379 | break; |
ghostrider06 | 1:76bf7ede6bce | 380 | |
ghostrider06 | 1:76bf7ede6bce | 381 | case 'd': |
ghostrider06 | 1:76bf7ede6bce | 382 | fCapa=fCapaInit; |
ghostrider06 | 1:76bf7ede6bce | 383 | pc.printf("Recharge de la batterie effectuee\n\r"); //Battery recharger |
ghostrider06 | 1:76bf7ede6bce | 384 | break; |
ghostrider06 | 1:76bf7ede6bce | 385 | |
ghostrider06 | 1:76bf7ede6bce | 386 | case 'q': |
ghostrider06 | 1:76bf7ede6bce | 387 | /********************** END of program (save all) *******************/ |
ghostrider06 | 1:76bf7ede6bce | 388 | pc.printf("Capa batterie restante: %.2f\n\r",fCapa); |
ghostrider06 | 1:76bf7ede6bce | 389 | pc.printf("Capa initale batterie: %.2f\n\r",fCapaInit); |
ghostrider06 | 1:76bf7ede6bce | 390 | pc.printf("%g m parcourus cette session\n\r",fdistpartiel); |
ghostrider06 | 1:76bf7ede6bce | 391 | fp = fopen("/local/Config2.txt","w"); |
ghostrider06 | 1:76bf7ede6bce | 392 | fprintf(fp,"%g %g %g %g %g %g %g", ngazmin, ngazmax,fBride,ftop_hall_total,ftop_hall_partiel,fCapa,fCapaInit); |
ghostrider06 | 1:76bf7ede6bce | 393 | fclose(fp); |
ghostrider06 | 1:76bf7ede6bce | 394 | Tgaz.detach(); |
ghostrider06 | 1:76bf7ede6bce | 395 | Vitesse.detach(); |
ghostrider06 | 1:76bf7ede6bce | 396 | Tbat.detach(); |
ghostrider06 | 1:76bf7ede6bce | 397 | MyPLD.write(0); |
ghostrider06 | 1:76bf7ede6bce | 398 | pc.printf(" fin programme scooter mbed \n"); |
ghostrider06 | 1:76bf7ede6bce | 399 | return 0; |
ghostrider06 | 1:76bf7ede6bce | 400 | } |
superphil06 | 0:e30c9ba95bd4 | 401 | } // end while |
ghostrider06 | 1:76bf7ede6bce | 402 | |
ghostrider06 | 1:76bf7ede6bce | 403 | //************** thread deinit ********************* |
ghostrider06 | 1:76bf7ede6bce | 404 | // DeInit_Web_Server(); |
ghostrider06 | 1:76bf7ede6bce | 405 | //bCan_Active=false; |
ghostrider06 | 1:76bf7ede6bce | 406 | //CanThread=false;// close can received thread |
ghostrider06 | 1:76bf7ede6bce | 407 | } // end main |