автомобильный тахометр на ардуино
- Войдите на сайт для отправки комментариев
Вс, 09/12/2012 - 21:30
Подскажите как реализовать тахометр на ардуино с помощью катушки зажигания.
Подскажите как реализовать тахометр на ардуино с помощью катушки зажигания.
С помощью катушки зажгания никак.
Надо сначала определиться, как считать/измерять обороты, будет понятно, какой использовать датчик. А уже потом думать о программах. Лично я бы не рискнул влезать в катушку зажигания, мало не покажется. Уверен, что в интернете много статей на тему как сделать электронное зажигание на карбюраторной машинке, оттуда можно и понять, как лучше сделать
С помощью катушки зажгания никак.
Почему никак? можно минус катушки "читать" или высоковольтный провод который идет в распределитель. Ну так же как это делает стробоскоп.
Это называется снимать сигнал с катушки зажигания или с коммутатора или вообще с датчика Холла. А с помощью катушки зажигания тахометр не получится. А точнее она никак не поможет в создании тахометра.
Тем по подсчету оборотов здесь пруд пруди.
В общем сообщение имело смысл: бессмысленный и не коректно заданный вопрос.
Например:
"Подскажите как реализовать спидометр на ардуино с помощью коробки передач."
"Подскажите как реализовать анемометр на ардуино с помощью потока ветра."
"Подскажите как реализовать бортовой комп на ардуино с помощью автомобиля."
Скажите придираюсь? Если человек действительно в чем-то заинтересован и хочет что-то реализовать, то таких вопросов от него не "услышишь". Будут конкретные и четкие вопросы, как, зачем и почему.
Можно было бы еще ответить например так: "Вот так - с помощью посатижей, изоленты и проводов" смысл тот же.
Напялив на себя личину leshak'а (что-то давно его здесь не слышно...), попробую пофилософствовать
Скажите придираюсь?
А то ...
Если человек действительно в чем-то заинтересован и хочет что-то реализовать, то таких вопросов от него не "услышишь". Будут конкретные и четкие вопросы, как, зачем и почему.
Для того, чтобы правильно задать вопрос, необходимо уже иметь какие-то начальные познания в теме. Той же терминологией овладеть в мере, достаточной для того, чтобы ставить пусть и глупые (а какие они еще могут быть от новичка?), но правильно выглядящие вопросы.
А чтобы иметь начальные познания в теме, надо что? Правильно - учиться, задавать вопросы. Естественно глупые. И тут уж никак иначе - либо молчи в тряпочку и не встревай в беседу, которую ведут ученые мужи, либо пытайся преодолеть тот самый первый шаг, с которого начинается "дорога в тысячу ли".
Для новичка (то бишь топик-стартера) расшифрую - maksim, надо полагать, имел в виду, что тахометр нельзя сделать "с помощью катушки", как механического объекта. В этом смысле да - она ничем особым не отличается от молотка.
А вот снимая сигнал с катушки зажигания, и имея правильное ПО, частоту вращения коленвала определить вполне себе можно.
PC: Продолжая аналогию, наберусь наглости утверждать - "с помощью Ардуино" тоже не только тахометра, но и вообще ничего сделать нельзя. Потому что она, будучи предметом неодушевленным, не может ни помочь, ни помешать в чем бы то ни было. Это вам любой филолог скажет!
Хотя... при чем тут филолог?
Прежде чем спросить, спроси у гугла и тогда не будет глупых вопросов, а по мере гугливания начнешь понимать - нужно тебе это или нет, что если совсем никак такая задача не подсилу, то просто идешь в магазин и покупаешь цифровой тахометр(+вольтметр) за 250р. и радуешься.
Тот кто здесь хотел собрать тахометр писал бы так:
Собираю тахометр, имею дуину Уну и дисплей из 3-х цифр. Нашел как подключить дисплей и пример скейтча, но почему-то вместо цифр какие то иероглифы, вот ссылка (или код), подключаю как там (или вот фото или описание) и еще не могу понять куда подключать тахометр, можно подключить к катушке зажигания? Помогите реализовать тахометр на ардуине.
Вот так примерно выглядел вопрос заинтересованного человека, который хоть что то попытался сделать сам.
В общем не знаю что на меня нашло, можно почистить тему.
Правильно максим говорит, у топикстартера появилась мечта или идея, ему самому инфо лень искать, так он и пишет. И как очень часто случается даже забывает о своей теме и не смотрит даже ответы, так как ему сейчас уже интересно как можно сделать робот ну или бабуробот которую производит наш завод, ни забот и ни хлопот!
Народ я с вами не согласен в корне. я просчматриваю свои темы по мере возможности и не живу как ВЫ в интернете.
Тахометр если что считывается именно с катушки или с генератора автомобиля редко когда с датчиков. если не понятно посмотрите схему хотя бесконтактное зажигание для автомобилей ваз карбюраторных моделей. По ерничать все могут. для обычных МК есть такие решения но для меня они не очень подходят для реализации моей идеи.
А если и задаю вопросы как новичек так и скажу Да Я новичек и что теперь гнобить надо?
Как видимо этот форум тажа участь затронула, как и многие другие.
обвязка меня мало интересует меня именно программирование ибо если нужна была обвязка я задал бы вопрос другом разделе.
цитата взята в ответе у Step962
"Если человек действительно в чем-то заинтересован и хочет что-то реализовать, то таких вопросов от него не "услышишь". Будут конкретные и четкие вопросы, как, зачем и почему."
Вопрос мой внимательно прочтите и прочтите свои высказывание "КАК"
Двигатель за вращение вала дает 4 импульса на катушку
тоесть получаеся если при 1000 оборотов в минуту двигателя будет показывать 4000
а мне надо на 7 сегмениные диоды, вывести в правильный сигнал
И какая же это у вас идея что другие решения вам не подходят? Так и в чем проблема? 4000 поделить на 4 и получить 1000 ?
И открою вам секрет на катушке зажигания 4 импульса (даже на том самом вазе) происходят за один оборот распредвала и 2 импульса за один оборот коленвала, а так как "обороты двигателя" это обороты коленвала, то делить надо на 2, а не на 4.
И назовите мне хоть одну машину с 4-х цилиндровым двигателем трамблерного распределения зажигания, у которой не 2 импульса за один "оборот двигателя"? И к какой такой машине не подайдет стандартный китайский цифровой тахометр+вольтметр?
Все что нужно есть на форуме
Индикация
Считывание оборотов
К катушке подключаетесь через делитеть и диод.
И кстати, даже на ижекторном тазе с ее сдвоенной катушкой на каждую из первичных обмоток тоже приходится по 2 импульса на оборот коленвала.
maksim, Я был не прав ошибочка спасибо за поправку. остальное сейчас гляну заранее спасибо.
Еще доп вопрос а что за делитель? разве не программын путем это делается?
Делитель напряжения и диод нужен для того чтобы не сжечь нуину, на первичной обмотке катушки зажигания 12 вольт, а дуине надо 5.
ТОесть через 7805 я правильно понял?
Нет, не правильно. 7805 это линейный стабилизатор, его применяют для питания МК. Для снятия сигнала можно использовать вот такую схему - делитель напряжения и диод.
Понял. спасибо
Сейчас встал вопрос в математических действиях как это реализовать
я незнаю можно ли подружить ардуино с обд портом _ компьютером, но если можно то проще будет сделать тахометр от обд типо такой бортовой компьютер, модно расход смотреть и всякую разную информацию. на обд раьеме воре один проводок отвечает за передачу данных
У меня карбюратоный двигатель. от куда сигнал я знаю где брать у меня вопрос как правильно стелать вычисление сигналов
Ну так код покажите.
Таки с ним и проблема яж говорю то что я спаять собрать могу а вот разобраться с кодом и есть напряженка.
тоесть действие можно вывести как нажатие тактовой кнопки.
но при 200 оборотах надо сделать деление на половину и как именно это все сделать я понятия не имею поэтому и создал этот топик.
Я не прошу сделать полностью код для меня а подсказать как это можно
Нет, не правильно. 7805 это линейный стабилизатор, его применяют для питания МК. Для снятия сигнала можно использовать вот такую схему - делитель напряжения и диод.
по схеме, диод перевернут...
Нет, не правильно. 7805 это линейный стабилизатор, его применяют для питания МК. Для снятия сигнала можно использовать вот такую схему - делитель напряжения и диод.
по схеме, диод перевернут...
И???...
Напялив на себя личину leshak'а (что-то давно его здесь не слышно...), попробую пофилософствовать
Караул! Грабят! Отдай личину! :)
По философии: вы правы что-бы задать вопрос нужно иметь минимальные знания. Но ведь заставляя более четко сформулировать вопрос мы и подталкиваем к приобретению этих знаний. Благо интернет - это не библиотека. "Сидеть в нем" что-бы выяснить что такое "делитель напряжения" - не нужно.
А непонимание возникает от того что мы привыкли к модели обучение "ТО". Когда учитель указывает на правильный ответ. А есть еще, восточный подход "не ТО". Когда задача учителя только в том, что-бы указывать когда ученик "пошел не той дорогой". Экономить ему время и ресурсы. Но находить правильную дорогу - он должен сам (и этот навык - главный). Учитель - только не пускает в тупики и пропасти.
В данном случае: найти что такое делитель и как его расчитать - можно предоставить самому (сказав что 12-ть вольт спалят дуину), а вот про защитный диод на входе - можно и предупредить (если сам не нашел про это).
Какой подход лучше? А фиг его знает. Индивидуально это. Но IMHO для изобретальско/исследовательских задач - лучше "не ТО". Лучше заставлять формулировать вопросы (то есть самому и ответы находить). Так лучше формируется "умение", а не только "знание".
А по поводу "болезни форума". Ну так это крайне субъективно. Я на например, очень благодарен товарищу который никогда не отвечал на мои вопросы по програмированию "а как ты это сделал?". А молча тыкал в книгу (инета тогда еще небыло) и говорил "там есть ответ" :)
Я не прошу сделать полностью код для меня а подсказать как это можно
Идете в раздел Программирование
И желательно читаете целиком. Это как детский конструктор в котором нужно ознакомится со всеми доступными детальками. Что-бы знать "из чего собирать можно". Хотя-бы бегло проглядть "что имеем".
А потом, когда полезете в задачу, уже вспомнится что "что-то подходящие я видел". Опять идет туда и читаем уже кусочек. Вдумчиво и внимательно.
Например: http://arduino.ru/Reference/AttachInterrupt
Смотрим пример. Думаем "а что если вместо мигания диода, мы будем увеличивать какую-то переменную?". А в главном loop, раз в 10-ть сек, например, выводить ее в Serial (отчитались) и обнулять.
по схеме, диод перевернут...
И???...
или с ним всё в порядке?
по схеме, диод перевернут...
или с ним всё в порядке?
Давайте порассуждаем: что такое диод? Зачем он там вообще?
Главное полезное свойство диода - запиратся и не пропускать ток (напряжения) от острого носика к тупому концу.
То есть его задача "не пустить какой-то ток(напряжение)". Что он тут у нас может "не пущать"?
С одной стороны у него ардуина. Но, по идее, так как пин у нее включен на вход, то там ничего меняться не может. Ардуина ничего "не выдает".
Изменения у нас могут прийти только со стороны 12V. В идеале между резисторами у нас должно образовыватся не более 5v (что-бы не спалить дуину). Но что если там, вдруг, появится 8v? (скакнуло напряжение, ошиблись с номиналами резисторов, их точность подгуляла e.t.c)?
Если диода вообще не будет - это 8v выпалят вход ардуины. Если диод будет "острым носиком к ардуине", то он опять-таки пропустить через себя эти 8v на арудину (и спалит ее), а вот если он "острием" будет направлен "к" этим 8v, то он "запрется" (c тупого конца напряжение меньше) и спасет ардуину.
Отсюда можно сделать вывод о том каков должен быть номинал диода: заведомо больше чем возможное напряжение которое ему прийдется "удерживать" если что-то пойдет не так. То есть не меньше 12v. Но, учитывая погрешности можно спокойно брать с "запасом" вольт на 25-ть.
Итак, с ним все в порядке? :)
ну ка, ну ка поподробнее с "номиналом диода" это что?
а вот разберем такую ситуацию на катоде диода +5v, он ведь ничего не пропустит и на аноде нибудет ничего (или почти ничего),
если на катоде 0V то и на аноде 0v, в данной схеме диод ничего пропускать не будет.... я ощибаюсь?
ну ка, ну ка поподробнее с "номиналом диода" это что?
Одна из характеристик диода - какое обратное напряжение он может удержать и не сгореть (и хорошо если он сгорит в "обрыв", а не КЗ). Вы же догадываетесь, что выковырять диод из первой попавшеся бытовой техники и дать на него 10 киловольт - ничем хорошим для него это не закончится :)
а вот разберем такую ситуацию на катоде диода +5v, он ведь ничего не пропустит и на аноде нибудет ничего (или почти ничего),
Вы верно подметили "почти ничего". Но все-таки будет. В режиме "вход" через мегамный резистор пин, все-таки, подключен к питанию. По идее этого должно хватить что-бы analogRead намерял 1024.
Если не будет хватать - можно самому подтянуть ногу вверх (или включить внутрений подтягивающий резистор).
Но не далее как вчера именно по такой схеме подключали дуину к автомобилю - всего хватало :)
если на катоде 0V то и на аноде 0v, в данной схеме диод ничего пропускать не будет.... я ощибаюсь?
Ну не поспоришь :) Если и там и там ноль - вообще никто никуда не идет :) Вопрос только в том, почему на аноде ноль? Ведь в предыдущем примере там было "почти ничего" напряжением в 5v :)
А потому что, когда на аноде "почти ничего", а на катоде 0, то это "почти ничего" очень быстро, через диод, в прямом направлении (туда-то он пропускает) "стекает" в катод (и дальше через резистор в землю). И, в итоге, analogRead на намеряет уже 0. Или "почти ноль". Так как диод в прямом направлении тоже имеет, хоть и не большое, но сопротивление (это его вторая характеристика, чем меньше - тем лучше).
Мне кажется что у вас возникла путаница (и желание развернуть диод) от того что вы представляете себе "идет ток в дуину или нет". А analogRead() меряет у нас потенциал, напряжение на ноге. А не проходящий ток. А потенциал на ноге мы можем образовать разными способами и "подавая его" подтяжкой от питания, и "забирая" подключая каким-либо образом ногу к земле (в данном случае через диод и резистор).
Вообщем предствте себе что дуина эта банка с водой. В которую по капле, из внутрених резервов, что-то наполняется. А нее есть выход. На выходе клапан. Клапан пропускает только "наружу". И ведет в водопроводную трубу магистрального давления. Когда в трубе "есть давление" - клапан запирается. Банка наполняется. И вы меряете уровень банки. Видити что она полна и из этого делаете вывод "в трубе есть давление".
Если же в трубе давление пропало, то внутренее давление банки открывает клапан наружу и вода из нее выливается. Отсюда вы делаете вывод - "в трубе нет давления".
В принципе в данной схеме верхний резистор на 120 кОм это лишнее, но если вдруг диод по какой-то причине пробьет или чудесным образом перевернется, то этот резистор не даст сгореть дуине.
согласен, про подтягивание ноги вверх я както не подумал...
Таки с ним и проблема яж говорю то что я спаять собрать могу а вот разобраться с кодом и есть напряженка.
тоесть действие можно вывести как нажатие тактовой кнопки.
но при 200 оборотах надо сделать деление на половину и как именно это все сделать я понятия не имею поэтому и создал этот топик.
Я не прошу сделать полностью код для меня а подсказать как это можно
Я не понимаю в чем у вас проблема, выше я вам дал ссылки на темы про индикацию и считывание оборотов.
Считывание оборотов - полностью готовый код, за исключением того, что там расчет для одного срабатывания датчика за один оборот вала, а вам нужен расчет на два срабатывания за один оборот. Так что может быть проще разделить результат на два?????????
maksim, данный код вывыодит на пк инфу, а посредство serial на lcd не вывести вроде.
или 7ми сегментники
и еще что за 19 строка что она отрабатывает?
Это с чего это не выводит, допишите дудет выводить, для LCD так вообще практически только
Serial
.println
заменить наlcd.
print.
В 19 строке вычисляются те самые обороты двигателя, а в конце строки /2 и есть то самое деление на 2, которое вам не давало покоя.понял. сейчас попробую собрать
Попробовал собрать код но что то тут не то
а еще не нашел на какой пин приходится подключение сигнала
Главное правило при написании ISR - делать внутри этой процедуры как можно меньше и убегать из нее как можно раньше.
И как можно дальше ;)
А вы что делаете:
- получили прерывание от соответствующей ножки
- вошли в процедуру, неторопливо огляделись, два раза подряд вызвали довольно медленную функцию micros(), подумали немного и решили написать поэму
- проинициализировали дисплей, вызвали millis(), поделили на тышшу (весьма медленная операция), видимо собрались вывести это значение в дисплей, но передумали
- устали от вышеописанных трудов - отдохнули две десятых секунды...
А в это время коленвал совершил еще около семнадцати (2500/60*2*0,25, на х.х., естественно, значительно меньше) оборотов, соответствующяя нога 17 (семнадцать!!!) раз попыталась вызвать прерывание, в котором вы так уютно расположились. Однако все это пропало всуе, ибо в микроконтроллерах AVR очередь на обработку прерывания состоит всего-навсего из одногоиеста.
И как результат - эта очередь всегда занята последним пришедшим событием (даже на х.х.), ваше прерывание немедленно вызывается сразу же за завершением предыдущей обработки. У основной программы вообще нет шансов сдвинуться с места. А дисплей будет показывать что-то от 100 до 150 об/мин.
Хотите, чтобы что-то когда-то хоть как-то заработало? Тогда:
- выбрасывайте все из ISR (переносите в основную программу)
- оставьте в ISR только самое необходимое - установку соответствующей переменной-флага, извещающей о том, что событие произошло (нога дернулась). Либо ее логичного развития - счетчика происшедших, но еще не обработанных событий (ака прерываний).
- не повторяйте одних и тех же бессмыссленных действий - контроллеру будет чем заняться и без этого
- не выполняйте циклов вычисления больше чем нужно. В вашем случае это - расчет RPM и вывод информации на экран не при каждом обороте коленвала (ну все равно ведь не сможете уследить), а, скажем, один раз в секунду (возможно, даже реже)
- и забудьте, наконец, про функцию delay()!
ЗЫ: ISR - это Interrupt Service Routine или Процедура Обработки Прерывания. У вас она носит гордое имя RPM.
Расчет можно вытащить из обработчика, а вот millis() не получится, потому как потеряется смысл принципа измерения оборотов, да и то не особо он и помешает(расчет), вал всетаки не милион оборотов в секунду делает.
ну millis() не такая уж и тяжолая. Она просто возвращает переменную-счетчик. Правда внутри прерывания, сколько раз ее не вызови всегда вернуть одно и тоже (стоят часы в этом время).
Расчет - можно и оставить, но соглашусь с step962 лучше так не привыкать. Изначально нужна привычка "в обработчике только РЕГИСТРАЦИЯ факта события. А все обработка - где-то в основном потоке. Тогда не нужно постоянно думать "что там можно, что нельзя".
Ну и явно, мой совет почитать документацию - пропал всуе. Несмотря даже на то что дал ссылку на конкретную функцию - attachInterrupt. Иначе я не могу объяснить как delay() попал в функцию обработчик прерывания. Там по поводу использования millis() и delay() даже шрифтом выделено. Специально.
Правда внутри прерывания, сколько раз ее не вызови всегда вернуть одно и тоже (стоят часы в этом время).
А там и не надо что б они шли, можно и переменную объявить и записывать туда. Но так по мне проще еще раз вызвать. Для данного случая вполне работоспособно и мудрить гемор с флагами не вижу смысла.
Ну и явно, мой совет почитать документацию - пропал всуе. Несмотря даже на то что дал ссылку на конкретную функцию - attachInterrupt. Иначе я не могу объяснить как delay() попал в функцию обработчик прерывания. Там по поводу использования millis() и delay() даже шрифтом выделено. Специально.
Так и мои все ссылки с успехом были проигнорированы, пока сюда не перекопировал код никаких движений не происходило.
а еще не нашел на какой пин приходится подключение сигнала
На цифровой вывод 2, если бы вы прочитали, про прерывания, то знали бы, что 0 прерывание на 2 выводе.
Хотя с другой стороны, данный метод измерения оборотов актуален для низкооборотистых валов и(или) когда нужна оперативность данных, а тут можно и количество срабатываний за отрезок времени считать.
Maksim. Я смотрел код по тем страницам но времени не было. но все равно от час ти ты прав
еще вопрос как можно вывести колличество нажатий на кнопку например по такому действию ( digitalWrite(ledPin, HIGH);)
Я просто немного не допонимаю принцып вывода инфы на LCD особенно с математикой . подскажите как можно сделать что бы показывало сколько нажатий на кнопку на мониторе.
ибо код который с верху у меня отрабатывает и я не понимаю как он работает.
для меня будет понятнее если сделать черезкнопку в "программировании я не нашел фунцию счетчик" и как надо запрограммировать.
Есть два способа вычисления оборотов:
1. Считать количество срабатываний датчика за единицу времени
2. Считать время между срабатываниями датчика
В коде выше второй способ.
а просто считать срабатывания датчика и после делать арефметику? такое возможно?
Есть два способа вычисления оборотов:
1. Считать количество срабатываний датчика за единицу времени
2. Считать время между срабатываниями датчика
я имею ввиду просто колличество нажатий например на кнопку на за время а вообще просто нажатия например на кнопку но при этом если нет сигнала напрмер через 10 мс брос счетчика