Bonjour Bonjour !
J’ai récupéré plusieurs MCP23017 dans un ancien FABLAB qui est en train de fermer/changer.
j’ai envie d’apprendre à les utiliser.
mon idée : Piloter une LED parmi 16 LEDs, j’envoie dans le port Série de mon ESP32 (ESP32 WROOM montée sur une carte pas juste le micropross). J’envoie un deux chiffre X1X2.
- X1 = 0 ou 1 pour sélectionner le port GPAx ou GPBx (x étant le numéro de la sortie entre 0 et 7)
- X2 = 0, 1, 2, 3, 4, 5, 6 ou 7 pour sélectionner la sortie.
Exemple : 12 = GPB2 / 00 = GPA0 … etc
le tout en utilisant le MCP23017 donc, j’ai le montage suivant :
avec la version du MCP2307 suivant :
lien RS de ma commande avec datasheet : le MCP23017 que j'ai et sa datasheet
J’ai chercher sur d’autres sujets de ce forum et d’autres tuto en ligne et à l’aide de ça et de chatGPT que mon chère jpBricole m’a plusieurs fois conseillé pour du code j’ai fait ceci :
/*
CODE pour allumer une LED sur demande dans le port série avec un MCP23017
Dans l'ordre il faut :
- initialiser l'I2C
- configurer les ports GPA0...7 et GPB0...7 en sorties
- maintenir un etat méémoire des sorties
- lire une commande du port série de 2 caractères
- décoder la commande (X1X2) : X1 = port GPA ou GPB / X2 = sortie 0 à 7
- allumer la LED voulu en fonction de la commande
Adresse de registre utilisée (BANK = 0):
- Direction port A : IODIRA = 0x00
- Direction port B : IODIRB = 0x01
- GPIO port A : GPIOA = 0x12
- GPIO port B : GPIOB = 0x13
*/
#include <Wire.h>
#define MCP23017_Address 0x20 // A changer en fonction de l'adresse du MCP (scanner I2C si besoin)
// Registre du MCP23017 (BANK = 0)
#define IODIRA 0x00
#define IODIRB 0x01
#define GPIOA 0x12
#define GPIOB 0x13
uint8_t PortA_state = 0x00; // Etat des sorties GPA
uint8_t PortB_state = 0x00; // Etat des sorties GPB
// Ecrire un registre MCP23017
void mcpWrite(uint8_t reg, uint8_t value) {
Wire.beginTransmission(MCP23017_Address);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA, SCL sur l'ESP32
// Configurer GPA et GPB en sortie
mcpWrite(IODIRA, 0x00); // GPA0...7 en sortie
mcpWrite(IODIRB, 0x00); // GPB0...7 en sortie
// Etteindre toutes les LEDs au départ
mcpWrite(GPIOA, PortA_state);
mcpWrite(GPIOB, PortB_state);
Serial.println("MCP initialisé et pret");
Serial.println("Entrez une valeur de 00 à 07 ou de 10 à 17");
}
void loop() {
if (Serial.available() >= 2) {
// 2 copie de ce qui est lue dans le port serie
char c1 = Serial.read();
while (!isDigit(c1)) c1 = Serial.read();
char c2 = Serial.read();
while (!isDigit(c2)) c2 = Serial.read();
// Ignorer les sauts de lignes
if (c1 == '\n' || c1 == '\r') {
return;
}
int port = c1 - '0';
int bit = c2 - '0';
// Verification si ce qui est écrit est bien entre 00 et 07 et entre 10 et 17
if ((port == 0 || port == 1) && (bit >= 0 && bit <= 7)) {
// Tout éteindre
PortA_state = 0x00;
PortB_state = 0x00;
if (port == 0) {
// On est sur GPAx
PortA_state = (1 << bit);
}
else {
// On est sur GPBx
PortB_state = (1 << bit);
}
mcpWrite(GPIOA, PortA_state);
mcpWrite(GPIOB, PortB_state);
Serial.print("LED allumée : ");
Serial.print(port == 0 ? "GPA" : "GPB");
Serial.println(bit);
}
else {
Serial.println("Commande invalide (00 à 07 ou 10 à 17)");
}
}
/*// Test simple : allumer GPA0
mcpWrite(GPIOA, 0x01); // GPA0 = HIGH
mcpWrite(GPIOB, 0x00);*/
}
Les 3 dernières lignes de code (celles commentées) servaient uniquement à tester le bon fonctionnement de mon mcp23017… justement… dans mon port Série j’ai bien :
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4980
load:0x40078000,len:16612
load:0x40080400,len:3480
entry 0x400805b4
MCP initialisé et pret
Entrez une valeur de 00 à 07 ou de 10 à 17
LED allumée : GPA0
LED allumée : GPA3
OR… rien ne s’allume…
Mes théories: je n’ai pas de pull-up pour mon I2C mais je ne sais pas comment dimensionner une résistance pour de l’I2C… j’aimerais bien apprendre à le faire et surtout apprendre l’emplacement de où elle se met…
(PS : tout est en 3,3V dans mon montage).
Merci d’avance, et sorry si c’est pas clair ou mal expliqué, je suis seulement un petit électronicien à en devenir je l’espère (LOL) en BUT GEII spé AII (traduction : Génie électrique et informatique industrielle spécialité automatisme et informatique industrielle).
J’ai mon assos de mini atelier pour étudiants pour chacun et je teste des trucs débile pour en apprendre plus, on apprend de l’absurde.
Si quelqu’un à une solution magique je prend mais surtout j’aimerais bien des explications pour apprendre !




