Fragen zu Port Expander

Hallo zusammen.
Ich habe mir vor einiger Zeit einen E-Dart gebaut und verwende zurzeit den Arduino Mega 2560 für die Steuerung.
Nun möchte ich einen ESP32 (ESP32 Dev Kit C V4) verwenden, aber da er nicht so viele Input/Output hat wie der Mega 2560, möchte ich für meine Matrix einen Port Expander I2C verwenden, um nicht so viele Input/Output beim ESP32 zu verschwenden, nur weiß ich leider nicht, was für ein Bauteil dafür geeignet ist.

Hier sind die Folgende Pins, diese ich zurzeit beim Mega2560 für meine Matrix verwende:

int matrixMaster[] = {A0, A1, A2, A3};
int matrixSlave[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};

Mit welchem Bauteil (Port Expander) könnte ich die Matrix 4x20 oder 20x4 verbinden?
Ich bedanke mich schon mal im Voraus für die Hilfe.
Gruss

MCP23017, schneller mit SPI MCP23S17, je IC 16 IOs. Bibliothek von Adafruit.

Vielen Dank für die Antwort.

Also müsste ich dann 2x SPI MCP23S17 verwenden?
Werde mir dann mal das Datenblatt dazu ansehen und vielen Dank für die Hilfe.

Gruss

falko1985:
Also müsste ich dann 2x SPI MCP23S17 verwenden?

Ja.

Oder Du verwendest vier Pins vom ESP32, ein paar hat der ja auch.

agmue:
Ja.

Oder Du verwendest vier Pins vom ESP32, ein paar hat der ja auch.

Bei einer 4x20 Matrix wird daraus wohl nichts.

Du kannst ein 23s16 und ein 23s08 nehmen. So hast Du 24 Pins wo Du 4 als Spalten und 20 als Zeilen verwendest. Du kannst Auch 2 23s16 nehmen und 8 Pins freilassen .

Grüße Uwe

Super, ich werde mir dann MCP23S16 und MCP23S08 besorgen.

Edit: Leider finde ich keine, die mit "S" MCP23S16, würde dann die MCP23S17 nehmen, sollte ja auch kein Problem sein, denke ich.

Und vielen Dank für die Hilfe.

MfG

falko1985:
Super, ich werde mir dann MCP23S16 und MCP23S08 besorgen.

Ja, Ich glaube ich hab die Zahlen verwechselt.

Kein Problem und vielen Dank.

Gruss

Hallo nochmal.
Von Adafruit finde ich nur diese Bibliothek ohne "S" MCP23017, kann ich diese trotzdem verwenden oder gibt es da Probleme?

Zurzeit habe ich diese Bibliothek eingebunden aber noch nicht testen können, da ich noch auf den Port Expander warte:

Ich bedanke mich schon mal im Voraus.

Gruss

Nein, die Adafruit-Lib arbeitet nur über I2C.

Gruß Tommy

Ok, werde dann die Adafruit Library verwenden und vielen Dank.

Gruss

Nochmal: Die Adafruit_MCP23017-Lib ist nicht für den MCP23S17 geeignet.

Gruß Tommy

Achso, ich bin von @agmue ausgegangen das ich die Bibliothek von Adafruit verwenden kann:

agmue:
MCP23017, schneller mit SPI MCP23S17, je IC 16 IOs. Bibliothek von Adafruit.

Ich werde mir dann einfach mal den MCP23017 besorgen, Vielleicht reicht der ja, falls er nicht zu langsam ist.
Ach ja, ich habe eine Matrix 4x16 und nicht 4x20, das war ein Fehler von mir.

Gruß

Der MCP23017 und MCP23S17 sind fast identisch. Der Unterschied ist das Interface.

• High-Speed I2C Interface (MCP23017):
-100kHz
-400kHz
-1.7MHz
• High-Speed SPI Interface (MCP23S17):

  • 10 MHz (maximum)

Der 23017 hat I2C Interface
der 23S17 hat SPI interface.

Eine Bibliothek für das I2C Interface kann nicht mit SPI funktionieren.
Die Register und restliche Innereien sind gleich.

Arduino steuert I2C normalerweise mit 400kHz.

Ein 23S17 ist darum viel schneller. Einerseits wegen der Taktfrequenz andererseits wegen des Protokolls zur Ansteuerung.

Grüße Uwe

falko1985:
Achso, ich bin von @agmue ausgegangen das ich die Bibliothek von Adafruit verwenden kann:

