Изучаем Arduino: инструметы и методы технического волшебства - [71]

Шрифт
Интервал

C.

На плате расширения SparkFun MicroSD shield (http://www.exploringarduino.com/parts/spark-fun-microSD-shield) (рис. 13.12) установлен только слот SD-карты. Тем не менее, предусмотрено монтажное поле для припаивания дополнительных компонентов. Вывод CS SD-карты подключен к контакту 8, его необходимо указать при использовании библиотеки SD с этим переходником.

Рис. 13.12. Плата расширения SparkFun MicroSD shield

13.2.2. SPI-интерфейс SD-карты

Как упоминалось ранее, связь платы Arduino с SD-картой осуществляется через SPI-интерфейс: контакты MOSI, MISO, SCLK (тактовые импульсы) и CS (выбор чипа). Для выполнения примеров этой главы мы будем использовать библиотеку SD. Это предполагает, что задействованы аппаратные SPI-контакты на плате Arduino, а в качестве CS назначен или контакт по умолчанию или определенный пользователем. Библиотека SD для правильной работы требует установки контакта для CS по умолчанию в качестве выхода, даже если для CS задан другой вывод.

В случае Uno это вывод 10, для платы Mega это вывод 53. Описанные далее примеры собраны на плате Arduino Uno с выводом CS, заданным по умолчанию.

13.2.3. Запись на SD-карту

Библиотека SD позволит создать несложный пример записи данных на SD-карту.

Будем получать данные с датчиков и записывать на карту. Данные хранятся в фай

- 281 -

ле под названием log.csv, в дальнейшем его можно открыть на компьютере. Важно отметить, что при форматировании карты в F АТ 16 имена файлов должны быть записаны в формате "8.3", т. е. расширение должно состоять из трех символов, а имя файла - не более чем из восьми символов.

Убедитесь, что переходник SD правильно подключен к плате Arduino и в него установлена SD-карта. Для Cooking Hacks Micro SD shield это будет выглядеть так, как на рис. 13.13 (используются контакты 8-13 Arduino и перемычка находится на правой стороне).

Рис. 13.13. Подключение платы расширения Cooking Hacks Micro SD shield

Для отладки программы будем контролировать статус нескольких функций библиотеки SD. Например, для установки связи с SD-картой необходимо вызвать следующую функцию (листинг 13.1 ):

Листинг 13.1. Функция инициализации SD-карты

if (!SD.begin(CS_pin))

{

Serial.println("Card Failure");

return;

}

Serial.println("Card Ready");

- 282 -

Обратите внимание, что мы не просто инициализируем обмен с картой с помощью функции so.begin (CS_pin), а получаем статус выполнения этой функции. При успешной инициализации программа выдает в последовательный порт сообщение об этом, в противном случае выводится сообщение о неуспехе и команда возврата останавливает дальнейшее выполнение программы.

При записи строки в файл подход аналогичный. Например, если вы хотите записать новую строку "hello" в файл, код будет выглядеть так, как в листинге 13.2.

Листинг 13.2. Функция записи информации на SD-карту

File dataFile = SD.open("log.csv", FILE_WRITE);

if (dataFile)

{

dataFile.println("hello");

dataFile.close();

// Данные не записываются,

// пока соединение не будет закрыто

}

else

{

Serial.println("Couldn't open log file");

}

В первой строке расположена команда создания нового файла (или открытие, если он уже существует) с названием log. csv. Если файл создан/открыт успешно, переменная dataFile получит значение true, и начнем процесс записи данных в файл.

В противном случае сообщаем об ошибке в последовательный порт. Запись строки данных в файл осуществляет функция da taFile.println(); чтобы предотвратить добавление символа новой строки, вызывайте функцию dataFile.print(). Все данные направляются в буфер и записываются в файл только после выполнения команды dataFile.close().

Теперь напишем простую программу, которая создает на SD-карте файл log.csv и каждые 5 секунд записывает в него через запятую метки и какое-либо сообщение (листинг 13.3). В каждой строке файла CSV будет записана временная метка (текущее значение функции millis()) и некоторый текст. Программа может показаться вам бесполезной, но на самом деле это важный пример, подготавливающий взаимодействие с реальными датчиками, чем мы займемся в дальнейших проектах.

Листинг 13.3. Тест записи данных на SD-карту- write_to_sd.ino

// Запись данных на SD-карту

#include

// Подключение контактов

// MOSI = pin 11

// MISO = pin 12

// SCLK = pin 13

- 283 -

// Подключение контакта выбора CS

const int CS_PIN = 10;

// Контакт для питания SD-карты

const int POW_PIN =8;


void setup()

{

Serial.begin(9600);

Serial.println ("Initializing Card");

// Установить CS как выход

pinMode(CS_PIN, OUTPUT);

// Для питания карты используется вывод 8, установить HIGH

pinMode(POW_PIN, OUTPUT);

digitalWrite(POW_PIN, HIGH);

if ( !SD.begin(CS_PIN))

{

Serial.println("Card Failure");

return;

}

Serial.println("Card Ready");

}

void loop()

{

long timeStamp = millis();

String dataString = "Hello There!";

// Открыть файл и записать в него

File dataFile = SD.open("log.csv", FILE_WRITE);

if (dataFile)

{

dataFile.print(timeStamp);

dataFile.print(",");

dataFile.println(dataString);

dataFile.close(); // Данные не записаны,

// пока соединение не закрыто!

// Вывод в монитор для отладки

Serial.print(timeStamp);

Serial.print(",");

Serial.println(dataString);