Aller au contenu


Photo
- - - - -

Capteur suiveur de ligne: connaitre les adresses I2C


8 réponses à ce sujet

#1 PPPJ

PPPJ

    Nouveau membre

  • Membres
  • 17 messages

Posté 03 mai 2011 - 12:48

Bonjour à tous,



je réalise actuellement un robot qui serait capable entre autre de suivre une ligne noire sur le sol. J'ai pour cela acheter un capteur suiveur de ligne (sur ce site: http://www.roboticsconnection.com/p-67-line-following-sensor.aspx) qui utilise le protocole I2C pour communiquer avec le microcontrolleur (Arduino Uno) mais le problème est que je ne connais pas les adresses des différents capteurs (il y en a 5 en tout). Dans le programme, pour recuperer les données du capteur, il est necessaire de connaitre les adresses correspondant à chaque capteur.

Je ne trouve pas la datasheet du capteur suiveur de ligne malheureusement et c'est surement dessus que je trouverais les informations necessaires.

Si quelqu'un saurait résoudre mon problème ou m'indiquer la datasheet de mon produit, j'en serais ravi!



Il me faudrait, si possible, un exemple de programme utilisé pour ce type de capteur avec le protocole I2C.



Merci d'avance.





#2 Jbot

Jbot

    Membre passionné

  • Membres
  • PipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 03 mai 2011 - 12:54

L'adresse de ton module est écrite sur le lien que tu nous a donné hein...

I2C Reading and Addressing information:

The I2C Line Following sensor comes pre-programmed with a default address of 0x50, however, it can be reprogrammed with a new address, just in case your system requires multiple line following sensors.

To change the address of the Line Following Sensor, it must first be the only device connected to your I2C bus. Then, you can write the following 3 sequence commands 0xA0, 0xAA, 0xA5, in the correct order, followed by the new address. For example to change the Line Following Sensor address from 0x50 (default) to 0x58, issue the following byte sequence to address 0x50: 0xA0, 0xAA, 0xA5, 0x58.

NOTE: No other command may be issued in the middle of the sequence. The sequence consists of 4 separate write transactions on the I2C bus.

The table below shows the possible addressing values, and the corresponding number of LED flashes you'll see when the device powers up.

Decimal Hex LED Flashes
80 50 1
82 52 2
84 54 3
86 56 4
88 58 5
90 5A 6

#3 PPPJ

PPPJ

    Nouveau membre

  • Membres
  • 17 messages

Posté 03 mai 2011 - 01:39

Oui d'accord mais je n'arrive pas à récuperer les données du capteur meme en utilisant les adresses indiquées...

Donc je me demande si j'entre bien les bonnes adresses.



J'ai testé ce code en s'inspirant des exemples trouvés sur le site d'Arduino:






#include



void setup()

{

Wire.begin();

Serial.begin(9600);pinMode(13, OUTPUT);

}



int reading = 0;

int address1 = 80;



void loop()

{

Wire.beginTransmission(address1); // D'après un exemple pris sur internet, il est necessaire de mettre de code mais

Wire.send(0x00); // je n'ai pas compris pourquoi... (eux disent que c'est pour "instruct sensor to read echoes")

Wire.send(address1); // => dire au capteur de lire les echos?! C'est à dire?

Wire.endTransmission();



Wire.requestFrom(address1, 1);

// le code qui suit allumer la DEL 13 de l'Arduino à des vitesses variables

while(Wire.available() == 0)

{

digitalWrite(13, HIGH); // Tant que le capteur ne recoit rien la DEL clignote rapidement

delay(100);

digitalWrite(13, LOW);

delay(100);

}



reading = Wire.receive();



if(reading){

digitalWrite(13, HIGH);

delay(1000); //Si le capteur detecte la ligne noire la DEL clignote lentement

digitalWrite(13, LOW);

delay(1000); }

else{

digitalWrite(13, HIGH);

delay(500); // Si il detecte rien ou un sol blanc, la DEL clignote a une vitesse modérée

digitalWrite(13, LOW);

delay(500); }





delay(500);

}

[/code]



Résultat du test du programme: la DEL clignote rapidement dans tous les cas...

Vos avis?



Au niveau des branchement, nous avons branché la sortie SDA sur Analog 4 et SCL sur Analog 5 en suivant le schéma ci-dessous:Image IPB







#4 Jbot

Jbot

    Membre passionné

  • Membres
  • PipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 03 mai 2011 - 03:10

Premiere chose, quand tu allumes ton chip, regarde combien de fois la LED clignote pour savoir son adresse.

Je ne sais pas trop quel exemple tu es allé chercher, ca m'a l'air plus compliqué que nécessaire.

Moi je dirais plutot un code comme ça :



int address1 = 80;

void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}

void loop()
{
Wire.requestFrom(address1, 1); // request 1 bytes from slave device #X

while(Wire.available()) // slave may send less than requested
{
int c = (int) Wire.receive(); // receive a byte as character
Serial.print©; // print the character
}

delay(500);
}[/code]

Ca écrira sur le port série de l'USB la value lue en I2C.
Aprés il faut que tu regarde ce que ca veut dire avec le tableau de correspondance sur la page que tu nous a linké.

#5 PPPJ

PPPJ

    Nouveau membre

  • Membres
  • 17 messages

Posté 04 mai 2011 - 01:35

J'ai testé ton code et le programme ne rentre jamais dans le while ce qui veut dire qu'arduino ne récupère aucune valeur du capteur.

#6 Jbot

Jbot

    Membre passionné

  • Membres
  • PipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 04 mai 2011 - 01:59

humm, essaies avec :
int address1 = 0xA0;

C'est potentiellement l'adresse qui etait mauvaise.

#7 PPPJ

PPPJ

    Nouveau membre

  • Membres
  • 17 messages

Posté 04 mai 2011 - 02:47

En m'inspirant de http://naneau.nl/2009/01/18/arduino-and-an-i2c-temperature-sensor/
j'ai fait un programme qui balaie toutes les adresses de 50 à 250 en les testant 10x chacune.

#include

int address = 50;
int compteur = 0;

void setup()
{
Wire.begin();
Serial.begin(9600);
}

void loop()
{
Serial.print(" Adress : ");
Serial.print(address);
Serial.print(" Value : ");

int resultat;

Wire.beginTransmission(address);
Wire.send(0x00);
Wire.requestFrom(address, 1);

if (Wire.available())
{
resultat = Wire.receive();
Serial.println(resultat);
}
else
{
Serial.println("---");
}

Wire.endTransmission();

delay(250);

if(compteur > 10)
{
address ++;
compteur = 0;
}
else
{
compteur ++;
}
}[/code]

La seul adresse qui m'affiche quelque chose est l'adresse 168 qui m'affiche des valeurs allant de 96 à 127 c'est à dire de 1100000 à 1111111.
Les 5 derniers chiffres servent donc sans doute à indiquer l'état des capteurs mais je ne sais pas à quoi servent les 2 premiers (d'autant plus que le site du suiveur de ligne indique qu'il devrait se trouver à la fin (0000011) et non au début(1100000)).


Mais le capteur marche donc c'est le principal. Merci de ton aide.

#8 Jbot

Jbot

    Membre passionné

  • Membres
  • PipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 04 mai 2011 - 03:01

Lorsque tu alimente ton chip, il doit donc clignoter 3 fois je suppose.

#9 PPPJ

PPPJ

    Nouveau membre

  • Membres
  • 17 messages

Posté 04 mai 2011 - 03:10

J'ai l'impression qu'il ne clignote qu'une fois puis qu'il reste allumé



Répondre à ce sujet



  


1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users