Корректор показаний спидометра ардуино

Опубликовано: 05.07.2024

Каравкин В.
В статье автора «Спидометр и тахометр на ARDUINO для автомобиля», в журнале «Радиоконструктор» №12 за 2016 год было описание несложного, благодаря использованию готового микроконтроллерного модуля ARDUINO UNO, прибора, на двухстрочном ЖК-дисплее показывающего скорость движения автомобиля и частоту вращения коленвала двигателя. Но тот прибор только показывал скорость, а здесь предлагается дополнение к нему, чтобы он не только показывал скорость движения, но и подавал звуковой сигнал водителю, если скорость превысила некий порог, например, 60 км/час при езде по городу или 90 км/час при езде по шоссе.



Суть дополнения в том, что в схему вводится схема на транзисторном ключе VT3, с зуммером в коллекторной цепи (рис.1). На базу этого транзистора управляющее напряжение подается через переключатель S1 либо с порта D12, либо с порта D11 платы ARDUINO UNO.
Этот переключатель S1 служит для выбора режима «город / шоссе». В положении «город» зуммер BF1 звучит при превышении скорости 60 км/час, а в положении «шоссе» зуммер звучит при превышении скорости 90 км/час. Выключатель S2 служит для отключения данной функции.
Значения скорости 60 и 90 км/час задаются в программе, и их легко можно заменить на другие значения, - какие угодно.
Существенные изменения касаются не только схемы, но и программы (таблица 1).


В программе добавляются два цифровых выхода, и вводится компараторная функция, которая следит за результатами измерения скорости и соответственно, изменяет логические уровни на этих двух цифровых выходах.
Цифровые выходы заданы в строках:
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
Для включения сигнализатора превышения скорости используется компараторная функция if
В строке:
if(frequency1>90)digitalWrite(11, HIGH);
указывается, что при превышении скоростью значения 90 км/час на порту 11 устанавливается логическая единица. В строке:
if(frequency1<90)digitalWrite(11, LOW) ;
указывается, что при скорости ниже значения 90 км/час на порту 11 устанавливается логический ноль.
В строке:
if(frequency1>60)digitalWrite(12, HIGH);
указывается, что при превышении
скоростью значения 60 км/час на порту 12 устанавливается логическая единица. В строке:
if (f requency1<60) digitalWrite (12 , LOW) ;
указывается, что при скорости ниже значения 60 км/час на порту 12 устанавливается логический ноль.
Вместо значений «60» и «90» можно подставить любые другие значения скорости, на которые будет срабатывать звуковой сигнализатор.
Литература:
1. Каравкин В. «Спидометр и тахометр
на ARDUINO для автомобиля».
ж. Радиоконструктор, №12, 2016г. стр.
34-36.
РК 02-2017

Корректор электронного (стрелочного) спидометра на ARDUINO

Корректор электронного (стрелочного) спидометра на ARDUINO

Транзистор я применил какой валялся в ящике - kc238b, кажется это аналог обычного кт315, точно не помню.
3 цифровой pin на ARDUINO это сигнал с датчика скорости (у меня на бусе применен датчик фаз от 8 клапанного ВАЗ)
4 цифровой pin на ARDUINO это выход на стрелочный спидометр.
Спидометр я применил от УАЗ. Он дешевый и его легко встроить в нашу приборку вместо родного тросового.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. Можно любой.
Я применил 3,3kOm (контакты слева направо GND/СИГНАЛ/+5V)

Корректор электронного (стрелочного) спидометра на ARDUINO

Корректор электронного (стрелочного) спидометра на ARDUINO

Корректор электронного (стрелочного) спидометра на ARDUINO

Корректор электронного (стрелочного) спидометра на ARDUINO

Можно хоть на сигнал от датчика ABS повесить (а там много зубов на оборот, около 60 шт). Только коэффициент правильно подобрать.
Любой репер можно, с любым количеством зубов. Главное чтобы датчик давал квадратный сигнал от 0 до 5 вольт и подобрать коэффициент умножения.

A0 pin ардуино - вход от потенциометра регулятора спидометра (у меня применен 3,3кОм)
2pin ардуино - вход - сигнал тахометра от ЭБУ двигателя
3pin ардуино - вход - сигнал от датчика скорости
4pin ардуино - выход - на спидометр в приборку (соединять только через транзистор как по схеме выше)
7pin ардуино - выход - на тахометр в приборку (соединять только через транзистор как по схеме выше)

Корректор электронного (стрелочного) спидометра на ARDUINO

должно хватить. Люди "умные" дома собирают на Ардуино и где-то я видел в инете проект человек делал что-то вроде Января для управления двиглом.

Я не сильно силен в электронике (сын помогает), но как Ардуина на помехи будет устойчива в авто? Делал как-то управление потенциометром скоростью маленького движка и оказалось, что ее может изрядно глючить, даже если движок сравнительно далеко от платы (около 1,5м)

п.с. мысль в голову: если планируешь решать много задач на Ардуино, то может быть имеет смысл поставить где-то TFT панельку сенсорную? сейчас можно сравнительно недорого взять 10-12". Причем программа для создания визуалиции прилагается и там уже много заготовленных кнопок, индикаторов и т.п. с досточно простой привязкой к контроллеру

________________________________________________________

