Dimanche 16 décembre 2007 7 16 /12 /Déc /2007 14:46

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.

Par Alain CROSET - Publié dans : Logiciel
Ecrire un commentaire - Voir les 10 commentaires
Retour à l'accueil

Commentaires

Bonjour, j'essai de faire fonctionner ce module mais il me renvoit toujours la meme valeur, je me demande si j'aurais pas intervertis l'emetteur avec le recepteur? J'ai finalement desoudé et je me suis rendu compte que sur un des transducteur il y a t et sur l'autre r . Une idée?
Commentaire n°1 posté par cyril le 18/01/2010 à 22h09
Bonjour,
T comme transmit = émission, R comme receive.
Je me souviens avoir un peu de mal au début de l'utilisation des capteurs sur bus I2C. Il ne faut pas oublier les temps d'attente entre le tip de commande et la lecture.
Je vais ajouter à mon article quelques éléments d'aide.
Réponse de Alain CROSET le 19/01/2010 à 20h56
Il me semble que le module etait fournit sans les transducteurs montées. Je les ai soudèes sans réflechir, de quel coté doit etre le recepteur?

Mon module semble recevoir les commandes puisque la led s'allume mais je ne reçoit pas de signal électrique sur l'une ou l'autre des pins 41 khertz comme je devrais. Je vais tester de nouveau mais quelques infos m'avancerait.
Commentaire n°2 posté par cyril le 19/01/2010 à 22h16
Aie ... là je ne vais pas pouvoir faire grand-chose pour toi. J'ai acheté mes capteurs chez Lextronic qui les fournit tout montés.
Pour info, en fonctionnement la led ne doit s'allumer que lors d'une detection. De plus, à la mise sous tension, la led s'allume une seconde, puis clignote en fonction de son adresse programmée.
Quelques infos sur le fonctionnement des capteurs LExtronnic : http://www.lextronic.fr/~lextronic_doc/Applications_A.pdf
Bonne chance.
Réponse de Alain CROSET le 20/01/2010 à 13h05
Je viens de reperer, le transmetteur est du meme coté que la led. A priori j'ai bousillé une patte en dessoudant. Domage

Moi aussi j'ai acheté chez lextronic
Commentaire n°3 posté par cyril le 20/01/2010 à 21h53
Bonne chance pour la prochaine fois
Réponse de Alain CROSET le 29/01/2010 à 22h32
J'ai un module msu10 tout neuf et déja monté de chez lextronic, même problème avec ton programme, la seule modification que j'ai fait c'est la frequence qui passe de 20 mhz a 16mhz.
 
Commentaire n°4 posté par cyril le 16/02/2010 à 01h50
Es-tu sûr que ta fréquence est la même dans ton bootloader, dans ton programme et dans ton quartz. Une différnce sur l'un des 3 et c'est la Cata.
Déjà, en dehors de ton capteur, est-ce que tu arrives à recevoir les infos par la RS232 ??
Réponse de Alain CROSET le 19/02/2010 à 07h50
Finnallement ça fonctionne, je connais pas la raison du problème.

Merci et  @+
Commentaire n°5 posté par cyril le 19/02/2010 à 16h32

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

Commentaire n°6 posté par Alan le 31/03/2010 à 10h03

Tes capteurs srf08 sortent en I2C ou en PWM ?

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

Réponse de Alain CROSET le 01/04/2010 à 13h01

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

Commentaire n°7 posté par Alan le 23/04/2010 à 23h32

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 ?

Réponse de Alain CROSET le 24/04/2010 à 09h29

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

Commentaire n°8 posté par Alan le 24/04/2010 à 10h06

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

Réponse de Alain CROSET le 24/04/2010 à 19h31

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.

Commentaire n°9 posté par Alan le 25/04/2010 à 13h04

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.

Réponse de Alain CROSET le 25/04/2010 à 19h56

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 << 8;
  range += i2c_read(0);
  i2c_stop();
  printf("range in centimeters = %4lunr", range);
    printf(" nr");
  delay_ms(5);
 }

 

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(100);                   //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

  range = i2c_read(1);         //read first byte and shift left
  range = range << 8;
  range += i2c_read(0);
  i2c_stop();
  printf("range in centimeters = %4lunr", range);
    printf(" nr");
  delay_ms(5);
 }

while(1)
 {
  i2c_start();                    //initate start condition
  i2c_write(0xG0);                //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(0xEG0);                //device address
  i2c_write(0x02);                //address of high byte register
  i2c_start();
  i2c_write(0xG1);                //device address but read

  range = i2c_read(1);         //read first byte and shift left
  range = range << 8;
  range += i2c_read(0);
  i2c_stop();
  printf("range in centimeters = %4lunr", range);
    printf(" nr");
  delay_ms(10372);
 }
}

 

les 10372ms correspondent à période de mon pendule si on ajoute les autres temps d'attente.

J'ai modifié le temps d'attente entre deux mesure à 5ms, car il me semble que l'onde s'est dissipée depuis le dernier echo vu qu'il a été envoyé deja 100ms avant et donc je respecte les 65ms conseillées entre 2 mesures, penses-tu que je puisse faire ça?

Merci beaucoup

Commentaire n°10 posté par Alan le 25/04/2010 à 20h29

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

 

Réponse de Alain CROSET le 27/04/2010 à 22h33

Présentation

Images aléatoires

  • dscn0491.jpg
  • p8120698.jpg
  • chassis1.jpg
  • PontsHetCPU.jpg
  • dscn0482.jpg
  • dscn0478.jpg

Recommander

Recherche

W3C

  • Flux RSS des articles

Widget Viadeo

Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus