Vous êtes sur la page 1sur 3

TD6 : Liaison I2C

L'adresse d'un composant i2c étant codée sur 7 bits, quel est le nombre d'adresses au total : 128
adresses.
Remarque : certaines adresses sont réservées et non utilisables pour les périphériques.

Trouvez les adresses des targets en utilisant le programme suivant : 0x09 et 0x1A.
Remarque :
- Les valeurs s'affichent dans le moniteur série.
- Il n'est pas nécessaire de comprendre le programme, ça viendra plus tard.

#include <Wire.h>

void setup()
{
Wire.begin();

Serial.begin(9600);
while (!Serial); // Leonardo : wait for serial monitor
Serial.println("\nI2C Scanner");
}

void loop()
{
byte error, address;
int nDevices;

Serial.println("Scanning...");

nDevices = 0;
for(address = 1; address < 127; address ++ )
{
// The i2c_scanner uses the return value of
// The Write.endTransmisstion to see if
// A device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");

nDevices++;
}
else if (error == 4)
{
Serial.print("Unknown error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");

delay(5000); // Wait 5 seconds for next scan


}

Modifier le programme pour envoyer la donnée à la carte Arduino sur laquelle sont branchées les LEDs,
et faire en sorte que la LED allumées changent toutes les 200 ms par exemple.
#include <Wire.h>
const uint8_t slaveAdress = 0x09; // Ou 4 ou 0b100 !
uint8_t value = 0b10101010;
;

void setup()
{
Wire.begin(); // Join i2c bus (address optional for master)
}

void loop()
{
value = ~ value;
Wire.beginTransmission(slaveAdress); // Transmit to device #4
Wire.write(value); // Sends one byte
Wire.endTransmission(); // Stop transmitting

delay(200);
}

Modifier le programme pour obtenir de la carte Arduino sur laquelle est branchée le potentiomètre la
"valeur" de celui-ci toutes les 200 ms.
#include <Wire.h>
const uint8_t slaveAdress = 0x1A; // Ou 4 ou 0b100 !
uint8_t value;

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

void loop() {
Wire.requestFrom(slaveAdress, 1); // Request 1 bytes(octet) from peripheral device @4

while (Wire.available()) { // Peripheral may send less than requested


value = Wire.read(); // Receive a byte as character
Serial.println(value); // Print the character
}
delay(200);
}

Réunissez vos deux programmes pour faire en sorte que le potentiomètre serve à changer le nombre
de LEDs allumées.
Remarque : on ne changera pas le programme des targets.

#include <Wire.h>
const uint8_t slaveAdress = 0x1A; // Ou 4 ou 0b100 !
const uint8_t slaveAdress2 = 0x09; // Ou 4 ou 0b100 !
uint8_t value;

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

void loop() {
Wire.requestFrom(slaveAdress, 1); // Request 1 bytes(octet) from peripheral device @4

while (Wire.available()) { // Peripheral may send less than requested


value = Wire.read(); // Receive a byte as character
Serial.println(value); // Print the character
}
Wire.beginTransmission(slaveAdress2); // Transmit to device #4
Wire.write(value); // Sends one byte
Wire.endTransmission(); // Stop transmitting
delay(200);
}

Vous aimerez peut-être aussi