Посоветуйте по автомобильному спидометру.
- Войдите на сайт для отправки комментариев
Доброго времени суток! Делаю, с позволения сказать, бортовой компьютер для жигулей. Требуется измерять остаток бензина в баке, скорость, пробег. Пробег нужно скидывать в еепром. Делать это каждую секунду-минуту- не хочу, кончится ресурс перезаписи. Надо пробег писать, когда движок глушу. Не знаю, как отловить этот момент. Загвоздка в том, что хочу полностью отключать питание устройства при отключении зажигания. Видел где-то решение на тини 2313, там когда напруга пропадала, аналоговый компаратор прерывание вызывал, и скидывал инфу в память , пользуясь напругой, с разряжающегося конденсатора по питанию. В 328 меге комаратора нет, а АЦП к этой задаче не прикрутишь. Что бы придумать?
И ещё вопрос. По измерению уровня бензина. Напряжение бортсети (плюс) идёт через обмотку показометра на датчик (реостат). Второй хвост реостата сидит на массе. Напряжение в бортсети меняется, катушка не только нелинейна по импедансу, так ещё и на температуру реагирует (в части активного сопротивления, разумеется). Поплавок в баке прыгает. Так вот, с сопротивлением катушки я ничего не придумаю, а напряжение на эту цепь застабилизировать можно. Но нужен стабилизатор на 12 В и около 0,1А с очень малым падением (чтоб не нарушать работу штатного прибора), 7812 тут не поможет, он чуть не полтора вольта теряет. Посоветуйте, какой взять из общедоступных! Параллельно датчику уровня топлива хочу повесить конденсатор, тысяч на 20 микрофарад, чтоб нивелировать плескание топлива и резкое изменение напряжения с поплавка. Думаю, АЦП Ардуины на конденсатор не обидится?
Спасибо кто дочитал!
В 328 меге комаратора нет, а АЦП к этой задаче не прикрутишь. Что бы придумать?
Как это компаратора нет? Загляните в даташит, стр. 234
To Dimax: Спасибо, и действительно есть. Конечно средствами IDE туда не добраться, но с прерыванием от WDT по вашим советам разобрался, может, и здесь чего найду.
To Andi: Интересная схема, буду изучать, устройство похоже на промышленное (многое предусмотрено), подскажите, пожалуйста, источник схемы, почитаю описание.
Тарас Петрович, я про работу с компаратором частенько писал, вот три ссылки из моих закладок: измеритель ёмкости прерывание для кнопки датчик вибрации может поможет разобраться ..
Andy, спасибо почитал. Там, конечно, серьёзные программисты работали (и с can шиной подружили контроллер, и с часами, и с кнопками, и с диплеем)-мне такое рановато.
Ещё уточняющий вопрос по стабилизатору: Прикупил я две микросхемы KA78R12 и LM2940-CT, обе обещают до 0,5В падение (опять ток бензодатчика не померил), ну до ампера должен быть. На выходе стабилизатора будет висеть немалая ёмкость (демпфирование колебаний датчика). Так вот, не обидится ли микросхема на потенциал на выходе после отключения входного напряжения (типа обратка получается, правда, полярность верная)? Тот же вопрос с питанием Ардуины. Мне ёмкости должно хватить на запись пробега в EEPROM (по прерыванию от компаратора, когда плюс после замка "закончился", а на конденсаторе фильтра ещё остался), а перед Ардуиной будет кренка на 5В стоять?
С питанием в общем определился, ардуине аккумулятор не съесть, пусть только проверяет, включено ли зажигание. Теперь возник вопрос с выводом цифр на дисплей 20х4. Нашёл на Ардуино.цц код из темы о выводе крупных цифр ( http://forum.arduino.cc/index.php/topic,44427.0.html ), код, как пишут, должен работать со стандартной библиотекой ЛиквидКристал, но не работает.
При попытке скомпилировать вылетае туева хуча ошибок, глубинный смысл которых мне не представляется понятным.
В теме, из которой я взял этот код, люди пишут, что он рабочий, правда лет 7 назад пишут (может, среда программирования менялась или библиотеки?). Что следует из неоднозначности вызова переполенной переменной? На этом форуме я находил подобную проблему, там всё решилось добавлением знака & перед элементом массива (говорят, это непосредственное обращение к элементу по его адресу). Здесь, увы, тоже не понял.
И ещё в коде присутствует строка:
Компилятор её не подсвечивает в тексте (как, например, лсд.Райт), в инструкции к библиотеке такого тоже нет. Что эта строка может значить?
Задача моя вывести три крупных цифры, составленных из забитых точками знакомест индикатора. Не думаю, что с такой задачей человечество столкнулось впервые, а посему, должна где-то быть готовая библиотека или код. Но мне посчастливилось найти лишь тот код, о ктором выше.
Прошу совета по данной тематике!
Или графический дисплей проще взять, и к нему библиотеки с различными шрифтами поискать?
И ещё в коде присутствует строка:
Компилятор её не подсвечивает в тексте (как, например, лсд.Райт), в инструкции к библиотеке такого тоже нет. Что эта строка может значить?
Задача моя вывести три крупных цифры, составленных из забитых точками знакомест индикатора. Не думаю, что с такой задачей человечество столкнулось впервые, а посему, должна где-то быть готовая библиотека или код. Но мне посчастливилось найти лишь тот код, о ктором выше.
Прошу совета по данной тематике!
Команда lcd.command(64); подаётся перед загрузкой символов в память дисплея. В библиотеке LiquidCrystal она обычно не требуется, так как вызывается внутри команды для загрузки символов lcd.createChar (есть в примерах к библиотеке).
Большие цифры есть здесь: http://arduino.ru/forum/programmirovanie/etyud-2-stroki-po-40-simvolov-na-lcd-1602
Arduinec, большое спасибо! В вашем примере всё просто и работает, пока собрал на макетке, вывел цифры на нужные знакоместа.
Аппаратную часть я благополучно спаял на макетке, теперь дело за окончательной программой. Что есть: Подключены 2 входа АЦП (на измерение бензина и напряжения), вход внешнего прерывания для общения с датчиком скорости, дисплей, ну и обвязка всякая (питание, стабилитроны, делители). Написал тестовый скетч.
Здесь всё просто: есть функция для вывода больших цифр с поразрядной разбивкой, функция работы с АЦП и вывод. Есть внешнее прерывание по спаду, оно считает импульсы с датчика. Есть прерывание от сторожевого таймера раз в секунду. Так-то всё работает, но чем выше скорость, тем больше ошибка. Имульсы я подаю с другой ардуино, написав на ней простенький генератор. Я думаю, что причина в долгом исполнении обработчика прерывания таймера. Поэтому, теряются импульсы.
Вопрос: правильно ли я строю алгоритм программы, может, есть идеи получше. И ещё, когда мы пишем функцию обработчика некого прерывания, нужно ли в конце указывать команду выхода из обработчика (восстановления флага I в SREG на вроде reti )?
Дорабатываю программу и выяснил, что скорость выходит завышенная в 1,11 раза. Есть, конечно, выход- программно умножить скорость на 0,91 (что я пока и сделал), но хочется понять почему. Ещё наблюдение- при подключении генератора к устройству "на ходу", первый раз выводится правильное значение скорости, а при всех последующих прерываниях- завышает. Если прерывание (его обработчик) от сторожевого таймера исполняется слишком долго, то дожны теряться прерывания от импульсов, то есть скорость должна быть ниже, а тут- наоборот. На периодичность следования прерываний от WDT, едва ли что-то может повлиять, там же счётчик аппаратный. Может, для расчёта скорости ввести ещё прерывание от внутреннего таймера 1 (ШИМ мне не нужен), а по вачДогу заниматься всякой индикацией? Посему- если кто вникнет, а ещё и подскажет- буду очень благодарен!
ЗЫ Тему бы в программирование?
Тарас Петрович, вотч дог считает время неточно, лучше использовать таймер 1 для счёта секунд, если он не задействован.
Вот оно что! Спасибо. Тогда вачдог на индикацию задействую, и пойду искать мантру для вызова прерывания от таймера. Кстати, Dimax, благодарю за проект генератора с регулировкой частоты из сериал, его-то я и собраk как тестовый, осциллограф сказал, что частота соответствует выбранной.
Тарас Петрович, мантру можно тут взять :)
Мантру нашёл))), работает. Ещё подладил программу. Теперь спидометр умеет правильно показывать скорость, напряжение питания устройства, бензин (пока без привязки к показаниям реального датчика) и пробег. Пробег хранится в энергонезависимой памяти, скидывается он туда в момент отключения питания прибора. После всех стабилизаторов, питания дисплея и т.п., я поставил диод Шоттки, а за ним-конденсатор на 1000,0. Питание от бортсети (плюс после замка зажигания), через делитель и стабилитрон, подан на вход внешнего прерывания. Когда прибор обесточивается, формируется прерывание INT 1 по спаду, в этом прерывании происходит запись пробега в память. После- контроллер отключается ввиду разрядки конденсатора. Постоянного питания я не схему не завёл, пока конденсатор справляется.
В планах прикрутить суточник пробега с кнопкой его сброса (жаль, прерывания внешние кончились((( и пищалку для подачи кратковременного звука при переходе через 77 км/ч.
Ещё мысли вслух про уровень бензина: Жигулёвский датчик топлива имеет кривую характеристику, делать аппроксимацию я не хочу, поэтому думаю просто полуить (экспериментом) тарировочную карту, забить её в массив из 40 элементов и перебирать этот массив на ближайшее к АЦП значение.
Скетч, вдруг кому интересно, или кто поправит:
Я бы записывал пробег не только по выключению. а скажем через каждый километр. думаю что машина развалится раньше чем при этом количество циклов перезаписи закончится. И колебания уровня топлива не апаратно снижал, а програмно плавающим средним.
Ещё поменял в программе вывод пробега, слелал через float, так точнее. Остался вопрос с кнопкой. Сейчас она только сбрасывает пробег, а хочется ей же циклически (57/77/107) менять величину скорости, при которой зуммер подаёт однократный сигнал о превышении. Только пока не могу придумать реализацию. То ли по длительности удержания, то ли ещё как. Может Pulsein в loop засунуть, так дребезг кнопки замучает. Сейчас-то кнопка однократно опрашивается в каждом прерывании таймера и дребезг- побоку. Или конденсатор микрофарад на 10,0 на кнопку повесить?
На днях подключал БК в машине, скорость разнится с навигатором в 1 км/ч, при работе стартера прибор не перезагружается, запись в память- действует, ошибка в измерении напряжения бортсети-не более 0,2В. Канал бензина пока не подключал, хлопотно приборку скидывать.
Ну и вариант программы на данный момент:
Запись каждый километр в дополнение к вкл-выкл, а не вместо. Однократный зумер в какой нибуть тягнучке задалбливает меня на навигаторе.
Да, надо предусмотреть возможность отключения зуммера вообще, то есть подача сигнала при (57/77/107/никогда).
Только вот как сделать? Например- при включении прибора -77, следующее-57, следующее-107, следующее- отключить. Удержание более 3 сек- сброс суточника....Или по-другому как... Счётчик какой завести в прерывании?
В "Программирование"? Сказано - сделано)
Про кнопочки тут, и удержание и дабл клик и ... в общем ТИТАНОВЫЙ ЛИСАПЕД ДЛЯ КНОПКИ.
Всем привет! БК успешно используется, а вот до ума доводится медленно. Установил я новый датчик в бак и прокалибровал, заливая по 1 литру. Сопротивление не измерял, записывал сразу показания АЦП. Диапазон получился не очень- ну тут я с делителем просчитался.
Поскольку ряд получился нелинейным, я думаю забить числа в массив, и ФОРом перебирать в поисках наиболее близкого значения. А номером элемента массива как раз и будет число литров.
Теперь возник вопрос, как бороться с плесканием бензина и огромным (до 100 единиц) разлётом данных ацп при резком перемещении машины, особенно когда бензина полбака? Усреднить- не получится (выборка может попасть на момент ускорения-торможения). Реже измерять- а если попадёт как раз на пик? Можно электролит повесить огромный на датчик, но тогда надо ток его заряда ограничивать, чтобы стабилизатор не сжечь, а ограничительный резистор погрешность внесёт. Есть у кого мысли, как правильно посчитать?
Изменил программу, как и планировал, перебрал ФОРом ряд калибровки. К моему удивлению, девиация показаний в литрах не превышает одного-двух. Точность работы меня вполне устроила. Теперь хочу сделать, чтоб считал, сколько км осталось до запрвки при текущем расходе. Но тут надо расход мерить и колличество бензина знать точно. Как это математически реализовать- пока в раздумьях. Если кто чо думает по этому поводу- поделитесь! ЗЫ На морозе почему-то сдох зуммер((
Текущий вариант программы:
Добрый день!
Интересный проект. Хочу добавить сюда пару термодатчиков.
Тарас Петрович, возможно выложить схему соединений из поста #19 с лучшим качеством? а то нечитабельно.