Спидометр, тахометр, одометр для любой техники (с GPS модулем).

Vladikas
Offline
Зарегистрирован: 25.07.2013

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

Использованные модули:

Arduino Nano, GPS приёмник от видеорегистратора, OLED экран 128х64 SSD1306, понижающий преобразователь напряжения на MP1584, сенсорная кнопка на TTP223, ну и рассыпуха по мелочи указана на схеме. Вместо сенсорной кнопки можно поставить обычную (пин замыкать на массу), но тогда нужно изменить конфигурацию в скетче (33 строку закомментировать). Кстати, сенсорная кнопка работает отлично - сквозь пластик палец в кожаной перчатке нормально отрабатывает, но нужно вплотную прижать/приклеить сенсорную пластину к пластику (отпаять пины, сделать эту сторону плоской).

GPS модуль покупал вот этот https://ru.aliexpress.com/item/32879520862.html, но что-то цена на него сейчас неадекватная (стоил с доставкой 300 рублей). Вот пара похожих лотов, похоже, что там внутри у всех одно и то же https://ru.aliexpress.com/item/33024312145.html и https://ru.aliexpress.com/item/33022736881.html Возможно, что по 200 рублей продают без ГЛОНАСС. Я в своём приёмнике пытался его активировать (чип вроде поддерживает), но не заработало. Да и нафиг он тут не нужен.

Логика работы такая:

Когда только включился показывает служебный экран:
    chars            символов принято
    sentences    фраз с позицией принято
    failed            ошибочных контрольных сумм
    passed         прошедших контрольных сумм
    hdop            горизонтальная точность
    lat                широта
    lng               долгота
    available      символов в буфере (1 - переполнение для softserial)

Если при этом заведён мотор, то показан тахометр.
Когда будет получено время с GPS, то будет показан экран времени.
Когда будет скорость выше минимальной (minTrueSpeed), то будет показана скорость.

Однократное нажатие кнопки - переключение экрана.
Двухкратное - блокировка на текущем экране (символ Н справа вверху).
Длительное удержание на экране одометров - сброс одометра.

В правом нижнем углу количество спутников. На экране тахометра внизу экрана рисуется полоска (максимум 10000 об/мин).

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

Вцелом устройство работает нормально, не смотря на то, что внутри говнокод (старался всё комментировать). Иногда может зависнуть, если мотоцикл стоял ночь под дождём или едешь по сильному туману. Отловить проблему мне не удалось. Склоняюсь к тому, что зависает OLED экран. После того, как покрыл всю пайку цапон-лаком, стало гораздо лучше.

Пришлось немного модифицировать шрифты для библиотеки работы с экраном. Их надо добавить в папку библиотеки SSD1306Ascii и добавить шрифт в файл allFonts.h (переделанная библиотека прилагается).

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

Все файлы (с библиотеками и прочим) https://yadi.sk/d/MXha8QHyRGsR2w

Скетч и шрифты https://yadi.sk/d/jMVPCIzbapkLCQ

b707
Offline
Зарегистрирован: 26.05.2017

скорость с GPS идет? и как быстродействие?

Vladikas
Offline
Зарегистрирован: 25.07.2013

Всё кроме оборотов идёт с GPS. Модуль выдаёт инфу в порт раз в секунду, так что экран спидометра обновляется раз в секунду. Экран тахометра обновляется раз в 100мс или раз в 500мс в зависимости от того аппаратный UART используется для связи с GPS или софтовый.

Vladikas
Offline
Зарегистрирован: 25.07.2013

Видео работы https://youtu.be/4xzfTJs3LxY

EduardNN
Offline
Зарегистрирован: 21.04.2019

Интересное устройство. С удовольствием собрал - работает. Но есть пару вопросов. С индикатором 128x64 0.96 дюймов на SSD1306, почему то сильно занижена яркость. Можно ли добавить поддержку других индикаторов в проект( например WG12864a или от мобильников )? 

Как с вами связаться ?

Vladikas
Offline
Зарегистрирован: 25.07.2013

Про яркость - попробовать изменить текущую с помощью oled.setContrast(255);

