MCP23017-E/SP accensione semplice di LED

Salve, come da mia presentazione sono molto a corto di nozioni di programmazione ARDUINO.
Ho un ELEGOO Mega 2560 R3 (compatibile Arduino).
Mi sono cimentato per rappresentazione luci e musica con il software Vixen modificando programma trovato in internet e facendo funzionare dei relè “stato solido”, per un totale di 64 canali (qua tutto OK).

Per il prossimo anno volevo aumentare notevolmente i canali utilizzando anche porte digitali per il funzionamento di Led Pixel, di conseguenza volevo inserire degli Expander MCP23017 per il solo funzionamento dei relè.
Ho trovato informazioni per il collegamento dell’ Expander ed inserisco anche lo schizzo di come ho fatto per sicurezza ed una foto dei collegamenti.
Per il codice arduino, avrei iniziato con un’integrato per poi (se tutto andasse bene) aumentarne fino a 5 in totale.

Visto la mia inesperienza sicuramente c’è qualcosa che non funziona nel codice che dovrebbe accendermi tutti led (come prova di funzionamento), purtroppo questo non accade, inserisco il codice che ho provato:

#include "Wire.h"

void setup() {
  Wire.begin();                     // avvio I2C Bus
  Wire.beginTransmission(0x20);     // MCP23017 indirizzo
  Wire.write(0x00);                 // IODIRA registro
  Wire.write(0x00);                 // imposta tutte le porte A in uscita
  Wire.endTransmission();

  Wire.beginTransmission(0x20);     // MCP23017 indirizzo
  Wire.write(0x01);                 // IODIRB registro
  Wire.write(0x00);                 // imposta tutte le porte B in uscita
  Wire.endTransmission();
}

// Funzione per porte A LED ON / OFF
void ledBlinkPortA(byte a)
{
  Wire.beginTransmission(0x20);     // inizio trasmissione 1°MCP
  Wire.write(0x12);                 // indirizzo porte A
  Wire.write(a);
  Wire.endTransmission();
  delay(100);
}

// Funzione per porte B LED ON / OFF
void ledBlinkPortB(byte a)
{
  Wire.beginTransmission(0x20);     // inizio trasmissione 1°MCP
  Wire.write(0x13);                 // indirizzo porte B
  Wire.write(a);
  Wire.endTransmission();
  delay(100);
}

void loop() {
  ledBlinkPortA((byte)0xfe);        // LED1 ON
  ledBlinkPortA((byte)0xfd);        // LED2 ON
  ledBlinkPortA((byte)0xfb);        // LED3 ON
  ledBlinkPortA((byte)0xf7);        // LED4 ON
  ledBlinkPortA((byte)0xef);        // LED5 ON
  ledBlinkPortA((byte)0xdf);        // LED6 ON
  ledBlinkPortA((byte)0xbf);        // LED7 ON
  ledBlinkPortA((byte)0x7f);        // LED8 ON
  
  ledBlinkPortB((byte)0xfe);        // LED9 ON
  ledBlinkPortB((byte)0xfd);        // LED10 ON
  ledBlinkPortB((byte)0xfb);        // LED11 ON
  ledBlinkPortB((byte)0xf7);        // LED12 ON
  ledBlinkPortB((byte)0xef);        // LED13 ON
  ledBlinkPortB((byte)0xdf);        // LED14 ON
  ledBlinkPortB((byte)0xbf);        // LED15 ON
  ledBlinkPortB((byte)0x7f);        // LED16 ON
}

chiedo lumi di cosa ho sbagliato o di cosa ho omesso per un buon funzionamento.
Grazie mille
buona giornata
Graziano

Generalmente: LED hanno sempre bisogno di un dispositivo che limita la corrente. Spesso si usano delle resistenze.

Ci sono dei LED con controller integrato che possono essere pilotate da uno o 2 segnali (a secondo il modello). Cerca Neopixel o WS2801 / WS2812.

Ciao Uwe

Uwe, ciao
sì ho già acquistato dei led WS2811 "classe IP68" e quelli funzionano a dovere; visto la mia lacuna di programmazione ho iniziato provando con gli esempi "FastLED" e successivamente ho utilizzato e leggermente modificato un codice trovato sul Web per adattarlo al software di programmazione luci "Vixen Ligth Show".

Ora invece, mio malgrado, mi trovo davanti un ostacolo "che magari è una bazzecola" ma non riesco a gestire le uscite dell'integrato MCP23017.
Mi spiego meglio: vorrei utilizzare l'Expander per gestire i relè (stato solido) per ora in tutto 40 (collegati direttamente alle porte del MEGA2560) ma vorrei arrivare a 80 relè, quindi ho acquistato 5 moduli MPC23017 per il solo input del segnale ai relè.

