Спидометр своими руками на ардуино
В этом уроке мы создадим своими руками простой спидометр для велосипеда на основе микроконтроллера Ардуино. Идея состоит в том, чтобы измерить угловую скорость колеса велосипеда. Таким образом, зная диаметр и математическую легенду Пи (3.14) можно рассчитать скорость. Также, зная количество раз, которое провернулось колесо, можно легко узнать пройденное расстояние. В качестве дополнительного бонуса мы решили добавить световой индикатор на велосипед, - задача состояла в том, когда включить стоп-сигнал.
Шаг 1. Держатель
Для этого проекта очень важно иметь сильный и стабильный держатель нашего Ардуино спидометра. Смысл в том, что велосипед может пострадать от сильного импульса, когда он попадает в дыру или когда вы решаете повеселиться и взять вел в тяжелые условия езды. Кроме того, наши входные данные фиксируется, когда магнит на колесе пересекает датчик эффекта Холла на опоре.
Если все одновременно пойдет не так, Arduino покажет скорость высокоскоростного поезда. Кроме того, вы не захотите, чтобы ваш лучший друг Ардуино упал на дороге только потому, что вы решили быть ленивым и использовать для держателя очень дешевые материалы.
Поэтому, чтобы соблюсти все нюансы безопасности, мы решил использовать алюминиевые ленты, так как их можно легко разрезать и просверлить, они устойчивы к коррозии и довольно дешевы, что всегда хорошо для поделок своими руками. Мы также использовали некоторые гайки (с шайбами) и болты, чтобы закрепить держатель на раме, так как всё должно быть надежно закреплено на раме.
Еще одной важной частью является то, что электроника нашего спидометра Ардуино должна быть должным образом изолирована от опор, если они сделаны из какого-либо металла. Горячий клей, который мы использовали, работал отлично, он также поглощал и смягчал удары, что было хорошо для довольно хрупкого дисплея.
Шаг 2. Датчик и магнит
Измерение и входные данные проекта основаны на этой части. Идея состоит в том, чтобы поместить магнит на велосипедное колесо и добавить датчик эффекта Холла на раму так, чтобы каждый раз, когда магнит пересекал датчик, Arduino знал, что оборот завершен и он может рассчитать скорость и расстояние.
Используемый здесь датчик - классический датчик с эффектом Холла А3144. Этот датчик понижает свою выходную мощность, когда конкретный полюс направлен в правильной ориентации. Ориентация очень важна, так как внешний полюс не повлияет на выход.
Выше несколько фото, показывающих правильную ориентацию. Также для датчика эффекта Холла требуется нагрузочный резистор 10 кОм, но в этом проекте заменен на нагрузочные резисторы 20 кОм в Arduino.
Тщательное размещение магнита очень важно. Если поместить его немного дальше, это может привести к непоследовательному чтению или отсутствию оборотов, а если расположить его очень близко, магнит может дотронуться до датчика, что не очень желательно.
Шаг 3. Дисплей
Этот дисплей теоретически необязателен, но вам нужно что-то, чтобы отображать скорость и расстояние в реальном времени. Думать об использовании ноутбука совершенно абсурдно. Мы использовали 0,96-дюймовый OLED-дисплей с I2C в качестве протокола связи между ведомым и ведущим устройствами.
Изображения выше показывают три режима, между которыми автоматически переключается Arduino.
- "Start" в правом нижнем углу - это когда Arduino только начал работу и успешно загрузился.
- Скорость в км/ч. Этот режим отображается только тогда, когда велосипед находится в движении, и автоматически отключается после его остановки.
- Последний, с метрами в качестве единиц, очевидно, - расстояние, которое прошел вел. Как только вел останавливается, Arudino переключается на отображение расстояния в течение 3 секунд.
Эта система не идеальна. Он на мгновение отображает пройденное расстояние, даже когда байк находится в движении. Может это не идеально, но это достаточно мило.
Шаг 4. Источник питания
Проект, будучи немного громоздким, не всегда может иметь под рукой розетку для зарядки. Поэтому из-за лени было решено просто использовать блок питания в качестве источника питания и использовать мини-USB-кабель для подключения питания USB от блока питания к Arduino Nano.
Но вы должны тщательно выбрать powerbank. Важно иметь правильную геометрию, чтобы ее можно было легко установить. Также источник питания должен быть немного тупым. Дело в том, что для экономии энергии powerbank предназначен для отключения выхода, если потребление тока не превышает определенного порогового значения.
Скорее всего это пороговое значение составляет не менее 200-300 мА. Наша схема будет иметь максимальное потребление тока не более 20 мА. Таким образом, обычный банк питания отключит выход. Это может привести вас к мысли, что в вашей цепи есть какая-то неисправность. Этот конкретный банк питания на фото выше работает с таким небольшим током.
Шаг 5. Стоп-сигнал (опционально)
В качестве дополнительной функции было решено добавить стоп-сигнал. Вопрос был в том, как определить, когда начался процесс торможения.
Если мы тормозим, велосипед замедляется. Это означает, что если мы рассчитываем ускорение и если оно оказывается отрицательным, можно включить стоп-сигналы. Это, однако, означает, что свет включится, даже если мы просто перестанем крутить педали.
Также мы не добавили транзистор в световую цепь, что абсолютно рекомендуется. Если кто-то сделает этот проект и правильно интегрирует эту часть, мы бы были более чем рады увидеть её и добавили бы картинки сюда. Ток мы получаем напрямую от цифрового контакта 2 Arduino Nano.
Спидометры используются для измерения скорости движения транспортного средства. Ранее на нашем сайте мы уже рассматривали создание аналогового спидометра на основе платы Arduino и цифрового спидометра на Arduino и смартфоне на Android. В аналоговом спидометре для измерения скорости мы использовали инфракрасный датчик, а в цифровом – датчик Холла. В этой же статье для измерения скорости мы будем использовать технологию GPS. В большинстве случаев GPS спидометры более точно измеряют скорость чем обычные спидометры. Также технология GPS в настоящее время широко используется в смартфонах и транспортных средствах для навигации и предупреждения о различных дорожных ситуациях.
В данной статье мы рассмотрим создание GPS спидометра на основе платы Arduino, GPS модуля NEO6M и OLED дисплея.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- GPS-модуль GY-NEO6M (купить на AliExpress).
- OLED дисплей с интерфейсом I2C и диагональю экрана 1.3 дюйма (1.3 inch I2C OLED display) (купить на AliExpress - для данного проекта выбирайте вариант дисплея с 4 контактами).
- Макетная плата.
- Соединительные провода.
GPS модуль NEO6M
NEO-6M является популярным GPS приемником со встроенной керамической антенной, которая обеспечивает хороший прием сигнала с GPS спутников. Данный приемник способен отслеживать до 22 спутников и обеспечивает определение местоположения в любой точке земного шара. Модуль имеет аккумулятор для автономной подпитки (backup battery), что позволяет ему сохранять данные когда основное питание схемы отключено.
Ядром модуля является GPS чип NEO-6M от компании u-blox. Он может отслеживать до 22 спутников по 50 каналам и обладает чрезвычайно хорошей чувствительностью (-161 dBm). Модуль поддерживает скорости передачи данных 4800-230400 бод. По умолчанию он настроен на скорость 9600 бод.
Технические характеристики модуля:
- рабочее напряжение: 2.7-3.6V DC (постоянного тока);
- рабочий ток: 67 mA;
- бодовая скорость передачи: 4800-230400 (9600 по умолчанию);
- протокол связи: NEMA;
- интерфейс: UART;
- внешняя антенна и встроенная энергонезависимая память (EEPROM).
Назначение контактов (распиновка) GPS модуля NEO6M:
• VCC : входное питающее напряжение;
• GND : общий контакт (земля);
• RX, TX : контакты для UART (последовательной) связи с микроконтроллером.
На нашем сайте мы уже достаточно часто рассматривали проекты с использованием GPS модулей, список данных проектов можно посмотреть по следующей ссылке.
OLED дисплей
Термин OLED расшифровывается как “Organic Light emitting diode” (органический светоизлучающий диод) и в используемом нами OLED дисплее используется та же самая технология, что и в привычных нам современных телевизорах, только разрешение экрана нашего дисплея существенно меньше чем у телевизоров. С подобными дисплеями проекты на Arduino сразу начинают "сверкать новыми красками" поскольку они обеспечивают значительно более презентабельную картинку чем обычные монохромные ЖК дисплеи. В нашем проекте мы будем использовать монохромный OLED дисплей SH1106 1.28” с 4-мя контактами, подключаемый по интерфейсу I2C.
Технические характеристики дисплея:
- микросхема драйвера: SH1106;
- входное напряжение: 3.3V-5V DC;
- разрешение: 128x64;
- интерфейс: I2C;
- потребление тока: 8 mA;
- цвет пикселов: синий (Blue);
- угол обзора: >160 градусов.
Назначение контактов (распиновка) дисплея:
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 дисплеем.
Подглядел я у одной американской машины интересную фичу. Спидометр проеКцировался на лобовое стекло.
Жил я с мечтой о таком нештяке почти всю свою сознательную жизнь. Ну не менять же своего японца на американца из за этого?
А тут дед мороз старшему сыну комплект "Матрешка Z" подарил.
Наборчик, развивающий познания в схемотехнике и программировании. Но сыну этот набор по боку. У него майнкрафт стынет. Ходил я бродил вокруг заветной коробочки и тут случилось. Соединилась моя мечта с возможностью реального воплощения.
Ну, думаю, сделаю. Не хочу простых путей. Зачем покупать у кого-то навороченные готовые наборы? Зачем мучить андроид, и качать на него бесплатную прогу? Сделаю САМ, Ну почти … сам.
Первым делом надо понять откуда буду брать сигнал. Мест море.
1) Датчик абс. Один леший ABS не работает.
2) Можно намутить проставку с датчиком скорости (сейчас такие на всех инжекторах стоят, не всегда проставки) между коробкой и тросом спидометра.
Ой у меня же инжектор. А вот как ЭБУ узнает скорость авто? Да и Автоматическая коробка как с этим справляется?
Книга. Вперед читать книгу. А точнее электросхемы. И тут я нашел. Оказывается у SpaceWagon'а тоже есть эта штуковина "он прячет ее в шкафу" (цитата из кинофильма "Солярис"). И стоит она непосредственно на спидометре. Называется геркон.
Вперед за приборкой. Вот её-то и буду мучить. Снял спидометр. А вот и геркон, который управляется магнитом с четырьмя полюсами. Для наглядности я разукрасил магнит маркером, пытаясь понять как сильно отличается зона разомкнутого геркона от зоны сомкнутого.
Ну теперь закипит работа. Или мой мозг.
Перепробовав все предложенные производителем набора эксперименты я так и не научился не программировать, не схемотехничать. :((
После долгих раздумий и сторонней помощи родилась схема, позволяющая запихнуть-таки сигнал геркона в arduino.
Схему привожу в первозданном виде. Договорились о том, что я буду ваять нижнюю часть, отделенную чертой.
Моё мнение заключается в том, что я думаю, что надо как-то отделить схему автомобиля от схемы arduino. Вышло это не ахти как, но уж ладно. По крайней мере мне в этой схеме всё понятно. :)) Делаю эту.
Собрав всё на монтажной плате, (прикольная штука, паять не надо, можно быстро всё переставить) я столкнулся со следующей проблемой. И эта проблема программная.
Резисторы как по схеме (вместо 600 Ом стоит 620 Ом). Диоды 1N4007. Оптрон PC817A.
И так Программирование. С горем пополам выяснил, что без прерываний не обойтись. Прерывание это такая штука. которая останавливает всю программу при возникновении какого-то времени или сигнала "Ч". Обрабатывает приоритетные данные, а потом возобновляет выполнение программы с той точки, где остановила.
Дальше круче. Если с сигналом от геркона всё оказалось просто, нашёлся оператор, который всё это (внешнее прерывание) обрабатывает, То с отсечкой времени (внутреннее прерывание) я до сих пор боюсь разбираться. Голова наверно сломается. Но мне опять помогли. Почти дали списать. Ладно. Спасибо. Работает.
Надо бы еще скетч кинуть наверно. Он на яндекс диске. Сразу предупреждаю, у меня Arduino UNO 16МГц. За работу на других подобных не отвечаю. Во внутренних прерываниях как-то задействованы внутренние ресурсы процессора. И при портации этого скетча на другую платформу надо что-то переделывать.
И видео про то, как это работает.
…В ноябре в сообществе «Электронные Поделки» один диванный мечтатель намекнул на то, что люди получающие знания и навыки из интернета, способны только на манипуляцию типа «Копировать — Вставить», а те кто читают книги — красаучеги по жизни. И родилась у меня идея бесполезной по сути доработки, но с инженерным подходом. И использованием информации из интернета и инструментами в этом самом интернете…
Разработка
А вы задумывались на сколько врет спидометр в вашей машине? Я вот задумался… Нет, я знаю, что если обуть резину не стандартную, то будет расхождение фактической скорости и показаний прибора. А мне стало интересно насколько врет спидометр математически.
Немного теории:
В коробке «Волги» стоит 6 импульсный датчик скорости, т.е. на один метр пути, который машина проехала на родных тапках, датчик выдает 6 импульсов. Соответственно чем меньше времени между импульсами, тем выше скорость автомобиля. Вот тут появилась идея использовать для измерения скорости микроконтроллер. Суть проста: считаем время между импульсами с датчика скорости и по формуле считаем скорость автомобиля.
Скорость(км/ч) = 600000/Время между импульсами(микросекунды)
Из следующей картинки я сделал вывод, что нужно измерять длительность одного периода. А это соответственно сумма двух полупериодов (положительного и отрицательного).
Взяв ардуинку и почитав про ее программирование приступил к творчеству. Набросал на бумажке схему работы(напридумывал всякого с запасом), потом открыл сайт easyeda и пошла возня. На схеме и спидометр, и тахометр, и вольтметр, и указатель топлива. Прикинул схему:
Тут же развел под нее печатку(прям на сайте)
Заказал под проект ардуинку и дисплей из Поднебесной. И пошел писать прошивку. Одних теоретических данных, как оказалось, мало. Собрав первый ходовой макет пошёл тестировать в боевых условиях. Вольтметр на делителе скакал как белка под спидами, бакомер показывал температуру на марсе. Тахометр не подключал, а вот спидометр начал давать показания сдал всех барыг в районе и 4 притона , похожие на правду.
Решил для первой версии устройства оставить только спидометр
Почесал репу и понял, что делать печатку для десятка деталек — прям в лом, да и не влезет она в волговскую приборку. Примерил ардуинку к колодцу лампочки — и как родная она туда вошла. Решено! Делаем модулями и пихаем их в колодцы неиспользуемых лампочек. Место для дисплея уже было придумано давно) Вот так был собран модуль для сигнала с датчика скорости.
У собранного своими руками электронного спидометра будет три режима:
- Спидометр (определение скорости) и одометр (пройденная дистанция)
- Задача 1 – проехать 32 км (20 миль)
- Задача 2 – достичь скорости 30 км\ч
Спидометр собран на Ардуино, так что нет предела вашему воображению.
Шаг 1: Как всё работает
Принцип работы проекта прост, но для сборки его нужно понимать. В самом простом понимании, он состоит из Геркона или магнитного выключателя, установленного на раму велосипеда и еще одного магнита, установленного на спицу колеса.
Так как колесо вращается, то магнит активизирует выключатель при каждом обороте. Сигнал поступает на Ардуино, который считает количество оборотов и по ним определяет покрытую дистанцию (нужно будет сначала указать диаметр вашего колеса). Также Ардуино следит за временем и вычисляет скорость. Данные выводятся на дисплей, где они отображаются в милях в час (или в километрах, если доработать формулу).
Шаг 2: Необходимые материалы
Проект недорогой и может обойтись вам в 300-700 рублей. Сборка потребует от вас некоторые умения в пайке.
Материалы для сборки:
Список необходимого инструмента:
- Паяльник
- Припой
- Корпус
- Что-то наподобие дремеля, чтобы прорезать в корпусе отверстия для установки электроники и дисплея
- Горячий клей или что-то подобное для закрепления компонентов на местах.
Шаг 3: Код
Перед тем, как мы перейдём к электронике, будет неплохо загрузить код, чтобы вы не испытывали конфуз, метаясь между неправильно подключенными проводами. Загрузите код на Ардуино, перед этим не забыв указать диаметр колеса вашего велосипеда.
Шаг 4: Электроника
Схема соединения компонентов приложена выше, но я также напишу её отдельно.
- Резистор на 220 Ом соединяем между пином 2 Ардуино и землёй
- Мгновенный переключатель соединяется с пином 2 и vcc
- Конденсатор на 0.1 uf помещаем между двумя клемами выключателя, чтобы уменьшить дибаунс
- Геркон на vcc и A0
- Резистор между A0 и gnd
После соединения всех компонентов можно запитать девайс и проверить, что всё работает.
Шаг 5: Корпус
Корпус можно сделать из пластика или дерева, он должен быть прочным и в нём должно быть достаточно пространства.
После установки переключателей, экрана, кнопки и хедеров проверьте девайс на работоспособность. Постарайтесь сделать устройство водонепроницаемым, ведь оно окажется в самых худших для работы условиях.
Шаг 6: Тестирование и устранение неполадок
Запитайте устройство от батарейки 9V и проверьте все три режима. Поднесите магнит близко к Геркону и скорость с дистанцией должны начать увеличиваться.
Рассказываю как сделать какую-либо вещь с пошаговыми фото и видео инструкциями.
Читайте также: