Как я логгер собирал на SD card Shield V2.0

    Привет, Хабр!

    imageПонадобилось мне срочно собрать простенький логгер данных для одного старого промышленного газоанализатора, у которого были лишь токовые выводы на бумажные самописцы. Вроде простенькая задача, но повеселила она меня знатно. Подробности этой истории под катом. Выводы там же.



    Задача, действительно, была простейшая. Но как всегда все срочно. Тратить деньги на промышленный логгер не хотелось, а в запасе оказалась платка Ардуино УНО. Пятиминутное прогугливание вопроса и нашелся подходящий шильдик, который прекрасно подходил для этой задачи. Промышленный газоанализатор ДОГ-4, который необходимо было подключить к логгеру, имеет лишь выводы на бумажные самописцы. Выводы токовые 0..5 мА для каждого анализируемого газа (NO и SO2).
    Кстати, газоанализатор оптический — отличная и надежная конструкция, но морально устаревшая электроника внутри портит все дело. Задача была пологгировать данные в течение недели и записать их в электронном виде для расчетов технологам. Больше подробностей не сказали.
    Найденный в Интернете шильдик был заказан в этом (кстати, очень неплохом) магазине и буквально на следующий день был доставлен в Томск из Новосибирска. Шильдик по описанию очень удобный, имеет площадку для прототипирования, которую я надеялся использовать в этом простом проекте. Достаточно нагрузить токовые выводы самописцев, к примеру, на резисторы 1 кОм, подтянутые в земле и получишь цифровые данные с прибора для всего диапазона измерений. Разрядности ADC в 10 бит Ардуино вполне устраивало технологов (еще бы, с бумажных лент скалывать данные куда веселее). Пришла посылка, красивая упаковка, описание как в интернет магазине. Указано наличие площадки для прототипирования, на которую необходимо было подпаять лишь два резистора.

    Однако вскрытие показало, что шильдик не соответствует описанию. Вот, что на самом деле было в коробке. Вместо площадки для прототипирования оказался переключатель питания 5 — 3,3 В, назначение которого мне осталось не ясным, так как изначально было бы разумнее взять питание 3,3 В с платы Ардуино и питать SD карту без риска спалить карточку. Перевод переключателя в 5 В тут же подает пятивольтовое питание на карту, тем самым добросовестно выводя ее из строя в дальнейшем. Веселая китайская электроника. Понятно, что питание было сразу подано корректное в 3,3 В. Скаченная с официальной страницы производителя библиотека для работы с устройством тоже оказалась с изюминкой. Она просто не работала.
    Шильдик использует 4 пина Ардуино, согласно этой таблице. Здесь, слава Богу, ничего не напутано.

    Уже задумавшись о том, чтобы начать самому программировать корректную работу данного устройства, я вспомнил о том, что в версиях Arduino IDE 1.0+ разработчики везде по какой-то причине стали использовать дефиницию #include «Arduino.h» вместо #include «WProgram.h» и поэтому старые библиотеки перестали работать в поздних версиях Arduino IDE. Вернувшись к библиотеке с сайта производителя я обнаружил, что именно по этой причине я не могу её «завести». Лечится ситуация достаточно просто. В файлах с расширениями .h и .cpp необходимо строку #include «WProgram.h» заменить на такую конструкцию

    #if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
    #else
    #include "WProgram.h"
    #endif
    


    После этого библиотека заработает в любой версии Arduino IDE. Можете это сделать сами, а можно скачать уже поправленный вариант библиотеки по этой ссылке.

    Окончательный код моего логгера для газоанализатора вряд ли будет интересен для поста, но привожу для ознакомления простенький пример. Так будет выглядеть рабочий код для записи данных на SD карту, который будет писать в файл каждые 5 секунд фразу «Hello, Habrahabr!»

    #include "FileLogger.h"
    
    // подключаем карточку к питанию 3,3 вольт на 8 пине
    #define MEM_PW 8
    
    void setup(void) {
    
      pinMode(MEM_PW, OUTPUT); // Инициируем пин 8 и подаем питание на карту
      digitalWrite(MEM_PW, HIGH);
    
    }
    
    void loop(void) {
    
      byte buffer[] = "Hello, Habrahabr! \r\n";  
        unsigned long length = sizeof(buffer)-1; // Важно! 
           int result = FileLogger::append("data.log", buffer, length);
     
    delay(5000); // ждем 5 секунд  
    }
    


    Несколько важных замечаний. Перед тем, как начать запись необходимо отформатировать карточку (FAT16) и открыть пустой файл с названием, которое будет использоваться в программе. В примере это data.log. Не выдергивайте карту из шильдика на «горячую». Лучше предусмотреть программное отключение питания командой digitalWrite(MEM_PW, LOW);
    Если ваши данные переменной длины, используйте вычисление длины строки. В примере это unsigned long length = sizeof(buffer)-1. Неточности в длине фраз приводят к сбою процесса записи и можно получить вместо данных битый файл.

    Выводы

    Шильдик оказался вполне рабочим. Прекрасная скорость записи данных. Конечно, не очень приятно, что описание не соответствует действительности, но это даже забавляет и дает возможность немного пораскинуть мозгами. Кстати, этот же шильдик можно использовать и для мини SD. Разъем для такой карты находится с обратной стороны.

    Всем хорошего дня!
    • +21
    • 28,1k
    • 6
    Поделиться публикацией
    Комментарии 6
      +9
      Шильдик это хорошо, но мне хватило переходника microsd=>SDHC и 6 проводков + штырьковый разъем. От задумки до релиза порядка 10 минут.
        0
        А можно поподробнее? Т.е. переходник и шильдик отличаются только тем, что шильдик смотрится приличнее? Т.е. всю работу по общению с картой делает Arduino в любом случае?
          0
          Естественно. Данный шилд — всего-навсего переходник, поскольку с картой памяти общение идет посредством SPI — посмотрите любую реализацию драйвера для SD-карт для AVR.
        +1
        на самом деле на хабре есть уже хорошая статья по шилду для ардуино. Я в свое время сделал по ней GPS трекер с записью на SD.
        Кстати Вам со временем и если возникнет такая необходимость можно расширить проект добавив к нему еще и GPRS модуль для периодического слива инфы на сервер, чтобы реже бегать.
          +1
          В таком случае чего мелочиться? Сразу через Ethernet отдавать в корпоративную сеть. А там и до автоматизированной обработки информации не далеко. =)
            0
            Как правило, в подобных системах протоколы сильно уж проприетарные и неподъемные средствами Ардуино.
            Исключение — если все можно свести к GET/POST-запросу. Или напрямую к SQL-серверу :) Я последний подход буду реализовывать в своей системе (которая пока еще проектируются и начинает прототипироваться).

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое