Сеть. Протокол обмена данными. Конфигурирование модулей.
С
архитектурой сети я уже определился. С компонентами тоже. Пока
радиомодули движутся ко мне по почте самое время заняться вопросами
функционирования сети. А вопросы есть следующие:
- Протокол
обмена данными между микроконтроллерами. Каким-то образом каждый
контроллер должен ведь разбирать из потока свалившихся на него байтов,
что ему требуется сделать.
- Конфигурирование радиомодулей. Очень
неудобно адреса закладывать на этапе компиляции кода. Надо бы иметь
возможность переназначать адреса микроконтроллеров в процессе
функционирования.
- Надо бы разработать ПО для решения первых двух пунктов.
Протокол. Я
решил пойти по простому пути. Пусть микроконтроллеры перебрасываются
между собой пакетами байтов. Для начала возьмем максимальный размер
пакета в 32 байта. Пусть пакет обязательно начинается с байта 0xAA, а
заканчивается байтом 0xFA. Это позволит в будущем добавить контроль
целостности данных и защитить сеть от сбоев и ошибок. Так, зная размер
пакета, его префикс и суффикс, можно будет его вычленить из потока. Байты
1 и 2 я решил отдать под идентификатор пакета. Этот идентификатор
фактически будет определять дальнейший формат данных в пакете и их
назначение. В 2 байта можно уложить 65536 идентификаторов - число вроде
как более чем достаточное. Поскольку я предполагаю, что контроллеры
будут общаться между собой по принципу "вопрос-ответ", то все множество
идентификаторов я решил разделить напополам: нечетные номера будут
запросами, а четные (+1) - ответами на эти запросы. Еще 4 байта (3:6) будут заняты адресом отправителя. Если понадобится послать ответ, мы будем знать куда его отправить.
Таблицу идентификаторов решено формировать нарастающим итогом. Конфигурирование радиомодулей. Каждому
микроконтроллеру в сети должен быть присвоен свой адрес. Как я уже
упомянул выше, зашивать в код адрес каждого устройства - не самый лучший
путь. Следовательно, сетевой адрес контроллер должен хранить в памяти. А
чтобы этот адрес не потерялся при перезагрузках, память должна быть
энергонезависимой. На самом деле, каждому оконечного контроллеру надо
хранить минимум 3 значения: номер RF-канала(частоту сети внутри
диапазона), свой собственный адрес и адрес центрального контроллера.
Я решил использовать 4-х байтовые адреса наподобие адресов TCP/IP v4.
Выделим под эти нужды первые 9 байт внутренней энергонезависимой памяти
меги. Теперь эти 9 байт в каждый контроллер надо записать. Для
настройки можно бы использовать некий отдельный модуль с
пользовательским интерфейсом. Подключать его к настраиваемому
контроллеру по UART. И при помощи специальных функций записывать в него
конфигурацию. Вариант 2 - использовать внутрисхемный программатор и
записывать EEPROM как байтовый массив с компа. Вариант 3 - подключать
комп через USB-to-TTL к UART настраиваемого контроллера и передавать ему
конфигурацию при помощи специально встроенных в контроллер функций и
специально разработанного софта на компе. Все это мне показалось неудобным по следующим причинам: - Создавать
еще одно устройство с экраном и клавиатурой - накладно. Писать для него
достаточно заумную прошивку работы с GUI - долго. А устройство это
использоваться будет достаточно редко.
- Прошивать EEPROM через SPI - не наглядно и легко допустить ошибку, которую потом будет трудно найти.
- Подключение
по UART, равно как и SPI, равно как и любое другое проводное
подключение неудобно тем, что контроллер будет встроен в помещение так,
чтоб нутро схемы наружу не торчало. Втыкать в него провода будет не
самым удобным. А если он еще и в потолок замурован?
С другой
стороны, у каждого контроллера уже есть беспроводной модуль, через
который можно организовать обмен данными. В прошивке мы дадим ему
некоторый базовый адрес. Таким образом, в любой момент времени адрес
контроллера нам будет известен. Я выбрал такой вариант: - Собираем до примитивизма простое устройство(конфигуратор), состоящее из какой-нибудь ардуинки и радиомодуля. Я использовал Arduino Nano + шилд, на котором уже был разъем для nRF24L01. Важно, чтоб у ардуинки был USB. Это позволит без каких-либо дополнений подключить ее к компу.
- Под Windows пишем достаточно простую программу, которая должна будет предоставлять удобный интерфейс к настройкам системы и передавать их в com-порт.
- В конфигуратор загрузим программу, которая организует трансляцию пакетов между UART и радиомодулем.
- В прошивку конечных контроллеров добавим несколько функций записи конфигурации в EEPROM.
Получается быстро и дешево.
|