Arduino Leonardo mit Arduino Mega via I2C verbinden

Hallo zusammen,

ich bau mir einen eigenen USB-Controller für meinen Landwirtschaftssimualtor.
Durch betätigen diverster Kippschlater sollen über den Arduino Tastaturbefehle an den PC gesendet werden.

Da der Leonardo begrenzte digitale Pins hat, wollte ich die Kippschlater an den Arduino Mega anschließen.
Der Arduino Mega soll dann als Slave die Signale an den Master, Arduino Leonardo senden.

Lt. Chat GPT ist das via I2C möglich.
Ich habe die beiden Bords verbunden (SCL zu SCL,SDA zu SDA und GND zu GND).
Leider klappt das nicht.
Am Leonardo alleine klappt das
Ich verute es liegt an der I2C verbindung.

Nun meine Frage:
Kann mir bitte einer genau erklären wie ich die Boards via I2C verbinde.

Anbei der Master Code für den Leonardo:

#include <Wire.h>
#include <Keyboard.h>

const int numOfButtons = 40; // Anzahl der Taster
int buttonState[numOfButtons];
int lastButtonState[numOfButtons] = {0};
char keys[numOfButtons] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '[', ']'};

void setup() {
Wire.begin(); // Beginne als Master
Keyboard.begin();
}

void loop() {
Wire.requestFrom(8, numOfButtons * sizeof(int)); // Fordere Daten von Slave an
int i = 0;
while (Wire.available()) {
buttonState[i] = Wire.read();
i++;
}

for (int i = 0; i < numOfButtons; i++) {
if (buttonState[i] == 1 && lastButtonState[i] == 0) {
Keyboard.press(keys[i]);
Keyboard.release(keys[i]);
}
lastButtonState[i] = buttonState[i];
}

delay(100); // Kleine Verzögerung für Stabilität
}

und der Slave<Code für den Mega

#include <Wire.h>

const int numOfButtons = 40; // Anzahl der Taster
int buttonPins[numOfButtons] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41}; // Ergänzen Sie die restlichen Pins
int buttonState[numOfButtons];
int lastButtonState[numOfButtons];

void setup() {
Wire.begin(8); // Beginne als Slave mit Adresse 8
Wire.onRequest(requestEvent);

for (int i = 0; i < numOfButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP); // Initialisiere Taster-Pins
lastButtonState[i] = HIGH; // Anfangszustand als nicht gedrückt
}
}

void loop() {
for (int i = 0; i < numOfButtons; i++) {
int currentState = digitalRead(buttonPins[i]);
if (currentState != lastButtonState[i]) {
buttonState[i] = (currentState == LOW) ? 1 : 0;
lastButtonState[i] = currentState;
}
}
}

void requestEvent() {
Wire.write((char*)buttonState, numOfButtons * sizeof(int));
memset(buttonState, 0, numOfButtons * sizeof(int)); // Setze nach Sendung zurück
}

Vielen Dank für eure Hilfe.

Damit bin ich schon raus....

Hat ChatGPT auch diesen Code geschrieben .... :roll_eyes:

So viele Taster verschaltet man normalerweise in einer Matrix, und dann kann der Leonardo das mit z.B. einem PCF8575 I2C Port Extender auch ganz alleine. Auch mit einem einfachen Demultiplexer HC138 würden die Pins am Leonardo schon ausreichen, wenn da nicht viel anderes angeschlossen werden soll.
Wenn Du unbedingt alle Taster einzeln anschließen willst, geht es auch mit 3 PCF8575.
Ein Mega ist definitiv mit Kanonen auf Spatzen geschossen und macht alles nur unnötig kompliziert.

N.B. Bitte verwende Code-Tags, wenn Du Code postest. Lies Dir dazu bitte auch folgendes durch:

1 Like

Mein Rat:

Frage den Roboter so lange, bis er dir das richtige Ergebnis liefert, das du erwartest.

Eine Antwort könnte auch wahrscheinlich 42 sein.

Oder Kipptaster?

Hat dir

auch was von den Pullups erzählt?

Ansonsten kann ich nur @MicroBahner zustimmen: Lass den Mega weg und benutze eine Matrix oder Portexpander. Ist 10 mal einfacher.

Der Mega hat in der Regel Pullups für i2C drauf, zwar mit 10K etwas hoch aber bei versuchsaufbauten, wenn die kabel nicht all zu lange sind, reicht es. Aber natürlich ist es besser, zur Sicherheit noch zusätzlich welche anzubringen wenn man das nicht vorher, durch blick ins Schaltbild oder durch nachmessen sichergestellt hat.

am Leonardo hast du Pins gekennzeichnet mit
D3/SCL
D2/SDA
GND

Am Mega hast du Pins gekennzeichnet mit
D21/SCL
D22/SDA
GND

Die verbindest du mit möglichst kurzen Kabeln.
Wenn es nicht funktioniert Zeige ein Bild von deinem Aufbau.
Weiters, stelle deine Codes in Code Tags. Wie das geht steht im Forum-How To

Hat dir ChatGPT nicht geschrieben, dass der Sketch hier in Code-Tags rein gesetzt werden sollte ?
Wenn nein, hast du vermutlich die ChatGPT-Fake-Version erwischt und solltest da mal nach der "echten" Version nachfragen.

An beiden ( und anderen Modellen) hast Du extra Pins wo SCL und SDA dransteht ( links von VREF und D13)

Leonardo

und Mega 2560 REV3

Beschriftung ist auf der Unterseite:

Grüße Uwe

.
ist mir klar und ich habe auch nichts Gegenteiliges geschrieben.

Aber da @tongu sich seit vier Tagen nicht mit Echtbildern gemeldet hat ist das Problem sicher schon gelöst.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.