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.

Capteur suiveur de ligne: connaitre les adresses I2C
Débuté par PPPJ, mai 03 2011 12:48
8 réponses à ce sujet
#2
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
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
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:
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:

#4
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 :
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é.
#7
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.
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.
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.
Répondre à ce sujet

1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users