Переделать можно на любой экран, но так как я не особо про это думал во время написания прошивки придётся много думать...

Связаться можно прямо тут.

EduardNN
Offline
Зарегистрирован: 21.04.2019

Не нашел такой строки...

Vladikas
Offline
Зарегистрирован: 25.07.2013
 
 

Правильно, её надо добавить где-нибудь после инициализации дисплея.

EduardNN
Offline
Зарегистрирован: 21.04.2019

Жаль, что я полный ноль программировании :(

Нашел в скетче два места где встречается инициализация дисплея , но добавление oled.setContrast(255);

результата не принесло.

Помог анализ примеров из библиотеки SSD1306Ascii.

После замены строки oled.begin(&SH1106_128x64, I2C_ADDRESS);//инициализация экрана 

на oled.begin(&Adafruit128x64, I2C_ADDRESS);//инициализация экрана

с яркостью дисплея все отлично.

Еще раз спасибо автору за интересное уст-во !!!

 

 

 

Vladikas
Offline
Зарегистрирован: 25.07.2013
 
 

У вас чип другой на дисплее, получается. Ну уже не ноль, прогресс есть!

Спасибо за отзыв.

Vladikas
Offline
Зарегистрирован: 25.07.2013
 
 

Ещё пара моментов. В коде есть строчки для предварительной инициализации одометров.

oilOdometerInit= 2000000;//пробег (в метрах) с замены масла для инициализации
totalOdometerInit= 42823000;//пробег (в метрах) на родном одометре для инициализации

И есть возможность сбросить все одометры в ноль. Замкнуть на минус при включении 5 пин.

resetPin = 5;//пин кнопки сброса одометров при инициализации

 

EduardNN
Offline
Зарегистрирован: 21.04.2019

     

Vladikas
Offline
Зарегистрирован: 25.07.2013

Хм, точно. В объяснении работы детектора правильно нарисовал, а в основной схеме косяк.

Интересно, что в черновике всё правильно, а в чистовике нет. Исправил, перезалил https://yadi.sk/d/h7TjM8uJZi5Rkw

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

EduardNN пишет:

Жаль, что я полный ноль программировании :(

Только в программировании?

Цитата:

Помог анализ примеров из библиотеки SSD1306Ascii.

После замены строки oled.begin(&SH1106_128x64, I2C_ADDRESS);//инициализация экрана 

 

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

Vladikas
Offline
Зарегистрирован: 25.07.2013
 
 

Не вводите людей в заблуждение? Какими функциями эти контроллеры не совместимы?

APJ
Offline
Зарегистрирован: 25.03.2015

Vladikas пишет:

Хм, точно. В объяснении работы детектора правильно нарисовал, а в основной схеме косяк.

Интересно, что в черновике всё правильно, а в чистовике нет. Исправил, перезалил https://yadi.sk/d/h7TjM8uJZi5Rkw

 

Похоже что всё равно косяк остался. R2 наверное должен быть от + 12 в к стабилитрону и R3

Vladikas
Offline
Зарегистрирован: 25.07.2013
 
 

Блин. Нельзя в час ночи такое рисовать.

EduardNN
Offline
Зарегистрирован: 21.04.2019

andriano пишет:

EduardNN пишет:

Жаль, что я полный ноль программировании :(

Только в программировании?

Цитата:

Помог анализ примеров из библиотеки SSD1306Ascii.

После замены строки oled.begin(&SH1106_128x64, I2C_ADDRESS);//инициализация экрана 

 

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

Ну куда же нам без таких одаренных и эрудированных пофи ?

Где же вы были, когда я пытался разобраться с причиной недостаточной яркости дисплея ???

Толку от вашей реплики ноль...

SSD1306 и CH1106 считаются, как бы совместимыми контроллерами , есть только одно небольшое различие между SSD1306 и SH1106: контроллер SH1106 имеет внутреннюю оперативную память 132x64 пикселей. SSD1306 имеет только 128x64 пикселей. 

EduardNN
Offline
Зарегистрирован: 21.04.2019

R3 вроде от +12...

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

Vladikas
Offline
Зарегистрирован: 25.07.2013
 
 

У меня на черновике правильно нарисовано (по которому я собирал). Благо устройство пару лет работало, пока мотоцикл не продал. А на чистовую перерисовать не получается, ночью голова хочет спать, а не рисовать...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

EduardNN пишет:

SSD1306 и CH1106 считаются, как бы совместимыми контроллерами , есть только одно небольшое различие между SSD1306 и SH1106: контроллер SH1106 имеет внутреннюю оперативную память 132x64 пикселей. SSD1306 имеет только 128x64 пикселей. 

Не только.

Есть и другие различия.

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

 

PS.

Цитата:

Толку от вашей реплики ноль...

Моя реплика вызвана удивлением, вызванным вашим сообщением.

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

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

PPS.

Цитата:

Где же вы были, когда я пытался разобраться с причиной недостаточной яркости дисплея ???

О том, что Вы указываете в своем коде 1106, я узнал только из Вашего сообщения № 8. А где я мог еще об этом узнать?

Vladikas
Offline
Зарегистрирован: 25.07.2013

В очередной раз исправил свои косяки. Надеюсь, окончательно ))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Фотографии в отдельных постах удалены по запросу ТС. На будущее, выкладывайте картинки с шириной ок. 640, чтобы не вылезало за разметку.

Prony
Offline
Зарегистрирован: 12.01.2021

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

Vladikas
Offline
Зарегистрирован: 25.07.2013

EEPROM микроконтроллера имеет ограниченный ресурс. Можно было бы писать одометры в EEPROM всё время, при каждом их изменении, но тогда память может быстро (на самом деле не очень быстро) сдохнуть. Чтоб продлить жизнь памяти используется детектор выключения. Как только питание 12 вольт пропадает микроконтроллер записывает данные в EEPROM, работая в эти доли секунды от конденсатора.

**********

Детектор не "вынесен отдельно", сам компаратор находится внутри микроконтроллера, это просто перерисовано более подробно.

Prony
Offline
Зарегистрирован: 12.01.2021

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Vladikas пишет:

EEPROM микроконтроллера имеет ограниченный ресурс. Можно было бы писать одометры в EEPROM всё время, при каждом их изменении, но тогда память может быстро (на самом деле не очень быстро) сдохнуть. Чтоб продлить жизнь памяти используется детектор выключения. Как только питание 12 вольт пропадает микроконтроллер записывает данные в EEPROM, работая в эти доли секунды от конденсатора.

Решение так себе. Едешь ты едешь из Москвы в Крым, хранишь данные своего одометра в ОЗУ, чтобы EEPROM не протирать, проехал, например, уже 1800км, потом, уякс, помеха прилетела по питанию, Ардуина перезагрузилась и "До свиданья, правильные данные одометра." 

v258
Offline
Зарегистрирован: 25.05.2020

Vladikas пишет:

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

Достаточно писать не в одну и ту же ячейку, а тысяч через 50-100 переносить запись в другую. И сохранять ее адрес в, скажем, нулевой. Тогда можно будет без проблем сохранять несколько миллионов км, записывая их при каждом изменении

Vladikas
Offline
Зарегистрирован: 25.07.2013

Думал о датчике топлива. Но на моём китайце карбюратор и бензин идёт самотёком. С импульсным насосом идея интересная, я бы попробовал. А так то у меня для пробега от заправки отдельный одометр был. Мне его хватало.

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Vladikas пишет:
Посмотрел бы я на того человека, который не слезая с мотоцикла смог проехать из Москвы в Крым.

Я по деццтву из Н-ска до Кургана доезжал за 1 дневной перегон. Отдыхал 1 раз, после Омска (~660 км).  Потерять хотя бы 500км из-за сбоя - тоже ничего хорошего. 

Vladikas
Offline
Зарегистрирован: 25.07.2013

Мне хватало моего варианта, делал то для себя устройство. Так-то никто не машает стопицот защит напихать. Я по большей части только часами пользовался и бензиновым одометром. Бак 12 литров, заправлялся каждые 100км.