Arduino UNO: USB Host Shield und SD-Lese Konflikt

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.");
  }
}

Willkommen im Forum :wink:

Was für einer? Ein Link ohne Copy und Paste wehre gut.
Wo zu SD Kartenleser und der Datenloger Schild?
Noch was mit dem SD Modul machst du dir nur die SD Karten kaputt es ist einer für 3,3V System dieser ist für 5V System.

Ich kann dir gleich sagen, ChatGPT ist ein rotes Tuch hier :wink:

Dann frage ich ganz einfach mal:
Warum lässt du ChatGPT das Problem nicht lösen / reparieren ?

1 Like

Hallo fony,

Danke :).

Barcodescanner

Das ChatGpt für viele ein rotes Tuch ist, kann ich mir vorstellen. Es ist aber für Anfänger eine gute Unterstützung und es wäre Vergäudung das Tool nicht zu nutzen. Es ist nunmal da, wie früher die Bücher. :slight_smile:

Hallo HotSystems,

ich verstehe gerade die Andeutung nicht. Scheinbar kann ChatGpt einen Fachmann ja nicht ersetzen :slight_smile:

Nein def. nicht. ChatGPT macht dir deine Arbeit, meist schlecht und du denkst super.
Beim Buch lesen musst du anschließend selbst Gehirnschmalz einsetzen.

Und ja, ChatGPT kann keinen Fachmann ersetzen. Noch nicht.

Nur es fehlt dem immer noch sehr viel zu Buch, wo möglich in paar Jahren schon.
90% Code vom denen funktionieren nicht, noch nicht, ausgenommen eine LED blinken lassen, wo schon bei drei kam Knudelnudel heraus, so viel zum ChatGPT.

Hallo zusammen,

es ist traurig, aber auch verständlich, dass einige so reagieren. Man hat Jahre Bücher gewelzt und dann kommt eine KI, die das ganz wissen scheinbar zu nichte und überflüssig macht, welches man sich beigebracht hat. Doch seid ohne Sorg. Ihr als erfahrene denkt, es macht euch überflüssig. Es ist aber bei weitem nicht so. Sprecht mit den Leuten die damit anfangen, ChatGPT ist eine unterstützung, aber kein Ersatz. Alle Stichwörter und Punkte muss man erst durch Foren und auch Bücher herausfinden. Und ja ich besitze auch welche. Und ich bin lieber ehrlich und sage es, was der größte Teil hier und wo anders nicht macht und ich weiß jetzt leider auch warum. Wenn es nicht gewollt ist, dann Sorry.
Dann weiß ich für die nächsten Foren Bescheid, dass ich lieber so tue als ob ich das Tool nicht kenne.

ChatGpt ist kein Ersatz sondern nur eine Unterstützung.

Und bevor was zur Rechtschreibung kommt, greife ich auch schonmal vor. Ich weiß, dass Rechtschreibfehler vorhanden sind.

:rofl: jetzt schreib mall was geht was geht nicht.
Mit den Schildern waren hier schon öfters Probleme, gerade zwei SD Module kommen sich gerne in Quere. Habe noch nie versucht zwei auf einem System benutzen, wurde das gelesen?

Keine Angst, die meisten denken nicht so.

Es gibt Card-Reader da funktioniert der CS Pin nicht. Der ist dauernd auf LOW

Das kommt noch dazu.

Es gab/gibt auch div. Module, die schalten die MISO-Leitung nicht hochohmig, wenn sie nicht aktiv sind und blockieren so den Bus.

Gruß Tommy

Und all das muß berücksichtigt werden.

Da hilft nur durchmessen. Modul inaktiv schalten (CS auf Vcc), über einen Widerstand (10 kOhm) wechselweise Vcc und GND auf MOSI legen und jeweils messen, was da raus kommt. Für die nicht hochohmig-schalten-Variante. Diesen Test am Besten ohne MC für jedes beteiligte Modul.

Gruß Tommy

1 Like

Genial einfach :wink:

Hallo fony,

danke für die Antwort. Ich hatte erst den Datenlogger, dieser funktioniert auch alleine, mit USB Host shield aber wieder nicht. Da ich dann gelesen habe, dass der CS10-Pin von beiden benutzt wird, dachte ich mir, dass ich mir den SD-Kartenleser, wenn ich diesen auf Pin 4 lege funktionieren sollte. Tat es aber nicht :).

danke für die Info mit den 3,3V. Dieser funktioniert Glücklicherweise noch. Meine Unwissendheit, dachte er zieht sich die 3,3V vom Pin und nicht die 5V. Werde es tauschen.

Hallo HotSystems,

danke für die Hinweise.
Müsste der Card Reader, dann auch nicht funktionieren, wenn dieser alleine auf dem Arduino ist?
Und Sorry wenn ich etwas zu Rau war.

Hallo Tommy56,

danke für die Antwort und Hinweise. Ich mache mich mal schlau, was dass zu bedeuten hat und Messe es dann durch. :slight_smile:

Da wird sich die Gruppe freuen wenn es weiter geht :slight_smile:

Mach den auf 5 bei mir auf Nano und Mega wollte die Lib unbedingt Pin5 haben, nicht fragen warum :wink:

hätte auch nichts gebracht, der Uno feuert auf die SD mit 5V, es wird nur der Strom begrenzt durch die Widerstände, uralte SD karten bis 500MB Konten damit leben, die neuen funktionieren vor erst, nur nicht lange, und zum testen karten bis 32GB nutzen!

Ja nur wie oben keine zu große SD zum Test!

Danke Fony,

SD-Kartenleser wird bestellt. Probiere dann morgen mal Pin 5 aus, :+1:

Okay, passt aber. Ich habe eine 16GB. Trotzdem danke für die zusätzliche Info.

Eigentlich müsste er alleinstehend funktionieren. Ich habe allerdings selbst noch keinen gehabt.

Und alles gut, kein Problem.