Stavo iniziando con il funzionamento di un Expander e successivamente avrei aggiunto gli altri 4, ho fatto innumerevoli ricerche su internet e letto varie schede per il funzionamento ed i collegamenti provando e riprovando alcuni codici ma nulla di fatto.
La tensione arriva correttamente alle porte 9-12-13 e 18 (la 12 e 13 sotto resistenza da 470 ohm), come il GND risulta corretto alle porte 10-17-16 e 15.
Per prova, sulle uscite dell'integrato ho collegato 16 led semplicissimi a 5V (senza alcuna resistenza) come positivo mentre il negativo dei Led l'ho messo sotto GND.

Il codice che ho postato precedentemente sarebbe stato pensato per aggiungere altri integrati (0x21; 0x22; ect), probabilmente ho approcciato malamente questa cosa e non riesco a far funzionare le porte correttamente. Magari dovrei definire l'MPC23017 ed eventuale libreria (avrei già provato ma anche quello andato a vuoto).

Scusa se sono stato lungo, tirando le somme: per ora sto facendo una prova per accendere tutti i led tramite l'Expander ma dopo diversi tentativi non riesco ancora ad avere questa condizione.

grazie mille del tuo tempo
Ciao
Graziano

Personalmente preferisco usare librerie già testate, per il MCP23017 ad esempio c'e' quella di Adafruit

grazie, NID
anche in questo caso avevo trovato un codice “Adafruit”, ed avevo messo in sospeso delle righe con “////”
allego per visione:

#include <Adafruit_MCP23017.h>


Adafruit_MCP23017 mcp1; 
////Adafruit_MCP23017 mcp2;
/* 

addr 0 = A2 low , A1 low , A0 low  000
addr 1 = A2 low , A1 low , A0 high 001
addr 2 = A2 low , A1 high , A0 low  010
addr 3 = A2 low , A1 high , A0 high  011
addr 4 = A2 high , A1 low , A0 low  100
addr 5 = A2 high , A1 low , A0 high  101
addr 6 = A2 high , A1 high , A0 low  110
addr 7 = A2 high, A1 high, A0 high 111

Connect pin #12 of the expander to Analog 5 (i2c clock)
Connect pin #13 of the expander to Analog 4 (i2c data)
Connect pins #15, 16 and 17 of the expander to ground (address selection)
Connect pin #9 of the expander to 5V (power)
Connect pin #10 of the expander to ground (common ground)
Connect pin #18 through a ~10kohm resistor to 5V (reset pin, active low)

// Input #0 is on pin 21 so connect a button or switch from there to ground
*/
#define addr1 7 // 7 = A1 high, A2 high, A3 high
////#define addr2 0 
void setup() 
  {
    Serial.begin(9600); 
    mcp1.begin(addr1);
    ////mcp2.begin(addr2);

    mcp1.pinMode(0, INPUT); //pin 21 on chip
    ////mcp2.pinMode(0, INPUT); //pin 21 on chip

  } 

  void loop()
  { 
      if(mcp1.digitalRead(0)== HIGH )
      Serial.println("HIGH"); 
      delay(1000);

      ////if(mcp2.digitalRead(0)== HIGH )
      ////Serial.println("HIGH 2"); 
      ////delay(1000);
  }

anche il codice sopra nulla.

Nel frattempo ho trovato in internet un codice per testare le porte I2C:

#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

e con le porte 12-13 dell’MPC23017 collegate al MEGA2560 rispettivamente al SCL-SDA mi da come risposta:“I2C devices not found”
mentre con le porte 12-13 dell’MPC23017 collegate al MEGA2560 rispettivamente alla A5-A4 mi da come risposta “HIGHT”

anche in questo caso se i collagamenti tra MPC e MEGA sono corretti no capisco come non faccia a trovare le porte I2C

grazie per la pazienza
Graziano

Sorry ... :frowning: ... ho provato a smontare la breadboard e rifare tutti i collegamenti, questa volta ho sostituito l' MPC23017 e il tutto funziona.
Ho testato tutti e 5 i miei MPC e purtroppo uno non funziona, proprio quello che ho montato sin dall'inizio.
Sono veramente dispiaciuto per l'accaduto è che non avrei mai pensato il non funzionamento di un cip (spero che possa essere anche normale altrimenti sono veramente sfortunato).
Ringrazio chi ha cercato di aiutarmi.
Ora proseguo con tutti i mie esperimenti .... alla prossima.
Graziano.

Che sfiga ! Capita.