Велокомпьютер своими руками на мк

—>Персональный сайт Пьяных А.В. —>

Я частенько вкручиваю педали на своем железном коне и пользуюсь обычным, дешевым китайским велокомпьютером за 150 рублей. Основной его задачей был подсчет пройденного расстояния, скорости и времени в пути.

Позже арсенал «приборов учета» пополнила программа Endomondo для мобильного телефона. Она умеет записывать трек маршрута (при включенном модуле GPS), выводит диаграммы скорости, рекордное время на дистанциях . Я радовался, когда удавалось побить собственные рекорды. По приезду домой и выползанию из ванной включал на мобилке инет и данные тренировки автоматически загружались на сервер программы. Потом можно было попивая чаёк посмотреть где и как я ехал, похвастаться перед женой очередным рекордом времени на стокилометровой покатушке, самым быстрым километром и так далее. Для дальнейшего развития физической формы нужны были данные каденса (скорости вращения педалей). Также знать каденс необходимо из «медицинских» соображений. При длительной езде с небольшим каденсом и большой нагрузкой можно безвозвратно загубить коленные суставы. Существуют велокомпьютеры с функцией измерения каденса, но они значительно дороже и функционал в них также ограничен. Мне хотелось сделать все по моим требованиям.

В начале 2015 года я увлекся Arduino и после того как намигался светодиодами, попищал пищалочками, попробовал работу с разными модулями, я захотел чего-то большего. Здесь меня и посетила мысль сделать собственный велокомпьютер на базе Arduino. В начале для уменьшения размера я выбрал контроллер Arduino nano с 32Кб флеш памяти, 2Кб ОЗУ, 1Кб энергонезависимой памятью EEPROM, тактовой частотой 16МГц. К нему были подключены две кнопки. Одна из них имитировала датчик оборота колеса для подсчета скорости и расстояния, а другая — датчик оборота педалей для подсчета каденса. Позже их планировалось заменить стандартными герконовыми датчиками от китайских велокомпьютеров. Информация выводилась на OLED дисплей диагональю 0,96 дюйма. Для полного исключения дребезга контактов кнопок я использовал сборку из 6 независимых инвертирующих триггеров Шмитта в одном корпусе (микросхема 74HC14N). Потом были подключены часы реального времени. Я написал программу, которая считывала данные и выводила скорость, каденс, пройденное расстояние за текущее включение компьютера, суммарный пробег, дату и время. Потом был подключен модуль MP3 с micro SD флешкой, на которой были записаны голосовые сообщения, проигрываемые при определенных событиях. Модуль с управлением через последовательную шину. В настройках можно регулировать громкость проигрывания сообщений.

Для правильного подсчета пройденного расстояния компьютер должен знать периметр колеса. Так как у меня несколько видов покрышек для разных дорог, то необходимо менять данные о периметре колеса. Для редактирования настроек были добавлены кнопки Меню, Больше, Меньше и Ввод. Для упрощения ввода параметров и чтения технической информации во время отладки программы и тестовых заездов к контроллеру был подключен bluetooth модуль. Через bluetooth терминал на мобильном телефоне я мог оперативно изменить параметры. Он также работает через последовательную шину. Память под программу уже заканчивалась. Arduino nano пришлось заменить на контроллер Mega2560, у данного контроллера 4 последовательных порта, больше портов ввода-вывода и больше памяти для программы и хранения переменных (256Кб флеш памяти, 8Кб ОЗУ, 4Кб памяти EEPROM). Здесь уже есть где развернуться.

Свет

Для движения в темное время суток на велосипеде была установлена велофара. У нее имелось 4 режима работы: максимальный, нормальный, стробоскоп и режим SOS. При движении на большой скорости по трассе максимальный режим был в самый раз. Иногда встречка, не догадываясь, что я велосипедист, моргала мне, чтобы я переключился на ближний:) Тогда я или переключался на нормальный режим, или опускал фару вниз, чтобы не слепить водителей. В городе даже нормальный режим вызывал панику у пешеходов, да и яркость при неспешной прогулке была излишней. Я решил возложить управление яркостью фары на микроконтроллер, сделав ШИМ регулирование. Для выяснения напряжения и тока работы светодиодов я разобрал фару и подключил приборы для измерения. Выяснил, что в максимальном режиме на светодиодную сборку подавалось около 8Вт мощности (0,58А при 14В), а в нормальном режиме всего 4Вт (0,3А при 13,3В). При попытке узнать паспортные данные на светодиоды я был очень удивлен. В фонаре были установлены ВНИМАНИЕ! 5 светодиодов CREE XM-L T6 по 10Вт каждый. Я не верил глазам. Ставить в фонарь 50Вт светодиодную сборку и подавать на нее 8Вт. Я догадывался, что светодиоды работают не на полную мощность для уменьшения тепловыделения, но то, что они работают всего на 8-16% мощности, вызвало у меня удивление. Тут же зачесались руки выжать больше, намного больше люменов. При подаче 12-15Вт фонарь ощутимо нагревался уже через 2-3 минуты. Отрезав часть корпуса фонаря, я прикрутил сборку к довольно массивному радиатору от CPU. При подаче паспортных 50Вт даже этот радиатор нагревался. Опытным путем я установил, что после превышения порога в 30 Вт визуально яркость не сильно меняется, а потребляемый ток и нагрев сильно возрастают. Чтобы не возить с собой автомобильный аккумулятор:), порог мощности я выбрал в 30Вт. К микроконтроллеру был подключен переменный резистор, которым можно было плавно менять яркость фары. Также при включении переднего света сзади велосипеда должен загораться красный габарит, чтобы обозначить мое присутствие на дороге. Все это было реализовано на микроконтроллере. Были случаи, когда я оставался в темное время суток без переднего света в 10-15 км от дома. В городе это не проблема, а вот на трассе это очень опасно. Для примерного расчета времени работы батареи аккумуляторов к МК был подключен датчик тока на микросхеме ACS712. На двух резисторах собран делитель напряжения для измерения напряжения на батарее. При снижении напряжения ниже порогового уровня яркость фонаря программно уменьшается. Затем я добавил еще две кнопки управления сигналами поворота, которые будут установлены спереди на руле и сзади на подседельном штыре или на багажнике. Для питания я планирую использовать батарею из 5 последовательно включенных Li-Ion аккумуляторов емкостью 3,4А.

