radarGSE

Dependencies:   HCSR04 mbed buzzer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }