AW9523 16-bit I/O expander and LED driver with ESP32

Supply 3.3-5 V Bus I2C I2C address 0x58 / 0x59 / 0x5A / 0x5B
VINGNDSCLSDAINTRSTAD0AD1P0_0P0_1P0_2P0_3P0_4P0_5P0_6P0_7P1_0P1_1P1_2P1_3P1_4P1_5P1_6P1_7

Pins and ESP32 wiring

PinRoleESP32 pinNotes
VINPower3V32.5 to 5.5 V
GNDGroundGND
SCLI2C clock (SCL)D22
SDAI2C data (SDA)D21
INTInterruptD35Interrupt output, optional
RSTNot wired to the ESP32—Reset, active LOW, pulled up. Leave unconnected
AD0Not wired to the ESP32—Address bit, default LOW
AD1Not wired to the ESP32—Address bit, default LOW
P0_0Not wired to the ESP32—Expander I/O: to your LEDs or buttons, not to the ESP32
P0_1Not wired to the ESP32—
P0_2Not wired to the ESP32—
P0_3Not wired to the ESP32—
P0_4Not wired to the ESP32—
P0_5Not wired to the ESP32—
P0_6Not wired to the ESP32—
P0_7Not wired to the ESP32—
P1_0Not wired to the ESP32—
P1_1Not wired to the ESP32—
P1_2Not wired to the ESP32—
P1_3Not wired to the ESP32—
P1_4Not wired to the ESP32—
P1_5Not wired to the ESP32—
P1_6Not wired to the ESP32—
P1_7Not wired to the ESP32—

Suggested wiring for the 30-pin ESP32 DevKit, avoiding flash, input-only and strapping pins. BoardPilot checks it for you as you wire.

Check it is the real chip

Read register 0x10: a genuine part answers 0x23. BoardPilot does this automatically in “Debug a problem”.

Starter code (Arduino)

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);  // SDA = GPIO 21, SCL = GPIO 22
  Wire.beginTransmission(0x58);
  bool found = Wire.endTransmission() == 0;
  Serial.println(found ? "AW9523 16-bit I/O expander and LED driver found at 0x58" : "Not found: check power, GND and SDA/SCL");
}

void loop() {}

Sources

Try it in 3D in BoardPilot

BoardPilot Part data (JSON)

Related parts

Part data: CC BY 4.0, free to reuse with credit to BoardPilot.