Хронометраж для горных лыж на Ардуино. Заодно

В общем-то независимо от хронометража для горных лыж на Ардуино можно делать всякие удобные устройства. Одно из таких устройств назрело уже несколько лет как. Дело в том, что на тренировках нужно следить за обычным временем. Горка у нас арендована строго на два часа, и это время не менее строго «расписано». При этом часов при себе нет. От этого пришлось давно отказаться, поскольку при тренировках слалома часы долго не живут. Да и все остальное, что может быть повреждено попаданием вешки, смартфон и даже брелок-сигнализация на ключах от машины. Всё в рюкзаке, который лежит в куче таких же около старта. Поэтому в поле зрения не вредно иметь часы. И желательно температуру, хоть это не критично. И желательно, чтобы часы отслеживали регламент тренировки, давали заметные сигналы, когда нужно ставить новую трассу, а когда закругляться. Искал что-то подобное в продаже, морозоустойчивое с достаточно большими индикаторами, чтобы было видно на расстоянии. Как ни странно, не нашел. В заметке опишу такой блок.

Регламент наших тренировок описан в заметке: Самостоятельные тренировки по слаломной трассе.  До начала арендованного времени (потому что сверху вниз) ставятся разминочные чарлики. Их нужно строго через полчаса заменить на первую тоже разминочную трассу, еще через полчаса на вторую трассу и оставить время на заглаживание склона. Эффективность тренировки (измеряемая в чувстве «накатался») зависит и от точности соблюдения регламента. Бывало так, что ставили хорошую трассу с омегой, а после пары спусков время аренды внезапно заканчивалось.




Модули (платы)

В модуле «Контроль регламента»  используются те же платы, что и для других модулей. Эти платы описаны здесь: Хронометраж для горных лыж на Ардуино. Заказ модулей. Точнее, используется одноплатный-однокристальный компьютер Ардуино Нано, плата зарядки аккумулятора и индикатор часов с двоеточием.

 

Ардуино Нано (159 руб, срок поставки 25 дней)
Аккумулятор 18650 (162 руб, 39 дней), плата зарядки (вверху, 22 руб, 25 дней). Плата выдачи стабилизированного напряжения 5 В (внизу, 27 руб, 25 дней) в этом модуле не используется
Индикатор для часов (с двоеточием) на контроллере TM1637 (с обратной стороны платы), 38 руб, срок поставки 25 дней

Помимо этих модулей используются следующие.

Индикатор «с точками» для вывода температуры. К сожалению такие индикаторы почему-то на другом контроллере (TM74HC595), с которым возни гораздо больше. Цена на Али (здесь, выше и далее, с доставкой до ближайшего почтового отделения в Москве) 94 руб (при курсе примерно 65 руб за доллар). Доставка получилась за 25 дней.

Плата часов «реального времени» (RTC — real time clock) DS3231. Это довольно точные часы с отдельным питанием на батарейке 2032, разумеется с кварцем. Помимо этого там встроен термометр для того, чтобы корректировать показания частоты кварца в зависимости от температуры. В принципе можно было бы использовать этот термометр, задокументированная точность составляет 0.5 градуса. Не сразу об этом узнал, но наверное использовать не стал бы, поскольку температура нужна «четко» снаружи. Стоимость 76 руб, доставка 25 дней.

Термометр DS18b20. Это не термопара, термометр на чипе от Dallas Semiconductor выдает сразу значение температуры в цифрах. Кроме этого на модуле есть свой адрес и протокол 1-wire, по которому на тот же провод можно навесить еще много таких же термометров. Цена 93 руб, доставка 25 дней. Заявленная точность — 0.5 градуса.

 

Активный зуммер. Бывают еще пассивные зуммеры, которые воспроизводят частоту, которую на них подают. Активный зуммер выдает сигнал сам, но только одной частоты. Стоимость 32 руб, срок поставки 25 дней. Срок поставки один и тот же для всех модулей, поскольку они заказывались одновременно в самой первой и в самой большой партии у одного поставщика. Наверное поэтому доставка получилась довольно быстрая для Али Экспресс.

Схема соединений

Думаю, такие схемы не вредно составлять для всех блоков на случай ремонта. Соединение могут быть не обязательно такими, поскольку у Ардуино Нано много равнозначных выходов. На схеме (+) и (-) не разведены, чтобы не усложнять восприятие. Просто нужно учитывать, что все красные провода соединены и это (+), и все черные соединены и это (-) или по-другому «земля».

1) Датчик температуры (черный и красный провода подключаются к (-) и (+) ), 2) плата зарядки аккумулятора от разъема USB, 3) выключатель питания, 4) аккумулятор, 5) индикатор времени, 6) индикатор температуры, 7) светодиод «садится аккумулятор», 8) кнопка обнуления секунд для выставления времени часов (расположена не на виду, внутри блока), 9) Ардуино Нано, 10) плата часов, 11) выключатель режима контроля регламента, 12) пьезопищалка для контроля регламента




Описание работы

Оба выключателя (питания и включение контроля регламента) расположены «под один палец». При включении показывается «астрономическое» время, как в обычных часах, и температура в градусах Цельсия с десятыми долями.

Расписание аренды у нас разное, по будням, выходным и праздникам. Все эти данные «вбиты» в программу. Когда наступает «время перемен», в течение трех минут прерывисто пищит зуммер и мигает индикатор времени. Если это не уместно, можно отключить выключателем.

Часы выставляются при компиляции программы, конечно не с точностью до секунды. Эту точность можно поймать нажатием кнопки, которая обнуляет установку секунд до ближайшей минуты. То есть, если секунд было больше, то та же минута, а если меньше, то минута прибавляется. В общем, максимально естественно.

В блоке нет «повышайки», поскольку нет ничего ответственного. То есть логическая единица во всех элементах схемы соответствует не 5-и вольтам, а напряжению, выдаваемому аккумулятором.

Измерения показали, что для конкретно этой Ардуины Нано все работает в диапазоне напряжений выдаваемых литий-ионным аккумулятором от 4.1 вольт (столько выдал полностью заряженный конкретный аккумулятор) до 2.86 вольт.

Когда аккумулятор разряжается до 3.0 вольт, загорается красный светодиод. После этого есть еще примерно полчаса работы схемы. А может и больше.

Измерял со старым аккумулятором от смартфона, поскольку дождаться когда сядет аккумулятор 18650 с заявленной емкостью 3000-3500 мАч даже не пытался.

В итоговый блок  поставил аккумулятор послабее, уже очень эти 18650 огромные 🙂




Особенности программирования

Нужно остановиться на четырех моментах: работа с датчиком температуры, с индикатором температуры, с часами, и измерение напряжения питания. Все остальное совсем обычное.

Измерение температуры

Как уже упоминал, измерение температуры это не просто термопара-АЦП-градуировка, а работа с протоколом, нахождение по адресу чипа, инициализация, и считывание. Это можно сделать очень сложно для неспециалиста. Так и сделано в примерах на основе библиотеки «OneWire», которые «лежат на поверхности» в интернете. С ними разобраться не получилось. Удалось разобраться с примерами, которые используют надстройку «DallasTemperature» над предыдущей библиотекой. Идеология примерно следующая. Сначала в эфир (точнее в один провод) высылается запрос на отклик от всех подключенных датчиков. Их может быть много, больше сотни. Собираются отклики, хотя в примере заранее известно, что подключен только один датчик. Этот единственный откликнувшийся датчик записывается в номер «0». Потом по номеру «0» отправляется запрос на данные, данные принимаются.

В общем-то все это не было бы важно, если бы на все это не уходило примерно 0.7 секунды времени, причем все остальные процессы останавливаются. Попытки определить этот адрес при инициализации в разделе «Setup» программы с тем, чтобы быстро обратиться именно к этому чипу и быстро считать данные мало что дали. Минимальное время «замирания» программы составляет 0.57 секунды и с этим ничего не поделаешь. Первоначально хотел повесить измерение температуры на Ардуино модуля «Старт». Потом, когда из-за борьбе с радиоканалом модуль «Старт» получился загруженным, решил не утяжелять. А оказывается ничего и не получилось бы. Модуль Старт «следит» за стартовой калиткой и за сигналом от модуля Финиш. «Замирать» на полсекунды ему никак нельзя 🙂




