Test des capteurs Ultrason

Publié le par Alain CROSET

Pour l'autonomie de GreenRbot lors d'une tonte, je vais installer les capteurs IR Sharp sur le côté gauche pour le contournement des obstacles. Pour la détection frontale, je me suis procuré 2 capteus ultrason miniature (que j'essaie de faire fonctionner depuis plusieurs semaines maintenant), voilà qui est fait.

Je vous livre ici le petit programme qui m'a permis de tester le fonctionnement des 2 capteurs. Les capteurs sont des MSU10 de chez Lextronic, à lecture par bus I2C. Tous les 2 capteurs étant livrés avec la même adresse E0, il faut modifier l'adresse du 2ème capteur.  Pour le test, aussi bien que pour la modification d'adresse, j'ai utilisé la carte CPU de GreenRbot. Je vous livre les 2 programmess :

 Changement de l'adresse de base E0 en F0 :


#include <16f877.h>
#fuses HS,NOPROTECT,NOWDT,BROWNOUT,PUT,NOLVP
#ORG 0x1F00,0x1FFF {} /* Reserve memory for bootloader for the 8k 16F876/7 */
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use i2c (master, sda=PIN_C4, scl=PIN_C3)
 
main()
{
  i2c_start();                    //initate start condition
  i2c_write(0xE0);                //device address
  i2c_write(0x00);                //register address
  i2c_write(0xA0);                //1rst seq to change adress
  i2c_start();                    //initate start condition
  i2c_write(0xE0);                //device address
  i2c_write(0x00);                //register address
  i2c_write(0xAA);                //2nd seq to change adress
  i2c_start();                    //initate start condition
  i2c_write(0xE0);                //device address
  i2c_write(0x00);                //register address
  i2c_write(0xA5);                //3rd seq to change adress
  i2c_start();                    //initate start condition
  i2c_write(0xE0);                //device address
  i2c_write(0x00);                //register address
  i2c_write(0xF0);                //write new adress
  i2c_stop();
}

Affichage des 2 distances en cm sur le PC :

#include <16f877.h>
#fuses HS,NOPROTECT,NOWDT,BROWNOUT,PUT,NOLVP
#ORG 0x1F00,0x1FFF {} /* Reserve memory for bootloader for the 8k 16F876/7 */
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c (master, sda=PIN_C4, scl=PIN_C3)
 
main()
{
// int i;
int rangeE;
int rangeF;
while(1)
 {
  i2c_start();                    //initate start condition
  i2c_write(0xF0);                //device address
  i2c_write(0x00);                //register address
  i2c_write(0x51);                //set units to centimeters
  i2c_stop();
  delay_ms(105);                   //wait for returning ping
 
  i2c_start();                    //initiate a new start condition
  i2c_write(0xF0);                //device address
  i2c_write(0x02);                //address of high byte register
  i2c_start();
  i2c_write(0xF1);                //device address but read
 
  rangeF = i2c_read(1);         //read first byte and shift left
  rangeF = rangeF << 8;
  rangeF += i2c_read(1);           //read second byte and add to 1st
  rangeF += i2c_read(0);
  i2c_stop();
 
//  printf("range F0 in centimeters = %3unr", rangeF);
  delay_ms(1000);

  i2c_start();                    //initate start condition
  i2c_write(0xE0);                //device address
  i2c_write(0x00);                //register address
  i2c_write(0x51);                //set units to centimeters
  i2c_stop();
  delay_ms(105);                   //wait for returning ping
 
  i2c_start();                    //initiate a new start condition
  i2c_write(0xE0);                //device address
  i2c_write(0x02);                //address of high byte register
  i2c_start();
  i2c_write(0xE1);                //device address but read

  rangeE = i2c_read(1);         //read first byte and shift left
  rangeE = rangeE << 8;
  rangeE += i2c_read(1);           //read second byte and add to 1st
  rangeE += i2c_read(0);
  i2c_stop();
 
  printf("range E0 in centimeters = %3unr", rangeE); 
  printf("range F0 in centimeters = %3unr", rangeF); 
  printf(" nr");
  delay_ms(1000);
 }
}

Reste à incorporer la lecture des capteurs droite et gauhe au module de détetion d'obstacle. Comment gérer la lecture suffisament rapidement pour l'utiliser en tant qu'interruption de trajectoire ... suspens, c'est une autre histoire, mais j'attendrai pour cela que la température de mon garage remonte au dessus des qques degrés à peine positifs du moment.

Publicité

Publié dans Logiciel

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
A
<br /> <br /> Merci de tes conseils je cherche tout de suite sur cette piste, j'ai modifié un peu ton programme pour qu'il convienne à mon usage, pourrais-tu me dire ce que tu en penses et quelles erreurs j'ai<br /> fait?<br /> <br /> <br />   {<br /> long range;<br /> while()<br />  {<br />   i2c_start();                    //initate start condition<br />   i2c_write(0xE0);                //device address<br />   i2c_write(0x00);                //register address<br />   i2c_write(0x51);                //set units to centimeters<br />   i2c_stop();<br />  <br />   delay_ms(100);                   //wait for returning ping<br />  <br />   i2c_start();                    //initiate a new start condition<br />   i2c_write(0xE0);                //device address<br />   i2c_write(0x02);                //address of high byte register<br />   i2c_start();<br />   i2c_write(0xE1);                //device address but read<br /> <br /> <br />   range = i2c_read(1);         //read first byte and shift left<br />   range = range
Répondre
A
<br /> <br /> Je ne comprends pas ton programme, quelles sont les adresses de tes capteurs ??<br /> <br /> <br /> Il n'y a pas d'adresse GX dans les MSU10, le choix d'adresse est limité aux adresses suivantes :<br /> <br /> <br /> The default shipped address of the SRF10 is 0xE0. It can be changed by the user to any of 16 addresses E0, E2, E4, E6, E8, EA, EC, EE, F0, F2, F4, F6, F8, FA, FC or FE, therefore up to 16 sonar's<br /> can be used.<br /> <br /> <br /> Ci-dessous un exemple qui fonctionne avec 2 capteurs aux adresses E2 et E4, et un délai de boucle total de 50+50+10 ms<br /> <br /> <br /> Bonne chance<br /> <br /> <br />  <br /> <br /> <br /> <br />
A
<br /> <br /> C'est exactement ça, l'idée est de récupéré ensuite les valeurs de mesure pour les exporter dans un logiciel de calcul et déterminer la position de la boule.<br /> <br /> <br /> J'ai déjà parcouru cette liste mais il me semble que tous ces programmes sont pour des chips, j'avais regardé, c'est vraiment pas évident, mais sinon je me demandais, ce ne serait pas possible<br /> d'émuler un pic par exemple sur PC pour faire les mesures, comme si on testait le programme? puis ensuite de récupéré les valeurs des mesures dans les registres? qu'en penses tu?<br /> <br /> <br /> Merci<br /> <br /> <br />  <br /> <br /> <br /> PS: chez moi CCS ne veut pas démarrer car il me dit qu'il ne trouve pas les drivers il me propose de réinstaller les drivers usb ccs, j'ai réinstallé le programme ne trouvant pas précisément ces<br /> drivers mais ça ne fonctionne toujours pas mais je pense que mon prog founi avec mon interface est assez proche.<br /> <br /> <br /> <br />
Répondre
A
<br /> <br /> Je pense qu'il n'y a pas d'intéret à émuler un PIC ou autre chip sur un PC pour récupérer tes mesures. Ce qu'il te faut, c'est rédiger un programme éxécutable sur ton PC, par exemple en Visual<br /> Basic ou tout autre langage permettant de gérer des fenètres windows.<br /> <br /> <br /> Pour ce que tu écris avec ccs, il faut forcément que tu compiles vers une cible, et sans chip ça doit être "le PC" mais je ne sais pas si CCS le permet.<br /> <br /> <br /> Personnellement je ne connais pas Visual Basic, pour t'aider dans ce domaine, tu peux essayer les forums de développeurs informatiques. Et ensuite importer les commandes C que tu trouves sur mon<br /> blog pour la lecture des capteurs I2C.<br /> <br /> <br /> <br />
A
<br /> <br /> En fait c'est bien là le problème je pense, je ne trouve pas de programme pour le programmer justement. Ma démarche a été d'essayer de les programmer avec le programme fourni par mon<br /> interface avec ccs en utilisant les commandes hexa données dans la notice mais sans succès<br /> <br /> <br /> Comment fais-tu pour programmer? Quel logiciel utilises-tu?<br /> <br /> <br /> J'ai vu qu'il fallait attendre avant de lire le registre, c'est le temps que le signal revienne c'est ça? et donc si on a une mesure courte on peut le réduire non? dans la notice ils conseillent<br /> 65ms mais si j'arrive jusqu'à pouvoir le modifier je suivrais tes conseiles des 100ms ça permettra de réduire les erreurs<br /> <br /> <br /> Merci<br /> <br /> <br /> <br />
Répondre
A
<br /> <br /> Si j'ai bien compris, tu as l'intention d'utiliser tes capteurs directement depuis un PC.<br /> <br /> <br /> Pour cela, il faudrait que tu puisse créer un exécutable sur ton PC qui pilote ton port USB et donc tes capteurs. Je n'ai pas d'information à ce sujet.<br /> <br /> <br /> Personnellement, mes capteurs sont branchés sur le port I2C d'un micro-controleur PIC16F877. C'est donc dans ce composant que je charge un programme rédigé en C et ensuite compilé. Pour modifier<br /> la programmation des capteurs, je passe par des petits programmes que je charge temporairement dans le PIC.<br /> <br /> <br /> j'utilise ccs comme compilateur pour programmer le PIC.<br /> <br /> <br /> Tu peux trouver tout un tas d'exemples de programmes pour les capteurs à l'adresse :<br /> <br /> <br /> http://www.robot-electronics.co.uk/acatalog/examples.html<br /> <br /> <br /> <br />
A
<br /> <br /> Bonjour, excuse moi de ne répondre que maintenant je n'ai pas pu y accéder avant.<br /> <br /> <br /> Je me suis trompé, mes capteurs sont des MSU10 ou SRF10 qui sont donc en I2C me semble-t-il que j'ai connecté au PC à l'aide de l'interface USB-I2C fournie sur Lextronic<br /> <br /> <br /> J'arrive à faire des mesures de distance à l'aide du p'tit prog': USB_I2C_SRF08.exe (il a pas l'air d'exister pour le srf10 mais il marche)<br /> <br /> <br /> Mais ensuite j'ai essayer de le programmer avec "USB-I2C Interface" qu'ils proposent sur lextronic mais ça ne fontionne pas et ccs ne reconnait même pas mes capteurs même après réinstalation des<br /> drivers. j'y arrive pas je comprends pas...<br /> <br /> <br /> Ton aide me serais vraiment d'un grand secours<br /> <br /> <br /> Merci bonne soirée<br /> <br /> <br /> <br />
Répondre
A
<br /> <br /> Bonjour,<br /> <br /> <br /> Je veux bien t'aider, mais il va falloir m'en dire un peu plus :<br /> <br /> <br /> - peux-tu joindre à ton com le petit programme que tu as fait pour programmer tes capteurs ?<br /> <br /> <br /> - par quel programme essaies-tu de les lire après reprogrammation ?<br /> <br /> <br /> - sais-tu qu'il faut laisser un temps entre la demande de lecture que tu envoies aux capteurs et la lecture du registre lui-même. Ca marche bien avec 100ms, ce qui implique que tu dois être bien<br /> synchronisé avec ta fréquence de transmission (quelle vitesse sur ton USB-I2C ?<br /> <br /> <br /> <br />
A
<br /> <br /> Bonjour, j'ai acheté les capteurs I2C et l'interface USB mais je n'arrive pas à trouver de programme pour "piloter" et tester mes capteurs srf 08 sur PC, le but est de réalisé une triangulation à<br /> l'aide de trois capteurs, avez-vous une idée de programme?<br /> <br /> <br /> Merci beaucoup<br /> <br /> <br /> PS: Superbe réalisation pour la tondeuse<br /> <br /> <br /> <br />
Répondre
A
<br /> <br /> Tes capteurs srf08 sortent en I2C ou en PWM ?<br /> <br /> <br /> C'est quoi ton interface USB ?? USB-I2C ?? autre ?<br /> <br /> <br /> <br />