Hallo zusammen,
(kann übersprungen werden..)
Ich habe die Forenregel gelesen und das ist dabei rausgekommen :).
ich befasse mich seit kurzem mit dem Adruino, einfache Projekte gingen ganz gut und konnten auch, unter anderem mit hilfe von diesem Forum, beenden.
Leider stoße ich jetzt, mit meinem Projekt, an meine Grenzen. Einfacherhalber für euch habe ich die Problemstellung von ChatGpt zusammenfassen lassen und den Code mit Kommentaren versehen lassen.
Sitze im übrigen schon seit 2 Wochen nur an der Hardware und bin ein neuen Adruino, ein neues USB host Shield, und ein SD Kartenleser weiter. Ich bekomme es leider nicht hin, dass alle zwei Shilds mit dem adruino kommunizieren können. Jeweils alleine für sich, funktionieren diese. Einen Beitrag im Forum habe ich gefunden, dieser konnte mir nicht weiter helfen. (.. bis hier.)
Schonmal danke für die Hilfe. Vielleicht ist es auch nicht möglich.
ChatGPT:
Problemstellung:
Ich arbeite an einem Projekt mit einem Arduino UNO, bei dem ich einen Barcode-Scanner und einen SD-Kartenleser gleichzeitig verwenden möchte. Der Barcode-Scanner ist über ein USB Host Shield angeschlossen, und der SD-Kartenleser ist direkt über die SPI-Schnittstelle verbunden, habe den SD-Kartenleser auch als Datenloggershild versucht. Ziel des Projekts ist es, den gescannten Barcode mit einer Datenbank auf der SD-Karte zu vergleichen und die zugehörigen Daten anzuzeigen.
Hardware:
Arduino UNO [https://www.ebay.de/itm/174942345198](https://Arduino)
USB Host Shield (CS-Pin auf Pin 9 geändert) [https://www.ebay.de/itm/185053782981](https://USB Host Shield)
Externer SD-Kartenleser (SPI, CS-Pin auf Pin 4) [https://www.ebay.de/itm/174940391947](https://SD-Kartenleser)
Datenlogger Modul [https://www.az-delivery.de/products/datenlogger-modul?_pos=1&_psq=datenlogger&_ss=e&_v=1.0](https://Datenlogger)
USB Barcode-Scanner (wird als HID-Tastatur erkannt) [https://www.amazon.de/gp/product/B07KD4C7WL/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1](https://Barcodescanner)
Software-Sketch:
Der Sketch initialisiert das USB Host Shield und wartet auf einen Barcode-Scan.
Nach dem Scannen wird der Barcode mit einer data.csv-Datei auf der SD-Karte verglichen.
Probleme, auf die ich gestoßen bin:
Pin-Konflikte:
Das USB Host Shield verwendet standardmäßig Pin 10 als CS-Pin. Da Pin 10 bereits für andere Funktionen belegt ist, habe ich den CS-Pin des USB Host Shields auf Pin 9 geändert.
Trotz der Hardwareänderung gibt es immer noch Schwierigkeiten bei der gleichzeitigen Verwendung des USB Host Shields und des SD-Kartenlesers.
Hardware-SPI vs. Software-SPI:
Die Idee war, den SD-Kartenleser über Software-SPI zu betreiben, damit der Hardware-SPI-Bus für das USB Host Shield frei bleibt. Allerdings stieß ich auf Probleme bei der Implementierung der SoftSPI-Bibliothek, da diese nicht richtig erkannt wurde oder nicht mit der aktuellen Bibliotheksversion kompatibel war.
Verbindungsprobleme:
Wenn beide Shields (USB Host und SD-Kartenleser) gleichzeitig angeschlossen sind, keiner erkannt. Wenn ich dann beim Test den USB Host Shield abklemme, wird dieser trotzdem vom Sketch als vorhanden erkannt.
Serielle Kommunikation:
Eine alternative Idee war, den SD-Kartenleser über serielle Kommunikation zu betreiben, dies war auch ohne erfolg.
Fragen:
Wie kann ich die Probleme mit der gleichzeitigen Verwendung des USB Host Shields und des SD-Kartenlesers beheben? Gibt es bewährte Methoden zur Konfliktvermeidung bei der Verwendung von mehreren SPI-Geräten auf einem Arduino UNO?
Ist es möglich, den SD-Kartenleser zuverlässig über Software-SPI zu betreiben, und wenn ja, welche Bibliotheken und Einstellungen werden dafür empfohlen?
Gibt es alternative Ansätze, wie ich den Barcode-Scanner und den SD-Kartenleser auf einfache Weise in einem Arduino-Projekt integrieren kann, ohne dass es zu Konflikten kommt?
Ich habe mir auch den Adruino Leonardo gekauft. Diesen hätte ich auch noch zu hause.
Ein alternativer vorgeschlagener Aufbau ist auch möglich.
Danke.
Beim Datenlogger habe ich den CS pin auf 10 gesetzt.
#include <SPI.h>
#include <SD.h>
#include <hidboot.h>
#include <usbhub.h>
// Pin-Konfigurationen
const int chipSelectSD = 4; // CS-Pin für die SD-Karte
const int chipSelectUSB = 9; // CS-Pin für das USB Host Shield
USB Usb;
HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
// Variable für den Barcode-String
String barcode = "";
// Klasse zur Verarbeitung der Tastatureingaben vom Barcode-Scanner
class KbdRptParser : public KeyboardReportParser {
void PrintKey(uint8_t mod, uint8_t key) {
uint8_t c = OemToAscii(mod, key);
if (c) {
if (c == '\r') { // Enter-Taste (Ende des Barcodes)
Serial.println("Gescannt: " + barcode);
checkBarcodeInDatabase(barcode); // Barcode prüfen
barcode = ""; // Barcode-String zurücksetzen
} else {
barcode += (char)c; // Zeichen zum Barcode-String hinzufügen
}
}
}
};
KbdRptParser Prs;
void setup() {
Serial.begin(9600);
Serial.println("Starte System...");
// USB Host Shield initialisieren
if (Usb.Init() == -1) {
Serial.println("USB Host Shield konnte nicht initialisiert werden. Überprüfe die Verkabelung.");
while (1); // Endlosschleife bei Fehler
} else {
Serial.println("USB Host Shield erfolgreich initialisiert.");
HidKeyboard.SetReportParser(0, &Prs);
}
// SD-Karte initialisieren
if (!SD.begin(chipSelectSD)) {
Serial.println("SD-Karte konnte nicht initialisiert werden. Überprüfe die Verkabelung und SD-Karte.");
} else {
Serial.println("SD-Karte erfolgreich initialisiert.");
}
}
void loop() {
Usb.Task(); // USB Host Shield Aufgaben verarbeiten
}
// Funktion zum Überprüfen des gescannten Barcodes in der Datenbank
void checkBarcodeInDatabase(String barcode) {
if (SD.exists("data.csv")) {
File dataFile = SD.open("data.csv");
if (dataFile) {
while (dataFile.available()) {
String line = dataFile.readStringUntil('\n');
int commaIndex1 = line.indexOf(',');
int commaIndex2 = line.indexOf(',', commaIndex1 + 1);
String fileBarcode = line.substring(0, commaIndex1);
String time = line.substring(commaIndex1 + 1, commaIndex2);
String setting = line.substring(commaIndex2 + 1);
if (fileBarcode == barcode) {
Serial.println("Barcode gefunden!");
Serial.println("Zeit: " + time);
Serial.println("Einstellung: " + setting);
dataFile.close();
return;
}
}
dataFile.close();
Serial.println("Barcode nicht in der Datenbank gefunden.");
} else {
Serial.println("Fehler beim Öffnen der Datei 'data.csv'.");
}
} else {
Serial.println("Datei 'data.csv' nicht gefunden. Überprüfe die Datei auf der SD-Karte.");
}
}