Итак, это уже третья статья (0, 1, 2) по модернизации NORVI Arita Model 5, контроллера который имеется в моём распоряжении. Арита изначально была интересным решением, а после добавления нами на прошлых этапах Ethernet интерфейса и OLED дисплея SSD1306 стала ещё интереснее.

Но до завершения первого цикла модернизации и выполнения «программы минимум» не хватает ещё одного элемента — картридера для microSD карт памяти. После добавления поддержки работы с SD картами памяти, контроллер получает возможность работы с полноценным веб-интерфейсом, значение чего трудно переоценить — появляется возможность удобно изменять настройки контроллера, создавать неограниченное количество веб-страниц, выводить на них нужную информацию и т. д.

Фактически, контроллер превращается в полностью самодостаточную вещь: он может управлять подключённым оборудованием (как собственно контроллер), общаться по сети с другими устройствами, выводить нужную информацию на веб-страницы, управлять другими контроллерами по проводным и беспроводным интерфейсам и т. д.

Немного о подсистеме SD


Прежде, чем переходить к техническим подробностям, нужно немного сказать о самой подсистеме SD и её роли в контроллерах.

Роль SD подсистемы в контроллерах можно подразделить на две части: это (1) возможность сохранять различные логи и (2) возможность сохранять различные файлы (html, css, js, txt, jpg, png, gif и т. д.) для построения полноценного веб-интерфейса.

На логах и конфигурационных файлах я особо останавливаться не буду — с ними всё понятно без дополнительных пояснений. Немного подробнее коснусь проблематики создания веб-интерфейса на контроллерах.

В случае ATmega2560 (на котором построена NORVI Arita) при добавлении в систему картридера для microSD карт памяти, нам становится доступно для хранения файлов аж до 32 ГБ (!) дискового пространства.

Примечание. Подсистема SD картридера также актуальна на «современных» контроллерах типа ESP8266 и ESP32: там, в принципе, можно организовать то же самое на внутренней памяти самих модулей, но в этом случае придётся довольствоваться несколькими мегабайтами SPIFFS, вместо 32+ ГБ microSD карты памяти.

Как минимум, это означает, что мы получаем в своё распоряжение возможность создания практически неограниченного количества веб-страниц для построения веб-интерфейса(ов) контроллера.

Но и это ещё не всё: при соответствующем проектировании серверной архитектуры контроллера, мы получаем (внутри контроллера) мини-хостинг с практически неограниченным количеством сайтов (веб-интерфейсов), каждый со своим дизайном, топологией и функционалом.

Для чего это нужно?

Контроллер на ATmega2560 имеет (может иметь) кучу подсистем и ролей (GPIO, DI, AI, OUT, UART, SPI, I2C, дисплей, Ethernet, nRF, LoRa, GSM, «управление отоплением», «погодная станция», «SMS сервер» и т. д.) и может выполнять различные задачи — часть ресурсов может быть задействована для одной задачи, а часть — для других. При наличии практически неограниченного дискового пространства, каждой задаче может быть предоставлен отдельный веб-интерфейс (со своими дизайном, топологией и функционалом), причём между сайтами (веб-интерфейсами) можно переключаться «на лету», без перезагрузки контроллера.

Создание мульти-веб-интерфейсов (сайтов) для различных задач (подсистем контроллера) — это не обязанность, а возможность — в принципе, всё это визуальное представление можно организовать в виде одного «развесистого» сайта с десятками (сотнями) страниц.

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

Далее мы всё это подробно разберём на практике.

Диспозиция


В качестве исходной мы имеем совершенно удручающую ситуацию: место для картридера расположено на обратной стороне верхней платы, которая совершенно недоступна нам для пайки, то есть без полной разборки контроллера у нас нет возможности нормальным образом припаять картридер к плате (какими бы виртуозами паяльника мы ни были бы). Кроме этого, за картридером расположены контактные площадки на которые не распаяны компоненты обвязки.



