![](https://habrastorage.org/webt/hc/q6/hp/hcq6hp21okvawom0rvvrnfhmtjo.jpeg)
Итак, это уже третья статья (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 картридер, (в умелых руках) позволяет перевести контроллер, его функционал, возможности и удобство пользования на совершенно новый уровень.
Далее мы всё это подробно разберём на практике.
❯ Диспозиция
В качестве исходной мы имеем совершенно удручающую ситуацию: место для картридера расположено на обратной стороне верхней платы, которая совершенно недоступна нам для пайки, то есть без полной разборки контроллера у нас нет возможности нормальным образом припаять картридер к плате (какими бы виртуозами паяльника мы ни были бы). Кроме этого, за картридером расположены контактные площадки на которые не распаяны компоненты обвязки.
![](https://habrastorage.org/webt/zv/r3/bb/zvr3bbeehr6kvtxrnubxcib6cbg.jpeg)
Штыри, соединяющие платы, вы можете видеть на фотографии выше — там их 4 секции по 12 пинов, итого по 48 паек на каждой плате (всего 96). Распаять всё это можно, но это явно не наш случай — легче использовать готовую плату microSD картридера и потом разместить её внутри контроллера, благо там есть много свободного места.
В качестве такой платы мы будем использовать RobotDyn MicroSD board. Почему именно её? Потому, что она была в моём хозяйстве и первой попалась под руку — в принципе, для наших целей можно использовать любую подобную плату.
![](https://habrastorage.org/webt/s_/vo/pf/s_vopffkl_ycqctjwmkb6bw27m8.jpeg)
Компания RobotDyn позаботилась о нас и любезно разместила все необходимые пояснения по подключению платы к контроллерам Arduino на обратной стороне платы. Поскольку мы имеем дело с Mega2560, то нас будут интересовать пины D50, D51 и D52.
![](https://habrastorage.org/webt/4a/zc/uh/4azcuhhxnvk9r_gmlutjmi2yew0.jpeg)
Исходя из распиновки NORVI Arita Model 5, мы имеем стандартные пины SPI интерфейса D50 (MISO), D51 (MOSI) и D52 (SCK), и плюс CS пин на D46 — этими данными мы воспользуемся позже, при написании софта для обслуживания SD карты на NORVI Arita.
![](https://habrastorage.org/webt/ns/aj/vj/nsajvjrwn7ipw4_1zhrsopstehm.png)
❯ Подключение картридера
Для запуска картридера нам нужно подключить к контроллеру 6 линий: MISO, MOSI, SCK, CS, +5V, GND. На данном этапе нам нужно только подтвердить принципиальную возможность работы платы RobotDyn MicroSD board в составе контроллера NORVI Arita, поэтому линии MISO, MOSI, SCK, CS и GND мы будем брать непосредственно из разъёма расширения для подключения внешних блоков (в дальнейшем эти линии можно будет подключить к контактным площадкам на плате).
![](https://habrastorage.org/webt/rj/-9/m1/rj-9m1sftgsjsborh6iujltxzd8.png)
Как видно из распиновки NORVI Arita, представленной в предыдущем разделе, пин CS в оригинальном варианте подключён на D46, но поскольку D46 нам легко не доступен (а в качестве CS можно использовать любой подходящий пин), то мы будем использовать пин D38 из межблочного разъёма.
![](https://habrastorage.org/webt/hc/q6/hp/hcq6hp21okvawom0rvvrnfhmtjo.jpeg)
Но тут возникает проблема: если вы внимательно посмотрите на распиновку межблочного разъёма, то заметите, что инженеры Norvi не озаботились выводом в этот разъём питающего напряжения +5 В (а лучше ещё и +3,3 В).
Поэтому нам придётся брать питающее напряжение непосредственно с платы контроллера. Самое простое и очевидное место для этого — контакт выходного сглаживающего конденсатора линии +5 В контроллера (при окончательной сборке это питание можно будет взять из другой, более удобной точки на печатной плате).
![](https://habrastorage.org/webt/f-/rd/yj/f-rdyjkxvln2p23p3up1zlapgye.jpeg)
Общий вид тестовой сборки Арита + её маленький друг SD картридер выглядят так:
![](https://habrastorage.org/webt/_1/q6/-v/_1q6-vgvoqos5fl3kzhclcst29e.jpeg)
В дальнейшем останется только всё это окультурить, упаковать картридер в термоусадку и закрепить во внутреннем пространстве контроллера. Можно даже озаботиться и предусмотреть крепление для возможности замены карт памяти без открытия корпуса 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 карами памяти.
![](https://habrastorage.org/webt/tt/cy/bx/ttcybxfo32sp9fs67qoxq7kgz3w.png)
Супер, теперь NORVI Arita Model 5 имеет поддержку Ethernet интерфейса и SD карт памяти — посмотрим, что это значит и что со всем эти можно сделать.
❯ Запускаем веб-интерфейс
Как я только что заметил, теперь у нас появилась возможность сделать из ординарного контроллера что-то интересное и раскрыть все (магические) таланты Ариты. Раскрывать таланты будем при помощи специализированной версии AMS для контроллеров серии NORVI Arita.
Примечание: тестирование производилось на внутренней, не публичной версии AMS для NORVI Arita. Публикация и распространение этой версии не планируется, возможно это будет сделано позже, после соответствующих доработок.
Запускаем AMS и наблюдаем в Serial загрузку и тестовые сообщения стартующих подсистем (сервисов).
![](https://habrastorage.org/webt/6n/cu/vn/6ncuvn5ry6fhdvuiw0bharghrpu.png)
AMS стартовал и готов выполнять любые возложенные на него функции. В тестовой сборке присутствуют только базовые функции и функции, ассоциированные с железом самой Ариты, но добавить любой другой функционал не составляет никаких проблем, вплоть управления и визуализации состояний сотен внутренних и внешних объектов (датчиков, актуаторов, проводных и беспроводных устройств и т. д. и т. п.).
Кстати, для работы этой системы не понадобились ни ESP32, ни 32-битность, ни FreeRTOS, хватило 8-битной ATmega2560 с 8-ю килобайтами оперативной памяти (причём 67% из которой остались свободными).
![](https://habrastorage.org/webt/o1/ur/s_/o1urs_6pnjc_eri6avbqu3oka5w.png)
На скриншоте видны динамические и работающие в реальном времени индикаторы запущенных сервисов (NTP, 485, SDI, UPL, DPI и т. д.), режимов работы (NET, FRE, NRF), цифровых входов (DI0-DI13), реле и транзисторных выходов (R0-R11), а также прочие индикаторы: свободной памяти, сетевой активности, загрузки MCU, текущей даты и времени, температуры и потребляемой мощности и т. д. Чуть ниже находится полоса главного меню с подпунктами страниц и собственно сама страница веб-интерфейса контроллера.
![](https://habrastorage.org/webt/yg/ht/uq/yghtuqe74q7e6sglej74cmx_c_8.png)
Кроме веб-интерфейса и практически неограниченного количества сайтов на SD карте памяти, тут же присутствует поддержка «физического» дисплея SSD1306, кнопок и меню с любыми настройками прямо с передней панели контроллера.
![](https://habrastorage.org/webt/dv/b0/jd/dvb0jdeyzevnoarwmcyxiingnzm.jpeg)
В общем, первый этап модернизации Ариты, приведения её в чувство и «программа минимум» нами успешно выполнены — NORVI Arita со всеми хардверными добавлениями (Ethernet интерфейс, дисплей, SD картридер) и программной поддержкой AMS представляет собой совершенно замечательное решение, которое на равных соперничает с более мощными (ESP32) и дорогими и прожорливыми (Linux) контроллерами во многих задачах по IoT и автоматизации.
❯ Заключение
До «полного фарша» нам осталось только добавить в Ариту часы реального времени (RTC), хардверный Watchdog и поддержку беспроводной связи nRF и/или LoRa — вот это уже будет очень приятная и функциональная машинка для реализации проектов по автоматизации.
(Хотя, конечно, было бы лучше, если бы производители железа, наконец, сделали нормальный контроллер, который не нужно было бы доводить до ума с паяльником и циркулярной пилой в руках.)
Читайте также:
- ➤ Лайфхак: как зимой спасти аккумуляторы своих гаджетов
- ➤ Брошенные идеи: консоли, которые так и не появились на свет
- ➤ Бизнес-махина из прошлого: каким был топовый бизнес-коммуникатор 2007 года — HTC X7500?
- ➤ Удивительные клеточные автоматы: обратные и расширенные поколения
- ➤ История создания Ведьмака: от литературной саги до игровой франшизы
Комментарии (13)
NutsUnderline
22.12.2023 14:49а может... просто взять другую плату где уже распаян sd, ethernet
smart_alex Автор
22.12.2023 14:49Можно, но модель M5 уже имеется в моём распоряжении и оставлять её в таком виде категорически не хочется, тем более, что модернизировать её относительно несложно.
А старшие модели Arita, во-первых, гораздо дороже, и, во-вторых, имеют всё ту же (на мой взгляд) недоделанную архитектуру — всё равно придётся лезть внутрь и переделывать там всё, что можно.
А вот получить в готовом виде «контроллер моей мечты» я уже и не надеюсь — железячники делают всё, что угодно, кроме того, что надо.
NutsUnderline
22.12.2023 14:49а может.... тогда и не Arita :) :) ладно бы что, так esp32 делают во всех видах... а этих железячников если не пинать то они и будут лепить в стиле "а нам дорожку некрасиво тут подводить"
Mike-M
22.12.2023 14:49А что насчет скорости работы веб-интерфейса?
Про СС32XX на форуме TI писали, что если на странице отображается десяток контролов, то начинаются жуткие тормоза. Слайдером, говорят, вообще пользоваться невозможно — задержка дикая. А это, на минуточку, Arm Cortex-M4.
smart_alex Автор
22.12.2023 14:49Просто ребята программировать не умеют (шутка). Как работали первые версии системы можно посмотреть тут:
https://www.youtube.com/channel/UCzwiCsCitrMphSTIEr8It_w
Современные версии движка работают раз в десять быстрее, если требуется особая динамика — существуют версии на Websockets. С интерфейсом нет никаких проблем даже на связке ATmega2560 + W5100 с четырьмя аппаратными сокетами, не говоря уже про более мощное железо.
NutsUnderline
22.12.2023 14:49прелесть веб-интерфейса в том что его рисует браузер, на (предположительно) мощном устройстве (планшете, компе - то есть далеко не М4). Это просто сайт, и мы все (я надеюсь) прекрасно знаем что бывают сайты быстрые, а бывают которые тормозят на слабом компе/интернете. потому что веб-программист делала его на гигабитном интернете на 20 ядерном компе, а у кого такого нет то это .. не программиста проблемы.
другими словами - (не)умеючи все испохабить можно.
LAutour
С SD + FAT есть одно но: если в процессе записи изменений на SD оборвется питание, то есть риск повреждения файловой системы и соответсвенно потери доступа к данным на SD. Нужен достаточный запас емкости по питанию и отслеживать еге внешнее отключение.
smart_alex Автор
Вообще-то да, правда за мою обширную практику подобного ни разу не случалось. Кстати, это хороший повод подумать ещё и об организации бесперебойного питания для контроллера.
LAutour
А вот я несколько раз сталкивался: в разработанном устройстве (еще до меня) логирование шло достаточно часто, а питание было батарейное, и не было отслеживания батареи.
smart_alex Автор
Возможно, здесь играет роль программная архитектура контроллера. AMS в своей интерфейсной части ничего не пишет на SD, только читает, а в тех проектах, где нужно было сохранять логи, он пишет крайне короткими порциями и сразу же закрывает файлы. Поэтому попасть отлючению в этот микросекундный интервал — нужно ещё очень постараться (с вероятностью примерно как выиграть в лотерею).
LAutour
Там вроде запись секторами (512b), поэтому отнюдь не микросекундный интервал, особенно если использовать SPI .
smart_alex Автор
Замерить интервалы времени записи на SD и получить конкретные цифры — не составляет никаких проблем (у меня такой задачи никогда не стояло).
А вот скорость чтения с SD и передачи данных по сети я мерил долго и упорно, пока добивался приемлемой производительности системы.
LAutour
sd-cf с параллельным интерфейсом и скорости чтения будет выше крыши :)