Arduino NANO, SPI 1.8" TFT mit SD stürzt bei SD.begin ab

Hallo liebe Bastler,

ich bin ein wenig am verzweifeln. Ich habe einen Arduino Nano v3, daran ist

  • eine RTC DS1302
  • ein MMA7361L 3-Achsen Beschleunigungssensor
  • und ein 1.8TFT SPI 128x160 Grafik LCD mit SD

Soweit funktioniert das auch alles ganz gut. Ist jedoch eine SD Karte eingesteckt und der Code kommt zu SD.begin, dann stürzt der Arduino ab und nichts geht mehr. Dabei gibt es ganz unterschiedliche Reaktionen je nach SD-Karte (mal blinkt die LED 13 ganz schnell oder es gibt einen Neustart). Verdrahtung habe ich mehrmals nun geprüft und ich würde behaupten, die passt.

Kann es sein, dass die Energieversorgung nicht ausreicht? Weiter ist mir aufgefallen, dass die Anzeigen auf dem LCD unfassbar langsam werden, sobald der Code bei SD.begin war (auch wenn keine Karte drin steckt, anders komme ich derzeit ja eh nicht weiter). Das ganze ist dann so lahm, dass man Texte beim Schreiben zusehen kann. Das ganze würde das Projekt quasi zum scheitern bringen. Kennt jemand das Problem?

Hier mein Testcode

/*  
 * Motorcycle Board Computer
 */

#define AX       A7 // Arduino-Pin an G-Sensor X
#define AY       A6 // Arduino-Pin an G-Sensor Y
#define AZ       A5 // Arduino-Pin an G-Sensor Z

#define SD_CS    4  // Arduino-Pin an SD CS

#define LCD_CS   3  // Arduino-Pin an Display CS   
#define LCD_DC   9  // Arduino-Pin an 
#define LCD_RS   8  // Arduino Reset-Pin

#define DS1302_SCLK_PIN   7    // Arduino pin for the Serial Clock
#define DS1302_IO_PIN     6    // Arduino pin for the Data I/O
#define DS1302_CE_PIN     5    // Arduino pin for the Chip Enable

#define rgb(r, g, b) (((short) r << 11) | ((short) g << 5) | (short)b) 

#include <Adafruit_GFX.h>    // Adafruit Grafik-Bibliothek
#include <Adafruit_ST7735.h> // Adafruit ST7735-Bibliothek
#include <SPI.h>
#include <SdFat.h>
#include <MemoryFree.h>
#include <DS1302.h>          // RTC

SdFat SD;
SdFile file;
Adafruit_ST7735 tft = Adafruit_ST7735(LCD_CS, LCD_DC, LCD_RS);  // Display-Bibliothek Setup
DS1302 rtc(DS1302_CE_PIN, DS1302_IO_PIN, DS1302_SCLK_PIN);

int   cal_x = 0,
      cal_y = 0,
      cal_z = 0,
      cur_x = 0,
      cur_y = 0,
      cur_z = 0,
      i = 1;
float ball_x = 10.,
      ball_y = 10.,
      ball_size = 10.;
     
void setup() {
  analogReference(EXTERNAL);
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  
  tft.initR(INITR_BLACKTAB); 
  
  tft.setRotation(1);
  tft.fillScreen(rgb(0, 0, 0));
  tft.setTextColor(rgb(31, 63, 31), rgb(0, 0, 0));
  tft.setTextWrap(true);
  tft.setTextSize(1);

  pinMode(AX, INPUT); 
  pinMode(AY, INPUT);
  pinMode(AZ, INPUT); 
  
  rtc.halt(false);
  //rtc.writeProtect(false);
  
  //rtc.setDOW(SATURDAY);
  //rtc.setTime(00, 55, 00);
  //rtc.setDate(2, 2, 2014);
 
  //rtc.writeProtect(true);
 
  tft.fillScreen(rgb(0, 0, 0));
  tft.setCursor(1, 1);
  tft.print("Kalibriere...");
  
  cal_x = analogRead(AX);
  cal_y = analogRead(AY);
  cal_z = analogRead(AZ);
  for (i = 0; i < 3; i += 1) {
    tft.print(" ");
    tft.print(3 - i);
    
    cal_x += analogRead(AX);
    cal_x /= 2;
    
    cal_y += analogRead(AY);
    cal_y /= 2;
    
    cal_z += analogRead(AZ);
    cal_z /= 2;
    
    delay(1000);
  }
  tft.print(" OK");
  
  delay(3000);
  
  tft.fillScreen(rgb(0, 0, 0));
  tft.setCursor(1, 1);
  tft.print("Free Memory:\n");
  tft.print(freeMemory());
  tft.print(" B");
  
  delay(3000);
  
  tft.fillScreen(rgb(0, 0, 0));
  tft.setCursor(1, 1);
  tft.print("Initialisiere SD Karte...\n");
  if (!SD.begin(SD_CS)) {
    tft.print("Konnte SD Karte nicht\ninitiieren!");
  } else {
    tft.print("SD Karte ist bereit!");
  }
  
  delay(3000);
  
  tft.fillScreen(rgb(0, 0, 0));
  tft.drawRect(0, 0, 160, 128, rgb(15, 30, 15));
}

void loop() {
    cur_x = analogRead(AX) - cal_x;
    cur_y = analogRead(AY) - cal_y;
    cur_z = analogRead(AZ) - cal_z;
    if (
      cur_x > 10 ||
      cur_y > 10 ||
      cur_z > 10
    ) {
      
      tft.fillRect(ball_x, ball_y, ball_size, ball_size, rgb(0, 0, 0));
      
      ball_x += cur_y / 10;
      ball_y -= cur_x / 10;
      
      if (ball_x < 1) {
         ball_x = 1; 
      }
      if (ball_y < 1) {
         ball_y = 1;
      }
      if (ball_x + ball_size > 159) {
         ball_x = 159 - ball_size; 
      }
      if (ball_y + ball_size > 127) {
         ball_y = 127 - ball_size; 
      }
      
      tft.fillRect(ball_x, ball_y, ball_size, ball_size, rgb(31, 0, 0));
      
      i += 1;
      if (i >= 159) {
        i = 1;
      }
    }
    if (millis() % 500 == 0) {
      tft.setCursor(1, 1);
       
      tft.print(rtc.getTimeStr());
      tft.print(" ");
      tft.print(rtc.getDateStr());
      tft.print("\nFree Memory: ");
      tft.print(freeMemory());
      tft.print(" B");
    }
}

Liebe Grüße
Tom

Ich habe gerade aus dem Keller mein Netzteil ausgekramt und an Vin des Arduinos geklemmt. Es lag wohl tatsächlich daran, dass die Energie zusammengebrochen ist, wenn auf die SD Karte zugegriffen wurde. USB reichte wohl nicht.

Ist eine SD Karte nun eingestöpselt, läuft der Code auch wieder rund und das Display wird schnell aktualisiert. Ist nun nur langsam, wenn keine SD Karte drin ist.

Dies nur, falls irgendwer auch mal auf dieses Problem stößt :slight_smile:

LG
Tom