Kart+xxxxx // Radar_RTOS
Dependencies: Radar_RTOS mbed
Fork of Radar_RTOS by
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 }
Generated on Mon Jul 18 2022 05:46:16 by 1.7.2