mcp23017 et ESP8266 nodeMCU

Bonjour à tous,

Dans l’objectif d’augmenter le nombre de sorties de mon nodeMCU, j’ai fait l’acquisition d’un petit module mcp23017 qui se présente sous la forme d’une petite board comme celle-ci
Seulement je ne dois pas être très doué puisque malgré mes recherches, je ne parviens toujours pas à le faire fonctionner… Mon objectif dans un premier temps est de simplement faire clignoter une led.

Voici le branchement que j’ai réalisé :

  • A0, A1, A2 mcp sur GND nodeMCU
  • RESET mcp sur 3,3V nodeMCU
  • SDA mcp sur D2 nodeMCU (GPIO4)
  • SCL mcp sur D1 nodeMCU (GPIO5)
  • GND mcp sur GND nodeMCU
  • VCC mcp sur 3,3V nodeMCU
  • Borne “+” de la led sur A0 mcp
  • Borne “-” de la led sur GND commun

Voici le code utilisé :

#include <ESP8266WiFi.h>

#include <Wire.h>

#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp;
const int LED =  1;      // the number of the LED pin


void setup() {
  Serial.begin(115200);

  mcp.begin();     
  mcp.pinMode(LED, OUTPUT);

}

void loop() {
    digitalWrite(LED, LOW);
    Serial.println("OFF");  
    delay(500);
    digitalWrite(LED, HIGH);
    Serial.println("ON");
    delay(500);  
  }

A vrai dire, je ne suis pas certain de l’adressage des pins de la board…

Merci pour votre aide !

il ne faut pas appeler

digitalWrite(LED, LOW);

sinon vous pilotez la pin 1 de votre ESP… La librairie vous fournit une instance qui représente votre MCP, c’est à cette instance qu’il faut demander de gérer la LED

 mcp.digitalWrite()
#include <Wire.h>
#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp;

const byte ledPin =  1;
 
void setup() {  
  Serial.begin(115200);
  mcp.begin();
  mcp.pinMode(ledPin, OUTPUT);
}

void loop() {
  mcp.digitalWrite(ledPin, HIGH);
  Serial.println("ON");
  delay(500); 

  mcp.digitalWrite(ledPin, LOW);
  Serial.println("OFF");  
  delay(500);
}

Dans le câblage:

  • RESET mcp sur 3,3V nodeMCU

Pour la pin Reset il est bon de rajouter une résistance de limitation de courant, par exemple ~10kΩ

peut être

const byte ledPin =  0;

et non ledPin= 1 pour la sortie A0 selon la doc de la librairie Adafruit... ou déplacer la led sur la sortie suivante

ah oui bien vu — effectivement 1 c'est pour GPA1

Super merci à vous deux !

Encore une question : est-il nécessaire de brancher les pins A0, A1, A2 ainsi que le RESET ? Et si oui pourquoi ?

les pins A0, A1, A2 donnent l'adresse I2C de votre module, en les mettant à GND vous avez l'adresse par défaut, ce qui vous permet de fairemcp.begin();sinon faudrait passer l'adresse à begin().

Reset ayant besoin d'être à HIGH pour que le module fonctionne, oui

et puis une petite résistance en série avec la led serait la bienvenue même si les sorties des MCP23017 sont 'robustes', mieux vaut maîtriser le courant que de travailler 'à fond la caisse' :wink:

les pins A0, A1, A2 donne l'adresse de votre module, en les mettant à GND vous avez l'adresse par défaut.

L'adresse sert pour la communication I2C ? Si je viens par exemple ajouter un LCD, n'aurai-je pas de problème d'adressage ?

al1fch:
et puis une petite résistance en série avec la led serait la bienvenue même si les sorties des MCP23017 sont 'robustes', mieux vaut maîtriser le courant que de travailler 'à fond la caisse' :wink:

C'est prévu :wink:

gugutz_96:
L'adresse sert pour la communication I2C ? Si je viens par exemple ajouter un LCD, n'aurai-je pas de problème d'adressage ?

ben comme toujours il faut lire la spec :slight_smile:
voilà où vont les bit A0,A1,A2 dans l'octet qui représente l'adresse de l'esclave


donc 0x2@ ou @ c'est la valeur des 4 bits 0 suivi des 3 bits que vous avez mis avec A2, A1 et A0 ce qui donne une adresse entre 0x20 et 0x27.
faudra régler cette adresse pour qu'elle ne soit pas en conflit avec votre écran (et passer le nombre de 0 à 7 à la fonction begin() si ce n'est pas 0)

(les LCD que je connais sur 2 ou 4 lignes sont en 0x27 ou 0x3F donc ne prenez pas 0x27, laissez le en 0x20)

Je crois que je vais prendre le temps d'approfondir un peu mes connaissances sur le protocole de communication I2C pour bien tout comprendre :o

Encore merci pour vos conseils et votre réactivité !

Bonjour,

Je reviens vers vous pour un autre petit problème avec mon mcp23017…

J’ai cette fois-ci voulu ajouter un BP pour activer ou désactiver la led. Cependant, lorsque je téléverse le programme, le LED s’allume, et l’état du bouton est lu à HIGH, sans qu’un appui sur celui-ci ne change quoi que ce soit (ni sur son état, ni sur l’état de la LED)

Le branchement est le même que celui décrit dans mon premier message, avec en plus un BP sur A2. J’ai essayé le même montage sans passer par le mcp, ça fonctionne. De même, le montage avec seulement la led et le mcp fonctionne aussi.

Voici le code :

#include <Wire.h>
#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp;

const byte ledPin = 1;
const byte BpPin = 2;
 
void setup() {  
  Serial.begin(115200);
  mcp.begin();
  mcp.pinMode(ledPin, OUTPUT);
  mcp.pinMode(BpPin, INPUT_PULLUP);
}

void loop() {

  if (mcp.digitalRead(BpPin) == LOW){
    Serial.println("bouton HIGH");
    mcp.digitalWrite(ledPin, HIGH);
    Serial.println("ON");
    delay(50);
    }

  if (mcp.digitalRead(BpPin) == HIGH){
    Serial.println("bouton LOW");
    mcp.digitalWrite(ledPin, LOW);
    Serial.println("OFF");
    delay(50);
 
  }
 
}

Merci à vous !

Quel type de bouton poussoir ?
Est-il bien branché ?
Si c'est un BP du genre de celui-ci :

Les broches sont reliées entre elles deux à deux.
Vérifie avec un ohmmètre.

je ne sais plus si la bibliothèque Adafruit supporte le INPUT_PULLUP. essayez de remplacer

  mcp.pinMode(BpPin, INPUT_PULLUP);

par

  mcp.pinMode(BpPin, INPUT);
  mcp.pullUp(BpPin, HIGH);  // active un pull-up interne de 100KΩ

il faut mettre à jour le registre GPPUA/B et donc ça demande un traitement adapté. je vous laisse regarder dans le code source s’ils l’on fait.

J-M-L:
je ne sais plus si la bibliothèque Adafruit supporte le INPUT_PULLUP. essayez de remplacer

  mcp.pinMode(BpPin, INPUT_PULLUP);

par

  mcp.pinMode(BpPin, INPUT);

mcp.pullUp(BpPin, HIGH);  // active un pull-up interne de 100KΩ

En effet c’était la solution ! Merci à vous

Merci aussi à hbachetti !

Effectivement j'ai regardé le code de la télécommande à MCP23008 que j'avais développé il y a six mois.
Ce détail ne saute pas au yeux.

    mcp.pinMode(button, INPUT);
    mcp.pullUp(button, HIGH);  // turn on a 100K pullup internally

Cela peut enseigner une chose : s'inspirer des exemples de la librairie est primordial.