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.