Индикатор на контроллерах TM74HC595

Выглядит это индикатор точно также как и на контроллере ТМ1637, а стоит дороже. Почему-то точки в индикаторах с Али только на этом контроллере. По большому счету индикатор на контроллерах TM74HC595 (их два на обратной стороне платы) это недоразумение. Цифры нужно все время программно «поджигать», примерно через 300 микросекунд (точных данных не нашел, но не менее, чем 1500 мкс), иначе индикатор моргает заметно для глаза. В принципе ничего сложного, поскольку Ардуино построено на цикле «loop», то есть все равно постоянно занимается одним и тем же. Но когда измерение температуры все берет на себя на полсекунды, то этот индикатор гаснет. В контроллере 1637 поджиг берет на себя контроллер (и это правильно 🙂 ), с ним все в порядке.

Задача решается через дергание программы путем прерывания по таймеру. Звучит дико, да и для меня слишком сложно. Для этого нужно подключить библиотеку «TimerOne». А саму библиотеку для индикатора и пример с работой по такому прерыванию нашел исключительно в рунете через сайт AlexGyver (спасибо!). Библиотека называется «TM74HC595Display». Правда там нет вывода отрицательных чисел и плохо обрабатывается показ околонулевых температур. Но это было несложно доделать.

Часы реального времени DS3231

К сожалению с примерами и библиотеками, которые «лежат на поверхности» тоже ничего не получилось. Но нашлась библиотека с очень простой работой, называется «DS3231». Отмечу, что подключать часы к Ардуино Нано можно только на «ножки» А4, А5, поскольку только на них реализован протокол I2C, который необходим этому модулю.

Обнуление секунд пришлось делать через прерывание (из-за температурного модуля), кнопка подключена к «ножке» D2 (прерывание номер 0). Это прерывание как-то конфликтует с прерыванием по таймеру для обслуживание индикатора. Поэтому обнуление идет не о факту нажатия кнопки, а по факту «кнопка уже нажата». В общем-то ненамного сложнее, но более криво 🙁




Измерение напряжения питания

у Ардуино Нано есть несколько входов с аналого-цифровыми преобразователями. Подсоединение аккумулятора к любому из этих выходов почему-то немедленно включало плату, как будто бы подсоединился к «ножке» 5V. Разбираться с этим не стал, поскольку решил отказаться от «повышайки», то есть не питать этот конкретный блок стабилизированными 5 вольтами. При такой схеме вообще с измерением напряжения все довольно печально. Входы АЦП измеряют напряжение относительно трех вариантов опорного напряжения (на выбор). Перечислять их не буду, поскольку для измерения «бортового» напряжения подходит только один способ — измерять относительно встроенного в чип опорного напряжения 1.1 вольт. Но тоже не просто, поскольку измерять напряжение можно только меньше опорного. То есть нужно городить делитель напряжения, который сам по себе будет потреблять ток.

К счастью в сети есть трюк, который находится по поиску Secret Arduino voltmeter — measure battery voltage. Смысл состоит в том, что в качестве опорного используется «бортовое» напряжение, а путем совсем непонятных для меня ухищрений в качестве измеряемого идет подключение внутри чипа к вышеупомянутому напряжению 1.1 вольт. То есть, 1.1 вольт измеряется в долях от бортового напряжение. Из этого обратным пересчетом вычисляется бортовое напряжение. Реализовано в виде процедуры по работе с регистрами, в которой я не понимаю ни одной строчки 🙂  Но при включении кода в программу все работает. Единственное, как и указывал автор, нужно подобрать коэффициент, поскольку внутреннее опорное напряжение не ровно точно 1.1 вольт.

Результат

Для того, чтобы перекинуть контакты индикатора TM74HC595 на правую сторону, как показано на картинке (а) необходимо обратить внимание, что на месте контакта DIO (б) справа расположен неиспользуемый контакт QH (в). Поэтому нужно перекинуть провод как показано на (г) и перерезать дорожку QH, как отмечено красной линией и указано стрелкой (г)

Здесь собраны все заметки по теме «Хронометраж для горных лыж на Ардуино».

 





Vadim Nikitin DigInfo.ruВадим Никитин

 

 

 

на начало страницы



Share This:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *