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.

Publié dans Logiciel

Commenter cet article

Alan 25/04/2010 20:29



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
fait?


  {
long range;
while()
 {
  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(100);                   //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


  range = i2c_read(1);         //read first byte and shift left
  range = range

Alain CROSET 27/04/2010 22:33



Je ne comprends pas ton programme, quelles sont les adresses de tes capteurs ??


Il n'y a pas d'adresse GX dans les MSU10, le choix d'adresse est limité aux adresses suivantes :


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
can be used.


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


Bonne chance


 



Alan 25/04/2010 13:04



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.


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
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?


Merci


 


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
drivers mais ça ne fonctionne toujours pas mais je pense que mon prog founi avec mon interface est assez proche.



Alain CROSET 25/04/2010 19:56



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
Basic ou tout autre langage permettant de gérer des fenètres windows.


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.


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
blog pour la lecture des capteurs I2C.



Alan 24/04/2010 10:06



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
interface avec ccs en utilisant les commandes hexa données dans la notice mais sans succès


Comment fais-tu pour programmer? Quel logiciel utilises-tu?


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
65ms mais si j'arrive jusqu'à pouvoir le modifier je suivrais tes conseiles des 100ms ça permettra de réduire les erreurs


Merci



Alain CROSET 24/04/2010 19:31



Si j'ai bien compris, tu as l'intention d'utiliser tes capteurs directement depuis un PC.


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.


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
la programmation des capteurs, je passe par des petits programmes que je charge temporairement dans le PIC.


j'utilise ccs comme compilateur pour programmer le PIC.


Tu peux trouver tout un tas d'exemples de programmes pour les capteurs à l'adresse :


http://www.robot-electronics.co.uk/acatalog/examples.html



Alan 23/04/2010 23:32



Bonjour, excuse moi de ne répondre que maintenant je n'ai pas pu y accéder avant.


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


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)


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
drivers. j'y arrive pas je comprends pas...


Ton aide me serais vraiment d'un grand secours


Merci bonne soirée



Alain CROSET 24/04/2010 09:29



Bonjour,


Je veux bien t'aider, mais il va falloir m'en dire un peu plus :


- peux-tu joindre à ton com le petit programme que tu as fait pour programmer tes capteurs ?


- par quel programme essaies-tu de les lire après reprogrammation ?


- 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
synchronisé avec ta fréquence de transmission (quelle vitesse sur ton USB-I2C ?



Alan 31/03/2010 10:03



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 à
l'aide de trois capteurs, avez-vous une idée de programme?


Merci beaucoup


PS: Superbe réalisation pour la tondeuse



Alain CROSET 01/04/2010 13:01



Tes capteurs srf08 sortent en I2C ou en PWM ?


C'est quoi ton interface USB ?? USB-I2C ?? autre ?