Прошу помощи в написании скетча круиз контроля
- Войдите на сайт для отправки комментариев
Приветствую всех!
На днях пришла плата ардуино нано, решил начать с написания скетча для реализации круиз контроля, так как давно хотел. Тема в общем-то распространённая, но конкретной реализации скетча чтоб взять и залить не нашёл. Пока величайшим мои достижением было моргание светодиодом, так что ошибки могут быть очень глупые, но мне совершенно не очевидные.
После рысканья по интренету в поисках решений было сотворено такое
int micros_sp = 0; volatile int CurrentSpeed; int MemSpeed; //запомненная скорость int SetSpeed; //выбранная скорость int OutPin = 13; //задаем номер выхода светодиода int SetButton = 3; //Кнопка SET int StopButton = 4; //Педаль тормоза int CluchButton = 5; //Педаль сцепления int UpButton = 6; //Кнопка Up +5 км/ч / восстановить скорость int DownButton = 7; //Кнопка Down -5 км/ч int SetPos = 0; //переменная для хранения состояния SET int StopPos = 0; //переменная для хранения состояния Stop int CluchPos = 0; //переменная для хранения состояния Cluch int UpPos = 0; //переменная для хранения состояния Up int DownPos = 0; //переменная для хранения состояния Down void setup() { attachInterrupt(0, speedometr, RISING); pinMode(OutPin, OUTPUT); //инициализируем контакт, подключенный к светодиоду, как выход pinMode(SetButton, INPUT); //включаем кнопку SET pinMode(StopButton, INPUT); //выжим тормоза pinMode(CluchButton, INPUT); //выжим сцепления pinMode(UpButton, INPUT); //включаем кнопку Up pinMode(DownButton, INPUT); //включаем кнопку Down } void speedometr (){ CurrentSpeed = (600000.0 / (micros() - micros_sp)); //600000.0 - 6 имп./м micros_sp = micros(); } void loop(){ SetPos = digitalRead(SetButton); //считываем значения кнопки SET if (SetPos == HIGH && CurrentSpeed >= 0) { //проверяем нажата ли кнопка SET MemSpeed = CurrentSpeed; //запоминаем текущую скорость SetSpeed = MemSpeed; ; //устанавливаем запомненную скорость как выбранную } StopPos = digitalRead(StopButton); //считываем значение педали тормоза if (StopPos == HIGH) { //проверяем выжат ли тормоз SetSpeed = 0; } CluchPos = digitalRead(CluchButton); //считываем значение педали сцепления if (CluchPos == HIGH) { //проверяем выжато ли сцепление SetSpeed = 0; } UpPos = digitalRead(UpButton); //считываем значение кнопки Up if (UpPos == HIGH && SetSpeed == 0) { //считываем состояние кнопки Up и проверяем не была ли сброшена выбранная скорость SetSpeed = MemSpeed; //Если скорость была сброшена - восстанавливает запомненную скорость } if (UpPos == HIGH && SetSpeed >= 0) { //считываем состояние кнопки Up и проверяем не была ли сброшена выбранная скорость SetSpeed = MemSpeed + 5; } DownPos = digitalRead(DownButton); //считываем значение кнопки Down if (DownPos == HIGH) { //проверяем выжат ли тормоз SetSpeed = MemSpeed - 5; } } void crusecontrol(){ if (SetSpeed > CurrentSpeed) { digitalWrite(OutPin, HIGH); //включаем поддержание выбранной скорости } }
Сейчас подключил к генератору, частота порядка килогерца, "нажал" кнопку SET, увеличил период - результата 0, светодиод не загорелся. Сейчас допишу вывод "скорости" на компорт и посмотрю что он выдаёт. Но может у меня тут вообще какая-то очевидная ошибка. Буду благодарен за помощь.
В 56 строчке в описании опечатка конечно, там проверка кнопки down.
так а в чём помощь - написать вам программу ?
Э... Нет. Сказать, что в этой неверно.
Попробую сформулировать вопросы конкретнее
Правильно ли расположены элементы, а конкретнее функции void в коде?
Верно ли написана функция кнопки SET?
И всё ли в порядке в функции спидометра.
Так, посмотрел - частоту он меряет, по крайней мере по Serial.print в зависимости от частоты выдаёт разные последовательности.
Хвататься за круиз-контроль после освоения блинка, решение не самое умное. Пособирайте для начала часики, метеостанции, а потом за более серьезные вещи беритесь (тем более, от которых целостность шкуры зависит и не только вашей). ИМХО.
Хвататься за круиз-контроль после освоения блинка, решение не самое умное. Пособирайте для начала часики, метеостанции, а потом за более серьезные вещи беритесь (тем более, от которых целостность шкуры зависит и не только вашей). ИМХО.
Вот едете вы по городу, а впереди красный. Ну вы, понятное дело, потихонечку оттормаживаетесь, чтобы остановиться аккурат не доезжая метр до крайней к вам стоящей автомашине. Вы уже почти остановились, но тут ардуино "вспоминает", что три часа назад вы ему велели держать 110, а тут такое упущение. Вот он и поддает газу, а вы собираете всех впереди стоящих. И хорошо, если это случается перед светофором, а не перед оживленным пешеходным переходом.
Скажете такого не может быть? Такое случается время от времени с крупными автопроизводителями, где конструированием занимаются профессионалы.
Первые проверки Toyota из-за самопроизвольного ускорения состоялись в 2002 и 2003 году. Тогда внимание NHTSA привлекли модели Camry и Solara. Еще два иска были поданы в 2004 и 2008 годах. В последнем случае поводом к началу расследования послужила гибель 76-летней Гуадалупе Альберто из штата Мичиган.
Пожилая женщина на своей Camry 2005 года выпуска ехала со скоростью 40 км/ч, неожиданно машина ускорилась до 130 км/ч и врезалась в дерево.
...Скажете такого не может быть?...
С точки зрения безопасности есть масса мер предотвращающих это - например сделать электрическое отключение привода при нажатии тормоза или сцепления, тут уже неважно что будет выдавать ардуино, если привод будет обесточен.
Наивно полагать, что только одна эта напасть может ожидать вас. В любом случае, при начале эксплуатации самопального круиз-контроля, не лишним будет известить учредителей премии Дарвина.
Так, ну частоту он запоминать начал. И после сброса тормозом или сцеплением восстанавливает её верно по кнопке Up. +/- 5 работает через... Странно в общем, видимо дребезг контактов. Надо будет для каждой кнопки его исправить программно.
Кого пугает круиз контроль - это всё очень несложно переделать в напоминалку о превышении скорости. Тогда и с кнопками +/- морочится не надо.
Наивно полагать, что только одна эта напасть может ожидать вас. В любом случае, при начале эксплуатации самопального круиз-контроля, не лишним будет известить учредителей премии Дарвина.
Пока допилю часть про ограничитель скорости, если уж КК не будет - пусть хоть пищит при превышении. Купил фокус новый недавно, там очень классно сделано - электронный дроссель просто перестаёт открываться при приближении к порогу ограничения скорости, но как это сделать с троссовым приводом - понятия не имею.
Не просветите меня, какие же ещё меня могут ожидать напасти?
От зря Вы так вопрос ставите с нашими дорогами и нравами. Не к добру шо называется.
Подумайте что будет при обгоне, если на встречке контроллер решит, что это слишком быстро. Или под круизом вылетели на участок с гололедом, а он считает, что скорость нужно держать.
Такие доработки авто запрещены, причем не только законом (хи-хи..) но и здравым смыслом, это очень опасно для Вас, Ваших пасажиров и участников движения оказавшихся рядом с Вами. Потому, пожалуста, сообщите здесь на форуме, и желательно в других СМИ, на каких дорогах и в какое время Вы будете использовать разработку первый месяц (дольше не потребуется) после установки на авто. Мы будем учитывать это при планировании поездок.
Пока допилю часть про ограничитель скорости, если уж КК не будет - пусть хоть пищит при превышении.
А вот это ни вапрос! такую штуку можна и запросто!
...
Подумайте что будет при обгоне, если на встречке контроллер решит, что это слишком быстро.
Ну на этот вопрос я могу вам легко ответить - ничего. Извините меня конечно, но сразу видно, что вы не имели дело с автомобилями с троссиковым круиз-контролем. Они могут только увеличить скорость, так как используются 2 троса привода, один из которых просто провисает, когда натянут второй. Т.е. затормозить он не может в принципе, только сбросить газ, если не нажата педаль. На мерине каком-то видел - круиз контроль жал на тормоз, но это нереальная редкость. Даже на современных автомобилях такое встретишь не часто.
Или под круизом вылетели на участок с гололедом, а он считает, что скорость нужно держать.
Вот это да, опасность. Которая впрочем никак не исправлена и заводских системах без ESP и антипробуксовки. Впрочем для этого есть простое решение - не включать его в гололёд. Как я и делаю всегда.
Такие доработки авто запрещены, причем не только законом (хи-хи..)
Спорить не хочу, но насколько я помню, по основным правилам допуска ТС к эксплуатации, запрещено вносить конструктивные изменения в тормозную систему и рулевое управление. И о том и о том мне думать уже поздно, одно от ауди, другое скоро будет от фольсквагена. Про системы питания и контроля скорости нет ни слова.
сообщите здесь на форуме, и желательно в других СМИ, на каких дорогах и в какое время Вы будете использовать разработку первый месяц (дольше не потребуется) после установки на авто. Мы будем учитывать это при планировании поездок.
Не беспокойтесь, это всё скорее этап подготовки, никаких испытаний до сухого асфальта. Максимум подключу к машине и буду со светодиодом ездить на приборке, чтоб контролировать адекватность работы.
Опять же прошу прощения, но этот спор мне напоминает многостраничные споры на автофорумах про газовое оборудование.
Пока допилю часть про ограничитель скорости, если уж КК не будет - пусть хоть пищит при превышении.
А вот это ни вапрос! такую штуку можна и запросто!
[/quote]
Да, уже накидал скетч. На столе от генератора работает.
дубль
Всем привет, это снова я. Монстрик подрос, отрастил пищалку по превышению скорости.
Теперь появилось желание оприделывать к нему разные фишечки типа запоминания установленных скоростей при отключении питания. Планирую запитать плату через конденсатор большой ёмкости и диод (с платой на одном источнике висят регистратор и навигатор), а один из выводов вывести до диода. Таким образом, чтобы при отключении питания плата получала об этом информацию, но за счёт конденсатора работала бы ещё какое-то время, за которое успевала бы записать значения в EEPROM. В скетче это 5 цифровой вывод. Можно было бы просто дублировать значение запомненных скоростей в EEPROM каждый раз при их изменении, но это как-то мне не нравится.
Всем привет, это снова я. Монстрик подрос, отрастил пищалку по превышению скорости.
Теперь появилось желание оприделывать к нему разные фишечки типа запоминания установленных скоростей при отключении питания. Планирую запитать плату через конденсатор большой ёмкости и диод (с платой на одном источнике висят регистратор и навигатор), а один из выводов вывести до диода. Таким образом, чтобы при отключении питания плата получала об этом информацию, но за счёт конденсатора работала бы ещё какое-то время, за которое успевала бы записать значения в EEPROM. В скетче это 5 цифровой вывод. Можно было бы просто дублировать значение запомненных скоростей в EEPROM каждый раз при их изменении, но это как-то мне не нравится.
Как использование?
Sync, молодец, очень интересный проект!
Сам думал над таким, руки пока заняться вплотную не дошли, + мало опыта в программировании.
Очень удобная штука на трассе! Устаёт нога на педали газа часами находиться.
Считаю её вполне безопасной, тем более если отключать электрически.
Если педаль газа с тросиком, как лучше реализовать привод? Шаговый двиг на ось заслонки?
Ещё, как понимаю, полноценно тормозить она не сможет, только сбрасывать газ. В принципе не страшно, но тогда нужна пищалка о превышении заданной скорости , либо речевое оповещение об этом.
Сам думал обойтись одной кнопкой и светодиодом - длинное нажатие вкл, светик горит, считывается и фиксируется текущая скорость.
Короткое нажатие (или нажатие педали тормоза) - отключение питания всей схемы. Наверное, всё же нужна отдельная кнопка на питание схемы и запись установленной скорости в епром.
Умников не слушай - про полёты в космос и другие более простые вещи тоже говорили, что это бред. А что вышло?
Какие мысли по перечисленным вопросам?
Кнопка "восстановить скорость" мне кажется лишней, если электрически отключать схему. При включении сама считает из епром и восстановит. Наверно нужна кнопка сброса запомненной скорости, либо опять-таки короткое нажатие сброс, длинное - установка скорости. Либо проверять при включении не зажата ли кнопка и если не зажата - сброс, а если зажата - восстановить скорость, считав из епром.
Откуда лучше считывать скорость? Считать импульсы напрямую с датчика? Или с шины CAN?
1. Мне такая реализация, через прерывание, при тестировании ее не понравилась. Из-за не стабильности. Отказался от нее и использую другую, "аппаратный" вариант тахометра.
1.1. micros() - переполняется и сбрасывается на ноль, приблизительно через 70 минут.
1.2 В attachInterrupt() значения возвращаемые millis() не изменяются. За micros() точно не скажу, но допускаю, что аналогично. Гуру поправят. :-)
2. А как "круиз-контроль" будет управлять дросельной заслонкой карбюратора? Как вариант трасса пошла с начала в плавную в горку (тут бы надо чуть газку добавитьдля удержания оборотов), а потом - такой же мягкий спуск (а тут газ можно немшко и убрать что бы стакан-два бензина сэкономить и ТС не разгонялось выше установленной скорости).
Без петли "обратной связи" система улетить в черте куда. :-)
Короче пишу. Времени заниматься всем не было, но уже всё как бы готово. Сегодня наверное первое испытание.
Как привод реализован.
Пневмопривод от Chrysler/Dodge. Механика и пневматика работает, при замыкании проводков газу даёт.
Как блок управления выглядит в железе
Чё пока не работает - действительно с micros скорость нестабильна. Отнял у ардуины timer1, чтоб он считал импульсы напрямую. Сейчас он считает без рывков и ровно, только вот скорость на выходе неправильная. Для испытаний это не важно, он же ориентируется по изменению, а не по абсолюту, но так как у меня он и приборкой заведует - надо исправлять. Не работает определение нейтрали. У меня оно будет программное - в момент запоминания скорости считается отношение скорости к оборотам, если это отношение во время работы сильно уйдёт - поддержание скорости сбрасывается, так как это значит либо на нейтраль выдернули, либо сцепу выжали. Обратной связи груши с контроллером нет. С одной стороны она не очень и нужна, так как поддержание скорости будет происходить внутри одной передачи, так что там диапазон скоростей будет не собо большим, с другой стороны не помешала бы. Буду думать, но скорее всего забью просто. Или механически ограничу вытягивание тросика.
Тут надо учесть, что груша может не только тянуть/отпускать, но и зафиксировать своё положение. Кроме того газует она весьма неспешно, на полное открытие дросселя секунды 1,5-2, можно искусственно ещё это время увеличить поставив в вакуумный шланг жиклёр малого сечения.
Управление 1 кнопкой по весьма простой причине - я не хочу морочиться с отдельными кнопками по торпеде и колхозом дополнительных рычагов от иномарок. Но. У меня подрулевые рычаги от 2108/09 и отсутствует задний дворник и омыватель. Так что я положение правого подрулевого "от себя" на эти цели и хочу задействовать. Фиксированное положение (дворник) на включение/выключение нам не подходит, иначе при каждом омыве стекла круиз будет отрубаться, что на трассе мягко говоря не комфортно. Да и есть у этих подрулевых особенность - если оттянуть на омыв лобовухи и отпустить - часто его возвратной пружиной забрасывает на включение заднего дворника. Не дело это. А вот нефикисируемое (омыватель) в самый раз. Его и случайно прожать труднее.
Т.е. короткое нажатие - при первом включении после запуска - запоминание и поддержание текущей скорости или восстановление поддержания скорости, если она есть в памяти, длинное - запоминание и поддержание текущей скорости. Выключение - педаль тормоза, ручник или рассинхронизация оборотов двигателя со скоростью.
Хвататься за круиз-контроль после освоения блинка, решение не самое умное.
а в каком отношении это дело с акселератором?
Иногда ведь именно газ, а не тормоз, цена жизни.
а в каком отношении это дело с акселератором?
Иногда ведь именно газ, а не тормоз, цена жизни.
При нажатии на тормоз груша обесточивается (запирается питающий транзистор в обход контроллера). При обесточивании открывается клапан экстренного сброса. По сути происходит полное выключение привода. Так что система отключения дублирована.
В оригинале там вообще стоит на педале тормоза двойной концевик, который размыкает цепь питания груши при нажатии (который постоянно ломается), но не вижу ничего плохого и в моём решении.
Сам привод круиза никак тросу газа не мешает, он просто дублирует его.
Испытание закончилось полной победой электроники и механики, ну почти, рессивер смяло разрежением как пакет сока. И провалом ПО. Пошёл дальше пилить скетч. Слишком быстро дёргает, правда и испытывал не на земле, вывесил задние колёса на козлах и приподнял ручник, так что вращались они без большой нагрузки. Видимо надо подводить импульсами, типа ШИМ только с большими периодами.
Взываю к помощи сообщества.
Сейчас код выглядит так
Оно работает, но дёргает. Нормально так дёргает, ехать так быстро утомляет. Так как пока мотор отреагирует на открытие заслонки она открывается слишком сильно и машина с рывком набирает скорость. Потом когда скорость превышена он начинает отпускать, тут инерция всего автомобиля и пока скорость упадёт ниже необходимой отметки заслонка оказывается полностью закрыта. Потом цикл повторяется.
Вся соль в строках 216-231.
1. При Vacuum HIGH и Vent HIGH происходит "нажатие" газа
2. При Vacuum LOW и Vent HIGH происходит удержание газа в нажатой позиции (на которую он натянулся в пункте 1)
3. При Vacuum LOW и Vent LOW происходит отпускание газа.
Решение проблемы дёрганья видел в том, чтоб понемного натягивать трос газа и ждать какой-то промежуток времени реакции мотора, потом повторять. Ну и чтоб в перспективе он несколько раз так натянул отпустил, даже с рывками и как бы откалибровался под конкретную машину, например добился того, чтоб корректировка была не чаще 1 раза в секунду с минимальным временем самой корректировки.
Было рождено это, без всяких автокалибровок, но позволяющее вручную хотя бы подобрать оптимальные времена работы
Вариантов написания строк 214-231 было много. Но все они вели себя примерно одинаково - когда надо было легко подтянуть трос в течении небольшого времени, оно давало газ в пол и машина начинала разгоняться не обращая внимание на текущую скорость.
Вопрос - что я написал не так? Там же по сути просто 3 таймера, но они не работают как надо.
Насколько я понимаю надо добавлять первую производную от скорости. То есть ускорение. Вернее вводить ее в ООС.
-----------
Не уверен за полноценный круиз - а вот вот систему подсказок для водилы - было бы нужно.
В долгом пути внимание притупляется - и можно потерять чувство скорости. Если иметь в поле зрения зеленую лампу "добавь газку" и красную "сбавь скорость" - существенная замена спидометру.
А как будут обстоять дела если зависнет МК?