Partager l'article ! Test des capteurs Ultrason: Pour l'autonomie de GreenRbot lors d'une tonte, je vais installer les capteurs IR Sharp sur le côté gauche po ...
Bienvenue sur le blog de GreenRbot
mon robot tondeuse de 2ème génération.
Ma précédente réalisation, SyLaM, était un robot tondeuse entièrement réalisé à partir de matériel de récupération. Malheureusement, les moteurs, issus des essuie-glaces d'une Toyota Corolla, n'étaient pas assez puissant pour ma pelouse, ou devrais-je dire mon pré.
De plus, le processeur, un PIC 16F84 n'offrait pas la puissance de calcul suffisante à l'algorithme de tonte parallèle que je voulais intégrer.
Vous pourrez voir la description de SyLaM à l'adresse suivante : http://sylam.blogspirit.com/
GreenRbot, offre une motorisation plus puissante, et le processeur central est un classique PIC 16F877.
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.
<div id="viadeoBlog"><script type="text/javascript" src="http://widget.viadeo.com/blogs/afficheblog/index.jsp?w=1&b=0042ccn2t7pqtgd3&u=0041k7tt3hmzav7w"></script></div>
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.
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.
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.
Moi aussi j'ai acheté chez lextronic
Déjà, en dehors de ton capteur, est-ce que tu arrives à recevoir les infos par la RS232 ??
Merci et @+
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
Tes capteurs srf08 sortent en I2C ou en PWM ?
C'est quoi ton interface USB ?? USB-I2C ?? autre ?
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
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 ?
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
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
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.
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.
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
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