Круиз контроль
- Войдите на сайт для отправки комментариев
Всем доброго дня!
Итого, что должен уметь сей девайс ( в лицах, так сказать)
1) включаться
2) калиброваться (по команде)
3) реагировать на педаль тормоза и сцепления (делать ХХ)
4) запоминать текущщую скорость и поддерживать её
5) вспоминать заданную скорость и выходиь на неё...
6) пошагово увеличивать или уменьшать её нажатиями на кнопки
7) показывать заданную скорость на дисплее...
8) выключаться
итого на входе у нас:
показания датчика скорости (OBD)
сигнал с тормоза
сигнал со сцепления
питание
кнопки ("ск +", "ск-", SET)
сигнал с аксселератора
на выходе:
сетодиод и/или дисплей
новый сигнал аксселератора
по аппаратной части:
сигнал от лягушки тормоза и сцепления 12В, скорость импульсы 5В, питание 12В ,педаль газа работает на изменении напряжения в диапазоне от 05, до трех вольт...по линейному закону.
соответсвенно устройство должно выдавать соответствующее напряжение (это кстати очень хорошо, потому что устройство можно будет ставить не трогая провода от педали к двигателю ,если вдруг какая нить фигня случится, то машина работать будет...
это основной алгоритм работы, будут добавляться части повышающие безопасность
надеюсь ,что To be continued

Гораздо интереснее было бы прочесть о реализованном проекте, нежели очередной список "хотелок".
Посему, желаю Вам настойчивости и удачи.
Спасибо.
думаю, что буду периодически добавлять информацию. пока из китая едет starter kit решил поработать головой и, так сказать, сделать для себя некое техническое задание, прикинуть что из себя должно представлять это устройство и что оно будет делать.
соберу на макетке, посмотрим что будет... потом добавление защиты от того что она не должна делать....потом интеграция в автомобиль...
потом думаю реализовать доводчики стекол..и многократное мигание поворотником при коротком нажатии...
пока это только декларирование намерения, ибо я еще почти ничего не сделал...но буду разбираться...
Небольшой апдейт,написал основу алгоритма круиз контроля. это только,так сказать, скелет, много чего еще придется там допислить: калибровка датчика акселератора, оцифровка этого сигнала, рассчет скорости по импульсам, доведение до ума корректировки скорости и напряжения.. защита от превышения значения напряжения с педали газа (например если надавить на газ не отключая кк...чтоб он потом вернулся на заданную скорость)... но пока вот что получилось
если есть комментарии (желательно обоснованные), то я только рад.
вот такой вот код получился пока:
даже компилируется :)
int setpin=2; //пин кнопки set int pluspin=3;//пин кнопки + int minuspin=4;//пин кнопки - int breakpin=5;//пин сигнала с тормоза int clutchpin=6;//пин сигнала со сцепления int Uinpin=A1;//пин замеряющий напряжение на педали int Ucheckpin=A0;//пин замеряющий напряжение на выходе int LEDgreenpin=9;//пин зеленого светодиода int LEDredpin=8;//пин красного светодиода int Vinpin=10;//пин скорости int Uoutpin=11;//пин корректирующего сигнала int Vset=0;//сбрасываем уст скорость int Uset=0;//сбрасываем установленное напряжеение int flagset=0; //флаг кнопки сет int Uin;// int Ucheck; int Vin; int Uout; int Umin;//- минимальное значение датчика с педали газа int Umax;//- максимальное значение датчика с педали газа int U;//корректор напряжения int i;//что за программа без i, корректор установленной скорости void setup () { pinMode(setpin, INPUT); pinMode(pluspin, INPUT); pinMode(minuspin, INPUT); pinMode(breakpin, INPUT); pinMode(clutchpin, INPUT); pinMode(Uinpin, INPUT); pinMode(Ucheckpin, INPUT); pinMode(LEDgreenpin, OUTPUT); pinMode(LEDredpin, OUTPUT); pinMode(Vinpin, INPUT); pinMode(Uoutpin, OUTPUT); digitalWrite(LEDgreenpin, HIGH);//зажигаем зеленый светодиод } void loop () { //включаем КК и и получаем входящщую информацию //создаем флаг для кнопки сет, который запоминает состояние одно нажатие-включен, еще одно -выключен if(digitalRead(setpin) == HIGH)//нажатие кнопки сет { if(flagset==0)//проверка флака кнопки сет, если он=0. тозначит что кк не был включен и надо его включить { flagset=1;//меняем переменную флага и включаем кк Uin=analogRead(Uinpin);//считываем напряжение на входе Vin=analogRead(Vinpin);//условно считываем скорость,нужно понять зависимость импульсов от скорости Uset=Uin;//запоминаем напряжение на педали в момент нажатия Vset=Vin;//запоминаем скорость digitalWrite(LEDgreenpin, LOW); //тушим зеленый светодиод digitalWrite(LEDredpin, HIGH ); //зажигаем красный диод } else//если флаг =1, то кк был активен и его надо выключить: { flagset=0;//меняем переменную флага Uout=0;//убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } //возможность установки ранее заданной скорости при нажатии на кнопку минус, при условии что кк включался if(flagset==0)//если кк выключен { if(digitalRead(minuspin) == HIGH)//нажата кнопка минус { if(Vset !=0)//если ранее была установлена скорость { digitalWrite(LEDgreenpin, LOW); //тушим зеленый светодиод digitalWrite(LEDredpin, HIGH ); //зажигаем красный диод flagset=1;//менем флаг сет } } } //собственно работа КК, if(flagset ==1)//если он был включен { if (digitalRead(breakpin) != HIGH)//если не нажата педаль тормоза-если нажата то выключаем все нах { if(digitalRead(clutchpin) != HIGH)//если не нажата педаль сцепления- если нажата то тоже выключаем //здесь собственно и будет алгоритм работы кк, тут он включен и ничего не мешает ему работать { Vin=analogRead(Vinpin);//условно считываем скорость,нужно понять зависимость импульсов от скорости //собственно держим скорость: if (Vset!=Vin)//если установленная скорость отличается от текущщей { if (Vset > Vin)// если машина притормозила, при езде в горку { Uout=Uout+U;//поднимаем корректирующее напряжение } if (Vset < Vin)// если машина разогналась, например под горку { Uout=Uout-U; } } //корректируем скорость кнопками + и - if(digitalRead(pluspin) == HIGH) { Vset=Vset+i; } if(digitalRead(minuspin) == HIGH) { Vset=Vset-i; } } else { flagset=0;//меняем переменную флага Uout=0;//убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } else { flagset=0;//меняем переменную флага Uout=0;//убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } }Я бы застремался такое на машину прикручивать, да еще в движении проверять
Ардуино в принципе стремно на машину ставить? Или с такой прошивкой? Прошивка только начинается...
Не ардуину, а любое самопальное устройство на педаль газа авто.
Ну ради примера: drivenge.ru(не реклама). Тоже с самопала начиналось а потом договор с оф дилером киа и цена сразу х2. Серт я не буду делать. Но вот испытания в спец лаборатории проведу. Не боги горшки обжигают.
"Договор с официальным дилером киа" это я так понимаю договор реализации между ИП Шестаков и ИП хххххх продающим автомобили КИА в Краснодаре. Отношение к производителю авто это не имеет. И разумеется это ни разу не сертификация и близко. Просто диллер продает кроме машин, ковриков, сигнализаций, вонючек в салон еще и вот такую коробочку
Далее - разумеется не боги горшки обжигают, но автопроизводители свою электронику обкатывают уже полвека на миллионах машин и их опыту есть основания доверять. Хотя вот Тойота вроде лопухнулась с ЭБУ и получила неконтролируемые ускорения в нескольких случаях на миллиард часов использования. У ИП Шестакова подозреваю нет такого гигантского опыта
не путайте теплое с мягким...там в загрузках есть отдельный сертификат ТР О безопасности колесных транспортных средств. топик про Тойоту читал, поржал....поэтому и не тойота
касательно Шестакова- анонс устройства для КИА- в декабре 12...уже типа обкатаное, хотя косяки были...
сначала продавалось примерно по пять тысяч, потом вдруг уже в начале 14, стало 11 со словами- мы договорились с КИА ,что это будет продаваться у Официальных дилеров...
так что КИА к этому девайсу не имеет никакого отношения...
Бумажкам, выданным контролирующими органами РФ у меня доверия абсолютный ноль.
Потому что я сам занимаюсь получением примерно таких бумажек и знаю, как все это делается
И опять же этот сертификат к автопроизводителю отношения не имеет. Сертифицировала какая то контора, допущенная к кормушке сертификации.
Интересна данная тема.
vlkam, а я бы поставил )) Естенственно, после отладки и с возможностью в случае чего быстро выключить сей девайс. Ведь даже кнопку запуска крутят, а это ИМХО даже постремнее :)
По поводу KIA и т.д. - даже обсуждать (лично я) не буду - пустое.
Бумажкам, выданным контролирующими органами РФ у меня доверия абсолютный ноль.
Потому что я сам занимаюсь получением примерно таких бумажек и знаю, как все это делается
+1 - это все что я мог бы сказать на эту тему.
Ну а данный проект имеет место быть. Почему нет?
По блоксхеме в первом посте: я один не могу ничего прочитать? Может залейте уж куда-нибудь картинку нормального разрешения.
По коду. Сейчас постараюсь немного переписать (сразу навскидку - лишком многопамяти занимают ваши ненужные инты и в программировании кое-что можно упростить на несколько операций). В логику самой программы пока не вникал.
Если есть, что-то по существу, то я готов выслушать комментарии... ну там типа "чувак, та как то странно сопротивления под диодом прикрутил...или там нужно задержки ставить при измерении сигналов...несколько раз значения замерять и среднее находить"...я только за...схоластику разводить я не собираюсь...
все так расписываю, потому что сейчас вспоминаю и учусь, мне так удобнее...это раз.
Два: опять же, пока я не знаю ответы на все вопросы, надеюсь что смогу получить на них ответы: например как из 12В сделать 5В для питания устройства.думаю что китайская зарядка для ЮСБ не совсем то...второе: нужно из 12 делать 5 В, чтобы отслеживать нажатие тормоза и сцепления, делать это быстро и точно, т.е. если я даже просто стукну по педали, гарантировано бы отключился КК...хотя до этого еще далеко... а сразу будут вопросы "а нафига тебе?"
я сам занимаюсь сертификацией, это мой основной источник дохода...
Испытания проведут при мне...я это на свою машину ставить собираюсь...мне не бумажка нужна, а подтверждение того что оно может работать вместе с авто. для сертификата нужна компания заявитель, а это другая история...
Из 12 5 как мне кажется проще всего сделать делителем (хотя проще - не надежнее - в бортовой сети авто бывают очень высокие броски).
Для питания устройства применить стабилизатор (ну типа 7805).
Интересна данная тема.
vlkam, а я бы поставил )) Естенственно, после отладки и с возможностью в случае чего быстро выключить сей девайс. Ведь даже кнопку запуска крутят, а это ИМХО даже постремнее :)
По поводу KIA и т.д. - даже обсуждать (лично я) не буду - пустое.
Бумажкам, выданным контролирующими органами РФ у меня доверия абсолютный ноль.
Потому что я сам занимаюсь получением примерно таких бумажек и знаю, как все это делается
+1 - это все что я мог бы сказать на эту тему.
Ну а данный проект имеет место быть. Почему нет?
По блоксхеме в первом посте: я один не могу ничего прочитать? Может залейте уж куда-нибудь картинку нормального разрешения.
По коду. Сейчас постараюсь немного переписать (сразу навскидку - лишком многопамяти занимают ваши ненужные инты и в программировании кое-что можно упростить на несколько операций). В логику самой программы пока не вникал.
спасибо за поддержку...я последний раз проги присал в институте года 4 назад...поэтому может что-то и коряво пока выглядит... читаемый алгоритм вечером выложу, он в визио, а на работе его нечем открыть...
Ну вот примерно отредактированный код.
Сразу оговорюсь - причесал не все. И еще - не вижу применения (присваивания каких-либо значений) переменных i и U. Зачем они? И что в них?
/*Опредлеление пинов*/ #define setpin 2 //пин кнопки set #define pluspin 3 //пин кнопки + #define minuspin 4 //пин кнопки - #define breakpin 5 //пин сигнала с тормоза #define clutchpin 6 //пин сигнала со сцепления #define Uinpin A1 //пин замеряющий напряжение на педали #define Ucheckpin A0 //пин замеряющий напряжение на выходе #define LEDgreenpin 9 //пин зеленого светодиода #define LEDredpin 8 //пин красного светодиода #define Vinpin 10 //пин скорости #define Uoutpin 11 //пин корректирующего сигнала /*Определение переменных*/ int Vset = 0; //сбрасываем уст скорость int Uset = 0; //сбрасываем установленное напряжеение boolean flagset = 0; //флаг кнопки сет int Uin; int Ucheck; int Vin; int Uout; int Umin; //- минимальное значение датчика с педали газа int Umax; //- максимальное значение датчика с педали газа int U; //корректор напряжения int i; //что за программа без i, корректор установленной скорости /*Сетап*/ void setup () { pinMode(setpin, INPUT); pinMode(pluspin, INPUT); pinMode(minuspin, INPUT); pinMode(breakpin, INPUT); pinMode(clutchpin, INPUT); pinMode(Uinpin, INPUT); pinMode(Ucheckpin, INPUT); pinMode(LEDgreenpin, OUTPUT); pinMode(LEDredpin, OUTPUT); pinMode(Vinpin, INPUT); pinMode(Uoutpin, OUTPUT); digitalWrite(LEDgreenpin, HIGH);//зажигаем зеленый светодиод } /*Основной цикл*/ void loop () { //включаем КК и и получаем входящщую информацию //создаем флаг для кнопки сет, который запоминает состояние одно нажатие-включен, еще одно -выключен if (digitalRead(setpin)==HIGH) //нажатие кнопки сет { if (flagset==0) //проверка флака кнопки сет, если он=0. тозначит что кк не был включен и надо его включить { flagset = 1; //меняем переменную флага и включаем кк Uin = analogRead(Uinpin); //считываем напряжение на входе Vin = analogRead(Vinpin); //условно считываем скорость,нужно понять зависимость импульсов от скорости Uset = Uin; //запоминаем напряжение на педали в момент нажатия Vset = Vin; //запоминаем скорость digitalWrite(LEDgreenpin, LOW); //тушим зеленый светодиод digitalWrite(LEDredpin, HIGH ); //зажигаем красный диод } else//если флаг =1, то кк был активен и его надо выключить: { flagset = 0; //меняем переменную флага Uout = 0; //убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } //возможность установки ранее заданной скорости при нажатии на кнопку минус, при условии что кк включался if (flagset==0 && digitalRead(minuspin)==HIGH && Vset!=0) //если кк выключен И нажата кнопка минус И если ранее была установлена скорость { digitalWrite(LEDgreenpin, LOW); //тушим зеленый светодиод digitalWrite(LEDredpin, HIGH ); //зажигаем красный диод flagset = 1; //менем флаг сет } /*собственно работа КК,*/ if (flagset==1) //если он был включен { //если не нажата педаль тормоза-если нажата то выключаем все нах if (digitalRead(breakpin)!=HIGH) //если не нажата педаль сцепления- если нажата то тоже выключаем { if (digitalRead(clutchpin)!=HIGH) //здесь собственно и будет алгоритм работы кк, тут он включен и ничего не мешает ему работать { Vin = analogRead(Vinpin); //условно считываем скорость,нужно понять зависимость импульсов от скорости //собственно держим скорость: //если установленная скорость отличается от текущщей if (Vset!=Vin) { // если машина притормозила, при езде в горку поднимаем корректирующее напряжение if (Vset>Vin) Uout += U; // если машина разогналась, например под горку if (Vset<Vin) Uout -= U; } //корректируем скорость кнопками + и - if (digitalRead(pluspin)==HIGH) Vset += i; if (digitalRead(minuspin)==HIGH) Vset -= i; } else { flagset = 0; //меняем переменную флага Uout = 0; //убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } else { flagset = 0; //меняем переменную флага Uout = 0; //убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } }U некоторые константа, которая корректируют значения напряжения , т.е. принцип такой: если машина самостоятельно тормозит или разгоняется ( в горку или с горки) то напряжение на выходе с контроллера потихоньку увеличивается или уменьшается для автоматического разгона или сброса скорости...
I- это для корректировки заданной скорости при нажатии кнопок + или -
эти значения нужно будет подбирать экспериментально...поэтому пока просто U и i
Ну тогда им хотя бы 1 пока присвоить ;) Опять-таки, если не прланируется брать значения больше 255 для экономии памяти лучше использовать тип переменных char (ну или byte - кому как удобнее - одно и тоже по сути).
P.S. Сейчас постараюсь понять логику программы :)
сразу оговорюсь, это еще не весь код+ пока никакой адаптации к железу...на Рио, оказывается стоит 2 датчика, соответственно нужно работать с двумя линиями напряжения... добавил калибровку датчика положения педали. , получается что напряжение, которое д.б. на выходе будет складываться из Umin и Uout или Uout=Uset-Umin...
Umax нужен, чтобы в случае ускорения, при обгоне, например, не выключая кк, не дать напряжению выйти за верхний предел. т.е если при включенном КК давить тапку в пол, то Uin= Umax, то Uout=0.
/*Опредлеление пинов*/ #define setpin 2 //пин кнопки set #define pluspin 3 //пин кнопки + #define minuspin 4 //пин кнопки - #define breakpin 5 //пин сигнала с тормоза #define clutchpin 6 //пин сигнала со сцепления #define Uinpin A1 //пин замеряющий напряжение на педали #define Ucheckpin A0 //пин замеряющий напряжение на выходе #define LEDgreenpin 9 //пин зеленого светодиода #define LEDredpin 8 //пин красного светодиода #define Vinpin 10 //пин скорости #define Uoutpin 11 //пин корректирующего сигнала /*Определение переменных*/ int Vset = 0; //сбрасываем уст скорость int Uset = 0; //сбрасываем установленное напряжеение boolean flagset = 0; //флаг кнопки сет int Uin; int Ucheck; int Vin; int Uout; int Umin; //- минимальное значение датчика с педали газа int Umax; //- максимальное значение датчика с педали газа int U; //корректор напряжения int i; //что за программа без i, корректор установленной скорости /*Сетап*/ void setup () { pinMode(setpin, INPUT); pinMode(pluspin, INPUT); pinMode(minuspin, INPUT); pinMode(breakpin, INPUT); pinMode(clutchpin, INPUT); pinMode(Uinpin, INPUT); pinMode(Ucheckpin, INPUT); pinMode(LEDgreenpin, OUTPUT); pinMode(LEDredpin, OUTPUT); pinMode(Vinpin, INPUT); pinMode(Uoutpin, OUTPUT); digitalWrite(LEDgreenpin, HIGH);//зажигаем зеленый светодиод //калибруем датчик педали газа, я так понял, что это будет: включаем питание при нажатой кнопке минус и он входит в режим калибровки на 10 секунд Vin=analogRead(Vinpin);//считываем скорость if (Vin==0)// если скорость=0 проверяем {if (digitalRead(minuspin) == HIGH)//проверяем нажатие кнопки минус { while (millis() < 10000)//в течении 10 секунд калибруем,т.е. нажимаем на педаль до упора и полностью отпускаем несколько раз. { Uin = analogRead(Uinpin);//считываем значение напряжения if (Uin > Umax) { Umax = Uin; } if (Uin < Umin) { Umin = Uin; }//подразумевается, что значения калибровки будут записаны в постоянную память, но пока так...дабы некалибровать его каждый раз... } } } } /*Основной цикл*/ void loop () { //включаем КК и и получаем входящщую информацию //создаем флаг для кнопки сет, который запоминает состояние одно нажатие-включен, еще одно -выключен if (digitalRead(setpin)==HIGH) //нажатие кнопки сет { if (flagset==0) //проверка флака кнопки сет, если он=0. тозначит что кк не был включен и надо его включить { flagset = 1; //меняем переменную флага и включаем кк Uin = analogRead(Uinpin); //считываем напряжение на входе Vin = analogRead(Vinpin); //условно считываем скорость,нужно понять зависимость импульсов от скорости Uset = Uin; //запоминаем напряжение на педали в момент нажатия Vset = Vin; //запоминаем скорость digitalWrite(LEDgreenpin, LOW); //тушим зеленый светодиод digitalWrite(LEDredpin, HIGH ); //зажигаем красный диод } else//если флаг =1, то кк был активен и его надо выключить: { flagset = 0; //меняем переменную флага Uout = 0; //убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } //возможность установки ранее заданной скорости при нажатии на кнопку минус, при условии что кк включался if (flagset==0 && digitalRead(minuspin)==HIGH && Vset!=0) //если кк выключен И нажата кнопка минус И если ранее была установлена скорость { digitalWrite(LEDgreenpin, LOW); //тушим зеленый светодиод digitalWrite(LEDredpin, HIGH ); //зажигаем красный диод flagset = 1; //менем флаг сет } /*собственно работа КК,*/ if (flagset==1) //если он был включен { //если не нажата педаль тормоза-если нажата то выключаем все нах if (digitalRead(breakpin)!=HIGH) //если не нажата педаль сцепления- если нажата то тоже выключаем { if (digitalRead(clutchpin)!=HIGH) //здесь собственно и будет алгоритм работы кк, тут он включен и ничего не мешает ему работать { Vin = analogRead(Vinpin); //условно считываем скорость,нужно понять зависимость импульсов от скорости //собственно держим скорость: //если установленная скорость отличается от текущщей if (Vset!=Vin) { // если машина притормозила, при езде в горку поднимаем корректирующее напряжение if (Vset>Vin) Uout += U; // если машина разогналась, например под горку if (Vset<Vin) Uout -= U; } //корректируем скорость кнопками + и - if (digitalRead(pluspin)==HIGH) Vset += i; if (digitalRead(minuspin)==HIGH) Vset -= i; } else { flagset = 0; //меняем переменную флага Uout = 0; //убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } else { flagset = 0; //меняем переменную флага Uout = 0; //убираем корректировку напряжения на акселераторе digitalWrite(LEDgreenpin, HIGH); //зажигаем зеленый диод digitalWrite(LEDredpin, LOW); //гасим красный диод } } }.
http://silich.ru/cruise.html
самый главный момент не отображен ни где....................... Машина-то какая? А то может там и ардуина не нужна......
самый главный момент не отображен ни где....................... Машина-то какая? А то может там и ардуина не нужна......
дедушкина копейка :) на всех остальных нынче круиз идет с завода даже в минимальной комплектации :)
Киа Рио QB. На ручке.
на ручке? эт брелок в смысле? :)
На механике
интересная тема.. у самого имеется ардуина мега
недавно прикрутил сервопривод к дроссельной заслонке + по тестам вроде крутит туда сюда ...
теперь осталось самое интересное написать непосрдественно программу... судя по данному топику, пока что нет уже готовых решений на ардуине?
пс
машина хонда цивик 98 год на механике
педаль газа троссиковая...
пока получилось подключиться через сериал порт к компу авто и снимать все данные с компа (скорость, обороты, разные датчики.. ) полноценный бортовой компьютер...
автор не будет возражать если я тоже присоединюсь к его проекту и буду выкладывать то что у меня есть и соответсвенно юзать то что есть тут?! ))
кстати по поводу надежности .. реально стремная тема .. но!!! я думаю что нужно на педаль тормоза ставить отдельное реле, которое будет отключать, вне зависимости работает ли ардуина или нет, сервопривод ...
у меня в данном случаи если обесточить сервопривод, пружина дроссельной заслонки закрывает дроссель сама ...
Уже пол года занимаюсь разработкой круиза на ардуино, затык в малом кол-ве свободного времени и долго ждал подходящий сервопривод. Почти все готово для запуска, скоро, возможно, напишу тут отчет. п.с. для тех кто изобретает велосипед с алгоритмом подбора скорости, гуглите "PID регулятор на ардуино" есть готовые библиотеки и удобная на Processing программа для отладки.
А по поводу установки ардуино в машину нет ничего страшного. Чип в компьютере вашей машины тоже может глючить в теории, но он обычно этого не делает, просто надо все делать с умом.
Продолжу интересующую тему.
Пока осилил следующий код с поправкой на ПИД регулятор (информации на русском маловато). Хотелось бы услышать мнение профи по оптимальности кода и его работоспособности, а самое главное отключении. Две кнопки пульта управления еще не реализованы. хочу пока разобраться с концепцией и основой программы
#include <PID_v1.h> //Библиотека пид-контролера //объявление пинов кнопок (подключение ардуино к пульту управления КК) int CruiseOnOffPin = 2; int CancelPin = 3; int AccelResPin = 4; int CoastSetPin = 5; volatile int CruiseSpeedFlag = LOW; volatile int CancelSpeedFlag = LOW; //подключение ардуино к авто int AcceleratorPin = 0; //пин потенциометра педали газа int SpeedPin = 6; //пин датчика скорости int CruisePin = 9; //пин выхода на ЭБУ int tormozPin = 8; // пин педали тормоза //определение данных круиз контроля double carspeed, accelerator, cruise; //текущая скорость, положение педали газа, требуемая скорость //double aggKp=4, aggKi=0.2, aggKd=1; // агрессивные коэф набора скорости double consKp=1, consKi=0.05, consKd=0.25; //стандартные коэф набора скорости double deltaSpeed = 0; //дельта на которую изменяется скорость при нажатии соответствующих кнопок PID cruiseControl (&carspeed, &accelerator, &cruise, consKp, consKi, consKd, DIRECT); //функция круиз контроля void setup () { pinMode (CruiseOnOffPin, INPUT); pinMode (CancelPin, INPUT); pinMode (AccelResPin, INPUT); pinMode (CoastSetPin, INPUT); pinMode (tormozPin, INPUT); attachInterrupt (CruiseOnOffPin, CruiseSpeed, CHANGE); attachInterrupt (CancelPin, Cancel, CHANGE); } //функции прерывания по нажатию кнопок void CruiseSpeed () {CruiseSpeedFlag = !CruiseSpeedFlag;} //функция реакциии на нажатие CruiseOnOff void Cancel () {CruiseSpeedFlag = HIGH;} //функция реакции на нажатие Cancel void AccelRes () {} //функция реакции на нажатие AccelRes void CoastSet () {} //функция реакции на нажатие CoastSet //функция включения КК void CC() { cruise = analogRead (SpeedPin); //задается требуемая скорость движения cruiseControl.SetMode (AUTOMATIC); //запускаем пид регулятор if (analogRead(AcceleratorPin)==0) //проверка, что педаль газа отпущена { while (CruiseSpeedFlag == HIGH || CancelSpeedFlag == HIGH || digitalRead(tormozPin)==0) //делать пока еще раз не нажмем кнопку CruiseOnOff || пока не нажмен кнопку cancel || пока не нажмем тормоз { carspeed = analogRead (SpeedPin); //считываем настоящую скорость if (carspeed > cruise) // если скорость больше заданной { analogWrite (CruisePin, 0); // отпускаем полностью педаль газа, - едем накатом } else // если меньше или равна заданной, то управляем ей { cruiseControl.Compute(); //расчитываем выходной сигнал analogWrite (CruisePin, accelerator); //передаем ЭБУ на сколько надо нажать педаль газа } } } } void loop () { int pedalGaza; //вводим переменную для получения текущего значения нажатия водителем педали газа pedalGaza = analogRead(AcceleratorPin);//получаем значения с педали газа pedalGaza = map (pedalGaza, 0, 1023, 0, 255);//масштабируем под выход на ЭБУ if (CruiseSpeedFlag == HIGH){CC();}//если кнопка CruiseOnOff была нажата, то запускаем КК else {analogWrite (CruisePin, pedalGaza);} //кнопки не задействованы, выдавать истиные значения с педали газа на ЭБУ }не совсем понял как с этими коэффициентами работать в пид регуляторе
у меня например тросик газа дергает сервопривод
вот угол 0 на сервоприводе - 0% открытие дросселя
угол 5градусов - 10% дросселя
и так далее ...
как мне применить в данном случае ? другие коэффициенты?
на сколько я разобрался (а информации на русском очень мало, а в формулы погружаться пока на созрел), угол так и будет как на сервоприводе. а вот команды сервоприводу на какой угол отклониться будут другие для более точного регулирования скорости.
А вот как раз скорост регулирования и точность задается этими тремя коэффициентами, условно первый самый грубый (скорость достигания заданной величины, а вторы два уже плавность подхода и колебаниячерез величину при при приближении к ней)
первое что пришло на ум составить таблицу соответсвия % нажатие на педаль газа и угол сервопривода ...
Всем привет. Я тоже хочу сконструировать такую штуку для интеграции в Газель с электронной педалью газа. По программированию я не спец но по электрике мастерам фору дам. На этой неделе схемку соберу - буду на стенде пробовать
привет! если надо, пиши на medvedev_dv@mail.ru подскажу, порекомендую уже готовые. Все давно, оказалось, придумано за нас
А меня сподвигла идея одного деятеля по конструктиву на АТмеге 168 сделать контроллер круиза, там особо сложного то ничего нет. Главное развязку с педалью сделать, и напряжение только на ЭБУ пойдет если гашетку притопить а потом отпустить. Правда там только конструктив описан, а программы нет и настройка не описана. И тут Ардуино с АлиЭкспрессом подвернулись. Оказалось непаханое поле. Я всех заказал по парочке, и сижу - колдую. На самом деле там достаточно Про Мини на 168 контроллере, если монолит собирать, да так оно и надежнее будет, хотя 328 с модулем прошивки сразу, его перепрошивать удобнее. Пока пойду паралельно, а дальше посмотрим. Машина под рукой. Эбу, педаль запасные есть. Ошибаться не страшно, а круиз ой как хочется, ибо на море 2500км на Газели одному без отдыха тяжеловато преодолевать, так хоть периодичести ноги вытягивать по трассе можно днем. Вот такая скромная мечта)))))))))))))))))зы
как намучаешься, пиши
Притихла тема.
Есть прогресс, успехи?
Интересуюсь, ибо себе на Хюндай Туксон (механика) такое прикрутить хочеться.
Кому интересно вот ссылка на мой вариант. По опыту скажу, что очень долго шёл к алгоритму. Библиотекой ПИД не пользовался пока. Недавно выявил и устранил электронные помехи с датчика положения дроссельной заслонки из-за которых долго не удавалось добиться устойчивого результата. Теперь результат совсем новый и иной. Проходим обкатку.
#include <IRremote.h> int IRPin = 12; // порт инфракрасного приёмника IRrecv irrecv(IRPin); decode_results results; unsigned long micros_sp = 0; volatile float sp; // мгновенная скорость volatile float spStart = 0; volatile float spAVG = 0; int sensorBrPin = 4; // сигнал с педали тормоза int hallMinPin = 5; // Датчик Холла минимум int hallMaxPin = 6; // Датчик Холла максимум int motorPinF = 7; // управление двигателем 1 канал int motorPinR = 8; // управление двигателем 2 канал int enabledMotor = 9; // разрешающий сигнал драйверу мотора int ledHallMaxPin = 10; // светодиод CC_FRW int buzzerPin = 11; // динамик int ledHallMinPin = 13; // светодиод CC_REV int ledCCOnPin = 14; // светодиод CC_On int acceleratorPin = 5; // сигнал с датчика БДЗ (аналоговый) boolean ccActive = 0; // активность КК int timePeriod = 0; unsigned long timeNextStep = 0; // время след прохода контроля (для исключения функции delay unsigned long timeMotorStop = 0; // время остановки мотора int SpeedFail = 0; // счётчик нарушений скорости для безопасности float CCSpeed = 0; // скорость КК const int CCSpeedMin = 5; // const int CCSpeedMax = 5; // int CurrDZ; // текущее положение ДЗ int DZPosMin; // минимальное положение ДЗ ~95 int DZPosMax; // максимальное положение ДЗ ~750 float OldSpeed = 0; // скорость прошлого замера float SpeedUp = 0; // ускорение unsigned long timeSpeedUp = 0; // временная метка для расчёта ускорения float SpeedOld = 0; // старая скорость в расчёте ускорения float CalcSpeedUp = 0; // расчётное ускорение int CSDK = 15; // коэффициент резкости расчётного ускорения (рекомендуется от 15 до 30, чем больше тем резче разгон) unsigned long timeOldSpeed = 0; // время замера прошлой скорости void speedometr() { // Определяем текущую скорость sp = (float)(1500000.0 / (micros() - micros_sp)); //600000.0 - 6 имп./м 1000000.0 - 10 имп./м и т.д micros_sp = micros(); } void setup() { pinMode(motorPinF, OUTPUT); digitalWrite(motorPinF, LOW); pinMode(motorPinR, OUTPUT); digitalWrite(motorPinR, LOW); pinMode(enabledMotor, OUTPUT); digitalWrite(enabledMotor, HIGH); // подаём разрешающий сигнал на драйвер pinMode(hallMinPin, INPUT); digitalWrite(hallMinPin, HIGH); pinMode(hallMaxPin, INPUT); digitalWrite(hallMaxPin, HIGH); pinMode(sensorBrPin, INPUT); digitalWrite(sensorBrPin, HIGH); pinMode(buzzerPin, OUTPUT); pinMode(ledCCOnPin, OUTPUT); pinMode(ledHallMaxPin, OUTPUT); pinMode(ledHallMinPin, OUTPUT); digitalWrite(2, HIGH); attachInterrupt(0, speedometr, RISING); // Прерывание INT0 на 4 ноге ATMega328. Подаем сигнал с датчика скорости, ограничив амплитуду сигнала до 4,5 В // делителем или оптопарой и притянув вход к земле // attachInterrupt(1, multiINTO, LOW); // Прерывание INT0 на 5 ноге ATMega328. Подаем сигнал с датчиков Hall (max, min), break, Sens_A/B (вызывает прерывание, когда на порту LOW) analogReference(DEFAULT); // пока считаем, что диапазон измеряемых значений от ДЗ от 0 до +5В, потом возможно придётся разбираться! // Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver spAVG = 20; } void motorMode(int mode) { // управляем приводом. задаём направление вращения или выключаем // останавливаем мотор digitalWrite(motorPinF, LOW); digitalWrite(motorPinR, LOW); switch (mode) { case 0: // остановить мотор // мотор остановлен на входе break; case 1: // крутим вперёд if (digitalRead(hallMaxPin) != 0) { digitalWrite(motorPinF, LOW); digitalWrite(motorPinR, HIGH); } break; case 2: // крутим назад if (digitalRead(hallMinPin) != 0) { digitalWrite(motorPinF, HIGH); digitalWrite(motorPinR, LOW); } break; } } void buzzGo(int mode) { switch (mode) { case 1: // получен известный код IR приёмником tone(buzzerPin, 1400, 100); break; case 2: tone(buzzerPin, 700, 50); break; case 5: tone(buzzerPin, 500, 100); delay(100); tone(buzzerPin, 1000, 100); delay(100); tone(buzzerPin, 1400, 200); case 9: // левый код IR приёмника tone(buzzerPin, 500, 50); delay(50); tone(buzzerPin, 500, 50); break; case 10: // отключение КК tone(buzzerPin, 1400, 150); delay(150); tone(buzzerPin, 1000, 150); delay(150); tone(buzzerPin, 500, 450); break; } } int ReadDZ_AVG(){ int i; int sval = 0; for (i = 0; i < 100; i++){ sval = sval + analogRead(acceleratorPin); } sval = int(sval / 100); // среднее return sval; } void ccOFF() { // отключаем КК, сбрасываем газ motorMode(0); ccActive = false; // снимаем статус активности КК timeMotorStop = millis() + 10000; motorMode(2); while (digitalRead(hallMinPin) != 0 && millis() < timeMotorStop) { //пока ДЗ не встанет в минимум вращаем в обратку привод или временное ограничение 5 секунд // delay(3); } motorMode(0); // buzzGo(10); } void setDZ(int tmpDZ) { // Устанавливаем ДЗ в конкретное положение timeMotorStop = millis() + 2000; if (ReadDZ_AVG() < tmpDZ){ while (digitalRead(hallMinPin) == 0){ // если привод в минимуме вытягиваем провисание motorMode(1); delay(5); motorMode(0); // пауза для плавности восстановления дросселя delay(5); // задержка для плавности восстановления дросселя // контроль вмешательства человека в управление дросселем if ((digitalRead(hallMinPin) == 0 && digitalRead(motorPinF) == 1 && digitalRead(motorPinR) == 0) || (digitalRead(hallMaxPin) == 0 && digitalRead(motorPinF) == 0 && digitalRead(motorPinR) == 1)) { motorMode(0); return; } if ((ccActive) && (digitalRead(sensorBrPin) == 0)) { //нажата педаль тормоза отключаем КК ccOFF(); return; } } timeMotorStop = millis() + 2000; while (digitalRead(hallMaxPin) != 0 && ReadDZ_AVG() < tmpDZ && millis() < timeMotorStop) { // временное ограничение 5 секунд // Serial.println(ReadDZ_AVG()); motorMode(1); delay(8); motorMode(0); // пауза для плавности восстановления дросселя delay(55); // задержка для плавности восстановления дросселя // контроль вмешательства человека в управление дросселем if ((digitalRead(hallMinPin) == 0 && digitalRead(motorPinF) == 1 && digitalRead(motorPinR) == 0) || (digitalRead(hallMaxPin) == 0 && digitalRead(motorPinF) == 0 && digitalRead(motorPinR) == 1)) { motorMode(0); return; } if ((ccActive) && (digitalRead(sensorBrPin) == 0)) { //нажата педаль тормоза отключаем КК ccOFF(); return; } } } else { timeMotorStop = millis() + 2000; while (digitalRead(hallMinPin) != 0 && ReadDZ_AVG() > tmpDZ && millis() < timeMotorStop) { // временное ограничение 5 секунд motorMode(2); delay(5); motorMode(0); // пауза для плавности delay(55); // задержка для плавности // контроль вмешательства человека в управление дросселем if ((digitalRead(hallMinPin) == 0 && digitalRead(motorPinF) == 1 && digitalRead(motorPinR) == 0) || (digitalRead(hallMaxPin) == 0 && digitalRead(motorPinF) == 0 && digitalRead(motorPinR) == 1)) { motorMode(0); // buzzGo(9); return; } if ((ccActive) && (digitalRead(sensorBrPin) == 0)) { //нажата педаль тормоза отключаем КК ccOFF(); return; } } } motorMode(0); } void ccON() { int ssp; ssp = sp; if (ssp > 20 && ssp < 130) { OldSpeed = ssp; // запоминаем текущ. скорость как старую timeOldSpeed = millis(); spAVG = ssp; spStart = ssp; timeSpeedUp = millis(); SpeedOld = ssp; // управляем ledCCOnPin digitalWrite(ledCCOnPin, HIGH); setDZ(CurrDZ + 5); ccActive = true; buzzGo(5); } else buzzGo(10); } void myDelay(int msec) { unsigned long timeEnd = 0; // время остановки мотора timeEnd = millis() + msec; while (millis() < timeEnd) { // проверяем не дошли ли до датчика при вращении и если да, отключаем мотор if ((digitalRead(hallMinPin) == 0 && digitalRead(motorPinF) == 1 && digitalRead(motorPinR) == 0) || (digitalRead(hallMaxPin) == 0 && digitalRead(motorPinF) == 0 && digitalRead(motorPinR) == 1)) { motorMode(0); } if (ccActive && digitalRead(sensorBrPin) == 0) { //нажата педаль тормоза отключаем КК ccOFF(); break; } } } void loop() { spStart = sp; if (spStart < spAVG * 2) { spAVG = spStart; } CurrDZ = ReadDZ_AVG(); if (DZPosMin < 20) { DZPosMin = CurrDZ; } if (irrecv.decode(&results)) { // 0xFD40BF - CH+ * // 0xFD807F - CH- * // 0xFD20DF - EQ * // 0xFD50AF - >>| * // 0xFD906F - |<< * // 0xFDA05F - V- // 0xFD609F - V+ // 0xFD00FF - >/|| // 0xFDE21D - call off // 0xFDA25D - call on // 0xFD9867 - power * switch (results.value) { case 0xFD9867: // кнопка калибровки // 0xFD9867 - power buzzGo(1); ccOFF(); break; case 0xFD20DF: // включаем/выключаем круиз // 0xFD20DF - EQ buzzGo(1); if (!ccActive) { ccON(); CCSpeed = spAVG; } else { ccOFF(); } break; case 0xFD50AF: // Увеличить скорость КК на 2 // 0xFD50AF - >>| buzzGo(1); if (ccActive) { CCSpeed = CCSpeed + 2; } else { ccON(); } break; case 0xFD906F: // Уменьшить скорость КК на 2 // 0xFD906F - |<< buzzGo(1); if (ccActive) { CCSpeed = CCSpeed - 2; } break; case 0xFD807F: // Увеличить скорость КК на 10 // 0xFD807F - CH- buzzGo(1); if (ccActive) { CCSpeed = CCSpeed + 10; } break; case 0xFD40BF: // Уменьшить скорость КК на 10 // 0xFD40BF - CH+ buzzGo(1); if (ccActive) { CCSpeed = CCSpeed - 10; } break; ////////////////////////////////////////// case 0xFDA05F: // - V- включить КК и скорость 40 buzzGo(1); if (!ccActive) { ccON(); } CCSpeed = 42; break; case 0xFD609F: // - V+ включить КК и скорость 60 buzzGo(1); if (!ccActive) { ccON(); } CCSpeed = 64; break; case 0xFD00FF: // - >/|| включить КК и скорость 90 buzzGo(1); if (!ccActive) { ccON(); } CCSpeed = 96; break; case 0xFDA25D: // "call on" просто прибавить дроссель даже без КК buzzGo(1); setDZ(CurrDZ + 8); ccActive = false; break; case 0xFDE21D: // "call off" просто убавить дроссель даже без КК buzzGo(1); setDZ(CurrDZ - 8); ccActive = false; break; // default: // buzzGo(9); } irrecv.resume();// Receive the next value } if ((ccActive || digitalRead(hallMinPin) != 0) && digitalRead(sensorBrPin) == 0) { //нажата педаль тормоза отключаем КК ccOFF(); } if (ccActive) { if ((spAVG < 20) || (spAVG > 130)) {// если скорость за пределами 20..130 отключаем КК SpeedFail = SpeedFail + 1; buzzGo(1); if (SpeedFail > 5) { ccOFF(); } } else { SpeedFail = 0; } } // расчёт ускорения if (ccActive && (millis() > timeSpeedUp + 500)) { SpeedUp = (spAVG - SpeedOld)/0.5; // SpeedUp = (spAVG - SpeedOld)/((millis() - timeSpeedUp)/1000); SpeedOld = spAVG; timeSpeedUp = millis(); } if (ccActive) { if (spAVG < CCSpeed - CCSpeedMin) {// скорость сильно ниже заданной digitalWrite(ledHallMinPin, HIGH); digitalWrite(ledCCOnPin, LOW); digitalWrite(ledHallMaxPin, LOW); } else if (spAVG > CCSpeed + CCSpeedMax){// скорость сильно выше заданной digitalWrite(ledHallMinPin, LOW); digitalWrite(ledCCOnPin, LOW); digitalWrite(ledHallMaxPin, HIGH); } else { digitalWrite(ledHallMinPin, LOW); digitalWrite(ledCCOnPin, HIGH); digitalWrite(ledHallMaxPin, LOW); } } else { digitalWrite(ledHallMinPin, LOW); digitalWrite(ledCCOnPin, LOW); digitalWrite(ledHallMaxPin, LOW); } if (ccActive) {// проверяем включен ли КК и настало ли время для след.прохода if ((spAVG < CCSpeed - CCSpeedMin || spAVG > CCSpeed + CCSpeedMax) && millis() >= timeOldSpeed + 1000) {// скорость за пределами нормы timeNextStep = millis(); CalcSpeedUp = ((CCSpeed - spAVG) / (CCSpeed / CSDK)) * 1000 / (timeNextStep - timeOldSpeed); // расчётное ускорение за 1 сек if (spAVG < CCSpeed - CCSpeedMin) {// скорость ниже заданной if (SpeedUp > 0) {// если скорость в верном направлении if (SpeedUp < CalcSpeedUp - CalcSpeedUp/10) { // если ускорение не достаточное setDZ(CurrDZ + 3 + int((CCSpeed - spAVG)/8 + spAVG/8)); }// *если ускорение не достаточное else if (SpeedUp > CalcSpeedUp + CalcSpeedUp/10 && SpeedUp > 0.1) { // если ускорение черезмерное setDZ(CurrDZ - 4 - int(abs(SpeedUp))); }// *если ускорение черезмерное }// *если скорость в верном направлении else {// если происходит снижение скорости setDZ(CurrDZ + int(spAVG/4)); }// *если происходит снижение скорости }// *скорость сильно ниже заданной else if (spAVG > CCSpeed + CCSpeedMax){// скорость сильно выше заданной if (spAVG > CCSpeed + 8) {// если скорость критически высока снижаем до минимума setDZ(DZPosMin - 5); }// *если скорость критически высока снижаем до минимума else {// скорость сильно выше заданной, но не выше критической, продолжаем анализировать if (SpeedUp < 0) {// если уже происходит снижение скорости if (spAVG < CCSpeed + CCSpeedMax + 1) { // снижая скорость приближаемся к норме setDZ(CurrDZ + int(spAVG/4)); } // *снижая скорость приближаемся к норме }// *если уже происходит снижение скорости else if (SpeedUp > 0) { // если происходит увеличение скорости setDZ(CurrDZ - 4 - int(abs(SpeedUp))); } // *если происходит увеличение скорости }// *скорость сильно выше заданной, но не выше критической, продолжаем анализировать }// *скорость сильно выше заданной // запоминаем скорость со входа, как старую spStart = sp; if (spStart < spAVG * 2) { spAVG = spStart; } OldSpeed = spAVG; timeOldSpeed = millis(); }// *скорость за пределами нормы else {// скорость в пределах нормы if (millis() > timeOldSpeed + 1000) {// прошло больше 1 сек с прошлого прохода if (spAVG < OldSpeed - 1 || spAVG > OldSpeed + 1) {// скорость отклонилась на 1 км/ч if (spAVG < OldSpeed) // снизилась setDZ(CurrDZ + int(spAVG/8)); if (spAVG > OldSpeed) // увеличилась setDZ(CurrDZ - int(spAVG/12)); // запоминаем скорость со входа, как старую spStart = sp; if (spStart < spAVG * 2) { spAVG = spStart; } OldSpeed = spAVG; }// *скорость отклонилась на 1 км/ч timeOldSpeed = millis(); }// *прошло больше 1 сек с прошлого прохода }// *скорость в пределах нормы }// *проверяем включен ли КК и настало ли время для след.прохода }P.S. Может не совсем по теме: Нужна прям помощь-помощь!!! Поскольку в моей версии реализация управления через ИК-приёмник, то есть необъяснимый "катаклизм" с работой ИК! Использую бибилотеку IRremote.h версии 2.0.1 (последняя на тек. момент). В моей комбинации железа и софта: пульт-приёмник-программа, очень часто возникает ситуация, когда на ИК-приёмник валится какой-то "мусор" вместо верных сигналов при нажатии на кнопки пульта. В это же время, вставляя какое-нибудь препятсвие (палец или руку) между пультом и приёмником перекрывая прямой обзор ~50% ИК сигналы, библиотекой начинают распознаваться верно. Убираешь препятствие - опять "мусор".... И лишь иногда при подаче питания на МК, до его перезагрузки, работает как по "букварю". Т.е. как будто иной раз библиотека считает отражённый сигнал полезным, а иной раз наоборот... Вообще не понимаю что за "шляпа"!?
P.P.S. Если у кого есть вопросы или пожелания - пишите мне на почту. (я на форуме редко бываю) kompasplus на mail.ru
кажется глупо делать серво привод для управления педалью газа ижекторного автомобиля... все же можно сделть проще... если это не карбюратор конечно... сейчас же почти все используют электронную педаль газа!!! я бы не отказался протестить на своем солярисе... и мне лично пофиг на каком контроллере собрано ардуино это или еще какая нибудь хрень... главное результат... даже бы сказал ардуино меня больше устраивает так как можно в любое время залезть в программу и что то изменить или доработать....
привод для управления педалью газа ижекторного автомобиля... все же можно сделть проще... если это не карбюратор конечно... сейчас же почти все используют электронную педаль газа!!!
а что делать, если дроссельная заслонка механическая!?... поменять впускной коллектор на коллектор с электронным дросселем? Это ваще другого порядка работа.