Comment programmer un ESP32 avec deux MCP23017

Bonjour,

Je suis nouveau dans la programmation et l’électronique.

j'ai un esp32Wroom (devkitc v4) et deux MCP23017, j'aimerais programmer les entrées et sorties de celle ci via Platformio sur Visual Studio Code.

j'ai noté les entrées et sorties de la manières suivante:
ESP32:
GPIO 22: SCL
GPIO 21: SDA

 MCP23017 (1):

1 : signal Récepteur IR 1
2 : signal Récepteur IR 2
3 : signal Récepteur IR 3
4 : signal Récepteur IR 4
5 : signal Récepteur IR 5
6 : signal Récepteur IR 6
9 : VCC
10 : GND
12 : SCL
13 : SDA
15 : GND
16 : VCC
17 : VCC
18 : VCC
23 : OUT 3.3V 1
24 : OUT 3.3V 2
25 : OUT 3.3V 3
26 : OUT 3.3V 4
27 : OUT 3.3V 5
28 : OUT 3.3V 6

MCP23017 (2):
1 : signal Récepteur IR 7
2 : signal Récepteur IR 8
3 : signal Récepteur IR 9
4 : signal Récepteur IR 10
5 : signal Récepteur IR 11
6 : signal Récepteur IR 12
9 : VCC
10 : GND
12 : SCL
13 : SDA
15 : VCC
16 : GND
17 : VCC
18 : VCC
23 : OUT 3.3V 7
24 : OUT 3.3V 8
25 : OUT 3.3V 9
26 : OUT 3.3V 10
27 : OUT 3.3V 11
28 : OUT 3.3V 12

Les OUT 3.3v seront pour active des Module MOSFET HW-517 après avoir reçu le signal infrarouge correspondant au même numéro, exemple: réception signal IR 1 activation OUT 3.3V 1 pendant 500ms.

Les Signales IR seront produit a l'aide de récepteur IR alimenter en 3.3v.

Les masses GND de l'esp32 et des mcp23017 seront commune ainsi que toutes les masses du circuit.

Les VCC seront branché avec la sortie 3.3v de l'esp32.

L'esp32 seras alimenter a l'aide du dans un premier temps via le câble USB puis seras alimenter via la broche 5V a l'aide de deux accu 18650 3000mah

J'aurais besoin de votre aide pour pouvoir codé ce circuit a l'aide de Platformio sur Visual Studio Code.

Merci d'avance pour les réponses!

Cordialement
Anas

Qu'il s'agisse de PlatformIO ou IDE ARDUINO cela ne change rien.
Pour piloter un MCP23017 :

AMHA l'hésitation du demandeur vient de l'emploi de deux MCP23017 simultanément.

Je pense qu'il faut créer deux objets

Adafruit_MCP23X17 mcp1;
Adafruit_MCP23X17 mcp2;

Mais comment passer l'adresse I2C au constructeur ?

Bonjour,

mcp1.begin(addr1);
mcp2.begin(addr2);

Le CI les pins d'adressage A0, A1 et A2

#define addr1 0x00
#define addr2 0x01