Кроме времени тренировки подсчитывается время, в течении которого велосипед находится в движении, и время вращения педалей. Если за 120 минут катания время движения составило 100 минут, значит я 20 минут стоял на месте. В ремя вращения педалей 90 минут будет означать, что я в сумме 10 минут двигался накатом по инерции.

Время движения и вращения педалей

Ведение записи данных

Для подробного лога тренировки требуется довольно много памяти, поэтому был добавлен модуль с SD картой. При каждом включении компьютера создается новый файл. В него записываются все события, будь то нажатие кнопки, сигналы с датчиков. При работе МК в нем работает счетчик отработанных миллисекунд. Переполнение и сброс счетчика происходит примерно через 50 дней после включения компьютера. Это намного больше, чем может длиться одна поездка. Запись в файл ведется построчно в формате X Y Z. X — название события описанное одной буквой (например, С — событие каденса, S — нажатие на тормоз, L — включение фары и т.д.). Y — значение события (для оборота колеса — это скорость, для оборота педалей — каденс). Z — время события в миллисекундах, отсчитанных от включения компьютера. Дата и время включения пишутся первой строкой во вновь созданном файле тренировки после включения компьютера. Таким образом есть точка отсчета всех событий во времени. Для чтения файл выглядит не удобно, и он получается довольно объемный. Позже я планирую написать программу, которая должна обрабатывать и анализировать эти данные.

Каденс от 51 оборота в минуту до 140 я разбил на 16 диапазонов. Компьютер подсчитывает и выводит в виде диаграммы распределение каденса по зонам. Таким образом можно определить, в каких зонах была совершена основная работа.

Распределение каденса по зонам

Стоп сигнал и дальномер