Штыри, соединяющие платы, вы можете видеть на фотографии выше — там их 4 секции по 12 пинов, итого по 48 паек на каждой плате (всего 96). Распаять всё это можно, но это явно не наш случай — легче использовать готовую плату microSD картридера и потом разместить её внутри контроллера, благо там есть много свободного места.

В качестве такой платы мы будем использовать RobotDyn MicroSD board. Почему именно её? Потому, что она была в моём хозяйстве и первой попалась под руку — в принципе, для наших целей можно использовать любую подобную плату.


Компания RobotDyn позаботилась о нас и любезно разместила все необходимые пояснения по подключению платы к контроллерам Arduino на обратной стороне платы. Поскольку мы имеем дело с Mega2560, то нас будут интересовать пины D50, D51 и D52.


Исходя из распиновки NORVI Arita Model 5, мы имеем стандартные пины SPI интерфейса D50 (MISO), D51 (MOSI) и D52 (SCK), и плюс CS пин на D46 — этими данными мы воспользуемся позже, при написании софта для обслуживания SD карты на NORVI Arita.


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


Для запуска картридера нам нужно подключить к контроллеру 6 линий: MISO, MOSI, SCK, CS, +5V, GND. На данном этапе нам нужно только подтвердить принципиальную возможность работы платы RobotDyn MicroSD board в составе контроллера NORVI Arita, поэтому линии MISO, MOSI, SCK, CS и GND мы будем брать непосредственно из разъёма расширения для подключения внешних блоков (в дальнейшем эти линии можно будет подключить к контактным площадкам на плате).


Как видно из распиновки NORVI Arita, представленной в предыдущем разделе, пин CS в оригинальном варианте подключён на D46, но поскольку D46 нам легко не доступен (а в качестве CS можно использовать любой подходящий пин), то мы будем использовать пин D38 из межблочного разъёма.



Но тут возникает проблема: если вы внимательно посмотрите на распиновку межблочного разъёма, то заметите, что инженеры Norvi не озаботились выводом в этот разъём питающего напряжения +5 В (а лучше ещё и +3,3 В).

Поэтому нам придётся брать питающее напряжение непосредственно с платы контроллера. Самое простое и очевидное место для этого — контакт выходного сглаживающего конденсатора линии +5 В контроллера (при окончательной сборке это питание можно будет взять из другой, более удобной точки на печатной плате).



Общий вид тестовой сборки Арита + её маленький друг SD картридер выглядят так:



В дальнейшем останется только всё это окультурить, упаковать картридер в термоусадку и закрепить во внутреннем пространстве контроллера. Можно даже озаботиться и предусмотреть крепление для возможности замены карт памяти без открытия корпуса NORVI Arita — но это по желанию, мне будет вполне достаточно просто иметь от 2 до 32 ГБ дискового пространства внутри контроллера.

Итак, если мы всё сделали правильно, то, теоретически, у Ариты должна появиться возможность работы с SD картами памяти, что мы сейчас и проверим.

Тестовый запуск и скетч


Для проверки работоспособности нашего решения и тестирования работы SD карты в составе контроллера NORVI Arita, немного модифицируем скетч из стандартной Arduino библиотеки SD.

/*
  NORVI Arita
  SD card test
*/

#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 38;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start SD card test..."));
  Serial.print("Init SD card... ");

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println(F("failed"));
    return;
  } else {
    Serial.println(F("Ok"));
  }
  
  digitalWrite(53, LOW);
  
  Serial.print("Card 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");
  }

  if (!volume.init(card)) {
    Serial.println("Not find partition");
    return;
  }

  uint32_t volumesize;
  Serial.print("Volume type FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();
  volumesize *= volume.clusterCount();
  volumesize *= 512;
  
  Serial.print("Volume size (bytes): ");  Serial.println(volumesize); volumesize /= 1024;
  Serial.print("Volume size (Kbytes): "); Serial.println(volumesize); volumesize /= 1024;
  Serial.print("Volume size (Mbytes): "); Serial.println(volumesize);
  Serial.println();

  //root.openRoot(volume);
  //root.ls(LS_R | LS_DATE | LS_SIZE);
} // setup

void loop() {

}

Здесь указываем выбранный нами в межблочном разъёме пин CS.

const int chipSelect = 38;

И «глушим» принудительно инициализируемый библиотекой SPI дефолтный CS пин D53 (см. об этом подробнее в предыдущих статьях цикла).

  digitalWrite(53, LOW);

Всё работает! Теперь в нашем контроллере появилась поддержка работы с SD карами памяти.



Супер, теперь NORVI Arita Model 5 имеет поддержку Ethernet интерфейса и SD карт памяти — посмотрим, что это значит и что со всем эти можно сделать.

Запускаем веб-интерфейс


Как я только что заметил, теперь у нас появилась возможность сделать из ординарного контроллера что-то интересное и раскрыть все (магические) таланты Ариты. Раскрывать таланты будем при помощи специализированной версии AMS для контроллеров серии NORVI Arita.

Примечание: тестирование производилось на внутренней, не публичной версии AMS для NORVI Arita. Публикация и распространение этой версии не планируется, возможно это будет сделано позже, после соответствующих доработок.

Запускаем AMS и наблюдаем в Serial загрузку и тестовые сообщения стартующих подсистем (сервисов).



AMS стартовал и готов выполнять любые возложенные на него функции. В тестовой сборке присутствуют только базовые функции и функции, ассоциированные с железом самой Ариты, но добавить любой другой функционал не составляет никаких проблем, вплоть управления и визуализации состояний сотен внутренних и внешних объектов (датчиков, актуаторов, проводных и беспроводных устройств и т. д. и т. п.).

Кстати, для работы этой системы не понадобились ни ESP32, ни 32-битность, ни FreeRTOS, хватило 8-битной ATmega2560 с 8-ю килобайтами оперативной памяти (причём 67% из которой остались свободными).



На скриншоте видны динамические и работающие в реальном времени индикаторы запущенных сервисов (NTP, 485, SDI, UPL, DPI и т. д.), режимов работы (NET, FRE, NRF), цифровых входов (DI0-DI13), реле и транзисторных выходов (R0-R11), а также прочие индикаторы: свободной памяти, сетевой активности, загрузки MCU, текущей даты и времени, температуры и потребляемой мощности и т. д. Чуть ниже находится полоса главного меню с подпунктами страниц и собственно сама страница веб-интерфейса контроллера.



Кроме веб-интерфейса и практически неограниченного количества сайтов на SD карте памяти, тут же присутствует поддержка «физического» дисплея SSD1306, кнопок и меню с любыми настройками прямо с передней панели контроллера.



В общем, первый этап модернизации Ариты, приведения её в чувство и «программа минимум» нами успешно выполнены — NORVI Arita со всеми хардверными добавлениями (Ethernet интерфейс, дисплей, SD картридер) и программной поддержкой AMS представляет собой совершенно замечательное решение, которое на равных соперничает с более мощными (ESP32) и дорогими и прожорливыми (Linux) контроллерами во многих задачах по IoT и автоматизации.

Заключение


До «полного фарша» нам осталось только добавить в Ариту часы реального времени (RTC), хардверный Watchdog и поддержку беспроводной связи nRF и/или LoRa — вот это уже будет очень приятная и функциональная машинка для реализации проектов по автоматизации.

(Хотя, конечно, было бы лучше, если бы производители железа, наконец, сделали нормальный контроллер, который не нужно было бы доводить до ума с паяльником и циркулярной пилой в руках.)



Читайте также:


