Kart+xxxxx // Radar_RTOS

Dependencies:   Radar_RTOS mbed

Fork of Radar_RTOS by Contest IOT GSE5

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 "UART_Radar.h"
00004 #include "buzzer.h"
00005 
00006 #define TRIG_1  PA_8
00007 #define ECHO_1  PC_7
00008 
00009 Serial pc(USBTX, USBRX); //reception --- tx, rx
00010 
00011 //Instanciation des GPIOs.
00012 DigitalOut trig(TRIG_1);            //Sortie digital pour le trigger.
00013 InterruptIn echo(ECHO_1);           //Entrée digital sur interuption pour l'écho.
00014 InterruptIn position(USER_BUTTON);    //Entrée digital sur interuption pour le levier de vitesse.
00015 
00016 //Instanciation du Timer.
00017 Timer distance_time;            //Timer pour la mesure de distance.
00018 Ticker mesure_time;             //Timer (fixe) avec interruption pour l'acquisition de la distance.
00019 Ticker send_time;               //Timer (fixe) avec interruption pour l'envoie de la distance.
00020 Ticker bip;                     //Timer (fixe) avec interruption pour l'actualisation du buzzer.
00021 
00022 //Instanciation des variables.
00023 Buzzer buzzo;
00024 int distance;
00025 
00026 
00027 /********************Fonction qui génére le burst pour la mesure de distance.****************************/
00028 //But : Générer un burst et reset le timer de sitance.
00029 //
00030 //Donnée :  Le timer distance_time est un timer global.  
00031 //          trig est un sortie digital. 
00032 //                   _____________
00033 // TRIG => ________/              \__....
00034 //          2 µs         10 µs       
00035 //   
00036 void send_burst(){ 
00037     distance_time.reset(); 
00038     trig = 0;
00039     wait_us(2);
00040     trig = 1;
00041     wait_us(10);
00042     trig = 0;
00043 }
00044 /*******************************************************************************************************/
00045 
00046 
00047 
00048 
00049 /*******************************Fonction de minimum et maximum.*****************************************/
00050 //But : Renvoie le min et le max entre deux entier.
00051 //
00052 int max (int a, int b) {
00053   return (a<b)?b:a;
00054 }
00055 int min (int a, int b) {
00056   return (a<b)?a:b;
00057 }
00058 /********************************************************************************************************/
00059 
00060 
00061 /******************Routine d'interruption sur front montant du signal echo.*****************************/
00062 //But : Lancer le timer.
00063 //
00064 //Donnée :  Le timer distance_time est un timer global.  
00065 //                  _....
00066 // ECHO => ....____/      Start timer.
00067 //                 ^      
00068 //
00069 void echo_rise(){ 
00070     distance_time.start(); 
00071 }
00072 /*********************************************************************************************************/
00073 
00074 
00075 
00076 /***************************Routine d'envoie de la distance via l'uart.***********************************/
00077 //But : Transformer la distance en chaine de caractéres.
00078 //      Envoier via la fonction send() et attendre un acquitement.
00079 //      Error si on recoie 3 non-acquitement succésif ou atteinte du timeout.
00080 //
00081 //Donnée :  L'entier distance est une variable global.
00082 //          La chaine message contient la distance sur 3 caractére + '\0'.        
00083 //          L'envoie est répété 3 fois quand il y a erreur. Si 3 erreurs, arret des émission.
00084 //          Il y a erreur si :  receive ne recoie pas d'acquitement dans un temps impartie.  
00085 //                              controle renvoie 0, qui corespond à une erreur de checksum.
00086 void transmit_data(){
00087     
00088     int essai, err;
00089     char message[4];
00090     char trame[2];
00091     message[0]=48+(distance/100)%10;
00092     message[1]=48+(distance/10)%10;
00093     message[2]=48+distance%10;
00094     message[3]=0;
00095         
00096     essai=0;
00097     send(message);
00098     
00099     
00100     pc.printf("%c%c%c\n\r",message[0],message[1],message[2]);
00101     err=receive(trame);                       //Bug avec le nouvelle affichage
00102     pc.printf("error%d\n\r",err);
00103  
00104     while((controle(trame)==1 || err!=0) && essai < 3){
00105         essai++;
00106         if( essai >= 3) while(1);
00107         send(message);
00108         err=receive(trame);
00109         pc.printf("error%d\n\r",err);
00110         
00111     }
00112 }
00113 /**********************************************************************************************************/
00114 
00115 
00116 
00117 
00118 /*********************Routine d'interruption sur front descendant du signal echo.**************************/
00119 //But : Stoper le timer, récupérer la distance en cm
00120 //      et modifier le silence entre deux bip du buzzer
00121 //
00122 //Donnée :  Le timer distance_time est un timer global.
00123 //          L'entier distance est une variable global.
00124 //          Le buzzer buzzo est un objet global.    
00125 //                  _____________________________________
00126 // ECHO => ________/      Distant = Temps / 29/2         \__.... Stop timer.
00127 //                                                       ^
00128 //       
00129 void echo_fall(){ 
00130     distance_time.stop();                               //Stop le timer.
00131     
00132     distance = distance_time.read_us() /29 / 2;    //Converti le temps (µs) en distance (cm).
00133     distance = min(distance,230);             //Definie la valeur max de la distance à 230.
00134     distance = max(distance,0);                    //Definie la valeur min de la distance à 0.
00135             
00136     buzzo.changeMode(distance);                         //Mise à jour de l'intervale entre chaque bip
00137 }
00138 /**********************************************************************************************************/
00139 
00140 /******************Routine d'interruption sur front montant du signal pos.*****************************/
00141 //But : Lancer les tâches.
00142 //                  
00143 //
00144 void position_rise(){ 
00145        
00146         echo.rise(NULL);                            //Routine NULL sur interruption de echo en front montant.
00147         echo.fall(NULL);                            //Routine NULL sur interruption de echo en front descendant.
00148         mesure_time.detach();                       //Stop la routine send_burst.
00149         send_time.detach();                         //Stop la routine transmist_data.                              
00150         bip.detach();                               //Stop la routine l'actualisation du buzzer.
00151     
00152 }
00153 /*********************************************************************************************************/
00154 
00155 /******************Routine d'interruption sur front descendant du signal pos.*****************************/
00156 //But : Stop les tâches.
00157 //                  
00158 //
00159 void position_fall(){ 
00160        
00161         echo.rise(&echo_rise);                      //Routine echo_rise sur interruption de echo en front montant.
00162         echo.fall(&echo_fall);                      //Routine echo_fall sur interruption de echo en front descendant.
00163         mesure_time.attach(&send_burst, 0.5);       //Lance send_burst toutes les 500ms.
00164         wait(0.1);                                  //Décalage entre send et transmit.
00165         send_time.attach(&transmit_data, 0.5);      //Lance transmist_data toutes les 500ms.
00166         wait(0.1);                                  //Décalage entre transmit et buzz.
00167         bip.attach_us(&buzzo, &Buzzer::run, 400);   //Lance l'actualisation du buzzer toutes les 400µs ( F = 2.5 kHz ).
00168     
00169 }
00170 /*********************************************************************************************************/
00171 
00172 
00173 
00174 int main() {
00175 
00176         position.rise(&position_rise);                      //Routine position_rise sur interruption de position en front montant.
00177         position.fall(&position_fall);                      //Routine position_fall sur interruption de position en front descendant.
00178 
00179     while(1);
00180 
00181 }