Frage zu SD

Hallo,
möchte gerne eine Motorsteuerung mit einer SD-Karte einsetzen. Allerdings sollte der Motor nicht starten, wenn die SD -Karte nicht bereit oder nicht vorhanden ist. Habe folgenden Sketch bei Arduino gefunden. Wenn SD nicht initialisiert wird, soll eine LED angehen, das tut sie auch, aber wenn ich analogWrite(3,0) hinschreibe, startet der Motor trotzdem. Was sollte man ändern?

Serial.begin(9600); //Kommunikation herstellen,
  while (!Serial)
  {
    ;
  }

    Serial.print("Initialisierung der SD-Karte...");
  pinMode(10, OUTPUT);
  if (!SD.begin(10))
  {
    Serial.println("Fehlgeschlagen, SD-Karte nicht vorhanden");
    digitalWrite(13, HIGH);
    analogWrite(3,0);
    return;
  }
  Serial.println("SD-Karte initialisiert.");
}

Un Du glaubst wirklich das ist bessere als Kaffeesatzlesen? :wink: :wink: :wink: :wink:
Der Kodeschnipsel den Du uns gegönnt hast, sagt gar nichts aus. Wo ist die Motoransteuerung?
Außerdem wird pin 13 für die SPI-Schnittstelle der SD-Karte verwendet. Du kannst sie nicht als Ausgang für die LED verwenden.

Der SD Slot hat 2 Kontakte, einen um zu sehen ob der Schreibschutzschieber de SD-Karte aktiviert ist und den zweiten ob eine Karte eingelegt ist. Vieleicht unterstützt dein SD-Slot Adapter diese Funktionen.

Grüße Uwe

Wie wäre es damit analogWrite() nur zu machen wenn die SD-Karte initialisiert wurde? :slight_smile:

[Wie wäre es damit analogWrite() nur zu machen wenn die SD-Karte initialisiert wurde?]
Sehr guter Tipp, danke. Funktioniert.
Habe jetzt anders gemacht:

Serial.print("Initialisierung der SD-Karte...");
pinMode(10, OUTPUT);
if (!SD.begin(10))
{
Serial.println("Fehlgeschlagen, SD-Karte nicht vorhanden");
digitalWrite(13, HIGH);
analogWrite(3,0);
return;
}
Serial.println("SD-Karte initialisiert.");
analogWrite(3,pwm);
}

Eine Frage zu SD-Karte hinterher.
Als chipSelect wählt man bei Arduino den Pin 10. Heißt das, dass dieser Pin damit reserviert ist und nicht mehr verwendbar für andere Zwecke? Wenn 13 auch belegt ist, muss wohl auf einen anderen ausweichen. Habe kaum mehr übrig, da ich noch LCD Display anschließen will.

auch 11 und 12 braucht die SD-Karte.
Die 6 Analogen Eingänge können als digitale Pins verwendet werden.
grüße Uwe

User_ino:
Habe kaum mehr übrig, da ich noch LCD Display anschließen will.

Dann betreibe doch dein LCD Modul über I2C-Bus.
Da gibts günstige adapter Arduino IIC I2C Serielle Schnittstellen Board Modul f.1602 LCD 2004 LCD Display und schon hast du wieder jede Menge Pins frei.
welchen Motor willst du denn steuern?

Habe diesen hier:
http://www.conrad.de/ce/de/product/198330/C-Control-IC-LC-Display-Modul?ref=searchDetail. Der hat auch eine I2C Buchse, glaube damit dürfte es auch gehen.

Habe einen DC Motor von Crouzet, der mit 24 V eingespeist wird, bei Farnell bestellt.

richtig, der geht auch über I2C anzusteuern. Und schon hast du wieder pins frei! :smiley:
Du mußt nur die Lib "LiquidCrystal.h" gegen die "LiquidCrystal_I2C.h" tauschen, das LCD-Modul an die beiden I2C Pins SDA und SCL anschliessen.
Vermutlich mußt du die Adresse des LCD (in den Beispielen in der Lib meist 0x20) anpassen, je nach dem, wie bei deinem Modul die Jumper gesetzt sind.

Wenn ich aus der Library "LiquidCrystal_I2C.h" die Funktion LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows); in den Arduino Sketch einfüge schreibt der Kompiler: error: expected `)' before 'lcd_Addr'. Also die Adressierungsjumper A0, A1, A2 sind aktiviert ("open"), in der Tabelle heißt es Hex: 40. Schreibe ich das in die Funktion von oben rein?

Ich meine natürlich nicht "open", sondern "closed"

User_ino:
Wenn ich aus der Library "LiquidCrystal_I2C.h" die Funktion LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows); in den Arduino Sketch einfüge schreibt der Kompiler: error: expected `)' before 'lcd_Addr'. Also die Adressierungsjumper A0, A1, A2 sind aktiviert ("open"), in der Tabelle heißt es Hex: 40. Schreibe ich das in die Funktion von oben rein?

Bitte den ganzen Beispielsketch und alle Zeilen der Fehlermeldung.
Grüße Uwe

Ich glaube er versucht einfach den Konstruktor mit dessen Definition/Signatur aufzurufen, statt die korrekten Parameter zu übergeben.

Das muss so aussehen:

LiquidCrystal_I2C lcd(0x40, 16, 2);

Wobei der erste Parameter die Adresse ist, dann die Anzahl der Spalten und dann die Zeilen

Danach kann man das Display über die Variable lcd ansprechen

Zum Eistieg habe diesen Code hier ausprobiert:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x40,16,2); // 

void setup()
{
    lcd.init(); // initialize the lcd 

    // Print a message to the LCD.
    lcd.backlight();
    lcd.print("Hello, world!");
}

void loop()
{
}

Sehe nur Artefakte auf dem Display. Angeschlossen an GRD, 5 V, SCL UND SDA auf Urduino Uno.

Urk, gerade einen Fehler gemacht. Die Anleitung enthält auch noch irgendeinen Kram über ein LED Display :o

Beim LCD ist das ne Definitionssache. Wenn alle offen sind, hängen die Adress-Eingänge über die Pullups an High! Daher könnte es dann die Adresse 0x4E haben und 0x40 wäre alle Jumper gesteckt.

Habe schon beides probiert. Das Display hat ein mal aufgeleuchtet, Artefakte sind aber geblieben.