При торможении загорается стоп сигнал и на экран выводится расстояние до объектов сзади, получаемое от ультразвукового дальномера. Задумка была такой. При движении по дорогам на большие расстояния с сокатальцами существует техника «сидения на колесе». Первый велосипедист как бы разрезает воздух и те, кто едет за ним, испытывают меньшее сопротивление воздуха. Чем меньше расстояние между велосипедами, тем меньше сопротивление и тем больше экономия сил. Есть информация, что экономия может достигать 20-30%. На больших расстояниях это очень много. При некотором опыте расстояние между колесами двух велосипедистов может составлять 5-15 см. При таком маленьком расстоянии даже незначительное замедление может привести к столкновению с неприятными последствиями и следами асфальтной болезни на лице:( Оборачиваться и смотреть назад для контроля расстояния между велосипедами не очень удобно, а порой и опасно. Поэтому при легком нажатии на рычаг тормоза (колодки еще не касаются тормозных дисков) включается ультразвуковой дальномер и на экран для оценки выводится расстояние до едущего сзади. При слишком маленьком расстоянии раздается предупреждающий звуковой сигнал. При большом расстоянии можно тормозить с большей силой, при маленьком можно сообщить о своем маневре и избежать аварийной ситуации. Неудобство использования ультразвукового датчика состоит в том, что он при попадании на него грязи выйдет из строя. Закрыть его тоже не получится. Поэтому датчик сейчас не подключен. Вместо него буду ставить оптический датчик. Его можно будет закрыть прозрачным стеклом и при загрязнении нужно будет всего лишь протереть.

Для регистрации погодных условий есть датчик температуры и давления BMP180 . Теоретически его можно приспособить для определения высоты. Точности измерения давления достаточно, что бы определить изменение высоты в 25 см (разрешение датчика 0,03 гектопаскаля). При усреднении нескольких измерений точность и стабильность показаний можно увеличить. Остается вопрос о калибровке, так как давление воздуха постоянно меняется. Плюс к этой погрешности добавляется влияние движения.

Температура и давление воздуха

Когда выводимых данных стало слишком много, была попытка подключить цветной LCD дисплей 2,2 дюйма диагональю и разрешением 240х320 точек. Попытку считаю неудачной, так как для обновления информации на экране уходило слишком много времени. Если показания скорости еще можно было обновлять раз в 2-3 секунды, то при изменении параметров (увеличении или уменьшении значения) пользоваться компьютером становилось просто невозможно. Если бы я использовал Maple mini с 32 разрядным процессором ARM Cortex-M3 с тактовой частотой 72 МГц против 16 у Mega2560, то с выводом на экран проблем бы не было, но тогда я еще не был знаком с кортексами. Решил проблему подключением второго OLED экрана. Оба работают по шине I2C, поэтому проводов не прибавилось. И нформация отображается своевременно и корректно (п ри частоте обновления на экранах 3 раза в секунду).

Датчик частоты сердечных сокращений

Для оценки интенсивности тренировки необходимо следить за частотой сердечных сокращений. Предусмотрен вход для подключения датчика сердцебиения. В компьютере есть уставки для разных пульсовых зон. На экране можно наблюдать ЧСС и пульсовую зону, в которой он находится. Датчик сердцебиения я опишу в отдельной статье. ЧСС измеряется методом фотоплетизмографии. Вкратце суть метода состоит в измерении изменения светоотражения/поглощения капилярами кожи излучения инфракрасного диапазона при прохождении пульсовой волны. В полевых условиях я его не проверял. Собранный на макетной плате он работает хорошо.

Читайте также  Генератор сигналов на arduino

Пульс и зоны пульса

А теперь подведем итоги первой части описания. Сформулируем список функций велокомпьютера.

Измерение, подсчет и вывод:

  • скорости движения
  • средней скорости
  • максимальной скорости
  • отношение текущей скорости к средней
  • пройденного расстояния за тренировку
  • пройденного расстояния за все время
  • времени тренировки
  • времени движения
  • времени вращения педалей
  • среднего каденса
  • распределения каденса по зонам
  • пульса
  • пульсовой зоны
  • расстояния до объектов сзади при торможении
  • температуры окружающей среды
  • атмосферного давления

Логирование на карту памяти всех событий;

  • велофарой с плавной регулировкой яркости
  • сигналами поворота

Более подробно о «железе» читайте в следующей статье .

Велокомпьютер своими руками на мк

Дельта принтеры крайне требовательны к точности изготовления комплектующих (геометрия рамы, длины диагоналей, люфтам соединения диагоналей, эффектора и кареток) и всей геометрии принтера. Так же, если концевые выключатели (EndStop) расположены на разной высоте (или разный момент срабатывания в случае контактных концевиков), то высота по каждой из осей оказывается разная и мы получаем наклонную плоскость не совпадающая с плоскостью рабочего столика(стекла). Данные неточности могут быть исправлены либо механически (путем регулировки концевых выключателей по высоте), либо программно. Мы используем программный способ калибровки.
Далее будут рассмотрены основные настройки дельта принтера.
Для управления и настройки принтера мы используем программу Pronterface.
Калибровка принтера делится на три этапа:

1 Этап. Корректируем плоскость по трем точкам

Выставление в одну плоскость трех точек — A, B, C (расположенных рядом с тремя направляющими). По сути необходимо уточнить высоту от плоскости до концевых выключателей для каждой из осей.
Большинство (если не все) платы для управления трехмерным принтером (В нашем случае RAMPS 1.4) работают в декартовой системе координат, другими словами есть привод на оси: X, Y, Z.
В дельта принтере необходимо перейти от декартовых координат к полярным. Поэтому условимся, что подключенные к двигателям X, Y, Z соответствует осям A, B, C.(Против часовой стрелки начиная с любого двигателя, в нашем случае смотря на логотип слева — X-A, справа Y-B, дальний Z-C) Далее при слайсинге, печати и управлении принтером в ручном режиме, мы будем оперировать классической декартовой системой координат, электроника принтера сама будет пересчитывать данные в нужную ей систему. Это условность нам необходима для понятия принципа работы и непосредственной калибровки принтера.

Точки, по которым мы будем производить калибровку назовем аналогично (A, B, C) и позиция этих точек равна A= X-52 Y-30; B= X+52 Y-30; C= X0 Y60.

Алгоритм настройки:

  1. Подключаемся к принтеру. (В случае “крагозяб” в командной строке, необходимо сменить скорость COM порта. В нашем случае с 115200 на 250000 и переподключится)

    После чего мы увидим все настройки принтера.
  2. Обнуляем высоты осей X, Y, Z командой M666 x0 y0 z0.
    И сохраняем изменения командой M500. После каждого изменения настроек необходимо нажать home (или команда g28), для того что бы принтер знал откуда брать отсчет.
  3. Калибровка принтера производится “на горячую”, то есть должен быть включен подогрев стола (если имеется) и нагрев печатающей головки (HotEnd’а) (Стол 60град., сопло 185 град.) Так же нам понадобится щуп, желательно металлический, известных размеров. Для этих задач вполне подойдет шестигранный ключ (самый большой, в нашем случае 8мм, он предоставляется в комплекте с принтерами Prizm Pro и Prizm Mini)
  4. Опускаем печатающую головку на высоту (условно) 9мм (от стола, так, что бы сопло еле касалось нашего щупа, т.к. высота пока что не точно выставлена.) Команда: G1 Z9.
  5. Теперь приступаем непосредственно к настройке наших трех точек.
    Для удобства можно вместо g- команд создать в Pronterface четыре кнопки, для перемещения печатающей головки в точки A, B, C, 0-ноль.

  • Последовательно перемещаясь между тремя точками (созданными ранее кнопками или командами) выясняем какая из них находится ниже всего (визуально) и принимает эту ось за нулевую, относительно нее мы будем менять высоту остальных двух точек.
  • Предположим, что точка A у нас ниже остальных. Перемещаем головку в точку B(Y) и клавишами управления высотой в Pronterface опускаем сопло до касания с нашим щупом, считая величину, на которую мы опустили сопло (в лоб считаем количество нажатий на кнопки +1 и +0.1)
    Далее командой меняем параметры высоты оси Y: M666 Y <посчитанная величина>
    M666 Y0.75
    M500
    G28
  • Ту же операцию проделываем с оставшимися осями. После чего следует опять проверить высоту всех точек, может получится, что разброс высот после первой калибровки уменьшится, но высота все равно будет отличатся, при этом самая низкая точка может изменится. В этом случае повторяем пункты 6-7.
  • 2 Этап. Исправляем линзу

    После того как мы выставили три точки в одну плоскость необходимо произвести коррекцию высоты центральной точки. Из за особенности механики дельты при перемещении печатающей головки между крайними точками в центре она может пройти либо ниже либо выше нашей плоскости, тем самым мы получаем не плоскость а линзу, либо вогнутую либо выпуклую.

    Корректируется этот параметр т.н. дельта радиусом, который подбирается экспериментально.

    Калибровка:

    1. Отправляем головку на высоту щупа в любую из трех точек стола. Например G1 Z9 X-52 Y-30
    2. Сравниваем высоту центральной точки и высоту точек A,B,C. (Если высота точек A, B, C разная, необходимо вернутся к предыдущей калибровки.)
    3. Если высота центральной точки больше остальных, то линза выпуклая и необходимо увеличить значение дельта радиуса. Увеличивать или уменьшать желательно с шагом +-0,2мм, при необходимости уменьшить или увеличить шаг в зависимости от характера и величины искривления (подбирается экспериментально)
    4. Команды:
      G666 R67,7
      M500
      G28
    5. Подгоняем дельта радиус пока наша плоскость не выровняется
    3 Этап. Находим истинную высоту от сопла до столика

    Третьим этапом мы подгоняем высоту печати (от сопла до нижней плоскости — столика) Так как мы считали, что общая высота заведомо не правильная, необходимо ее откорректировать, после всех настроек высот осей. Можно пойти двумя путями решения данной проблемы:
    1 Способ:
    Подогнав вручную наше сопло под щуп, так что бы оно свободно под ним проходило, но при этом не было ощутимого люфта,

    • Командой M114 выводим на экран значение фактической высоты нашего HotEnd’а
    • Командой M666 L получаем полное значение высоты (Параметр H)
    • После чего вычитаем из полной высоты фактическую высоту.
    • Получившееся значение вычитаем из высоты щупа.

    Таким образом мы получаем величину недохода сопла до нижней плоскости, которое необходимо прибавить к полному значению высоты и и записать в память принтера командами:
    G666 H 235.2
    M500
    G28

    2 Способ:
    Второй способ прост как валенок. С “потолка”, “на глаз” прибавляем значение высоты (после каждого изменение не забываем “уходить” в home), добиваясь необходимого значения высоты, но есть шанс переборщить со значениями и ваше сопло с хрустом шмякнется об стекло.

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

    Велокомпьютер своими руками

    Это статья о том, как можно самостоятельно сделать для любимого велосипеда компьютер. Покупать готовый это для меня не интересно, хотя быстро, без мороки и имеет более человеческий вид. Хотелось сделать полезную вещь применив свои знания. Так вот, посмотрев в интернете несколько вариантов таких самоделок, быстро была составлена схема устройства.

    В качестве основы был взят распространенный контроллер ATtiny2313. Для которого и была написана программа. В качестве индикатора используется семисегментный четырехразрядный индикатор, красного свечения. Транзисторы обыкновенные маломощные NPN, в моем случае ставил КТ315.

    Печатная плата изготавливалась лазерно-утюжным методом. Контроллер установил в панельку, чтобы можно было извлекать и перепрошивать, так как разъема для программирования я не предусмотрел. Однако сделал разъемы для подключения питания и датчика, чтобы можно было снимать велокомпьютер с руля.

    В качестве корпуса выбор сразу пал на старую велофару, которая работала от больших батареек-боченков и светила достаточно тускло, так как там стояла лампочка накаливания.

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

    В результате тестов дома, яркость показалась очень даже достаточной, но после первой же покатушки вечером, я понял что нужно все менять.

    Поискав по закормам, нашел две светодиодные сборки с отражателями от нерабочих фонариков. Примеряв все это дело, решил закрепить стационарно.

    Первые же ночные испытания показали, что работа ведется в правильном направлении, теперь можно было и вечером ездить. Но для большего комфорта докупил фонарик на 1 ваттном светодиоде с регулировкой пятна света, и закрепил отдельно на руле. Теперь все видно как днем (ну почти как днем), прохожие даже оборачиваются посмотреть что это на них едет )))

    Самым сложным в изготовлении это устройства, было сделать магнит, который крепиться на спицу. Все мои попытки найти в продаже готовый, но без самого компьютера, оказались безуспешными. Было решено сделать самому, как говориться полный хендмейд. Нашел магнит когда-то выковырянный из старого электросчетчика. Повертев его пару минут, определился какая часть больше подойдет, и начал пилить его своим дремелем, в итоге 4 диска сточил в ноль + 2 разлетелось, магнит оказался очень прочным, его даже сверла не брали. В итоге после дня мучений магнит был готов к установке на колесо. Пластиковая стяжка для того чтобы вся эта конструкция не проворачивалась на спице. Осталось покрасить все это дело.

    Следующим компонентом, который тоже нужно было сделать самому был датчик, основанный на герконе. Здесь все было просто, выточил из текстолита платку, разрезал медь где нужно, чтобы не травить, припаял геркон и провода. Потом залил все это лаком для ногтей, чтобы хоть как-то защитить от воды и грязи. И в конце при помощи пары подкладок и пластиковых стяжек закрепил на нужном расстоянии от магнита на вилке.

    Еще один немало важный компонент это батарейный блок. Я решил использовать три пальчиковых аккумулятора по 1.2 В в итоге имею 3.6 В – необходимый минимум для работы контроллера достигнут. Аккумуляторы размещаются в специальном батарейном блоке, который я закрепил под сидением. В планах сшить для него сумочку на липучках, чтобы удобнее было менять аккумуляторы.

    Потом осталось проложить провода по раме, и все окончательно закрепить.

    Описывать программную часть не буду, так как там все достаточно понятно, и я по ходу написания оставлял комментарии.

    This program was produced by the

    CodeWizardAVR V1.25.8 Evaluation

    Automatic Program Generator

    © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.

    Author : Freeware, for evaluation and non-commercial use only

    Chip type : ATtiny2313

    Clock frequency : 8,000000 MHz

    Memory model : Tiny

    External SRAM size : 0

    Data Stack size : 32

    eeprom unsigned int Total,on; //переменная в eeprom

    char Disp1, Disp2, Disp3,Disp4,k,j; // В этих переменных хранятся цифры, которые нужно отобразить

    unsigned char Num1, Num2,Num3, Num4,startFlag, MODE=1;

    unsigned long int timeC=0,time=0; // переменная хранящая значение таймера при срабатывании геркона

    unsigned long int speed=0;

    int distance=0,t ,TD,i=480;

    // External Interrupt 0 service routine

    interrupt [EXT_INT0] void ext_int0_isr(void)

    // Place your code here

    timeC=time; // время между прерываниями

    // Timer 0 overflow interrupt service routine

    interrupt [TIM0_OVF] void timer0_ovf_isr(void)

    // Place your code here

    // Declare your global variables here

    void Display ( unsigned int Number) // Функция выделяет цифры из четырехзначного числа

    while (Number >=1000)<

    while (Number >= 100)

    while (Number >= 10)

    void Dig_init() //кодировка цифр для индикатора

    Dig[0] =255-63; //(a+b+c+d+e+f); // Сейчас у нас схема с общим катодом

    Dig[4] =255-102; // (f+g+b+c);

    Dig[5] =255-109; // (a+f+g+c+d);

    Dig[6] =255-125; // (a+f+g+c+d+e);

    Dig[8] =255-127; // (a+b+c+d+e+f+g);

    Dig[9] =255-111; // (a+b+c+d+f+g);

    // Declare your local variables here

    // Crystal Oscillator division factor: 1

    // Input/Output Ports initialization

    // Port A initialization

    // Func2=In Func1=In Func0=In

    // State2=T State1=T State0=T

    // Port B initialization

    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

    // Port D initialization

    // Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=Out Func0=In

    // State6=0 State5=0 State4=0 State3=0 State2=T State1=0 State0=T

    // Timer/Counter 0 initialization

    // Clock source: System Clock

    // Clock value: 1000,000 kHz

    // Mode: Normal top=FFh

    // OC0A output: Disconnected

    // OC0B output: Disconnected

    // Timer/Counter 1 initialization

    // Clock source: System Clock

    // Clock value: 7,813 kHz

    // Mode: Normal top=FFFFh

    // OC1A output: Discon.

    // OC1B output: Discon.

    // Noise Canceler: Off

    // Input Capture on Falling Edge

    // Timer 1 Overflow Interrupt: On

    // Input Capture Interrupt: Off

    // Compare A Match Interrupt: Off

    // Compare B Match Interrupt: Off

    // External Interrupt(s) initialization

    // INT0 Mode: Rising Edge

    // Interrupt on any change on pins PCINT0-7: Off

    // Timer(s)/Counter(s) Interrupt(s) initialization

    // Universal Serial Interface initialization

    // Clock source: Register & Counter=no clk.

    // USI Counter Overflow Interrupt: Off

    // Analog Comparator initialization

    // Analog Comparator: Off

    // Analog Comparator Input Capture by Timer/Counter 1: Off

    // Global enable interrupts

    TD=Total; // запись общего расстояния из EEPROM при подаче питания

    startFlag=1; //((Гц/256)*длина колеса/1000м*3600сек*10)/timeC

    Велокомпьютер своими руками на мк

    Простой велокомпьютер с цветным 320×240 LCD

    Автор: WiseLord, wiselord1983@gmail.com
    Опубликовано 18.07.2017
    Создано при помощи КотоРед.

    В мае этого года так случилось, что приобрёл я себе велосипед, что хотел сделать уже давно, да как-то всё не выходило. Ну и, естественно, захотелось заиметь к нему что-то вроде велокомпьютера — считать пройденную дистанцию, отображать текущую скорость, и так далее.

    Покупать что-то готовое, будучи радиолюбителем и умея работать с МК, как-то не комильфо. Да и лежали у меня в закромах когда-то давно купленные на Aliexpress разные платки, которые и решено было пустить в дело. Получилось устройство, которое выглядит на велосипеде как-то так:

    Небольшой ролик с обзором функционала на Youtube:

    Функционал пока что самый базовый, но, скорее всего, будет расширяться. На текущий момент самое тяжёлое (шрифты, графика) уже реализовано, а у применённой ATmega328p ещё 70% памяти программ свободно. Так что вопрос скорее в том, что бы интересное придумать, а не в том, влезет или нет.

    Принципиальная схема очень проста:

    На самом деле, она, конечно, сложнее — не прорисовано питание, возможно, желательны какие-то фильтры для кнопок и датчиков (резисторы и конденсаторы, помимо имеющегося программного антидребезга), да даже те же ёмкости по питани. Но на суть это мало влияет — тут каждый может под себя доработать эти цепи.

    Правда, у меня вместо микросхемы ATmega328p использовна готовая плата, называемая Arduino Pro Mini, на которой уже есть кое-какая обвязка. Но это только для удобства разработки, используется она именно как микроконтроллер с удобно разведёнными на гребёнку ножками. Никакой средой Arduino и прочими скетчами здесь и не пахнет — проект заточен для обычного микроконтроллера.

    В качестве дисплея у меня применён купленный года два назад 320×240 цветной LCD на базе контроллера ILI9341:

    Дисплей работает по интерфейсу SPI, поэтому подключить его очень просто. Но есть один нюанс, который стоил мне многих нервов. Дисплей должен работать от напряжения 3.3В. Больше — нельзя. На плате дисплея можно видеть линейный стабилизатор на 3.3В. Я его тоже увидел, и, было, обрадовался. Подключил его к вышеупомянутой плате Arduino, переписал ранее написанный драйвер для STM32 под AVR и поимел странное поведение — дисплей нормально инициализировался и работал где-то в 50% случаев.

    В общем, долго мучил я код, пытаясь найти проблему, пока практически случайно не запитал от 3.3В и ATmega. И все баги пропали.

    В общем, проблема была в том, что МК, запитанный от 5В, соответственно выдавал это же напряжение лог. 1 на выходы, подключенные к дисплею. А эти ножки дисплея, оказывается, к 5В совсем нетолерантны — отсюда и все проблемы.

    Сначала я было подумал подключить дисплей к МК через преобразователь уровня. Но отдельно специальную микросхему заводить не хотелось, а резистивные делители не очень хороши тем, что в ждущем режиме через них будет (на входах с лог. 1) течь ток.

    В общем, проще оказалось и МК запитать от 3В (я использовал этот же стоящий на дисплее линейный стабилизатор), и всё заработало чётко.

    Можно видеть, что на плате с дисплеем разведён ещё и разъём для SD-карты со своим набором выводов. Мне он был не нужен, плюс делал плату много толще, поэтому я выпаял этот разъём, отклеил сам дисплей от его платы (он там был на чём-то вроде двухстороннего скотча) и отрезал где-то процентов 60 платы, естественно, убедившись что никаких дорожек непосредственно для дисплея там нет.

    В итоге на освободившееся место хорошо легла плата Arduino Pro Mini с ATmega328p на борту:

    Оба основных компонента — дисплей и плата поместились практически в габаритах крышки от корпуса. Ну и вид с обратной стороны:

    Была у меня мысль изготовить нормальную плату, чтобы разместить на ней вообще всё — МК, контакты для шлейфа дисплея, стабилизатор и т.д. Получилось бы, наверное, ещё лучше чем есть. Но очень хотелось всё сделать поскорее и приступить уже к программной части, поэтому я просто соединил всё МГТФ-проводом. Во второй половине корпуса разместилась Li-Ion батарея (купил на рынке, батарея от какой-то Nokia подходящего размера на 1450 мА*ч).

    Там же, под батареей (закреплённой на толстом двухстороннем скотче) разместилась и плата для её зарядки:

    Десяток таких плат на базе контроллера заряда TP4056 я тоже как-то покупал на Aliexpress. Выглядят они вот так:

    На плате имеются два светодиода. Во время зарядки через обычный MicroUSB кабель горит один из светодиодов — красный. Когда зарядка закончена, загорается второй — синий. Плата размещена в корпусе так, чтобы светодиоды были возле стенки, которую я дополнительно в этом месте с помощью фрезы сделал немного тоньше. И вот так теперь выглядит процесс зарядки велокомпьютера:

    В ждущем режиме потребление составляет около 100 мкА. В активном режиме потребление всей системы достаточно большое — порядка 90мА. При этом около 75мА потребляет подсветка дисплея.

    Конечно, это очень много, но тут уж ничего не поделаешь. Хотя, учитывая ёмкость батареи ч 1450мА*ч, заряда хватает на неделю при катании по 2 часа каждый день. Вполне нормально. Заряжается батарея где-то часа за три.

    Для крепления на руль на обратной стороне корпуса были сделаны своего рода салазки:

    Нижний элемент — печатная плата. Корпус «застёгивается» на соответствующем креплении на руле, при этом площадки на печатной плате входят в контакт с подведёнными площадками от датчиков.

    В качестве датчиков применены миниатюрные герконы. Модель даже и не помню, должны подходить практически любые варианты.

    Один геркон закреплён на вилке переднего колеса, другой — на раме возле педали. Соответственно, на спицах переднего колеса и на одной из педалей закреплены магниты. Один из датчиков (на колесе) служит для расчётов скорости и пути, второй (на педали) — для расчёта ритма (каденса).

    При подключении велокомпьютера необходимо всего лишь правильно в настройках указать длину окружности колеса (в миллиметрах). Больше ничего, по большому счёту, ничего настраивать и не нужно.

    FUSE-биты для МК для avrdude: -U lfuse:w:0xff:m -U hfuse:w:0xd1:m -U efuse:w:0xFF:m. По большому счёту, важно лишь выставить режим работы с кварцевым резонатором, остальное по вкусу. Ну, разве что EESAVE бит поставить, дабы накопленные в EEPROM данные (тот же общий пройденный путь) не затирались при перепрошивке МК.

    При использовании Arduino FUSE-биты можно, собственно, и не трогать, так как там уже всё настроено на 16МГц.

    Исходный код проекта можно загрузить с GitHub. Там же можно найти проект для Proteus8 (для сборки под симулятор нужно в Makefile раскомментировать одну строчку, чтобы немного повернуть/отзеркалить изображение на экране).

    Собственно, это вся нужная информация. Всё прочее можно будет обсудить в форуме.

    Велокомпьютер своими руками на МК

    После покупки нового велосипеда решил я его оснастить велокомпьютером, но китайские поделки покупать не стал по трём причинам:
    1. Высокая цена
    2. Отвратительное качество сборки
    3. Ну, я же радиолюбитель!

    И поэтому я поступил как настоящий радиолюбитель – собрал желаемый прибор самостоятельно.

    В данной статье я расскажу вам, как самому собрать велокомпьютер на микроконтроллере. Данный велокомпьютер выполнен на микроконтроллере Attiny2313, в качестве дисплея использован однострочный ЖК индикатор на контроллере HD44780. Прибор умеет отображать текущую скорость, общее и промежуточное расстояния (отображаются в метрах). Общее расстояние, в отличии от промежуточного сохраняется в энергонезависимой памяти EEPROM. Схема велокомпьютера очень проста и не содержит дорогостоящих компонентов:

    Дисплей подключён к микроконтроллеру по распространенному 4-х битному интерфейсу. Кнопки S1,S2,S3 (подтянуты десяти килоомными резисторами к плюсу питания) управляют прибором. Подстроечный резистор R6 регулирует контрастность дисплея. Светодиод HL1 индицирует подачу питания. В качестве динамика Ls1 можно использовать пьезоизлучатель. Транзистор VT1 – можно ставить любой биполярный n-p-n структуры, например КТ315 (я применил BC546B). Микроконтроллер Attiny2313 можно использовать с любыми буквенными индексами.

    Зачем нужен внешний кварц микроконтроллеру, у которого есть свой тактовый генератор?
    Наверное, у каждого из вас появился такой вопрос, и я на него постараюсь ответить. Без кварца работа устройства будет крайне не стабильна (неточность измерения, крякозяблики на дисплее и т.п.) потому, что встроенный тактовый генератор в микроконтроллере имеет большую “плавающую точку” и его частота постоянно колеблется. Если у вас нет такого кварца, не расстраивайтесь! Просто измените программу под тот кварц, который у вас есть. Впишите, в строчку $crystal= частоту своего кварца и всё будет ОК. Но на “худой конец”, если у вас нет никакого кварца, используйте встроенный тактовый генератор (пример установки фьюз-битов внизу), конечно работать будет не совсем точно и стабильно.

    После того как я нарисовал схему и подумал каким будет велокомпьютер, сел на свой любимый велик и поехал по городу – покупать радио детали по следующему списку:

    1. Микроконтроллер Attiny2313 1шт.
    2. Кнопки тактовые (без фиксации) 3шт.
    3. Резисторы номиналом 10 кОм 5шт.
    4. Резисторы номиналом 1 кОм 2шт.
    5. Резистор номиналом 100 Ом 1шт.
    6. Панелька под микроконтроллер DIP-20 1шт.
    7. Транзистор биполярный BC546B 1шт.
    8. Пьезоизлучатель 1шт.
    9. Кварц 4 МГц 1шт.
    10. Светодиод (синего свечения) 1щт.
    11. Построечный резистор номиналом 10 кОм 1шт.
    12. ЖК индикатор (дисплей) на контроллере HD44780 1*16 1шт.
    13. Керамические конденсаторы 18 пФ 2шт.
    14. Керамический конденсатор 0.1 мкФ 1шт.
    15. Электролитический конденсатор 100 мкФ 1шт.
    16. Штекер 2.5 1шт.
    17. Гнездо для штекера 2.5 1шт.
    18. Гнездо MiniUSB 1шт.
    19. Пластмассовый корпус 85x60x35мм 1шт.
    20. Крепёж на руль велосипеда 1шт.
    21. Кнопка с фиксацией 1шт.
    22. Геркон 1шт.

    Корпус, который я купил для велокомпьютера:

    Макетная плата, термоусадка, АКБ и метр провода у меня были.
    Приехавши домой сразу взялся за сборку велокомпьютера. Первым делом взялся за корпус. В корпусе надо сделать прямоугольную дыру размером 15×60мм.

    Возможно, вы спросите, а как ты делал такую дыру? Да очень просто! Сначала размечаем карандашом, где будем делать дырку, потом сверлилкой сверлим по контуру отверстия когда весь контур высверлили выламываем кусок пластмассы и обрабатываем всё напильником. Вот что получилось у меня:

    Кстати, все остальные отверстия я делал по ходу сборки. Изнутри корпуса на дыру приклеил кусочек органического стекла, чтобы пыль и влага не попадали на дисплей.

    Далее спаял плату поставил кнопки, дисплей и всё остальное. Монтаж делал на макетной плате.

    Вид сзади (без крышки):

    Зарядка через MiniUSB:

    У меня прибор питается от аккумулятора телефона Nokia на 3.7v. Зарядка осуществляется через MiniUSB порт, подключённый прямо к аккумулятору. Возможно, вы скажете, это же не правильно! И будете правы, для этого дела есть специальные микросхемы но я таковой микрухи не нашёл и пришлось довольствоваться тем что было. Но как-никак зарядка идёт, и за два часа заряда мой аккумулятор заряжается полностью. В рабочем режиме с включенной подсветкой дисплея велокомпьютер потребляет

    Установка велокомпьютера на велосипед

    Чтобы считать, расстояние и скорость велоспидометру нужен, так сказать “орган восприятия”. Геркон — это и есть этот “орган”, устанавливается он на раме велосипеда рядом с колесом, на спицах колеса устанавливается магнит. Чтобы когда колесо делало полный оборот, магнит “проходил” напротив геркона и “замыкал” его, тем самым формируя импульс который нужен велокомпьютеру для расчёта расстояния и скорости. На схеме указано, где подключать геркон к прибору. Я геркон припаял на небольшой кусочек макетной платы, припаял к нему провода и усадил на него термоусадку. И закрепил это всё на раме велосипеда с помощью пластмассовых стяжек.

    Пример установки магнита на спицы колеса:

    Велокомпьютер я закрепил посредине руля велосипеда:

    Описание устройства

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

    Загрузка велокомпьютера (приветствие):

    Информация о версии:

    Информация об авторе:

    Кнопка S1 – при нажатии сохраняется общее расстояние в энергонезависимой памяти EEPROM, в течение секунды на дисплее отображается надпись “All:” а после её общее расстояние и надпись “Save”, звучит звуковой сигнал, после чего велокомпьютер возвращается к подсчёту расстояния и скорости (главный экран).

    Да, да! Вы не ошиблись (смотря на фотографию выше), за несколько дней я проехал 191км! Потому что сегодня (21.08.2012), до школы осталось 11 и дабы проводить лето решил сделать “небольшую” покатушку за город.

    Кнопка S2 — при нажатии обнуляется промежуточное расстояние, на дисплее отображается сообщение “Total clear!”, звучит звуковой сигнал, после чего велокомпьютер возвращается к подсчёту расстояния и скорости (главный экран).

    Кнопка S3 — при нажатии в течение секунды на дисплее отображается надпись “All:” а после её общее расстояние и звучит звуковой сигнал, после чего велокомпьютер возвращается к подсчёту расстояния и скорости (главный экран).

    Настройка велокомпьютера

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

    Если кто это сделать не в состоянии, присылайте мне на e-mail длину своего колеса, сделаю прошивку под ваш велосипед.

    Прошивка МК велокомпьютера

    Прошивка для велокомпьютера находится в файлах к статье и называется t2313veloC.HEX, прошивку писал в среде BASCOM-AVR (исходник прилагается).
    Пример установки фьюз-битов на внешний кварц 4МГц:

    Пример установки фьюз-битов на внутренний тактовый генератор 4 МГц:

    В файлах к статье есть проект данного девайса в симуляторе Proteus. Но предупреждаю, что в симуляторе прибор работает очень медленно! В протеусе разве что светодиодами мигать можно (без глюков).

    Видео работы велоспидометра:

    Заключение

    В заключении хотелось бы сказать, что велокомпьютер вышел отличный и не дорогой, затраты составили 113400 бел/руб. Для примера: самый дешёвый китайский велокомпьютер стоит не менее 200000 бел/руб, который я видел. Да и вообще своё – это сделанное для себя, качественно и с любовью, а не китайское г…но, которое на следующий день после покупки сломается. Сборка своего велокомпьютера мне доставила удовольствие, а его эксплуатация доставляет мне ещё большее удовольствие.

    И смотрите больше на дорогу чем на велокомпьютер, всяко бывает… И удачи вам на дороге и в электронике!

    Ниже вы можете скачать исходники, прошивку, проект в Proteus


    Вело — компьютер своими руками.

    Идея сделать велокомпьютер своими руками возникла, когда мне порядком надоел мой старый китайский велоспидометр в серебристом изящном корпусе, в основном своей многофункциональностью — у него было несколько дисплеев, и они периодически сменялись во время движения. Много никому не нужных настроек и функций — и все одной кнопкой. Основной же причиной послужило то, что в настройках можно было прописать длину окружности колеса только в целых дюймах — соответственно, точность его расчетов была соответствующей.

    Я придерживаюсь мнения, что велокомпьютер должен быть простым, незаметным, и выполнять какую-то одну функцию.

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

    Имеется только одна кнопка, нажимая которую, можно последовательно менять 3 режима работы дисплея: дисплей выключен, дисплей включен, включена подсветка.

    Включается он самостоятельно, при замыкании геркона, и выключается при остутствии сигналов в течении 20 сек. При этом пробег сохраняется в памяти eeprom.

    Геркон подключен к порту через фильтр на элементах C12, C13, R24.

    Так как attiny2313a питается в диапазоне 1.8 — 3 в, а дисплей от 5 вольт с преобразователя, требуется согласование уровней, которое реализовано с помощью резисторов.

    Транзистор T1 управляет подсветкой дисплея.

    Ключ на транзисторе T2 отвечает за питание дисплея, пропуская ток к преобразователю. Надо сказать, что в качестве данного транзистора подойдет только p — канальный полевой транзистор с напряжением открытия (Gate Threshold Voltage) не более 1.5 вольт, иначе при проседании батарейки дисплей погаснет раньше, чем мог бы.

    Преобразователь выполнен на микросхеме MAX1674, которая работает от 0.7 вольт и отличается высоким КПД.

    Программа написана на CvAvr.

    В общих словах логика работы такова:

    Всеми расчетами управляет таймер TIMER1 с предделителем 256. Т.к. частота кварца 4000000 Гц, соответственно, частота таймера 15625 Гц. Период — 0.000064 сек. Этими промежутками времени и измеряется время между двумя срабатываниями геркона, используемое для расчета скорости.

    Время переполнения таймера (счет до 65535) — 4.19424 сек.

    При включении велокомпьютера из eeprom считывается общий пробег.

    В главном цикле проверяются флаги засыпания, пробуждения и режима работы дисплея, и запускаются соответствующие процедуры. На дисплей выводятся скорость и пробег. Затем микроконтроллер переводится в режим IDLE (пониженное энергопотребление), в котором он и находится большую часть времени.

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

    Нажатие на кнопку вызывает прерывание, в котором изменяется флаг режима работы дисплея.

    Прерывание по таймеру TIMER1 увеличивает некоторую величину, при превышении которой определенного порога, поднимается флаг засыпания.

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

    При пробуждении порты переводятся в нормальное состояние и включается дисплей с последующей инициализацией.

    Первый запуск. Это не окончательный вариант, в процессе пришлось переделать плату из-за некоторых изменений.

    Окончательный вариант платы. Преобразователь выполнен на отдельном модуле, поскольку я не сразу определился со схемой последнего.

    Плата со стороны дорожек.

    Конструкция — бутерброд из платы и дисплея. Края обточены, чтобы все вошло в корпус.

    А корпус я решил сварить из профиля и кусков металла. Сначала сварил коробок 82X35X30, потом приварил сбоку пластины, немного выступающие за нижнюю часть, для более плотного закрывания крышки. Там, где необходимо, наплавил металл, а затем зашлифовал все болгаркой вот до такой формы.

    Корпус из металла дает очевидное преимущество — на него можно наварить любые крепления, в том числе и на руль, не говоря уже и о самом корпусе — он может быть сделан любых размеров и для любых целей.

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

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

    Верхняя часть с дисплеем.

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

    Вот он, уже покрашенный в желтую краску и просушенный.

    Крышка крепится таким вот нехитрым способом — с помощью болтов, согнутых под 90 градусов. Держится вполне неплохо, учитывая и то, что у крышки есть ребра жесткости в виде отгибов.

    Запуск велокомпьютера в корпусе.

    Ну и наконец, самое время установить спидометр на руль и посмотреть на него в действии. Я засунул внутрь плоский литий-ионный аккумулятор от какого-то плеера.

    Между корпусом и дисплеем вставил кусок оргстекла, который прикрепил герметиком внутри корпуса для герметичности.

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

    В качестве геркона и магнита использовал старые, от китайского велоспидометра.

    Что касается основного предназначения велокомпьютера, то здесь у меня претензий пока нет.

    Ток потребления при включенном дисплее около 5 mA, но поскольку я не сразу нашел подходящий транзистор T2, то пришлось вместо него временно впаять твердотельное реле, в результате ток немного завышен — 8 с небольшим.

    При отключенном дисплее — 3.1 mA, с включенной подсветкой 36 mA.

    В спящем режиме мультиметр не зафиксировал ток, но, как обещает производитель контроллера, должно быть 24 μA.