Главная > Arduino > Arduino + w5100 + SD

Arduino + w5100 + SD


1 мая 2013. Разместил: dimon
Посмотрим как записывать данные в файл на SD карточке, установленной в картридере Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot.
Для этого напишем простой скетч, который будет принимать по com-порту строку, выводить ее на экран 1602 вместе с количеством принятых строк, делать эхо этой строки в com-порт, и записывать ее в текстовый файл на карте памяти SD.
Т.к. шилд использует digital пины 4 (низкий уровень – выбор картридера на шилде), 10 (низкий уровень – выбор ethernet на шилде), 11 (SPI bus – MOSI), 12 (SPI bus – MISO), 13 (SPI bus – CLK), а в наших ранних примерах эти пины использовал дисплей, то придется переподключить дисплей на другие цифровые выходы.

Скетч с кучей комментариев, надеюсь, не требует дополнительных пояснений:
/*
Баловство с w5100 и com-портом
Будем принимать по com-порту строку, выводим ее на экран и
записывать в файл на SD карте

Оборудование:
- дисплей 1602, потенциометр для подсветки дисплея
- Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot
- SD карточка

Подключение дисплея 1602:
Контакт дисплея  	Контакт Arduino	             Значение
  1	                       GND                   Vss
  2                            5V                    Vdd
  3                            GND	             Vo (контрастность)
  4	                       digital 9	     RS
  5	                       digital 8             R/W
  6	                       digital 7             ENABLE
  11	                       digital 6	     DB4
  12	                       digital 5	     DB5
  13	                       digital 3	     DB6
  14                           digital 2	     DB7
  15	                       5V	             LED+
  16                           GND	             LED-

Подключение W5100:
Обмен данными между Ардуиной и Шилдом происходит по SPI.
Низким уровнем на digital выводе выбирает ведомое устройство на шине SPI:
выбор SD - digital 4
выбор ethernet - digital 10

 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 */
 
 
 
 // подключаем библиотеки
 #include <LiquidCrystal.h>    // для работы с LCD
 #include <SPI.h>              // для работы с SPI
 #include <SD.h>               // для работы с SD
// #include <Ethernet.h>       // для работы с Ethernet
 

 // инициализируем LCD, указывая контакты данных
 LiquidCrystal lcd(9, 8, 7, 6, 5, 3, 2);


// задаем переменные
boolean receiveFlag = false;      // флаг что было что-то принято через com-порт
String myString;                  // строка
char* FileName = "testfile.txt";  // имя файла с которым будем работать
File myFile;                      // класс File
int Count = 1;                    // счетчик
int selectEthernet = 10;          // выбор ведомого на шилде - Ethernet
int selectSd = 4;                 // выбор ведомого на шилде - SD

// включим Ethernet
#define SWITCH_TO_W5100 digitalWrite(selectSd,HIGH); digitalWrite(selectEthernet,LOW);
// включим SD
#define SWITCH_TO_SD digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,LOW);
// выключим и SD и Ethernet
#define ALL_OFF digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,HIGH);

 
 void setup() {
   
   
   // красивая "загрузка" программы при старте :)
    lcd.begin(16, 2);
    lcd.print("Loading");
    delay(500);                // ждем 0.5 секунды
    lcd.print(".");
    delay(500);                // ждем 0.5 секунды
    lcd.print(".");
    delay(1000);               // ждем 1 секунду
    lcd.clear();               //очистка экрана
  
 
    Serial.begin(9600); // инициализируем передачу данных по COM-порту 
                           // на скорости 9600 бод
    Serial.println("Start "); //   

    // Задаем режим работы портов  
    pinMode(selectEthernet, OUTPUT);
    pinMode(selectSd, OUTPUT);
    // высокий уровень на обоих - не выбран ведомый на SPI
    digitalWrite(selectEthernet, HIGH);
    digitalWrite(selectSd, HIGH);

    // инициализация SD
    if (!SD.begin(selectSd)) Serial.println("initialization SD failed!");
    

     
 }
 
 void loop() {

        
     
    // проверяем буфер com-порта - было ли что-то принято
    if (Serial.available() > 0)     //если есть доступные данные считываем строку
    {  
            
        while (Serial.available() > 0) 
        {
          int inChar = Serial.read();  // считываем символ
          myString += (char)inChar;    // формируем строку
        }  
          
 
        // устанавливаем флаг что нужно обработать принятые данные
        receiveFlag = true; 
     
        // Serial.flush(); // очистим буфер
       
    }




    // если флаг receiveFlag установлен - значит что-то приняли. Обработаем: 
    if (receiveFlag == true)
    {
      
      // выводим принятую переменную на экран
      lcd.clear();              //очистка экрана
      
      lcd.setCursor(13, 0);     // устанавливаем курсор в 12-ом столбце, 1 строке
      lcd.print(Count);         // выводим кол-во итераций

      lcd.setCursor(0, 1);      // устанавливаем курсор в 0-ом столбце, 2 строке
      lcd.print(myString);      // выводим myString на экран

      // эхо в com-порт
      Serial.print("String: "); // 
      Serial.println(myString); // эхо myString в com-порт
	 

      // записываем в файл

        // выберем ведомого SPI = включим SD        
        SWITCH_TO_SD;
        
        // Откроем файл на запись
        myFile = SD.open(FileName, FILE_WRITE);

        // если файл открылся - запишем в него данные
        if (myFile) 
        {
            myFile.println(myString);
    	    // закроем файл
            myFile.close();
        } else {
            // если файл не открылся - рапортуем об ошибке
            Serial.println("error opening file");
        }
        
        // отключим SD (отключим все)
        ALL_OFF; 


      // подотрем за собой :)
      receiveFlag = false;      // сбрасываем флаг
      myString = "";            // очистка строки
      
      Count++;         // инкремент счетчика 
      
      
    }
	 
	 
     delay(1000);     // задержка перед повторением 


 }


Com-порт, переданные строки:
Com-порт и эхо переданных строк


Тестовый файл на SD карте - те же самые строки:
Тестовый файл на SD карте с этими же строками


Тестовый стенд на макетке:
Тестовый стенд на макетке - arduino + w5100 shield + LCD1602Тестовый стенд на макетке - arduino + w5100 shield + LCD1602


Обратите внимание на первую строку - цифра 8 - это количество принятых строк.

Вернуться назад