Aziz Bench

Adresse I²C PCA9685

Le composant PCA9685 (driver PWM / servo 16 canaux, 12 bits) peut répondre sur 0x40–0x77 : voici comment choisir.

Adresse I²C (7 bits)
0x40–0x77
55 adresses possibles
Écriture / lecture (8 bits)
0x80 / 0x81
Binaire
1000000
Adresse partagée avec
60 périphériques
Sa place sur le bus ses adresses réservées
0123456789ABCDEF
00000102030405060708090A0B0C0D0E0F
10101112131415161718191A1B1C1D1E1F
20202122232425262728292A2B2C2D2E2F
30303132333435363738393A3B3C3D3E3F
40404142434445464748494A4B4C4D4E4F
50505152535455565758595A5B5C5D5E5F
60606162636465666768696A6B6C6D6E6F
70707172737475767778797A7B7C7D7E7F

Comment régler l’adresse

Câblez les broches d’adresse ainsi :

A5…A0 → 0x40–0x77 (0x70 = All Call)

À la mise sous tension, il répond aussi à l’adresse All Call 0x70, qui entre en conflit avec un TCA9548A à son adresse par défaut. Désactivez All Call dans MODE1, ou déplacez le multiplexeur.

Périphériques qui utilisent les mêmes adresses

Deux périphériques sur le même bus ne peuvent pas répondre à la même adresse. Ces modules de notre liste utilisent au moins une de ces adresses :

PériphériqueDescriptionAdresse partagée
HDC1080capteur de température et d’humidité0x40
HTU21Dcapteur de température et d’humidité0x40
INA219moniteur de courant, de tension et de puissance0x40–0x4F (16)
INA226moniteur de courant, de tension et de puissance0x40–0x4F (16)
INA260moniteur de courant, de tension et de puissance avec shunt intégré0x40–0x4F (16)
INA3221moniteur de courant et de tension 3 canaux0x40, 0x41, 0x42, 0x43
Si7021capteur de température et d’humidité0x40
OPT3001capteur de lumière ambiante0x44, 0x45, 0x46, 0x47
SHT30 / SHT31 / SHT35capteur de température et d’humidité0x44, 0x45
SHT40 / SHT41 / SHT43 / SHT45 (SHT4x)capteur de température et d’humidité0x44, 0x45, 0x46
Voir les 60 périphériques
PériphériqueDescriptionAdresse partagée
ADS1015ADC 12 bits 4 canaux0x48, 0x49, 0x4A, 0x4B
ADS1115ADC 16 bits 4 canaux0x48, 0x49, 0x4A, 0x4B
ADS7830ADC 8 bits 8 canaux0x48, 0x49, 0x4A, 0x4B
LM75Bcapteur de température numérique / thermostat0x48–0x4F (8)
PCF8591ADC 8 bits 4 canaux + 1 DAC0x48–0x4F (8)
TMP102capteur de température numérique0x48, 0x49, 0x4A, 0x4B
TMP117capteur de température numérique haute précision0x48, 0x49, 0x4A, 0x4B
TSL2561capteur de lumière ambiante (visible et infrarouge)0x49
24LC256 / 24AA256 / 24FC256EEPROM I²C 256 Kbit0x50–0x57 (8)
AT24C32EEPROM I²C 32 Kbit0x50–0x57 (8)
PCF85063Ahorloge temps réel (RTC)0x51
PCF8563horloge temps réel (RTC)0x51
ENS160capteur de qualité de l’air à oxydes métalliques (TVOC/eCO₂/AQI)0x52, 0x53
ADXL345accéléromètre 3 axes0x53
BQ27441-G1jauge de batterie pour une cellule Li-ion0x55
MAX30100oxymètre de pouls et capteur de fréquence cardiaque0x57
MAX30102oxymètre de pouls et capteur de fréquence cardiaque0x57
SGP30capteur de gaz VOC et eCO₂0x58
SGP40capteur de gaz, indice VOC0x59
SGP41capteur de gaz, indices VOC et NOx0x59
CCS811capteur de gaz eCO₂ / TVOC0x5A, 0x5B
MLX90614thermomètre infrarouge sans contact0x5A
MPR121contrôleur tactile capacitif 12 canaux0x5A, 0x5B, 0x5C, 0x5D
BH1750FVI (BH1750)capteur de lumière ambiante0x5C
LPS22HBcapteur de pression barométrique0x5C, 0x5D
GT911contrôleur d’écran tactile capacitif 5 points0x5D
MCP4725DAC 12 bits avec EEPROM0x60–0x67 (8)
MCP4728DAC 12 bits 4 canaux avec EEPROM0x60–0x67 (8)
SCD30module CO₂ NDIR, température et humidité0x61
SCD40 / SCD41capteur de CO₂ photoacoustique, température et humidité0x62
BMI270IMU 6 axes0x68, 0x69
DS1307horloge temps réel (RTC)0x68
DS3231horloge temps réel compensée en température0x68
MPU-6050accéléromètre + gyroscope 6 axes0x68, 0x69
MPU-6886IMU 6 axes0x68, 0x69
MPU-9250IMU 9 axes (accéléromètre, gyroscope, magnétomètre AK8963)0x68, 0x69
PCF8523horloge temps réel (RTC)0x68
SEN50 / SEN54 / SEN55module particules fines, VOC/NOx, température et humidité0x69
HT16K33pilote de matrice LED 16×8 avec scrutation de clavier0x70–0x77 (8)
SHTC3capteur de température et d’humidité0x70
SX1509expandeur d’E/S 16 canaux avec driver de LED et gestion de clavier0x70, 0x71
TCA9548Amultiplexeur I²C 8 canaux0x70–0x77 (8)
IP5306SoC pour batterie externe (chargeur + boost), version I²C0x75
BME280capteur de température, d’humidité et de pression0x76, 0x77
BME680capteur de gaz (VOC), de température, d’humidité et de pression0x76, 0x77
BME688capteur de gaz avec IA, de température, d’humidité et de pression0x76, 0x77
BMP280capteur de pression et de température0x76, 0x77
BMP388capteur de pression et de température0x76, 0x77
MS5611-01BAcapteur de pression barométrique (altimètre)0x76, 0x77
BMP180capteur de pression et de température0x77