Если дома есть 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 когда можно унаследовать от этого класса свой с заданной ногой контроллера и частотой мигания, там есть методы для переопределения и они вызываются раз в заданное время.

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

vladyka1701

Похожие публикации

Я считаю, что знакомиться с новым продуктом, создавая игры, очень весело и нескучно, и именно поэтому я сделал этот проект.
Этот проект заключается в использовании Arduino UNO и lcd-дисплея Stone tft для разработки простой игры в крестики-нолики.
Материалы, необходимые для эксперимента
Arduino UNO tft lcd дисплей Stone STWI070WT-01 Принцип работы системы
Задайте, что первое нажатие на экран должно быть O, второе нажатие на экран - X, проделайте этот цикл. Установите 8 массивов для хранения количества O и X в каждой строке, столбце и диагонали каждой сетки, до тех пор, пока есть три одинаковых знака является победа, то будет мигающий красный ящик, чтобы доказать победу строки, столбца или диагонали, а затем нажмите сброс, чтобы начать игру снова.
Простая схема соединения

Разработка графического интерфейса пользователя

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

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

admin

Dj_Grander Z Play

Добрый день! В данный момент прохожу производственную преддипломную практику (сам учусь в УРТК). Стоит задача соединить Lego EV3 и Raspberry PI по I2C интерфейсу. До этого, при работе с другими устройствами, у меня никогда не было проблем с I2C интерфейсом, но в данной связке "EV3-RPI" - начались ошибки. Перед описанием ошибок, уточню, что EV3 - Master, а Raspberry - Slave, т.к. EV3 умеет работать только в режиме Master.
Первое, что бросается в глаза, это практически постоянная передача в эфир SLA пакета (адреса Slave-устройства). По-факту, именно с этого и должна начинаться передача, но в данном случае, её попросту не происходит. А, если быть точнее, то происходит она только каждый шестой раз.
Следующая проблема заключается в том, что обмен данными не всегда происходит до конца. Даже если EV3 отправляет свой пакет (два байта), то ответ от Raspberry (он тоже два байта) приходит через-раз, а то и ещё реже.
я также пробовал соединять EV3 с Arduino, Arduino с Raspberry, что бы найти причину, но там всё отлично работало и ошибок было ноль. Стабильный обмен двумя байтами, как и нужно.

Очень нужна помощь в устранении данных ошибок!


P.S: У EV3 используется нестандартный уровень лог. единицы (там он 4.3в) и обычные конверторы уровней уже не работают с ним. Поэтому, мне пришлось перепаивать его под другие номиналы подтягивающих резисторов, что бы всё заработало. В его работе нареканий нет.

Ниже показаны осциллограммы работы I2C между различными устройствами, которые были задействованы.

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

Внешний вид аналогового спидометра на основе Arduino и инфракрасного датчика

В рассматриваемом проекте мы будем показывать скорость как в аналоговой, так и в цифровой форме. Также в данной статье мы можем улучшить свои познания в области шаговых двигателей и использования прерываний и таймеров в Arduino. В результате реализации данного проекта мы сможем измерять скорость любого вращающегося объекта, отображать ее в цифровой форме на экране ЖК дисплея 16x2 и в аналоговой форме на соответствующем указателе.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Биполярный (двухполюсный) шаговый двигатель (4 провода) (bipolar stepper motor).
  3. Драйвер шагового двигателя L298n (Stepper motor driver) (купить на AliExpress).
  4. Модуль инфракрасного датчика (IR sensor module) (купить на AliExpress).
  5. ЖК дисплей 16х2 (16*2 LCD display) (купить на AliExpress).
  6. Резистор 2,2 кОм (купить на AliExpress).
  7. Соединительные провода.
  8. Макетная плата.
  9. Источник питания.
  10. Напечатанная на принтере картинка спидометра.

Внешний вид компонентов для проекта

Расчет скорости и ее отображение на аналоговом спидометре

Инфракрасный (ИК) датчик представляет собой устройство которое может обнаруживать присутствие объекта перед собой. Для тестирования работы проекта мы использовали двухлопастной вентилятор, который поместили перед инфракрасным датчиком, поэтому всегда когда лопасть вентилятора будет проходить над датчиком ИК датчик будет обнаруживать это. Для расчета времени одного оборота вентилятора мы задействуем таймеры и прерывания платы Arduino. В определенной степени данная часть проекта похожа на тахометр на основе платы Arduino, ранее рассматривавшийся на нашем сайте.

Внешний вид инфракрасного датчика

В этом проекте мы будем использовать прерывание самого высокого приоритета для определения числа оборотов вентилятора в минуту (rpm - revolutions per minute). Мы будем применять это прерывание в нарастающем режиме. То есть всегда когда выход датчика будет изменять свое состояние с LOW на High будет вызываться на выполнение функция RPMCount(). А поскольку в проекте мы использовали двухлопастной вентилятор это значит что данная функция будет вызываться 4 раза за один оборот.

Когда мы определим время одного оборота мы можем рассчитать по ниже приведенной формуле число оборотов в минуту (RPM). В этой формуле 1000/time позволит определить нам число оборотов в секунду (RPS - revolution per second), а умножив полученное значение на 60 мы получим число оборотов в минуту.

Читайте также: