Catalex SD & SoftSPI

In einem früheren Beitrag hatte ich erwähnt, dass ich Daten eines Sensors auf einer SD Karte speichern wollte, dies aber nicht möglich war, da das Catalex SD Card Modul den SPI Bus blockierte, mit dem auch ein anderes benötigtes Modul verbunden war.

Nach etwas Arbeit und trouble shooting läuft es nun. Für alle, die das selbe Problem haben (dass das Catalex Modul nicht mit anderen SPI-Geräten verwendbar ist) habe ich hier die Lösung!

Vorweg meine Idee: Ich möchte zwei Arduinos verwenden, das eine dient als Sender, das andere als Empfänger von Daten. Diese Daten nehmen ich am Sender mit Hilfe von Temperatursensoren auf und schicke sie mit dem NRF24L01+ Wireless-Modul an den Empfänger. Dieser nimmt sie mit dem gleichen Modul auf und zeigt sie an einem Display an. Zusätzlich werden sie noch auf dem SD Card Modul von Catalex gespeichert.

Catlex

Der Grund für diesen Aufwand ist, dass das SD Kartenmodul von Catalex (v1.0) den SPI-Bus blockiert, da es das SN74LVC125A-Modul als Level-Shifter nutzt. Leider wurden die nötigen Pins, um anderen Geräten die Kommunikation auf dem BUS zu ermöglichen, auf Ground gelötet. Deshalb blockiert das SD-Karten-Modul den BUS. Die einzige Lösung es trotzdem mit anderen SPI-Geräten zu nutzen ist es mit einer Softwarelösung auf andere Pins zu setzen. So erzeugt man quasi 2 SPI-Bus-Systeme auf einem Arduino.

Der elektrische Aufbau

Die Temperatursensoren und den Display habe ich beide hier vorgestellt. Die Details zum NRF24-Modul sind hier zu finden und der Inhalt zum SD Card Modul soll in diesem Beitrag folgen.

Der Aufbau benötigt neben den Modulen auch ein paar andere Komponenten.

  • Sender
    • 1 Arduino Uno/Nano
    • 1 NRF24L01+ Wireless Modul
    • 2 DS18B20 OneWire Temperatursensoren
    • 1 4.7kΩ Widerstand für den Datenbus
  • Empfänger
    • 1 Arduino Uno/Nano
    • 1 NRF24L01+ Wireless Modul
    • 1 SD Card Reader Modul (Catalex v1.0)
    • 1 I2C Display (16×2)
Der Sender

Transmitter_Shematic

Transmitter

* den Button einfach ignorieren!

Der Empfänger

Receiver_Shematic

Receiver

Der Code

Das Programm befindet sich natürlich auf GitHub.

Doch bevor man das Programm auf das Arduino laden kann benötigt man ein paar Programmbibliotheken, damit die Module auch richtig funktionieren. Alle nötigen Libs findet man auf GitHub im Verzeichnis ‚Libraries‘.

Das Catalex SD Card Modul wird an den SoftSPI-Bus angeschlossen. Dies ist nichts anderes als eine Imitation des Hardware-SPI-Bus, nur eben von der Software verwaltet. Hierzu muss man die SdFat-Bibliothek etwas editieren, genauer das ‚SdFatConfig‘-File.

Zu editierender Inhalt: Zeile 81, #define SD_SPI_CONFIGURATION 3 (Standard 1).

Ich habe dies bereits getan, sodass man nur mehr alle Bibliotheken des Ordners auf GitHub in das Standardverzeichnis von Arduino kopieren muss.

Transmitter.ino

Der Transmitter nimmt in definierten Zeitintervallen die Messwerte der Sensoren auf und sendet sie über das RF24 an den Empfänger. Für mehr Informationen verweise ich auf die oben genannten Beiträge.

Receiver.ino

Die Daten werden vom RF24 empfangen und auf dem Display dargestellt. Um sie dann auf der SD Karte zu speichern muss man das Textfile auf der Karte wie folgt aufrufen:

file.open("Temp.txt", O_WRITE | O_CREAT | O_AT_END);

Das erste Attribut gibt den Dateinamen an. Das zweite steht für die Art des Zugriff. In diesem Fall passieren 3 Dinge:

  • O_WRITE: Es wird auf die Karte geschrieben und nicht gelesen.
  • O_CREAT: Existiert keine Datei namens ‚Temp.txt‘ wird eine leere erzeugt.
  • O_AT_END: Es wird am Ende der Datei weiter geschrieben. Andernfalls würde man alle Daten in der Datei überschreiben.

Zu Beginn der Datei muss man zusätzlich noch definieren, wo man den SoftSPI-Bus verwenden will. Ab Zeile 55 wird dies erledigt.

const uint8_t SOFT_MISO_PIN = 4;
const uint8_t SOFT_MOSI_PIN = 5;
const uint8_t SOFT_SCK_PIN = 6;
const uint8_t SD_CHIP_SELECT_PIN = 7;

Im großen und ganzen war es das. Es ist, wie man sieht, nicht besonders schwer alles unter einen Hut zu bringen, doch bis man alles nötige zusammen hat dauert es schon etwas. Ich hoffe mal das hilft all‘ jenen die das gleiche Problem haben wie ich.