Da habe ich mich leider geirrt :-[

falko1985:
Zurzeit habe ich diese Bibliothek eingebunden aber noch nicht testen können, da ich noch auf den Port Expander warte:
GitHub - n0mjs710/MCP23S17: Arduino Driver for Microchip MCP23S17

Sollte OK sein!

Vielen Dank für die Antwort.
Ich habe gestern die MCP23017 Chips bekommen und meine Schaltung getestet, leider hängt sich der MCP23017 auf, wenn in einer Loop-Schleife ständig was geschrieben wird wie digitalWrite usw.

Zum Test habe ich vorher eine LED Blinken lassen, um Sicherzugehen, das alles funktioniert und war alles OK.

Nun habe ich meinen Sketch etwas umgeschrieben, um die Matrix auszulesen.
Hier ist das alte Sketch, diese ich noch mit Arduino Mega 2560 verwendet hatte und sehr gut funktioniert hat:

// Change here to the number of lines of your Master Layer
int masterLines = 4;
// Change here to the number of lines of your Slave Layer
int slaveLines = 16;
// Put here the pins you connected the lines of your Master Layer 
int matrixMaster[] = {A0, A1, A2, A3};
// Put here the pins you connected the lines of your Slave Layer
int matrixSlave[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};

void setup() 
{
  Serial.begin(9600);
  for(int i = 0; i < slaveLines; i++){       
    pinMode(matrixSlave[i], INPUT_PULLUP);   
  }
  for(int i = 0; i < masterLines; i++){         
    pinMode(matrixMaster[i], OUTPUT);         
    digitalWrite(matrixMaster[i], HIGH);     
  }   
}

void loop()
{
  String key = getKey();
  if( key != 0) {
    Serial.println(key);
  }
}

String getKey()
{
  String key = "";  // 0 indicates no key pressed
  for(int i = 0; i < masterLines; i++){         
    digitalWrite(matrixMaster[i], LOW);         
    for(int j = 0; j < slaveLines; j++){             
      if(digitalRead(matrixSlave[j]) == LOW){  // Is a key pressed?      
        while(digitalRead(matrixSlave[j]) == LOW);  // wait for key to be released   
        key = String(i)+","+String(j);  // Remember which key                      
      }         
    }         
    digitalWrite(matrixMaster[i], HIGH);   // De-activate the current column.  
  } 
  return key;
}

Und hier ist das neue Sketch, diese ich mit ESP32 Dev Kit C V4 und 2 MCP23017 verwende:

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

Adafruit_MCP23017 mcp1; // Create MCP 1
Adafruit_MCP23017 mcp2; // Create MCP 2

const uint8_t addr1 = 0; // Adresse 0x20 / 0
const uint8_t addr2 = 1; // Adresse 0x21 / 1

// Change here to the number of lines of your Master Layer
int masterLines = 4;
// Change here to the number of lines of your Slave Layer
int slaveLines = 16;
// Put here the pins you connected the lines of your Master Layer 
int matrixMaster[] = {0, 1, 2, 3};
// Put here the pins you connected the lines of your Slave Layer
int matrixSlave[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

void setup() {  
  Serial.begin(9600);
  mcp1.begin(addr1);      // Start MCP 1
  mcp2.begin(addr2);      // Start MCP 2

  mcp1.pinMode(0, OUTPUT);
  mcp2.pinMode(0, OUTPUT);

  for(int i = 0; i < slaveLines; i++){ 
    mcp2.pinMode(matrixSlave[i],INPUT);
    mcp2.pullUp(matrixSlave[i],HIGH);
  }
  for(int i = 0; i < masterLines; i++){         
    mcp1.pinMode(matrixMaster[i],INPUT);       
    mcp1.digitalWrite(matrixMaster[i], HIGH);     
  }
}

void loop() {
  String key = getKey();
  if( key != 0) {
    Serial.println(key);
  }
}


String getKey()
{
  String key = "";  // 0 indicates no key pressed
  for(int i = 0; i < masterLines; i++){         
    mcp1.digitalWrite(matrixMaster[i], LOW);         
    for(int j = 0; j < slaveLines; j++){             
      if(mcp2.digitalRead(matrixSlave[j]) == LOW){  // Is a key pressed?      
        while(mcp2.digitalRead(matrixSlave[j]) == LOW);  // wait for key to be released   
        key = String(i)+","+String(j);  // Remember which key                      
      }         
    }         
    mcp1.digitalWrite(matrixMaster[i], HIGH);   // De-activate the current column.  
  } 
  return key;
}

Wenn ich an meiner Matrix eine Taste Drücke, dann kommt erstmal nichts an, wenn ich ein Paar mal drücke, dann kommt es irgendwann an aber so, als würde der MCP23017 sehr stark hängen bleiben.

Wie könnte man die Funktion getKey() so umschreiben, das es mit den MCP23017 funktioniert?
Ich möchte gern ohne Delays arbeiten, da das Programm sonst für eine gewisse Zeit anhält und ich eigentlich noch viele andere Funktionen drin habe, die dann nicht mehr richtig funktionieren, wenn ich Delays einsetze.

Im Anhang habe ich ein Bild angehängt, wie ich die 2 MCP23017 verbunden habe.

Ich bedanke mich schon mal für die Hilfe.

Gruss

Was ich spontan sehe:

  mcp1.pinMode(0, OUTPUT);
  mcp2.pinMode(0, OUTPUT);

Welchen Sinn haben diese Zeilen?

    mcp1.digitalWrite(matrixMaster[i], LOW);

Der pinMode ist INPUT, da dürfte diese Zeile nicht den gewünschten Effekt haben.

Welchen Sinn haben diese Zeilen?

damit wird jeweils der gem. Adafruit Nummerierung Pin 0 auf Output gesetzt.
Auf beiden Chips. Auf Github gibts ein Pin-Mapping:

noiasca:
damit wird jeweils der gem. Adafruit Nummerierung Pin 0 auf Output gesetzt.

Dann muß ich meine rhetorische Frage wohl anders formulieren: Welchen logischen Sinn soll dieses Unterfangen haben?

Schweizer Variante:
Diese Zeilen ergeben doch wohl keinen Sinn, oder?

Typisch deutsch (ich zähle mich zu dieser besonderen Art):
Die zwei Zeilen sind Quatsch, schmeiß die raus!

Jeder möge sich die Variante wählen, die zu ihm paßt 8)

Vielen Dank erstmal für die Antworten.

agmue:
Was ich spontan sehe:

  mcp1.pinMode(0, OUTPUT);

mcp2.pinMode(0, OUTPUT);



Welchen Sinn haben diese Zeilen?

Sorry, ich habe das vergessen zu entfernen.
Ich hatte das vorher zum Test drin und 2 LEDs über diese Output geschaltet.
Ich werde es nochmal Versuchen und Melde mich dann nochmal, vielen Dank.
Gruss