Bonjour,
Après avoir réussi à afficher un texte sur un afficheur lcd grâce à vous, je vous sollicite une nouvel fois car je voudrais cette fois ci afficher la distance entre le capteur et un obstacle.
J'ai commencé par rechercher sur le net comment fonctionne le capteur et je suis tombé sur ceci : http://www.micropik.com/PDF/HCSR04.pdf
D'après ce que j'ai compris il faut envoyer une impulsion de 10 microseconde dans le Triger du capteur puis il renvoie un signal haut d'une durée proportionnelle à la distance par la broche Echo.
La formule est : distance=((temps de l’état haut du signal reçu)*(la vitesse du son dans l'air soit 340 mètres par seconde))/2
Vu que la vitesse est en mètre par seconde je pense que la durée du signal haut envoyé par la capteur doit être en mètres par secondes aussi.
Donc j'ai commencé à faire mon programme sur mikroC dont voici le code :
/*
* Project name:
Test du HC-SR04
* Test configuration:
MCU: PIC16F877A
Oscillator: HS, 12.0000 MHz
Ext. Modules: Character LCD 2x16
HC-SR04
SW: mikroC PRO for PIC
*/
// LCD connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB6_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD connections
char txt1[] = "Test du capteur";
char txt2[] = "HC-SR04";
char txt3[] = "Distance :";
char txt4[5];
float distance = 0;
int tempo1 = 0;
int tempo2 = 0;
bit oldstate;
void main(){
TRISB0_bit = 1; // Config RB0 entree
TRISA = 0x00; // Config RA sortie
PORTA = 0x00;
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd(_LCD_CLEAR); // Effacer le LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Desactivation du curseur
Lcd_Out(1,2,txt1); // Ecrire text 1
Lcd_Out(2,6,txt2); // Ecrire text 2
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); // Effacer le LCD
affichage:
floatToStr(distance,txt4);
Delay_ms(60);
Lcd_Cmd(_LCD_CLEAR); // Effacer le LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Desactivation du curseur
Lcd_Out(1,2,txt3); // Ecrire text 1
Lcd_Out(1,14,txt4); // Afficher distance
PORTA = 0x01; //Broche RA0 a 1
Delay_us(10); //Attente 10 microsecondes
PORTA = 0x00; //Broche RA0 a 1
do {
if (Button(&PORTB, 0, 0, 1)) { //Si reception signal
oldstate = 1; //Mise a jour du statut du signal
tempo1++; //Inctrémante de 1 a chaque boucle
Delay_us(1); //on attend 1 uS pour tempo1 soit en uS
}
if (oldstate && Button(&PORTB, 0, 0, 0)) { //Si signal passe de 1 a 0
oldstate = 0; //Mise a jour du statut du signal
tempo2 = tempo1; //tempo2 devient egal a tempo1
tempo1 = 0; //on met tempo1 a 0
break; //on sort de la boucle
}
} while(1);
tempo2 = (tempo2/1000000); //conversion microsecondes en secondes
distance = (tempo2*340)/2; //calcul de la distance
goto affichage;
}
Le problème est que la valeur affichée sur le lcd est toujours égale à 0, j'ai aussi essayé en remplaçant :
tempo2 = (tempo2/1000000); //conversion microsecondes en secondes
distance = (tempo2*340)/2; //calcul de la distance
par :
distance = tempo2/58; //calcul de la distance
et j’obtiens bien une valeur proportionnelle a la distance mais très imprécise : j'ai 0 pour 0~40 cm 1 pour 40~80cm 3 pour 80~120cm et après 4.
Le pic envoi bien l'impulsion de 10 microseconde avec ce programme et j'ai visualiser le signal de sortie a l'oscilloscope et j'obtiens un signal haut de 4 ms sur la broche Echo pour une distance d'environ 65 cm
je pense que c'est ma boucle qui n'est pas correct mais je ne vois pas comment faire pour mesurer avec le plus de précision possible de temps de l'état haut à la broche RB0
Si quelqu'un a déjà utilisé ce genre de capteur, une idée, une suggestion ou a remarquer un bugg dans le programme n'hésitez pas a répondre.
Merci d'avance
-----