Vielleicht noch eine kleine Anmerkung zum Schluss. Da das SD Modul nun am SoftSPI-Bus hängt kann man den „normalen“ SPI-Bus wieder ganz normal und ohne Einschränkungen nutzen. Die Verwendung beschränkt sich nicht auf SD+RF24, sondern man kann jede Kombination nutzen, etwa SD+RFID.

Bei Fragen ist ein Kommentar immer erwünscht!

Advertisements

7 Gedanken zu “Catalex SD & SoftSPI

  1. Vielen lieben Dank für die schnelle Antwort !
    ich hoffe ich kann Dir auch mal helfen wenn Du Deinen USB Stick mal mitgewaschen hast 🙂
    Vielen lieben Dank ! Das brauchst Du nicht , dann nehme ich mal das PIN 13 blinken als positive Nachricht auf 🙂

    Ich habe eine Email geschickt , bitte bescheid sagen wenn ich noch etwas schicken soll. 🙂

    Mit freundlichen Grüßen
    Christian

    Gefällt mir

  2. Momentan giebt der Sketch die Fehlermeldung mit Abbruch :
    „LiquidCrystal_IC2 lcd (0x27, 16, 2); previously declared here.“ Ich danke mal das ich nur meine Libraries aufräumen muss 🙂 … Ich Lade das Sketch mal auf einem anderen Rechner hoch…
    Mit freundlichen Grüßen
    Christian

    Gefällt mir

  3. Hallo !

    Vielen lieben Dank für die Aufklärung des SPI Problems …
    Ich sitze vor einem Projekt ( Arduino Mega ) und 2 SPI Geräten ( einmal den NRF transceiver und einmal ein SD Karten Modul./ Drucksensor BMP180 )…
    Ich habe leider nur einen Arduino Nano , einen UNO und 2 Mega.
    Wie könnte ich Dein Projekt zu Stande bekommen mit 2 meiner Arduinos ?
    Und was noch wichtiger ist , mein Sensor den ich anschließen möchte ist ein BMP180 Drucksensor.
    ( Ich habe auch das gleiche LCD das mit GND VCC SDA SCL betrieben wird )
    Könntest Du mir bitte weiterhelfen oder mir sagen was für Änderungen ich in Deinem Code machen müsste ? Oder darf ich Dir ein Paar Fotos schicken damit Du siehst was ich unbedingt zusammenwürfeln möchte ?
    Für etwaige Hilfen von Deiner Seite kann ich mich mit Daten Recovery Services revancieren …

    Vielen Dank !
    Mit freundlichen Grüßen
    Christian ( Microwhatt )

    Gefällt mir

    1. Freilich kann ich dir dabei helfen, schick mir einfach mal eine Mail (ev. mit paar Bildern deines Aufbaus) und deinem Programmcode, den verwendeten Modulen und wie du es verkabelt hast.

      Bei deinen vorhandenen Arduinos kann ich dir sagen: Nano & Uno nutzen den gleichen Prozessor-Typ. Daher musst du bei beiden weder im Programm, noch in der Pinbelegung was ändern -> deshalb nutze ich so gerne das Nano, da es kleiner aber genau so gut wie das Uno ist. Mit dem Mega hab‘ ich bis jetzt zwar keine Erfahrungen (es ist mir einfach zu groß, da kann man ja gleich einen Raspberry nehmen ^^), aber es wird schon nicht so umständlich sein, den Code zu ändern.

      Mail: deloarts@outlook.com

      Gefällt mir

      1. Supernett ! Vielen lieben Dank !
        Ich schreibe Dir eine Email. 🙂 Momentan habe ich den Transmitter aufgebaut und das Sketch hochgeladen. Im Serial Monitor erscheint nichts. ( Ich denke das ist normal ? )
        Nur ein kleines Blinken (blaue LED ) am Arduino nano ist zu sehen…
        Ich mache mich jetzt dran den Mega zu benutzen weil der Uno noch für ein Projekt verbaut ist .. ( Fals es besser ist dann nehme ich den auseinander 🙂 )
        ( Der schwierige Teil wird wohl für mich sein anstatt eines one wire Temperatur Sensors muss ich einen BPM180 Drucksensor einbauen ) Ich brauche keine Temperatur Daten von Ihm sondern nur Druckdaten 🙂 … Aber ich baue es jetzt erst mal so wie Du beschrieben hast. Ich schicke Dir mal eine Email sobald ich alles verstöpselt habe 🙂
        Mit freundlichen Grüßen
        Christian

        Gefällt mir

        1. Das Blinken der LED kommt daher, dass Pin 13 des Boards hardwareseitig mit dieser verbunden ist, der aber hier gleichzeitig als SCK-Pin dient. Das ist bei SPI die Clock, also der Taktgeber für die Kommunikation, dass sich beide Partner auch verstehen können. Deshalb siehst du in diesem Fall das Blinken.

          Im seriellen Monitor siehst du nichts, weil ich beim Sender darauf verzichtet hab, wenn du möchtest kannst du dir aber für Debug-Zwecke (etwa zum Anzeigen der Sensordaten am PC) die Daten an den PC schicken lassen. Das mache ich ganz gerne bei komplexen Programmen, um zu sehen ob eh alles abgearbeitet wird.

          Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s