Teensy 3.2 & SD Card Module

Hallo miteinander,

habe ein Teensy 3.2 mit Fest verlöteten (ja war ne sch... idee) OctoWS2811 Adaptor.
Möchte da jetzt ein "SD Card Modul" anschließen.

Das >> SD-Karten-Modul <<

Anschließen würde ich das so:

SD Modul ...... Teensy
GND ................GND
CS .................... D10
MOSI ............... D11
SCK ................. D13
MISO ............... D12
5V .................... HIER HABE ICH EIN PROBLEM

Laut Teensy 3.2 Pins gibt es auf dem Bord selbst nur 3,3V.
Ich versorge den OctoWS2811 jedoch mit 5V, nehme ich dann die 5V von der Versorgung?

Gruß Mücke

SD arbeiten eigentlich mit 3,3V. Da ist ein Spannungsregler drauf.
Schau mal, on Du einen Adapter direkt für 3,3V findest oder eine Microsd direkt anschließt.

Gruß Tommy

ach ja, der 3.2 ist 5V tolerant, da kannst Du auch diesen nehmen.

Gruß Tommy

auf dem SD Modul gibt es 3,3V und 5V. habe jedoch im Internet gelesen das man lieber 5V verwenden soll.

daher wollte ich die 5V anschließen.

mein Problem ist tatsächlich das ich alles Löten muss, ich "De..." habe das alles verlötet, und hin und her Löten wollte ich vermeiden da ich darin nicht gerade der beste bin, .. .

Rot ist 3,3V
Grün ist 5V
SD-Power

Wie kommst Du auf die Idee mit den 5V.
Das Modul hat einen 3.3V Pin neben GND.

Quelle: Teensy tutorial : SD Card - M.B Raw

also for some SD card module like what i use in this tutorial , you must power it from 5V because it has a level shift IC , don't connect it with 3.3V it won't work !.

Daher bin ich auf die 5V gekommen.

Das ist ein anderes Modul.

for some SD card module like what i use in this tutorial , you must power it from 5V because it has a level shift IC

:wink:
Reichelt:
grafik

Blogspot:

OK, dann ziehe ich mein Frage zurück !

Ein Englisch ist wirklich nicht das Beste und ich hatte das erst etwas anders versenden.

Sorry.

Danke euch für die Geduld mit mir!

Wünsche noch einen Schönen Abend!

Gruß Mücke

Alles gut :wink:
Das Modul von ihm ist ein Micro-SD mit einem Levelshifter und ist je nachdem wirklich tricky - je nach Ausführung...
ps: https://deepl.com (Ich hab nicht mal english irgendwo gelernt...) der Tipp kam mal von @Tommy56 ...

Gut das man nachfragen kann wenn man was nicht verstanden hat.

Das mit deepl kenne ich und habe ich sogar installiert :see_no_evil:.

Gruß Mücke

1 Like

ich weiß das ich ich Müll gebaut habe in dem ich den OctoWS2811 Adaptor direkt auf dem Teensy 3.2 gelötet habe.

Ich bin am Überlegen wie ich die Pins D10, D11, D12 und D13 nach Assen legen kann, so das ich das SD Modul angeschlossen bekomme.

habe mir überlegt die einfach so nah als Möglich am Adaptor und Teensy abzuschneiden, dann kann ich die Löcher der Pins wieder frei machen und neue Pins einlösten.

Oder ist das ein schlechte Idee?

gruß Mücke

Warum willst Du die Stifte rauslöten?
Du hast doch genügend Platz oben.
Drauflöten und gut is. Kleine Spitze braucht es und ne ruhige Hand.
Habe ich mit meinen NRF's alle gemacht um Kontaktproblemen mit den Dupontkabeln entgegen zu wirken...

