Asdf
Dependencies: mbed HC_SR04_Ultrasonic_Library
main.cpp@0:c4844dc380b9, 2019-12-17 (annotated)
- Committer:
- brunostgr
- Date:
- Tue Dec 17 17:52:28 2019 +0000
- Revision:
- 0:c4844dc380b9
Asrf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
brunostgr | 0:c4844dc380b9 | 1 | /* |
brunostgr | 0:c4844dc380b9 | 2 | * Le 16 decembre 2019 |
brunostgr | 0:c4844dc380b9 | 3 | * Bruno St-Georges et Nicolas Brochu |
brunostgr | 0:c4844dc380b9 | 4 | * Instrumentation en systemes ordines |
brunostgr | 0:c4844dc380b9 | 5 | * |
brunostgr | 0:c4844dc380b9 | 6 | * Laboratoire 8 - Capteur ultrasonique |
brunostgr | 0:c4844dc380b9 | 7 | * Ce programme permet de mesurer une distance (mm) ou une vitesse (mm/s) a l'aide d'un capteur ultrasonique. |
brunostgr | 0:c4844dc380b9 | 8 | * Un bouton-poussoir permet de changer le mode de fonctionnement (correction d'erreur) selon la table suivante: |
brunostgr | 0:c4844dc380b9 | 9 | * - Mode 0: Correction par plafonnement |
brunostgr | 0:c4844dc380b9 | 10 | * - Mode 1: Correction par omission des donnees erronees |
brunostgr | 0:c4844dc380b9 | 11 | * - Mode 2: Correction par extrapolation |
brunostgr | 0:c4844dc380b9 | 12 | * - Mode 3: Affichage de la vitesse |
brunostgr | 0:c4844dc380b9 | 13 | * |
brunostgr | 0:c4844dc380b9 | 14 | * LPC1768 |
brunostgr | 0:c4844dc380b9 | 15 | * Connexions externes: |
brunostgr | 0:c4844dc380b9 | 16 | * Broche 21 - Bouton-poussoir |
brunostgr | 0:c4844dc380b9 | 17 | * |
brunostgr | 0:c4844dc380b9 | 18 | */ |
brunostgr | 0:c4844dc380b9 | 19 | |
brunostgr | 0:c4844dc380b9 | 20 | // Librairies |
brunostgr | 0:c4844dc380b9 | 21 | #include "mbed.h" |
brunostgr | 0:c4844dc380b9 | 22 | #include "ultrasonic.h" |
brunostgr | 0:c4844dc380b9 | 23 | |
brunostgr | 0:c4844dc380b9 | 24 | // Bornes statiques du capteur |
brunostgr | 0:c4844dc380b9 | 25 | #define I_MIN_RANGE 20 // en mm; Integer |
brunostgr | 0:c4844dc380b9 | 26 | #define I_MAX_RANGE 4000 // en mm; Integer |
brunostgr | 0:c4844dc380b9 | 27 | |
brunostgr | 0:c4844dc380b9 | 28 | // Variables |
brunostgr | 0:c4844dc380b9 | 29 | uint8_t uiMODECORRECTION = 0; |
brunostgr | 0:c4844dc380b9 | 30 | int iData[5] = {0, 0, 0, 0, 0}; |
brunostgr | 0:c4844dc380b9 | 31 | int iI = 0; |
brunostgr | 0:c4844dc380b9 | 32 | int iDISTANCE1, iDISTANCE2, iVITESSE; |
brunostgr | 0:c4844dc380b9 | 33 | |
brunostgr | 0:c4844dc380b9 | 34 | // Bouton-poussoir |
brunostgr | 0:c4844dc380b9 | 35 | DigitalIn bouton(p21); |
brunostgr | 0:c4844dc380b9 | 36 | |
brunostgr | 0:c4844dc380b9 | 37 | // Fonctions periodiques |
brunostgr | 0:c4844dc380b9 | 38 | Timer t; |
brunostgr | 0:c4844dc380b9 | 39 | Ticker flipper; |
brunostgr | 0:c4844dc380b9 | 40 | void dist(int iDistance) |
brunostgr | 0:c4844dc380b9 | 41 | { |
brunostgr | 0:c4844dc380b9 | 42 | if(uiMODECORRECTION == 0){ // Plafonnement |
brunostgr | 0:c4844dc380b9 | 43 | if(iDistance < I_MIN_RANGE){ |
brunostgr | 0:c4844dc380b9 | 44 | iDistance = I_MIN_RANGE; // Remplacement par valeur minimale |
brunostgr | 0:c4844dc380b9 | 45 | }else if(iDistance > I_MAX_RANGE){ |
brunostgr | 0:c4844dc380b9 | 46 | iDistance = I_MAX_RANGE; // Remplacement par valeur maximale |
brunostgr | 0:c4844dc380b9 | 47 | } |
brunostgr | 0:c4844dc380b9 | 48 | printf("Distance %d mm\r\n", iDistance); |
brunostgr | 0:c4844dc380b9 | 49 | }else if(uiMODECORRECTION == 1){ // Omission des valeurs erronees |
brunostgr | 0:c4844dc380b9 | 50 | if(!(iDistance < I_MIN_RANGE || iDistance > I_MAX_RANGE)){ // Ignore les valeurs à l'extérieur de la plage |
brunostgr | 0:c4844dc380b9 | 51 | printf("Distance %d mm\r\n", iDistance); |
brunostgr | 0:c4844dc380b9 | 52 | } |
brunostgr | 0:c4844dc380b9 | 53 | }else if(uiMODECORRECTION == 2){ // Extrapolation |
brunostgr | 0:c4844dc380b9 | 54 | iData[4] = iData[3]; // FIFO pour calcul de variation moyenne |
brunostgr | 0:c4844dc380b9 | 55 | iData[3] = iData[2]; |
brunostgr | 0:c4844dc380b9 | 56 | iData[2] = iData[1]; |
brunostgr | 0:c4844dc380b9 | 57 | iData[1] = iData[0]; |
brunostgr | 0:c4844dc380b9 | 58 | iData[0] = iDistance; // Assignation de la valeur presente |
brunostgr | 0:c4844dc380b9 | 59 | int iVariationMoyenne = ((iData[1] - iData[2]) + (iData[2] - iData[3]) + (iData[3] - iData[4])) / 3; |
brunostgr | 0:c4844dc380b9 | 60 | if(!(iDistance < I_MIN_RANGE || iDistance > I_MAX_RANGE)){ // Valeurs à l'intérieur de la plage |
brunostgr | 0:c4844dc380b9 | 61 | printf("Distance %d mm\r\n", iDistance); |
brunostgr | 0:c4844dc380b9 | 62 | } else { |
brunostgr | 0:c4844dc380b9 | 63 | iData[0] = iData[1] + iVariationMoyenne; // Ajoute la variation moyenne a la derniere valeur valide |
brunostgr | 0:c4844dc380b9 | 64 | printf("Distance %d mm\r\n", iData[0]); |
brunostgr | 0:c4844dc380b9 | 65 | } |
brunostgr | 0:c4844dc380b9 | 66 | } |
brunostgr | 0:c4844dc380b9 | 67 | } |
brunostgr | 0:c4844dc380b9 | 68 | |
brunostgr | 0:c4844dc380b9 | 69 | // Objet capteur ultrasonique |
brunostgr | 0:c4844dc380b9 | 70 | ultrasonic sonar(p17, p18, .1, 1, &dist); // trig, echo, update speed, timeout, fonction a appeler |
brunostgr | 0:c4844dc380b9 | 71 | |
brunostgr | 0:c4844dc380b9 | 72 | // Fonction de vitesse |
brunostgr | 0:c4844dc380b9 | 73 | void check(void){ |
brunostgr | 0:c4844dc380b9 | 74 | if(uiMODECORRECTION == 3){ |
brunostgr | 0:c4844dc380b9 | 75 | if(iI == 0){ |
brunostgr | 0:c4844dc380b9 | 76 | iDISTANCE1 = sonar.getCurrentDistance(); |
brunostgr | 0:c4844dc380b9 | 77 | iI++; |
brunostgr | 0:c4844dc380b9 | 78 | } |
brunostgr | 0:c4844dc380b9 | 79 | else if(iI == 1){ |
brunostgr | 0:c4844dc380b9 | 80 | iDISTANCE2 = sonar.getCurrentDistance(); |
brunostgr | 0:c4844dc380b9 | 81 | iI++; |
brunostgr | 0:c4844dc380b9 | 82 | } |
brunostgr | 0:c4844dc380b9 | 83 | else{ |
brunostgr | 0:c4844dc380b9 | 84 | iI = 0; |
brunostgr | 0:c4844dc380b9 | 85 | iVITESSE = abs(iDISTANCE2 - iDISTANCE1) * 10; // Vitesse en mm/s |
brunostgr | 0:c4844dc380b9 | 86 | printf("\n\rVitesse: %i mm/s",iVITESSE); |
brunostgr | 0:c4844dc380b9 | 87 | } |
brunostgr | 0:c4844dc380b9 | 88 | } |
brunostgr | 0:c4844dc380b9 | 89 | } |
brunostgr | 0:c4844dc380b9 | 90 | |
brunostgr | 0:c4844dc380b9 | 91 | // Programme principal |
brunostgr | 0:c4844dc380b9 | 92 | int main(){ |
brunostgr | 0:c4844dc380b9 | 93 | flipper.attach(&check, 0.2); |
brunostgr | 0:c4844dc380b9 | 94 | sonar.startUpdates(); // Active le capteur |
brunostgr | 0:c4844dc380b9 | 95 | while(1) |
brunostgr | 0:c4844dc380b9 | 96 | { |
brunostgr | 0:c4844dc380b9 | 97 | sonar.checkDistance(); // Mesure de la distance |
brunostgr | 0:c4844dc380b9 | 98 | if(bouton == 0){ // Choix du mode de fonctionnement |
brunostgr | 0:c4844dc380b9 | 99 | uiMODECORRECTION++; |
brunostgr | 0:c4844dc380b9 | 100 | if(uiMODECORRECTION == 4){ |
brunostgr | 0:c4844dc380b9 | 101 | uiMODECORRECTION = 0; |
brunostgr | 0:c4844dc380b9 | 102 | } |
brunostgr | 0:c4844dc380b9 | 103 | printf("\n\rMode de correction: %u\n\r",uiMODECORRECTION); |
brunostgr | 0:c4844dc380b9 | 104 | while(bouton == 0); |
brunostgr | 0:c4844dc380b9 | 105 | wait_ms(25); |
brunostgr | 0:c4844dc380b9 | 106 | } |
brunostgr | 0:c4844dc380b9 | 107 | wait_ms(60); // Debounce |
brunostgr | 0:c4844dc380b9 | 108 | } |
brunostgr | 0:c4844dc380b9 | 109 | } |