Цифровой одометр в авто на ардуино
Цифровой спидометр на Ардуино для автомобиля или мотоцикла и электронный одометр своими руками
В инструкции будет рассказано, как сделать цифровой спидометр для своего велосипеда. Да, это то же самое, что мы используем в автомобилях и мотоциклах, но он будет очень дешевым.
У собранного своими руками электронного спидометра будет три режима:
Спидометр собран на Ардуино, так что нет предела вашему воображению.
Шаг 1: Как всё работает
Принцип работы проекта прост, но для сборки его нужно понимать. В самом простом понимании, он состоит из Геркона или магнитного выключателя, установленного на раму велосипеда и еще одного магнита, установленного на спицу колеса.
Так как колесо вращается, то магнит активизирует выключатель при каждом обороте. Сигнал поступает на Ардуино, который считает количество оборотов и по ним определяет покрытую дистанцию (нужно будет сначала указать диаметр вашего колеса). Также Ардуино следит за временем и вычисляет скорость. Данные выводятся на дисплей, где они отображаются в милях в час (или в километрах, если доработать формулу).
Шаг 2: Необходимые материалы
Проект недорогой и может обойтись вам в 300-700 рублей. Сборка потребует от вас некоторые умения в пайке.
Материалы для сборки:
Список необходимого инструмента:
Шаг 3: Код
Перед тем, как мы перейдём к электронике, будет неплохо загрузить код, чтобы вы не испытывали конфуз, метаясь между неправильно подключенными проводами. Загрузите код на Ардуино, перед этим не забыв указать диаметр колеса вашего велосипеда.
Шаг 4: Электроника
Схема соединения компонентов приложена выше, но я также напишу её отдельно.
После соединения всех компонентов можно запитать девайс и проверить, что всё работает.
Шаг 5: Корпус
Корпус можно сделать из пластика или дерева, он должен быть прочным и в нём должно быть достаточно пространства.
После установки переключателей, экрана, кнопки и хедеров проверьте девайс на работоспособность. Постарайтесь сделать устройство водонепроницаемым, ведь оно окажется в самых худших для работы условиях.
Шаг 6: Тестирование и устранение неполадок
Запитайте устройство от батарейки 9V и проверьте все три режима. Поднесите магнит близко к Геркону и скорость с дистанцией должны начать увеличиваться.
Рассказываю как сделать какую-либо вещь с пошаговыми фото и видео инструкциями.
Тахометр-спидометр на Arduino
С помощью датчика Холла и платы Ардуино можно измерять скорость вращения к примеру колеса велосипеда или самоката, в общем в любых механизмах и машинах, которым необходимы измерения скорости.
В этом проекте мы делали спидометр из кольца адресных светодиодов под управлением компактной платы Ардуино Нано версии с CH340.
1. Аппаратная часть
Для реализации тахометра с применением адресных светодиодов на понадобится:
2. Схема и программная часть
После подбора компонентов для сборки, собираем небольшую схему
Кольцо можно временно отключить, чтобы просто не мешалось.
Проверяем схему еще раз и загружаем в Arduino следующий скетч
После загрузки скетча можно проверить работу датчика холла, для этого подключаем осциллограф на выход тахометра и смотрим что выдает датчик холла при вращении диска с магнитом рядом с датчиком. Если сигнал отсутствуем проверяем правильность подключения датчика и при необходимости делаем подтяжку сигнала резистором 10 кОм на плюс питания.
После проверки работоспособности подключаем кольцо на светодиодах WS2812 и вращая рядом с датчиком диском с магнитом получаем частоту вращения диска.
Перед установкой в какие либо механизмы необходимо откалибровать данный тахометр, используя заведомо исправный тахометр заводского исполнения.
Смотрим что получилось.
Заключение.
Применение данной схемы масса.Например сделать спидометр для велосипеда закрепив магнит на колесе, а датчик на вилке или сделать модернизацию приборной панели автомобиля. В общем везде, где необходимо измерение частоты или скорости вращения механизма.
Электронный спидометр на базе Arduino Uno
Подглядел я у одной американской машины интересную фичу. Спидометр проеКцировался на лобовое стекло.
Жил я с мечтой о таком нештяке почти всю свою сознательную жизнь. Ну не менять же своего японца на американца из за этого?
А тут дед мороз старшему сыну комплект «Матрешка Z» подарил.
Наборчик, развивающий познания в схемотехнике и программировании. Но сыну этот набор по боку. У него майнкрафт стынет. Ходил я бродил вокруг заветной коробочки и тут случилось. Соединилась моя мечта с возможностью реального воплощения.
Ну, думаю, сделаю. Не хочу простых путей. Зачем покупать у кого-то навороченные готовые наборы? Зачем мучить андроид, и качать на него бесплатную прогу? Сделаю САМ, Ну почти … сам.
Первым делом надо понять откуда буду брать сигнал. Мест море.
1) Датчик абс. Один леший ABS не работает.
2) Можно намутить проставку с датчиком скорости (сейчас такие на всех инжекторах стоят, не всегда проставки) между коробкой и тросом спидометра.
Ой у меня же инжектор. А вот как ЭБУ узнает скорость авто? Да и Автоматическая коробка как с этим справляется?
Книга. Вперед читать книгу. А точнее электросхемы. И тут я нашел. Оказывается у SpaceWagon’а тоже есть эта штуковина «он прячет ее в шкафу» (цитата из кинофильма «Солярис»). И стоит она непосредственно на спидометре. Называется геркон.
Вперед за приборкой. Вот её-то и буду мучить. Снял спидометр. А вот и геркон, который управляется магнитом с четырьмя полюсами. Для наглядности я разукрасил магнит маркером, пытаясь понять как сильно отличается зона разомкнутого геркона от зоны сомкнутого.
Ну теперь закипит работа. Или мой мозг.
Перепробовав все предложенные производителем набора эксперименты я так и не научился не программировать, не схемотехничать. :((
После долгих раздумий и сторонней помощи родилась схема, позволяющая запихнуть-таки сигнал геркона в arduino.
Схему привожу в первозданном виде. Договорились о том, что я буду ваять нижнюю часть, отделенную чертой.
Моё мнение заключается в том, что я думаю, что надо как-то отделить схему автомобиля от схемы arduino. Вышло это не ахти как, но уж ладно. По крайней мере мне в этой схеме всё понятно. :)) Делаю эту.
Собрав всё на монтажной плате, (прикольная штука, паять не надо, можно быстро всё переставить) я столкнулся со следующей проблемой. И эта проблема программная.
Резисторы как по схеме (вместо 600 Ом стоит 620 Ом). Диоды 1N4007. Оптрон PC817A.
И так Программирование. С горем пополам выяснил, что без прерываний не обойтись. Прерывание это такая штука. которая останавливает всю программу при возникновении какого-то времени или сигнала «Ч». Обрабатывает приоритетные данные, а потом возобновляет выполнение программы с той точки, где остановила.
Дальше круче. Если с сигналом от геркона всё оказалось просто, нашёлся оператор, который всё это (внешнее прерывание) обрабатывает, То с отсечкой времени (внутреннее прерывание) я до сих пор боюсь разбираться. Голова наверно сломается. Но мне опять помогли. Почти дали списать. Ладно. Спасибо. Работает.
Надо бы еще скетч кинуть наверно. Он на яндекс диске. Сразу предупреждаю, у меня Arduino UNO 16МГц. За работу на других подобных не отвечаю. Во внутренних прерываниях как-то задействованы внутренние ресурсы процессора. И при портации этого скетча на другую платформу надо что-то переделывать.
И видео про то, как это работает.
GPS спидометр на Arduino и OLED дисплее своими руками
Спидометры используются для измерения скорости движения транспортного средства. Ранее на нашем сайте мы уже рассматривали создание аналогового спидометра на основе платы Arduino и цифрового спидометра на Arduino и смартфоне на Android. В аналоговом спидометре для измерения скорости мы использовали инфракрасный датчик, а в цифровом – датчик Холла. В этой же статье для измерения скорости мы будем использовать технологию GPS. В большинстве случаев GPS спидометры более точно измеряют скорость чем обычные спидометры. Также технология GPS в настоящее время широко используется в смартфонах и транспортных средствах для навигации и предупреждения о различных дорожных ситуациях.
В данной статье мы рассмотрим создание GPS спидометра на основе платы Arduino, GPS модуля NEO6M и OLED дисплея.
Необходимые компоненты
GPS модуль NEO6M
NEO-6M является популярным GPS приемником со встроенной керамической антенной, которая обеспечивает хороший прием сигнала с GPS спутников. Данный приемник способен отслеживать до 22 спутников и обеспечивает определение местоположения в любой точке земного шара. Модуль имеет аккумулятор для автономной подпитки (backup battery), что позволяет ему сохранять данные когда основное питание схемы отключено.
Ядром модуля является GPS чип NEO-6M от компании u-blox. Он может отслеживать до 22 спутников по 50 каналам и обладает чрезвычайно хорошей чувствительностью (-161 dBm). Модуль поддерживает скорости передачи данных 4800-230400 бод. По умолчанию он настроен на скорость 9600 бод.
Технические характеристики модуля:
Назначение контактов (распиновка) GPS модуля NEO6M:
• VCC : входное питающее напряжение;
• GND : общий контакт (земля);
• RX, TX : контакты для UART (последовательной) связи с микроконтроллером.
На нашем сайте мы уже достаточно часто рассматривали проекты с использованием GPS модулей, список данных проектов можно посмотреть по следующей ссылке.
OLED дисплей
Термин OLED расшифровывается как “Organic Light emitting diode” (органический светоизлучающий диод) и в используемом нами OLED дисплее используется та же самая технология, что и в привычных нам современных телевизорах, только разрешение экрана нашего дисплея существенно меньше чем у телевизоров. С подобными дисплеями проекты на Arduino сразу начинают «сверкать новыми красками» поскольку они обеспечивают значительно более презентабельную картинку чем обычные монохромные ЖК дисплеи. В нашем проекте мы будем использовать монохромный OLED дисплей SH1106 1.28” с 4-мя контактами, подключаемый по интерфейсу I2C.
Технические характеристики дисплея:
Назначение контактов (распиновка) дисплея:
VCC : питающее напряжение 3.3-5V DC;
GND : общий провод (земля);
SCL : контакт синхронизации интерфейса I2C;
SDA : контакт передачи данных интерфейса I2C.
Сообществом Arduino разработано уже достаточно много библиотек для работы с OLED дисплеями, нам среди них понравилась библиотека Adafruit_SH1106.h – она проста в использовании и позволяет работать с графикой.
Подобный дисплей мы ранее уже использовали в следующих проектах:
Схема проекта
Схема GPS спидометра на Arduino и OLED дисплее представлена на следующем рисунке.
Внешний вид собранной на макетной плате конструкции проекта выглядит следующим образом:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе необходимо подключить все используемые библиотеки. В нашем проекте мы будем использовать библиотеку TinyGPS++.h для считывания GPS координат с GPS модуля и библиотеку Adafruit_SH1106.h для работы с OLED дисплеем.
Тахометр или спидометр: Поток мыслей про измерение частоты в Arduino
Предистория
Если дома есть Arduino, в гараже машина или мотоцикл, а то и хоть мотособака, в голове туманные представления о программировании — возникает желание измерить скорость движения или обороты двигателя, посчитать пробег и моточасы.
В данной статье я хочу поделиться своим опытом по изготовлению подобных поделок.
Немного физики
Для измерения частоты вращения нам понадобится датчик положения колеса/вала/круга/итп. Датчик ставится как правило один. Возможно, что он будет срабатывать не один раз на каждый оборот. Например, у вас датчик Холла и 4 магнита на колесе. Таким образом, для правильного вычисления частоты нужно знать:
То есть, если частота меньше разумного минимума, то считаем, что она равна нулю, если больше максимума — игнорируем показания.
С количеством срабатываний понятно, но зачем ещё эти мины и максы? Давайте рассмотрим сначала варианты расчёта частоты.
Со скоростью всё проще, достаточно знать число π, диаметр колеса, а частоту вращения мы уже знаем.
Болванка для кода
Так как мы имеем дело с такими нежными величинами как время и пространство, то лучше сразу освоить прерывания.
Обратите внимание на модификатор volatile у переменной counter. Все переменные, которые будут изменяться в обработчике прерывания (ISR) должны быть volatile. Это слово говорит компилятору, что переменная может изменяться неожиданно и доступ к ней нельзя оптимизировать.
Функция ISR() вызывается каждый раз, когда появляется единица на ноге fqPin. Мы эту функцию не вызываем, это делает сам контроллер. Он это делает, даже когда основная программа стоит в ступоре на функции delay(). Считайте, что ISR() обслуживает событие, от вас не зависящее и данное вам свыше как setup() и loop(). Контроллер прерывает выполнение вашей программы, выполняет ISR() и возвращается обратно в ту же точку, где прерывал.
Обратите внимание, что в функции loop() мы отключаем прерывания вообще любые для того, чтобы прочитать переменную counter и сохранить её во временную переменную cnt. Потом, конечно же, включаем снова. Так мы можем потерять один вызов, конечно же, но с другой стороны, переменная unsigned long имеет 32 бита, а процессор ATMega32 8-битный, вряд ли он скопирует данные за один такт, а ведь в процессе копирования может случиться прерывание и часть данных изменится. По этой же причине мы копируем значение counter локально так как значение этой переменной при использовании в разных местах программы может быть разным опять же из-за изменения её в прерывании.
Тело функции ISR() должно быть максимально коротким, точнее, сама функция должна выполняться максимально быстро. Это важно, так как прерывается выполнение вашего кода, который может оказаться чувствительным к непредвиденным задержкам. Некоторые библиотеки отключают прерывания для выполнения чувствительных с задержкам операций, например для управления светодиодной лентой WS2812.
Считаем обороты за единицу времени.
Первое, что приходит в голову, это взять интервал времени и посчитать количество измерений.
Как и у многих простых решений, у этого есть неочевидные минусы. Для повышения точности измерений вам необходим довольно большой интервал времени. Принцип тот же, что и у Шума квантования. При времени оборота колеса сравнимом с временем подсчёта, существенные изменения скорости вращения не будут замечены. Показания такого частотомера будут различаться до двух раз на каждый отсчёт.
Для повышени точности на малой скорости можно увеличить число К, как это сделано, скажем, в автомобильной технике для датчика ABS. Можно увеличить время подсчёта. Делая и то и другое мы подходим ко второй проблеме — переполнению счётчика. Да, переполнение легко лечится увеличением количества бит, но арифметика процессора Arduino не умеет считать 64-битные числа столь быстро, как хотелось бы и как она это делает с 16-разрядными.
Увеличение времени расчёта тоже не очень хорошо тк нам надо знать частоту прямо сейчас, вот при нажатии на газ, а не через пару секунд. Да и через пару секунд мы получим скорее некое среднее значение. За это время можно несколько раз сделать врумм-врумм.
Есть другой метод. Он лишён вышеописанных недостатков, но, как водится, имеет свои.
Считаем интервал между отсчётами
Мы можем засечь время одного отсчёта и другого, вычислить разницу. Величина, обратная вычисленному интервалу и есть частота. Круто! Но есть минусы.
Что делать, если наше колесо крутится еле-еле и измеренный интервал превышает разумные пределы? Выше я предложил считать частоты ниже разумного минимума за ноль.
Определённым недостатком метода можно считать шумы квантования на высоких частотах, когда целочисленный интервал снижается до нескольких двоичных разрядов.
Так же хотелось бы некую статистику подсчётов для улучшения показаний, а мы берём лишь последнее значение.
Методом проб и ошибок я подобрал интервал отображения данных на дисплее в 250мс как оптимальный. Если чаще, то цифры размазываются, если реже — бесит тормознутость.
Комбинированный метод
Можно попробовать объединить достоинства обоих методов.
То есть, мы засекаем время не просто между отсчётами, а время между проверками данных и делим на количество отсчётов за это время. Получается усреднённый интервал между отсчётами, обратная величина от которого есть частота. Предоставим компилятору оптимизировать вычисления.
Обратите внимание, что за интервал считается не время опроса, как в первом примере, а время от последнего отсчёта до предыдущего последнего отсчёта в прошлом опросе. Это заметно поднимает точность вычисления.
Таким образом, мы можем получать вполне достоверные данные как на низких так и на высоких частотах.
Если использовать кооперативную многозадачнось, то можно сделать подсчёт, скажем раз 100мс, а вывод на дисплей раз в 250мс. Очень короткий интервал опроса снизит чувствительность к низким частотам.
Как говорят в рекламе, «но это ещё не всё».
Ошибки дребезга
Для устрашения вас предположу, что измеряем частоту вращения двигателя от индуктивного датчика зажигания. То есть, грубо говоря, на высоковольтный провод намотан кусок кабеля и мы измеряем индукцию в нём. Это довольно распространённый метод, не правда ли? Что же здесь сложного может быть? Самая главная проблема — современные системы зажигания, они дают не один импульс, а сразу пачку.
Но даже обычная система зажигания даёт переходные процессы:
Старинные же кулачковые контактные вообще показывают замечательные картинки.
Как с этим бороться? Частота вращения не может вырасти мгновенно, не даст инерция. Кроме того, в начале статьи я предложил ограничить частоту сверху разумными рамками. Отсчёты, что происходят слишком часто можно просто игнорировать.
Другой вид помех — это пропадание отсчётов. Из-за той же инерции у вас не может измениться частота в два раза за одну миллисекунду. Понятно, что это зависит от того, что вы собственно измеряете. Частота биения крыльев комара может, вероятно и за миллисекунду упасть до нуля.
Статистическая обработка в данном случае становится уже достаточно сложной для маленькой функции обработки прерывания и я готов обсудить варианты в комментариях.
Особенности измерения скорости движения и скорости вращения.
При измерении скорости вращения бензинового двигателя надо обязательно учесть величину К, которая совсем не очевидна. Например, вы намотали провод на кабель свечи и ожидаете, что там будет одна искра на один оборот. Это совсем не так. Во-первых, у 4-тактного двигателя вспышка происходит один раз на два оборота, у 2-тактного один раз на оборот коленвала. Во-вторых, для упрощения системы зажигания коммутатор подаёт искру на неработающие в данный момент цилиндры, типа на выпуске. Для получения правильного К надо почитать документацию на двигатель или подсмотреть показания эталонного тахометра.
При измерении скорости движения частота обновления дисплея не имеет большого значения, особенно, если вы рисуете цифры, а не двигаете стрелку. Даже обновление информации раз в секунду не вызовет отторжения. С оборотами двигателя всё наоборот, индикатор должен откликаться гораздо быстрее на изменение оборотов.
Вывод информации
Типичная обида начинающего разработчика автомобильной и мотоциклетной электроники «стрелки дёргаются, цифры нечитабельны» лечится простым способом — надо обманывать клиента. Вы что думаете, автомобильный тахометр всегда показывает вам правду? Конечно же нет! Хотя вам этот обман нравится и вы хотите, чтобы ваш прибор дурил голову так же.
Стрелки
Если включить зажигание на новом модном автомобиле или мотоцикле, стрелки приборов сделают красивый вжух до максимума и медленнее опадут до нуля. Вот! Вот это нам и надо сделать. Надо, чтобы при показе максимальной величины стрелка не метнулась к ней мгновенно и не упала как акции лохотрона в ноль.
Итак, нам надо учитывать максимальную скорость стрелки на увеличение и максимальную на уменьшение показаний. Совсем хорошо сделать эти скорости нелинейными, чтобы стрелка сначала двигалась быстрее, а потом чуть помедленнее приближалась к заданному значению.
Вот пример с нелинейным выводом показаний:
Вы можете поиграть с коэффициентами. Этот же принцип используется при выводе громкости сигнала, например, у любого аналогового индикатора: стрелки, полоски, яркость, цвет, размер итп. Приведённый пример самый простой, но и не самый красивый. Предлагайте ваши варианты в комментариях.
Цифры
С цифрами всё намного сложнее. Быстрые изменения показаний приводят к тому, что несколько порядков сливаются в мутное пятно. Для скорости, как и писал выше, можно задать интервал раз в секунду и глаз успеет прочитать три цифры.
В мототехнике не зря делают аналоговые индикаторы оборотов, точные цифры не нужны, важна относительная близость к оборотам максимального крутящего момента, к максимальным вообще и холостые.
Я предлагаю менять частоту вывода информации на дисплей в зависимости от степени изменения величины. Если обороты меняются, скажем, на 5% от последнего подсчёта, а не показа — можно затупить и показывать раз в 300-500мс. Если на 20%, то показывать раз в 100мс.
Можно огрубить шкалу и показывать только две значащие цифры
С учётом мототематики, можно довольно точно показывать обороты холостого хода как описано чуть выше и огрублять вывод на оборотах от двух холостых. На высоких оборотах для гонщиков важнее делать блинкеры типа «передачу вниз», «передачу вверх» и «ты спалишь движок». То есть держать двигатель около максимального крутящего момента и не дать ему крутиться выше максимальных разрешённых оборотов. Блинкеры замечательно делаются с помощью SmartDelay когда можно унаследовать от этого класса свой с заданной ногой контроллера и частотой мигания, там есть методы для переопределения и они вызываются раз в заданное время.
Идеи по отображению цифр тоже приветствуются в комментариях.
Вывод
Если наступить на все грабли, можно стать опытным разработчиком.