Da Pin 10-13 schon belegt ist, und ich angst habe das wenn ich so ein Stiftleiste drauf Löte (die nicht in die Löcher gesteckt werden dann zu schnell und leicht wieder abbrechen?

Denn Pin 10-13 hat ja schon einen Pin drin und der ist mit dem Adapter zusammen gelötet.

oder wie meinst du das genau?

Las das zusammengebaut.
Ich hatte extra geschaut, wo die Pins liegen :wink: Das wird nichts, wenn Du die da raushauen willst. Und laut dem Plan von Paul, sind die Pins auf dem OptoBoard einfach nur drauf, aber ungenutzt. (Da Du sync nicht benutzt ist 12 auch frei...)

Da wo die Pfeile gemacht hast, löte Kabel drauf - fertig.
Hab ich hier auch gemacht.

Ok das werde ich probieren mit den Anlöten der Kabel, ich habe die ganze zeit nur an Stiftleisten gedacht die ich da dran Löten könnte :roll_eyes:

Das ist ja cool, danke für den Link. das war mir die ganze zeit nicht so klar was wirklich benutzt wird und was nicht.

Wow, Respekt, da würde ich ja Amok laufen, ich kann so was nur sehr schlecht, (wilde Kabel in der Gegend, finde ich ganz schlimm, in meinen Ordnungswahn, bewundere alle die das können, würde da auch gerne etwas gelassener sein.

[EDIT]
habe noch die Bilder, wie es ausschaut für euch.
habe über alle Lötstellen auch einen Schrumpfschlauch drüber gezogen, sicher ist sicher :rofl:
Löten ist nicht mein Spezialität!

Löten_001


1 Like

Jetzt habe ich dich noch eine Frage :-(.

Bei den bespielen zur SD gibt es ja einige Beispiele:
Da habe ich mir das "SD - CardInfo" Beispiel raus gesucht.

Angeschlossen habe ich mein Modul ja so.
SD Modul ...... Teensy
GND ................GND
CS .................... D10
MOSI ............... D11
SCK ................. D13
MISO ............... D12
VCC3.3 ............ 3.3 V

Mir ist nicht ganz klar wo ich die Pins in dem Code angeben muss, damit der Code richtig funktioniert.
Bis jetzt bekomme ich immer nur Fehler kein Modul angeschlossen.

Ich verstehe auch nicht was mit "chipSelect" sein soll. :roll_eyes:

Das ist der Code aus dem Beispiel:

/*  SD card test 
Dieses Beispiel zeigt, wie man die Utility-Bibliotheken verwendet, auf denen die'
SD-Bibliothek basiert, um Informationen über Ihre SD-Karte zu erhalten.
Sehr nützlich, um eine Karte zu testen, wenn Sie nicht sicher sind, ob sie funktioniert oder nicht.
 	
Die Schaltung:
  * Die SD-Karte ist wie folgt an den SPI-Bus angeschlossen:
 ** MOSI - bei Arduino Uno/Duemilanove/Diecimila, Pin 7 bei Teensy mit Audiokarte
 ** MISO - pin 12 am  Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 am  Arduino Uno/Duemilanove/Diecimila, pin 14 am Teensy mit Audiokarte
 ** CS - hängt von Ihrem SD-Kartenschild oder -modul ab - pin 10 am Teensy mit Audiokarte
 		Pin 4 hier aus Gründen der Konsistenz mit anderen Arduino-Beispielen verwendet

 
 created  28 Mar 2011, by Limor Fried 
 modified 9 Apr 2012, by Tom Igoe
*/

 // die SD-Bibliothek enthalten:
#include <SD.h>
#include <SPI.h>

// Variablen mit Hilfe der Funktionen der SD-Utility-Bibliothek einrichten:
Sd2Card card;
SdVolume volume;
SdFile root;

// ändern Sie diese Einstellung entsprechend Ihrem SD-Schild oder Modul;
// Arduino Ethernet-Schild: Pin 4
// Adafruit SD-Schilde und -Module: Pin 10
// Sparkfun SD-Schild: Pin 8
// Teensy-Audio-Platine: Pin 10
// Teensy 3.5 & 3.6 & 4.1 on-board: BUILTIN_SDCARD
// Wiz820+SD-Karte: Pin 4
// Teensy 2.0: Pin 0
// Teensy++ 2.0: Pin 20
const int chipSelect = 4;

void setup()
{
  // KOMMENTIEREN SIE DIESE BEIDEN ZEILEN FÜR DAS TEENSY-AUDIO-BOARD AUS:
   //SPI.setMOSI(11); // Das Audioschild hat MOSI an Pin 7
   //SPI.setSCK(13); // Die Audio-Abschirmung hat SCK an Pin 14
  
 // Öffnen Sie die serielle Kommunikation und warten Sie, bis der Anschluss geöffnet wird:
  Serial.begin(9600);
   while (!Serial) {
    ; // Warten Sie auf die Verbindung zum seriellen Anschluss.
  }

  Serial.print("\nSD-Karte initialisieren...");

  // wir verwenden den Initialisierungscode aus den Utility-Bibliotheken
  // da wir nur testen, ob die Karte funktioniert!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("Initialisierung fehlgeschlagen. Zu prüfende Punkte:");
    Serial.println("* ist eine Karte eingelegt?");
    Serial.println("* Ist Ihre Verkabelung korrekt?");
    Serial.println("* Haben Sie den chipSelect-Pin so geändert, dass er zu Ihrem Shield oder Modul passt?");
    return;
  } else {
   Serial.println("Die Verkabelung ist korrekt und eine Karte ist vorhanden.");
  }

  // den Kartentyp drucken
  Serial.print("\nTyp der Karte: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unbekannt");
  }

  // Jetzt werden wir versuchen, das 'Volume'/die 'Partition' zu öffnen - es sollte FAT16 oder FAT32 sein
  if (!volume.init(card)) {
    Serial.println("Die FAT16/FAT32-Partition konnte nicht gefunden werden.\nStellen Sie sicher, dass Sie die Karte formatiert haben.");
    return;
  }

  // Typ und Größe des ersten Datenträgers vom Typ FAT ausgeben
  uint32_t volumesize;
  Serial.print("\nDatenträgertyp ist FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // Cluster sind Sammlungen von Blöcken
  volumesize *= volume.clusterCount();       // werden wir eine Menge Cluster haben
  if (volumesize < 8388608ul) {
    Serial.print("Größe des Datenträgers (Bytes): ");
    Serial.println(volumesize * 512);        // SD-Kartenblöcke sind immer 512 Byte groß.
  }
  Serial.print("Größe des Datenträgers (Kbytes): ");
  volumesize /= 2;
  Serial.println(volumesize);
  Serial.print("Größe des Datenträgers (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  
  Serial.println("\nAuf der Karte gefundene Dateien (Name, Datum und Größe in Bytes): ");
  root.openRoot(volume);
  
  // alle Dateien auf der Karte mit Datum und Größe auflisten
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {  
}

Gruß Mücke

Mir ist auch noch nicht klar, ob das überhaupt so geht, wie das von Dir gedacht war.

Aber zumindest gibt es ein Layout:Teensy and Teensy++ Pinouts, for C language and Arduino Software - und dazu scheint es zu passen.
10 wäre dann ChipSelekt, 11 MOSI, 12 MISO, 13 CLK
Variante 2:
9 ChipSelect, 7 MOSI, 8 MISO, 14 CLK

Welche Variante, das kann ich Dir nicht sagen...

Es hat etwas gedauert, aber nun ist mein Teensy 3.2 entstaubt :slightly_smiling_face:

Die Entwickler von Arduino möchten es Dir leicht machen und verwenden in den Bibliotheken Standardpins. Bei der Pinbelegung sind es die grün hinterlegten in schwarzer Schrift. Gleich kommt dann noch ein ABER!

SPI mit MOSI, SCK und MISO ist ein Bus, an den mehrere Teilnehmer angeschlossen werden können, die sich im CS unterscheiden. Beispielsweise könnten sich die SD-Karte und ein Display den SPI-Bus teilen, wobei CS vom Display an Pin 4 und SD-Karte an Pin 10 angeschlossen sein könnte. Der Display-Bibliothek mußt Du dann Pin 4 als CS mitteilen, der SD-Karten-Bibliothek Pin 10.

Siehst Du die Diskrepanz?

Die Mitteilung an die Bibliothek findet hier statt:
card.init(SPI_HALF_SPEED, chipSelect)

Klar?

Mit diesem Programm

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila, pin 7 on Teensy with audio board
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila, pin 14 on Teensy with audio board
 ** CS - depends on your SD card shield or module - pin 10 on Teensy with audio board
    Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SD.h>
#include <SPI.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// Teensy audio board: pin 10
// Teensy 3.5 & 3.6 & 4.1 on-board: BUILTIN_SDCARD
// Wiz820+SD board: pin 4
// Teensy 2.0: pin 0
// Teensy++ 2.0: pin 20
const int chipSelect = 10;

void setup()
{
  //UNCOMMENT THESE TWO LINES FOR TEENSY AUDIO BOARD:
  //SPI.setMOSI(7);  // Audio shield has MOSI on pin 7
  //SPI.setSCK(14);  // Audio shield has SCK on pin 14

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect.
  }


  Serial.print("\nInitializing SD card...");


  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  if (volumesize < 8388608ul) {
    Serial.print("Volume size (bytes): ");
    Serial.println(volumesize * 512);        // SD card blocks are always 512 bytes
  }
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 2;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  File root = SD.open("/");

  printDirectory(root, 0);

  Serial.println("done!");
}

void loop()
{
  // nothing happens after setup finishes.
}

void printDirectory(File dir, int numSpaces) {
  while (true) {
    File entry = dir.openNextFile();
    if (! entry) {
      //Serial.println("** no more files **");
      break;
    }
    printSpaces(numSpaces);
    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      printDirectory(entry, numSpaces + 2);
    } else {
      // files have sizes, directories do not
      unsigned int n = log10(entry.size());
      if (n > 10) n = 10;
      printSpaces(50 - numSpaces - strlen(entry.name()) - n);
      Serial.print("  ");
      Serial.print(entry.size(), DEC);
      DateTimeFields datetime;
      if (entry.getModifyTime(datetime)) {
        printSpaces(4);
        printTime(datetime);
      }
      Serial.println();
    }
    entry.close();
  }
}

void printSpaces(int num) {
  for (int i = 0; i < num; i++) {
    Serial.print(" ");
  }
}

void printTime(const DateTimeFields tm) {
  const char *months[12] = {
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
  };
  if (tm.hour < 10) Serial.print('0');
  Serial.print(tm.hour);
  Serial.print(':');
  if (tm.min < 10) Serial.print('0');
  Serial.print(tm.min);
  Serial.print("  ");
  Serial.print(months[tm.mon]);
  Serial.print(" ");
  Serial.print(tm.mday);
  Serial.print(", ");
  Serial.print(tm.year + 1900);
}

erhalte ich dann diese Ausgabe


Initializing SD card...Wiring is correct and a card is present.

Card type: SD2

Volume type is FAT16

Volume size (bytes): 998424576
Volume size (Kbytes): 975024
Volume size (Mbytes): 952
System Volume Information/
  WPSettings.dat                                   12    15:34  December 18, 2019
  IndexerVolumeGuid                                76    15:34  December 18, 2019
helpers.cpp                                      3861    14:33  January 28, 2022
helpers.h                                        2091    14:33  January 28, 2022
DigitalFilters.h                                14247    20:46  August 24, 2021
MCP23S17.cpp                                    17899    20:46  August 24, 2021
MCP23S17.h                                       3838    20:46  August 24, 2021
done!

Bei Dir wird die Anzeige inhaltlich abweichen.

Na super...; Wenn man sich auf eines verlassen kann. Dann ist es Staub :slight_smile:

Ja, er ist sogar wichtig!

Auf Elektronik und im Haushalt eher lästig, fliegt eine Menge Kram durch unsere Atmosphäre. Ich habe mal ein Buch zu der Thematik gelesen, welche Funktion der "Staub" hat.

Der Teensy animiert eigentlich einen LED-Streifen in der Kellerbar, die derzeit aber im Covid-Schlaf vor sich hin dämmert. Da bleibt der Staub halt liegen. Aber nun strahlt er wieder :slightly_smiling_face:

Mein Testchaos im Bild:

2 Likes