Sportiduino – модифицированные прошивки

Недавно я выложил новую версию (2.05) программы «О-Судейство», в которую я добавил новую обработку «Работа с мастер-станцией SportIduino через COM-порт». Благодаря чему программа «О-Судейство» теперь напрямую работает с мастер-станцией SportIduino (без использования дополнительного приложения «SportiduinoPQ.exe»).

В процессе создания обработки я использовал мастер-станцию SportIduino со стандартной прошивкой версии «1.8.0-beta.1». Однако в процессе реализации в своей обработке циклического считывания чипов участников на финише столкнулся с не совсем (на мой взгляд) удачной реализацией команды «Считать чип» (код 0x4B) в стандартной прошивке. Описание команд мастер-станции (и ответов на эти команды) приведено здесь. Что мне не понравилось в реализации этой команды: мастер-станция отвечает на эту команду, только когда обнаруживает чип участника. А если нет чипа в зоне считывания мастер-станции – то мастер-станция никак на команду не отвечает! Хотя на любые другие команды логика совсем иная – на полученную команду мастер-станция всегда отправляет ответ. Из-за этого программе на компьютере не совсем просто понять момент, когда отправлять на мастер-станцию следующую команду чтения чипа. Дело в том, что я сделал в обработке интервал циклического чтения чипов с шагом в 250 миллисекунд (250мс, 500мс, 750мс и т.д.) и на малом интервале (250мс) отсутствие ответа не всегда означало отсутствие чипа. Я игрался еще с использованием связки команд «Считать тип чипа» и «Считать чип». Команда «Считать тип чипа» всегда возвращает ответ, даже если чипа нет. Поэтому я (в режиме циклического считывания чипов участников) вместо команды «Считать чип» сначала отправлял команду «Считать тип чипа». Затем анализировал ответ на команду «Считать тип чипа» и следующую (в связке) команду «Считать чип» отправлял, только когда в ответе на команду «Считать тип чипа» чип был обнаружен. Но эта связка как-то коряво у меня работала, часто вылетали ошибки чтения чипа (возможно, из-за увеличившихся временных интервалов, вызванных паузой между передачами 2-х команд).

Подумав, я решился на модификацию прошивки мастер-станции. Я создал в ней несколько новых команд (и ответов на них). При этом полностью поддерживается работа старых команд. Прежде всего добавил команду «Считать чип ACK» (код 0x5B), которая всегда возвращает ответ с кодом 0x64. Аналогично добавил команду «Считать сырые данные ACK» (код 0x5C) с обязательным ответом с кодом 0x6A. И добавил новую команду «Считать мастер-чип чтения состояния станции» (код 0x5D) с ответом с кодом 0x6B, потому что в стандартной прошивке присутствовала только команда «Создать мастер-чип для чтения состояния станции» (код 0x50), а для чтения данных из этого чипа использовалась команда «Считать сырые данные с чипа». То есть, чтобы считать полезные 16 байт с данными о состоянии базовой станции, с чипа читалась практически вся память (около 500 байт для чипов NTAG 215). В итоге для мастер-станции я сделал модифицированную прошивку «1.8.222». Мои изменения выделены комментариями //Егунов+ и //Егунов-. Ссылка на скетч с исходниками этой прошивки в конце этой статьи.

Потом решился на изменение стандартной прошивки базовой станции (версия 3.7.0). Как выяснилось, алгоритм чтения содержимого лога отметок из базовой станции сделан «однопорционным». Лог отметок из базовой станции записывается на мастер-чип всегда с самого начала и записываются максимум то количество отметок, которое способно разместиться на одном мастер-чипе. Для NTAG215 это 123 отметки. Если в логе отметок базовой станции количество записей больше, чем 123 (а стандартная прошивка базовой станции позволяет записать в лог отметок до 4000 записей), то прочитать их не получится. В модифицированной прошивке реализовал «порционное» чтение лога отметок, когда один и тот же мастер-чип чтения лога отметок должен многократно подноситься сначала к базовой станции (которая запишет на него очередную порцию записей из своего лога отметок), затем к мастер-станции (которая считает эту порцию). Интервал между «порциями» должен быть в пределах 3-300 секунд. Если этот интервал будет нарушен (или мастер-чип между порциями будет поднесен к другой базовой станции), то при следующем поднесении этого мастер-чипа к базовой станции на него будет записана самая первая порция лога (начнется считывание с самого начала лога) и перед этим базовая станция издаст звуковой сигнал «Некорректное время» (3 коротких звуковых сигнала «пи-пи-пи»), свидетельствующий о том, что базовая станция была готова записать очередную порцию лога отметок, но начала запись с самого начала. Программа «О-Судейство» умеет собирать считанные на мастер-станции порции лога отметок в один лог и после считывания всех порций отображает в отдельном окне табличного документа лог отметок, который можно сохранить в файл или скопировать в буфер обмена для дальнейшей обработки.

 Попутно реализовал запись на мастер-чип чтения состояния станции так называемой «расширенной информации»: серийный номер, дата изготовления, наименование изготовителя и т.п.

Мои изменения в скетче прошивки базовой станции выделены комментариями //Егунов+ и //Егунов-. Ссылка на скетч с исходниками этой прошивки в конце этой статьи.

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

Рис.1
фрагмент скетча базовой станции, где задаются данные для расширенной информации
(записываются на мастер-чип чтения состояния станции)

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

  • DONT_USE_HARD_ALARM – отключается использование аппаратного будильника с пробуждением по внешнему прерыванию, вместо него используется программный будильник с точностью +0-25 сек (так как станция в режиме «Сон» просыпается раз в 25 секунд);
  • DONT_USE_ADC – отключается использование схемы измерения напряжения батареи (с точностью 0.02V), вместо нее используется измерение Vcc (напряжение питания после стабилизатора) с разрешением 1 бит (в норме/низкий заряд);
  • DONT_USE_I2C_EEPROM — отключается использование микросхемы I2C EEPROM, вместо нее лог отметок (без времени) будет записываться в EEPROM mega328p;
  • DONT_USE_REED_SWITCH — отключается использование схемы моментального пробуждения базовой станции герконом при помощи магнита, приклеенного к чипу.

Эти макроопределения я добавил, когда на этапе настройки комплекта из 36-ти базовых станций столкнулся с фактом, что несколько станций не пробуждаются по аппаратному будильнику, еще несколько станций при измерении напряжения батареи возвращали некорректное значение 1.36V (всегда только это значение). Вероятно, это мне достались косячные микросхемы mega328p, китайцы — мастера подсунуть лажу под видом хорошего товара.

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

А вот так выглядит расширенная информация после считывания мастер-чипа в программе «О-Судейство»:

Рис.2
Просмотр расширенной информации в программе «О-Судейство»
(при считывании на мастер-станции мастер-чипа чтения состояния станции)

Скетч с модифицированной прошивкой мастер-станции v.1.8.222 скачать можно здесь.

Скетч с модифицированной прошивкой базовой станции v.3.7.0 скачать можно здесь.

Продублировал эти ссылки на странице DOWNLOAD в таблице «Программное обеспечение и документация SportIduino».