NORVI Arita: добавляем SD картридер и веб-интерфейс (почти контроллер мечты)
Итак, это уже третья статья (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
#include
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 — вот это уже будет очень приятная и функциональная машинка для реализации проектов по автоматизации.
(Хотя, конечно, было бы лучше, если бы производители железа, наконец, сделали нормальный контроллер, который не нужно было бы доводить до ума с паяльником и циркулярной пилой в руках.)