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.
Aucun commentaire pour cet article
Commentaires