Si deux d’entre eux se retrouvent sur la même adresse, changez celle de l’un des deux avec sa broche d’adresse, placez-en un derrière un multiplexeur TCA9548A (0x70–0x77) ou utilisez un second bus I²C : l’ESP32, l’ESP32-S3 et le RP2040 ont deux contrôleurs I²C (l’ESP32-C3 en a un).

Vérifier tout le bus →Ajoutez votre PCA9685 et vos autres modules : l’outil trouve les conflits, propose des adresses libres et dimensionne les pull-up.

Adresse sur 7 bits et sur 8 bits

Les adresses I²C font 7 bits. Certaines datasheets et bibliothèques les écrivent sur 8 bits, avec le bit de lecture/écriture ajouté à droite : c’est pourquoi la même puce peut être indiquée en 0x40 ou en 0x80. La bibliothèque Wire d’Arduino et ESPHome utilisent la forme sur 7 bits.

Ses adresses vont de 0x40 à 0x77 sur 7 bits, soit de 0x80 à 0xEE en adresses d’écriture sur 8 bits.

Vérifier qu’il répond

Reliez votre PCA9685 à SDA et SCL, puis téléversez ce sketch : il teste chaque adresse que la puce peut utiliser et affiche celle qui répond. Sur l’ESP32, les broches par défaut sont GPIO21 (SDA) et GPIO22 (SCL) ; sur l’Arduino Uno, A4 et A5.

#include <Wire.h>

const byte ADDRS[] = {
  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
  0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
};

void setup() {
  Serial.begin(115200);
  Wire.begin();
  for (byte a : ADDRS) {
    Wire.beginTransmission(a);
    if (Wire.endTransmission() == 0) {
      Serial.print("PCA9685 : adresse 0x");
      if (a < 0x10) Serial.print('0');
      Serial.println(a, HEX);
      return;
    }
  }
  Serial.println("Aucune reponse : verifiez le cablage");
}

void loop() {}

Dans ESPHome, le bus est scanné au démarrage (scan: true est la valeur par défaut) : le log liste toutes les adresses qui répondent.

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true

Résistances de pull-up

SDA et SCL ont besoin de résistances de pull-up vers l’alimentation. Beaucoup de modules en ont déjà, souvent de 4,7 kΩ ou 10 kΩ, et avec plusieurs modules sur le bus elles se combinent en parallèle. Le vérificateur d’adresses I²C calcule la plage admise selon la tension et la vitesse de votre bus.

Questions fréquentes

Quelle est l’adresse I2C d’un PCA9685 ?

0x40–0x77, selon le câblage : A5…A0 → 0x40–0x77 (0x70 = All Call).

Puis-je utiliser plusieurs PCA9685 sur le même bus ?

Oui, jusqu’à 55, chacun réglé sur une adresse différente. Au-delà, utilisez un multiplexeur TCA9548A ou un second bus I²C.

Mon PCA9685 n’apparaît pas dans le scan I2C : pourquoi ?

Vérifiez, dans cet ordre : SDA et SCL non inversés ; la masse commune entre les cartes ; les résistances de pull-up sur SDA et SCL ; le module alimenté à la tension prévue ; aucune broche d’adresse laissée en l’air ; enfin, dans votre code, l’adresse sur 7 bits (0x40) et non celle sur 8 bits (0x80).

Périphériques similaires

Adresses vérifiées sur la datasheet PCA9685.