Комментарии (13)


  1. LAutour
    22.12.2023 14:49

    С SD + FAT есть одно но: если в процессе записи изменений на SD оборвется питание, то есть риск повреждения файловой системы и соответсвенно потери доступа к данным на SD. Нужен достаточный запас емкости по питанию и отслеживать еге внешнее отключение.


    1. smart_alex Автор
      22.12.2023 14:49

      Вообще-то да, правда за мою обширную практику подобного ни разу не случалось. Кстати, это хороший повод подумать ещё и об организации бесперебойного питания для контроллера.


      1. LAutour
        22.12.2023 14:49

        А вот я несколько раз сталкивался: в разработанном устройстве (еще до меня) логирование шло достаточно часто, а питание было батарейное, и не было отслеживания батареи.


        1. smart_alex Автор
          22.12.2023 14:49

          Возможно, здесь играет роль программная архитектура контроллера. AMS в своей интерфейсной части ничего не пишет на SD, только читает, а в тех проектах, где нужно было сохранять логи, он пишет крайне короткими порциями и сразу же закрывает файлы. Поэтому попасть отлючению в этот микросекундный интервал — нужно ещё очень постараться (с вероятностью примерно как выиграть в лотерею).


          1. LAutour
            22.12.2023 14:49

            Там вроде запись секторами (512b), поэтому отнюдь не микросекундный интервал, особенно если использовать SPI .


            1. smart_alex Автор
              22.12.2023 14:49

              Замерить интервалы времени записи на SD и получить конкретные цифры — не составляет никаких проблем (у меня такой задачи никогда не стояло).

              А вот скорость чтения с SD и передачи данных по сети я мерил долго и упорно, пока добивался приемлемой производительности системы.


              1. LAutour
                22.12.2023 14:49

                sd-cf с параллельным интерфейсом и скорости чтения будет выше крыши :)


  1. NutsUnderline
    22.12.2023 14:49

    а может... просто взять другую плату где уже распаян sd, ethernet


    1. smart_alex Автор
      22.12.2023 14:49

      Можно, но модель M5 уже имеется в моём распоряжении и оставлять её в таком виде категорически не хочется, тем более, что модернизировать её относительно несложно.

      А старшие модели Arita, во-первых, гораздо дороже, и, во-вторых, имеют всё ту же (на мой взгляд) недоделанную архитектуру — всё равно придётся лезть внутрь и переделывать там всё, что можно.

      А вот получить в готовом виде «контроллер моей мечты» я уже и не надеюсь — железячники делают всё, что угодно, кроме того, что надо.


      1. NutsUnderline
        22.12.2023 14:49

        а может.... тогда и не Arita :) :) ладно бы что, так esp32 делают во всех видах... а этих железячников если не пинать то они и будут лепить в стиле "а нам дорожку некрасиво тут подводить"


  1. Mike-M
    22.12.2023 14:49

    А что насчет скорости работы веб-интерфейса?

    Про СС32XX на форуме TI писали, что если на странице отображается десяток контролов, то начинаются жуткие тормоза. Слайдером, говорят, вообще пользоваться невозможно — задержка дикая. А это, на минуточку, Arm Cortex-M4.


    1. smart_alex Автор
      22.12.2023 14:49

      Просто ребята программировать не умеют (шутка). Как работали первые версии системы можно посмотреть тут:

      https://www.youtube.com/channel/UCzwiCsCitrMphSTIEr8It_w

      Современные версии движка работают раз в десять быстрее, если требуется особая динамика — существуют версии на Websockets. С интерфейсом нет никаких проблем даже на связке ATmega2560 + W5100 с четырьмя аппаратными сокетами, не говоря уже про более мощное железо.


    1. NutsUnderline
      22.12.2023 14:49

      прелесть веб-интерфейса в том что его рисует браузер, на (предположительно) мощном устройстве (планшете, компе - то есть далеко не М4). Это просто сайт, и мы все (я надеюсь) прекрасно знаем что бывают сайты быстрые, а бывают которые тормозят на слабом компе/интернете. потому что веб-программист делала его на гигабитном интернете на 20 ядерном компе, а у кого такого нет то это .. не программиста проблемы.

      другими словами - (не)умеючи все испохабить можно.