Dimanche 16 décembre 2007
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.
Commentaires