При создании некоторых проектов у нас может возникнуть ситуация когда нам необходимо посмотреть какие-либо данные. И зачастую памяти микроконтроллера не хватает. В этой ситуации для сохранения данных мы можем использовать внешнюю карту памяти.
Модули, позволяющие сохранять данные на карту памяти, как правило, используют шину SPI, заняв у микроконтроллера 4 вывода. К тому же они являются достаточно крупными устройствами, что исключает их использование в малогабаритных устройствах.
Решением проблемы может быть использование OpenLog – миниатюрный модуль для сохранения данных на карте microSD. OpenLog подключается к плате с помощью шины UART, поэтому мы можем подключиться к нему, используя только два вывода микроконтроллера.
На самом деле для сохранения данных достаточно даже одного вывода – необходимо вывод TX микроконтроллера соединить с выводом RX OpenLog.
Подготовка карты памяти к работе с модулем OpenLog
Для работы с OpenLog мы можем использовать любую microSD карту, емкость которой находится в диапазоне от 64 МБ до 64 ГБ, но быстрее всего модуль работает с картами до 16 ГБ. Карта должна быть отформатирована в формате FAT (желательно FAT32). Эту операцию можно без проблем выполнить с помощью операционной системы Windows.
В OpenLog есть светодиод, отслеживающий ошибку карты или ее отсутствие. Когда светодиод мигает подряд 3 раза, то это означает, что модуль не может связаться с картой. В этом случае, как правило, достаточно просто отформатировать карту.
Подключение OpenLog к Ардуино
После того как мы подготовили нашу microSD карту, мы можем вставить ее в слот модуля. Однако прежде чем мы это сделаем, стоит припаять к плате контактную гребенку. Достаточно будет 4 контакта OpenLog, но мы припаяем 6 контактов, чтобы иметь возможность использовать дополнительные функции модуля. Модуль, с которым мы будем работать, представлен ниже.
Кратко обсудим, как подключить OpenLog к Ардуино
Вывод GRN является выводом сброса. Если подать на этот вывод логический высокий уровень, то это перезагрузит модуль. Это довольно важно, поскольку перезагружая чип, мы можем удобно перенести сохраненные данные в новый файл.
- Вывод RXI — это вывод, используемый для приема данных от микроконтроллера. Его необходимо подключить к TX платы Ардуино.
- Вывод TXO — это вывод передачи данных. Его необходимо подключить к RX платы Ардуино.
- Выводы VCC и GND, конечно же, являются выводами питания. Здесь стоит упомянуть, что OpenLog работает при напряжении от 3,3 до 12В, но наиболее оптимальный диапазон является 3,3…5В.
- Вывод BLK является контактом GND, его можно использовать, например, при подключении модуля к АрдуиноPro Mini, у которого есть два контакта GND, выведенных рядом.
Связь с платой может быть реализована:
- Первый вариант — через аппаратный UART Ардуино, по умолчанию назначенный контактам 0 и 1.
- Второй вариант – путем создания в Ардуино виртуального последовательного порта.
Сначала мы воспользуемся первым вариантом. Также стоит помнить, что по умолчанию устройство работает на скорости 9600 бод.
Ниже приведен простой скетч теста UART:
void setup() { Serial.begin(9600); // указываем скорость UART delay(5000); Serial.print("Test!"); } void loop() { }
Кто-то может задаться вопросом, почему мы взяли 5-секундную паузу между запуском Serial Monitor и отправкой первых данных. Это связано с тем, что OpenLog необходимо время, чтобы полностью запустить свою работу и начать процедуру записи данных.
В datasheet указано, что достаточно двух секунд, но не помешает добавить еще несколько секунд, чтобы обезопасить себя от ошибок.
Помните, что при программировании Ардуино встроенный программатор использует UART, поэтому важно отключить модуль от Arduino. После программирования отключаем питание, подключаем OpenLog и снова подключаем Ардуинок источнику питания. Программа должна запуститься через 5 секунд, Ардуино отправит данные для записи на карту, по истечении этого времени подождите еще 5 секунд, чтобы убедиться, что все данные были сохранены.
Теперь мы можем отключить питание от Arduino, вынуть карту из модуля и подключите ее к компьютеру. Файл, создавший модуль, должен выглядеть, как показано ниже:
Когда мы поняли, как отправлять данные с помощью аппаратного UART, мы можем перейти к отправке данных через виртуальное последовательное соединение. Скетч не будет сильно отличаться, мы просто добавим включение встроенного светодиода, чтобы знать об окончании записи. Скетч должен выглядеть так, как показано ниже:
#include <SoftwareSerial.h> static const int RXPin = 2, TXPin = 3; //создаем переменные для виртуального порта SoftwareSerial ss(RXPin, TXPin); //назначаем имя и контакты void setup() { pinMode(13, OUTPUT); //определяем вывод 13, т.е. встроенный светодиод Serial.begin(9600); ss.begin(9600); // скорость передачи данных на SD-карту delay(5000); // время, необходимое для запуска модуля Serial.println("Test!"); ss.println("Test!"); delay(500); Serial.println("YA vizhu, chto vy mozhete otpravlyat' dannye na kartu dvumya sposobami!"); ss.println("YA vizhu, chto vy mozhete otpravlyat' dannye na kartu dvumya sposobami!"); delay(5000); // время, необходимое для завершения записи на карту digitalWrite(13,HIGH); } void loop() { }
В данном случае единственное изменение в подключении модуля OpenLog — это подключение вывода TXO модуля к контакту 2 Ардуино и вывода RXI к контакту 3 Arduino.
После внесения изменений, мы можем загрузить скетч в Ардуино. В Serial Monitor мы должны увидеть следующее:
Когда мы увидим, что светодиод, назначенный контакту 13, горит, мы можем отключить питание от Arduino и извлечь карту. После подключения к компьютеру мы должны найти файл со следующим содержимым:
Если мы и это освоили, то перейдем к последнему примеру, в котором мы сохраним данные в двух отдельных файлах, благодаря этому мы можем разделить записи, например, на дни или другие временные интервалы. Скетч с описанием показан ниже:
#include <SoftwareSerial.h> static const int RXPin = 2, TXPin = 3; // создаем переменные для виртуального порта SoftwareSerial ss(RXPin, TXPin); // назначаем имя и контакты int resetPin=4; void setup() { pinMode(13, OUTPUT); //определяем вывод 13, т.е. встроенный светодиод pinMode(4, OUTPUT); //определяем вывод 4, который является выходом для сброса модуля Serial.begin(9600); ss.begin(9600); // скорость передачи данных на SD-карту delay(5000); // время, необходимое для запуска модуля Serial.println("Zapisat' v fajl nomer 1:"); delay(500); Serial.println("Fajl1:"); ss.println("Fajl1:"); delay(500); Serial.println("10,20,30"); ss.println("10,20,30"); delay(5000); // время, необходимое для завершения записи на карту Serial.println("Sbros modulya"); digitalWrite(4,HIGH); // сбрасываем модуль delay(1000); digitalWrite(4,LOW); Serial.println("Zapisat' v fajl nomer 2:"); delay(500); Serial.println("Fajl2:"); ss.println("Fajl2:"); delay(500); Serial.println("40,50,60"); ss.println("40,50,60"); delay(5000); // время, необходимое для завершения записи на карту Serial.println("Mozhno otklyuchit' pitanie!"); digitalWrite(13,HIGH); } void loop() { }
Последнее изменение – необходимо подключить вывод GRN модуля к выводу 4 Arduino. После загрузки программы в Arduino и запуска Serial Monitor мы должны увидеть следующее:
И на карте должны быть созданы два файла следующего содержания:
Теперь вы можете легко сохранять данные проекта на microSD карту!
Добрый день! а Как передать в openlog дату и время, что бы файлы создавались с правильной датой?
Вы должны передать а log соответствующую строку.