void setup() {
 mcp1.begin(addr1);
 mcp2.begin(addr2);
 // etc.

**Edit : revoir l'écriture des adresses, voir ci-dessous**

J'avais regardé un exemple de la bibliothèque :

// uncomment appropriate mcp.begin
  if (!mcp.begin_I2C()) {
  //if (!mcp.begin_SPI(CS_PIN)) {
    Serial.println("Error.");
    while (1);
  }

A quoi sert de donner un exemple qui utilise les valeurs par défaut de A0,A1, A2 par défaut sans le préciser ?

Oui mais comment mettre toute ces infos dans le code?

Dans Adafruit_MCP23XXX.h le constructeur par défaut est celui-ci :

#define MCP23XXX_ADDR 0x20 //!< Default I2C Address
  bool begin_I2C(uint8_t i2c_addr = MCP23XXX_ADDR, TwoWire *wire = &Wire);

Il faut fouiller les exemples, comme pour n'importe quelle librairie :

Bonjour

Dès que l'on a plusieurs MCP23017 (comme presque tout autres objets), il est préférable de les mettre en tableau, ça en facilite l'usage,

#include <Adafruit_MCP23X08.h>
#include <Adafruit_MCP23X17.h>

const int mcpNombre = 6;
Adafruit_MCP23X17 mcp[mcpNombre];

void setup()
{
	for (int m = 0; m < mcpNombre; m ++)
	{
		mcp[m].begin_I2C(m + 0x20);
	}
}

void loop()
{

}

Ce n'est pas essayé "en vrai"

Cordialement
jpbbricole

@jpbbricole
@nsfactoryproject a deja du mal avec la notion de deux objets a instancier et tu ajoutes les tableaux alors qu’il n’a que deux objets a créer.

@hbachetti
Je constate une évolution dans les bibliothèques qui ne gêne pas un ancien professionel.
Je ne pense même pas qu’il le remarque tellement il est dans son domaine.

Avec la multiplication des plate-formes, mais pas que pour cette raison, le code des bibliothèques devient de plus en plus complexe, donc de moins en moins compréhensif pour un debutant.

Quand je me suis mis a la programmation, j’ouvrais les fichiers code pour prendre des idees, maintenant je n’y comprends plus rien.

Parallèlement les exemples deviennent de plus en plus rudimentaires, ce qui laisse les non spécialistes et encore plus les débutants, perplexes .

On s’eloigne de plus en plus de l’esprit de ”Wiring”.

Les datasheets aussi évoluent, le modèle Atmel, qui etait accompagné d’exemples en assembleur et en C, disparait, il ne reste plus que le texte qui est souvent peu clair pour un non professionnel.

1 Like

Ca change quoi au problème, c'est toujours des objets à instancier et autant qu'il apprenne les tableaux au début, c'est tout ça de fait et, surtout, ça simplifiera son code!

Cordialement
jpbbricole

1 Like

En écrivant ceci, tu supposes que les MCP23017 ont des adresses I2C consécutives, et qu'elles partent de ZÉRO.
Or l'adresse par défaut est :
#define MCP23XXX_ADDR 0x20 //!< Default I2C Address

1 Like

Attention : la librairie AdaFruit a changé, il y a environ 2 ans.
La méthode begin() des versions 1.XXX de la librairie AdaFruit accepte un argument allant de 0 à 7. Elle ajoute elle-même 0x20 pour obtenir l'adresse I2C, tandis que la nouvelle méthode begin_I2C() doit recevoir l'adresse I2C réelle (0x20 à 0x27).

1 Like

Bonjour hbachetti

Oui, mais m n'est pas directement l'adresse i2C, mais l'index fixé par les ponts à souder A0, A1 et A2.
L'adresse i2c est 0x20 + l'index des ponts.

C'est également indiqué par @trimarco232 au post #5.

Cordialement
jpbbricole

Comme dit plus haut, la librairie a radicalement changé depuis 2 ans.
Elle gère à l'heure actuelle les MCP23008, MCP23S08, MCP23017, MCP23S17, etc.
Elle nécessite également l'installation de BusIO:

Bonjour hbachetti

Ton message est arrivé pendant que j'écrivais le mien.

En effet j'utilisais la vieille version. J'ai adapté mon post #9. Exemple où les MCP23017 on des adresses consécutives partant de 0x20.

Cordialement
jpbbricole

Je suis d'accord avec toi, et j'ai moi-même été surpris la première fois que j'ai utilisé la nouvelle version de cette librairie, et constaté qu'il ne fallait plus utiliser les index 0 à 7 comme dans l'ancienne version.
Le manque de documentation est un constat général quand on examine les librairies ARDUINO. Il faut souvent examiner les fichier .h et .cpp pour en savoir plus.
Malheureusement pour les débutants, certaines notions ne font pas partie de leur bagage (héritage, agrégation, etc.).
Mais c'est un constat général aussi, les débutants empoignent un projet sans connaître les bases du langage.

au temps pour moi, je suis effectivement parti d'un vieil exemple
perso,

  • je n'utilise les librairies, telles celles d'Adafruit, uniquement pour faire un test rapide du montage ; généralement, je réécris manuellement la config du mcp23017 (ou autres), pour être certain qu'il fasse exactement ce que je veux, et oui, il faut dans ce cas effectivement lire les datasheet
  • j'en suis revenu du mcp23017, génial, mais (actuellement ou définitivement ?) trop cher ; dans l'objet de ce topic, j'aurais utilisé un 74hc595 + un 74hc165, c'est 10x moins cher, quite à devoir équiper ce dernier de résistances de tirage

On revient aux bases.

@nsfactoryproject
En résumé :
Tu as deux objets à instancier, un par module MCP23017.
Tu dois pour chaque objet utiliser la méthode begin avec l'adresse I2C

L'adresse I2C se modifie en jouant avec les pin A0, A1, A2: soit on les relie à la masse, soit à l'alimentation.

Pour être certain de l'adresse que tu as fixée, tu as tout intérêt à utiliser un scanner I2C.
Un scanner I2C est un programme "arduino" de quelques lignes qui recherche tous les composants i2C connectés.
Le scanner donne l'adresse des composants détectés.
Tu trouveras facilement des versions sur le net, cet utilitaire est très répandu.

Si tu fais cette opération en priorité, elle te permettra :

  • de vérifier que les MCP23017 sont bien câblés => si tu ne vois pas tes modules I2C c'est que le câblage est à rectifier.
  • d'obtenir l'adresse réelle.

Tu partiras sur de bonnes bases pour écrire ton programme.

2 Likes

Ou trouver ce scanner i2C dans platformio?