Как стать автором
Обновить

Универсальное DRO на базе Arduino Nano — shDRO. Часть 2

Время на прочтение3 мин
Количество просмотров7.5K
И снова здравствуйте!

Продолжаю описывать свою разработку shDRO. В данной части я опишу алгоритм опроса устройств и формат команд консоли.

Первая часть.

Прошивка

Так как количество каналов/портов, к которым можно подключать устройства считывания 12, и каждый канал теоретически может быть настроен на прерывание, то используются два обработчика прерывания типа PCINT (для портов D и C). Из этого следует одно ограничение по подключению: все выводы устройства, которые настроены на вход, должны быть подключены к каналам одной группы. Если же канал настроен на выход, то для текущего устройства, неважно, к какой группе он принадлежит. Группы: группа1 (каналы 0-5), группа2 (каналы 6-11).

Для обработчиков прерываний задействованы два кольцевых буфера, по 256 байт.

Код обработчика прерывания такой:

buf[pos] = DATA_N;
pos++;

Где DATA_N это один из портов: PIND, PINC.

Обработка данных происходит следующим образом:

  • наступает прерывание, в буфер записывается новое значение порта;
  • периодически буфер опрашивается, и из него читаются те данные, которые появились после последнего опроса (позиция буфера последнего опроса сохраняется в структуре устройства);
  • в процессе чтения новых данных, сравниваются уровни прерывания, заданные для каналов, с текущими данными порта. Если уровень прерывания не совпадает, то данные игнорируются.
  • происходит проверка, что приняты все данные для обработки (например, для протокола BIN6 нужно принять 24 бита);
  • происходит обработка данных в «читабельный» вид и обработанные данные выводятся на экран;
  • затем процесс повторяется;

Для реализации вышеописанной логики работы, в прошивке реализованы следующие логические модули:

  • Device: модуль содержит всю информацию об одном подключенном устройстве. Для каждого подключенного устройства, создается такой модуль;
  • Protocol: модуль содержит информацию о протоколе и как обрабатывать поступающие на порты сигналы в соответствии с данным протоколом обмена;
  • Function: модуль содержит информацию о том, как преобразовывать данные, полученные от модуля Protocol. Например, есть модуль Protocol, который поддерживает квадратурный сигнал, но устройства, которые выдают квадратурный сигнал, могут быть разными: это может быть оптическая линейка, или датчик количества оборотов. Т.е. в одном случае данные нужно преобразовать в мм или дюймы, а в другом об/мин. Данный модуль как раз выполняет это;
  • Led: модуль который отображает информацию на индикаторах. shDRO содержит 4 индикатора, и для каждого устройства задается нужный индикатор отображения;

В итоге, чтобы подключить устройство, в консоли нужно:

  • сконфигурировать нужные каналы;
  • добавить device;
  • для device задать protocol, function и led;
  • добавить/привязать нужные каналы к device;

Консоль

На данный момент, я проверял работу консоли в мониторе порта ArduinoIDE и в Terminal v.1.9b. Для терминалов типа Putty нужно реализовать режим эха (не реализовано).

Формат команды:

<команда> </аргумент1> <значение_аргумента1> </аргументN> <значение_аргументаN>

Максимальное количество аргументов в одной строке 5.

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

Все команды выполняются только после подачи команды Setup (исключение, команда Help, которая выводит список всех доступных команд).

Все команды описаны в приложенном архиве, так же в нем первая версия прошивки в формате hex.

shDRO.zip (.hex + описание команд)

Исходники shDRO

Продолжение следует.

Спасибо!

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

PS1
Просьба тем, кто живет в Казани.
Если у вас есть:
  • цифровые штангенциркули, работающие по протоколам: 24BIT, BCD7;
  • цифровые линейки iGaging (протокол 21BIT);

то не могли бы вы предоставить их мне на пару-тройку дней, чтобы написать и отладить протоколы под них?
Обещаю сохранить их в целости и сохранности!
Но это уже в личку. Заранее спасибо.

PS2
В файл описания команд забыл добавить две команды:
— save: сохраняет настройки каналов и устройств в EEPROM;
— load: выгружает настройки каналов и устройств из EEPROM (load выполняется автоматом при инициализации);
Файл перезаливать не буду, просто имейте ввиду. Но «help» данные команды отображает.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 15: ↑14 и ↓1+13
Комментарии4

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн