Arduino Due mit Ethernet & SD - Shield
Um ein kombiniertes Ethernet & SD-Karten Shield mit dem Arduino zu betreiben müssen beide Controller Ethernet sowie auch SD-Karte über die SPI angesprochen werden. Damit dies ohne Probleme funktioniert müssen die Shields aktiviert bzw. deaktiviert werden.
Ansprechen der SD-Karte und des Ethernetmoduls
Ein reines Ethernet-Shield kann mit den Arduino-Beispielen problemlos in Betrieb genommen werden. Auch beim reinen SD-Karten Shield sind keine Probleme zu erwarten. Wird ein komnbiniertes Shield verwendet, das sowohl einen Ethernet- wie auch einen SD-Karten Baustein mitbringt, müssen die Bausteine im Quellcode dynamisch aktiviert und deaktiviert werden.
Folgender Sketch kann hierfür verwendet werden :
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
// Matching SD in Arduino Ethernet shield: pin 4
const int chipSelect = 4;
// Text to be read from SD card
String text1;// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
static byte arduinoMAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
static IPAddress ArduinoIPAddress(192,168,1,230);
EthernetServer telnetServer = EthernetServer(80);// Matching pin to enable SD card and disable Ethernet
void ethEnable()
{
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
pinMode(10, OUTPUT);
digitalWrite(10, LOW);
}
// Matching pin to enable Ethernet and disable SD card
void sdEnable()
{
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
}
// Initialization and reading of SD card
void sdCARD_INIT()
{
Serial.print("\nInitializing SD card...");
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card is 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");
} // Opening 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
volumesize *= 512; // SD card blocks are always 512 bytes
Serial.print("Volume size (bytes): ");
Serial.println(volumesize);
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE); // reading a file
if (file.open(root, "PRINT00.TXT", O_READ)) {
Serial.println("Opened PRINT00.TXT");
}
else{
Serial.println("error reading PRINT00.TXT");
//error("file.open");
}
Serial.println();
// printing text inside the file
int16_t c;
while ((c = file.read()) > 0)
{text1 = text1 + char(c);}
Serial.println();
Serial.println(text1);
}void Ethernet_IP_CONFIG()
{
//Changing the IP address for test
ArduinoIPAddress[0] = 192;
ArduinoIPAddress[1] = 168;
ArduinoIPAddress[2] = 0;
ArduinoIPAddress[3] = 166;
delay(150);
Serial.println(ArduinoIPAddress);
Serial.println("\nNew IP address...Done");
}
void setup()
{
// Open serial communications:
Serial.begin(9600);
// Enable SD card to read text in a file
sdEnable();
sdCARD_INIT();
Ethernet_IP_CONFIG();
// start the Ethernet connection and the server:
Serial.println("starting the Ethernet connection and the server");
ethEnable();
Ethernet.begin(arduinoMAC, ArduinoIPAddress);
telnetServer.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = telnetServer.available();
if (client) {
Serial.println("new client");
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// add a meta refresh tag, so the browser pulls again every 5 seconds:
client.println("<meta http-equiv=\"refresh\" content=\"5\">");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
// The following line was originally the printing of the text "analog channel"
// Now will be the text inside the file in SD card "canal analogico"
client.print(text1);
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>"); }
// give the web browser time to receive the data
delay(10);
// close the connection:
client.stop();
Serial.println("no client connected");
}
Der Sketch gibt eine Kurzinfo zur SD-Karte aus und eröffnet anschließend einen Webserver auf der IP-Adresse 192.168.0.166 auf dem Werte der analogen Eingänge ausgegeben werden. Der Sketch kombiniert zwei Beispiele aus der Arduino IDE.
Die Bildergalerie zeigt einen Arduino Due mit aufgesetztem kombiniertem Ethernet- und SD-Shield.