radarGSE
Dependencies: HCSR04 mbed buzzer
main.cpp
00001 #include "mbed.h" 00002 #include <string.h> 00003 #include "HCSR04.h" 00004 #include "buzzer.h" 00005 //#include "rtos.h" 00006 00007 #define TRIG_1 PA_8 00008 #define ECHO_1 PC_7 00009 00010 Serial pc(USBTX, USBRX); //reception --- tx, rx 00011 Serial carte(PA_9, PA_10); //emission --- tx, rx 00012 00013 HCSR04 sensor1(TRIG_1, ECHO_1); 00014 DigitalOut led1(LED1); 00015 00016 int max (int a, int b) { 00017 return (a<b)?b:a; 00018 } 00019 00020 int min (int a, int b) { 00021 return (a<b)?a:b; 00022 } 00023 00024 void USART1_puts(char *text){ 00025 while(*text != '\0'){ 00026 00027 if(carte.writeable()){ 00028 carte.putc(*text); 00029 text++; 00030 } 00031 00032 } 00033 } 00034 00035 00036 void format(char *msg, char *msg_formated){ 00037 int somme=5; 00038 int i=0; 00039 msg_formated[0]=2; 00040 printf("\n\r"); 00041 while(msg[i]!=0){ 00042 somme= somme + msg[i]; 00043 msg_formated[i+1]=msg[i]; 00044 i++; 00045 } 00046 if(somme>255){ 00047 somme++; 00048 } 00049 somme=somme%256; 00050 msg_formated[i+1]=~somme; 00051 msg_formated[i+2]=3; 00052 msg_formated[i+3]=0; 00053 00054 //A supprimer 00055 i=0; 00056 while(msg_formated[i]!=0){ 00057 printf("[%d] ", msg_formated[i]); 00058 i++; 00059 } 00060 } 00061 00062 /* 00063 void format(char *msg, char *msg_formated){ 00064 char *STX = 2; 00065 char *ETX = 3; 00066 strcat(msg_formated, STX); 00067 strcat(msg_formated, msg); 00068 strcat(msg_formated, ETX); 00069 } 00070 */ 00071 00072 void send(char *data){ 00073 char trame[52]=""; 00074 format(data, trame); 00075 USART1_puts(trame); 00076 } 00077 00078 /* 00079 void receive(char *frame){ 00080 char trame[50]={0}; 00081 int etat = 0; 00082 while(etat != 2){ 00083 char r; 00084 if(carte.readable()){ 00085 r = carte.getc(); 00086 switch(etat){ 00087 case 0 : if(r == 'S'){etat = 1;} 00088 break; 00089 case 1 : if(r != 'E'){strcat(trame,&r);} 00090 else { etat = 2; } 00091 break; 00092 default : break; 00093 } 00094 } 00095 } 00096 for(int i=0;i<50;i++){ 00097 frame[i]=trame[i]; 00098 } 00099 } 00100 */ 00101 00102 int receive(char *frame){ 00103 int end = 0; 00104 int I; 00105 unsigned int sommeBuffer; 00106 char r; 00107 Timer timeout; 00108 timeout.start(); 00109 while(1){ 00110 if(timeout.read_ms() > 100) return 1; 00111 if(carte.readable()){ 00112 r = carte.getc(); 00113 00114 switch(r){ 00115 case 2: //Start 00116 I=0; 00117 sommeBuffer=2; 00118 break; 00119 00120 case 3: //Stop 00121 frame[I]=0; 00122 sommeBuffer+=3; 00123 00124 if(sommeBuffer>255){ 00125 sommeBuffer++; 00126 } 00127 sommeBuffer=~sommeBuffer; 00128 sommeBuffer=sommeBuffer%256; 00129 00130 if(sommeBuffer==0){ //Les sommes concordent, les données sont valides 00131 frame[I-1]=0; 00132 return 0; 00133 }else{ //Message invalidé par la somme 00134 frame[0]=0; 00135 return 1; 00136 } 00137 break; 00138 00139 default : 00140 frame[I]=r; 00141 sommeBuffer+=r; 00142 I++; 00143 break; 00144 } 00145 } 00146 } 00147 return 1; 00148 } 00149 00150 int controle(char *frame){ 00151 if (*frame!=6) 00152 return 0; 00153 return 1; 00154 00155 } 00156 00157 void tictac(){ 00158 led1 = !led1; 00159 } 00160 void bipContinu(){ 00161 led1 = 1; 00162 } 00163 void bipOff(){ 00164 led1 = 0; 00165 } 00166 00167 //Emission d'une trame, reception d'acquittement et vérification 00168 int main() { 00169 00170 Ticker tic; 00171 tic.attach(&bipOff, 0.1); 00172 00173 Buzzer buzzo; 00174 Ticker bip; 00175 bip.attach_us(&buzzo, &Buzzer::run, 100); 00176 00177 char trame[50]; 00178 int essai, error; 00179 int i=0; 00180 int value; 00181 char message[4]; 00182 00183 int mem[2] = {-1, -1}; 00184 int memFreq = 0; 00185 Timer timeout; 00186 00187 while(1){ 00188 00189 value=min(sensor1.distance(1),230); 00190 value=max(value,0); 00191 00192 /* Filtrage */ 00193 if(mem[0]<0){ 00194 mem[0]=value; 00195 }else{ 00196 if(abs(mem[0]-value)<40){ 00197 mem[1]=mem[0]; 00198 mem[0]=value; 00199 }else{ 00200 value=mem[0]; 00201 } 00202 } 00203 00204 //Mise à jour de l'intervale entre chaque bip 00205 buzzo.changeMode(value); 00206 00207 message[0]=48+(value/100)%10; 00208 message[1]=48+(value/10)%10; 00209 message[2]=48+value%10; 00210 message[3]=0; 00211 00212 essai=0; 00213 printf("%s\n\r",message); 00214 send(message); 00215 00216 error=receive(trame); 00217 00218 00219 while((controle(trame)==0 || error==1) && essai<3){ 00220 send(message); 00221 error=receive(trame); 00222 essai++; 00223 } 00224 00225 if(essai==3) return 0; 00226 00227 i=(i+1)%10; 00228 wait(1); 00229 00230 } 00231 }
Generated on Fri Jul 15 2022 02:17:35 by 1.7.2