Круиз контроль

wOOlf
Offline
Зарегистрирован: 21.04.2014

Всем доброго дня! 
Итого, что должен уметь сей девайс ( в лицах, так сказать)
1) включаться
2) калиброваться (по команде)
3) реагировать на педаль тормоза и сцепления (делать ХХ)
4) запоминать текущщую скорость и поддерживать её
5) вспоминать заданную скорость и выходиь на неё...
6) пошагово увеличивать или уменьшать её нажатиями на кнопки
7) показывать заданную скорость на дисплее...
8) выключаться

итого на входе у нас: 
показания датчика скорости (OBD)
сигнал с тормоза
сигнал со сцепления
питание
кнопки ("ск +", "ск-", SET)
сигнал с аксселератора

на выходе: 
сетодиод и/или дисплей
новый сигнал аксселератора

по аппаратной части:

сигнал от лягушки тормоза и сцепления 12В, скорость импульсы 5В, питание 12В ,педаль газа работает на изменении напряжения в диапазоне от 05, до трех вольт...по линейному закону.
соответсвенно устройство должно выдавать соответствующее напряжение (это кстати очень хорошо, потому что устройство можно будет ставить не трогая провода от педали к двигателю ,если вдруг какая нить фигня случится, то машина работать будет...
это основной алгоритм работы, будут добавляться части повышающие безопасность
надеюсь ,что To be continued

Araris
Offline
Зарегистрирован: 09.11.2012

Гораздо интереснее было бы прочесть о реализованном проекте, нежели очередной список "хотелок".

Посему, желаю Вам настойчивости и удачи.

wOOlf
Offline
Зарегистрирован: 21.04.2014

Спасибо.

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

пока это только декларирование намерения, ибо я еще почти ничего не сделал...но буду разбираться...
 

wOOlf
Offline
Зарегистрирован: 21.04.2014

Небольшой апдейт,написал основу алгоритма круиз контроля. это только,так сказать, скелет, много чего еще придется там допислить: калибровка датчика акселератора, оцифровка этого сигнала, рассчет скорости по импульсам, доведение до ума корректировки скорости и напряжения.. защита от превышения значения напряжения с педали газа (например если надавить на газ не отключая кк...чтоб он потом вернулся на заданную скорость)... но пока вот что получилось

если есть комментарии (желательно обоснованные), то я только рад.

вот такой вот код получился пока:
даже компилируется :) 

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); //гасим красный диод
    }
   } 
}

 

vlkam
Offline
Зарегистрирован: 17.02.2013

 Я бы застремался такое на машину прикручивать, да еще в движении проверять

wOOlf
Offline
Зарегистрирован: 21.04.2014

Ардуино в принципе стремно на машину ставить? Или с такой прошивкой? Прошивка только начинается...

vlkam
Offline
Зарегистрирован: 17.02.2013

wOOlf пишет:
Ардуино в принципе стремно на машину ставить? Или с такой прошивкой? Прошивка только начинается...

Не ардуину, а любое самопальное устройство на педаль газа авто.
 

wOOlf
Offline
Зарегистрирован: 21.04.2014

Ну ради примера: drivenge.ru(не реклама). Тоже с самопала начиналось а потом договор с оф дилером киа и цена сразу х2. Серт я не буду делать. Но вот испытания в спец лаборатории проведу. Не боги горшки обжигают.

vlkam
Offline
Зарегистрирован: 17.02.2013

"Договор с официальным дилером киа" это я так понимаю договор реализации между ИП Шестаков и ИП хххххх продающим автомобили КИА в Краснодаре. Отношение к производителю авто это не имеет. И разумеется это ни разу не сертификация и близко. Просто диллер продает кроме машин, ковриков, сигнализаций, вонючек в салон еще и вот такую коробочку

Далее - разумеется не боги горшки обжигают, но автопроизводители свою электронику обкатывают уже полвека на миллионах машин и их опыту есть основания доверять. Хотя вот Тойота вроде лопухнулась с ЭБУ и получила неконтролируемые ускорения в нескольких случаях на миллиард часов использования. У ИП Шестакова подозреваю нет такого гигантского опыта

 

wOOlf
Offline
Зарегистрирован: 21.04.2014

не путайте теплое с мягким...там в загрузках есть отдельный сертификат ТР О безопасности колесных транспортных средств. топик про Тойоту читал, поржал....поэтому и не тойота
касательно Шестакова- анонс устройства для КИА- в декабре 12...уже типа обкатаное, хотя косяки были...
сначала продавалось примерно по пять тысяч, потом вдруг уже в начале 14, стало 11 со словами- мы договорились с КИА ,что это будет продаваться у Официальных дилеров...
так что КИА к этому девайсу не имеет никакого отношения...

vlkam
Offline
Зарегистрирован: 17.02.2013

wOOlf пишет:
не путайте теплое с мягким...там в загрузках есть отдельный сертификат ТР О безопасности колесных транспортных средств.

Бумажкам, выданным контролирующими органами РФ у меня доверия абсолютный ноль.
Потому что я сам занимаюсь получением примерно таких бумажек и знаю, как все это делается

И опять же этот сертификат к автопроизводителю отношения не имеет. Сертифицировала какая то контора, допущенная к кормушке сертификации.

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Интересна данная тема.

vlkam, а я бы поставил )) Естенственно, после отладки и с возможностью в случае чего быстро выключить сей девайс. Ведь даже кнопку запуска крутят, а это ИМХО даже постремнее :)

По поводу KIA и т.д. - даже обсуждать (лично я) не буду - пустое.

vlkam пишет:

Бумажкам, выданным контролирующими органами РФ у меня доверия абсолютный ноль.

Потому что я сам занимаюсь получением примерно таких бумажек и знаю, как все это делается

+1 - это все что я мог бы сказать на эту тему.

Ну а данный проект имеет место быть. Почему нет?

По блоксхеме в первом посте: я один не могу ничего прочитать? Может залейте уж куда-нибудь картинку нормального разрешения.

По коду. Сейчас постараюсь немного переписать (сразу навскидку - лишком многопамяти занимают ваши ненужные инты и в программировании кое-что можно упростить на несколько операций). В логику самой программы пока не вникал.

wOOlf
Offline
Зарегистрирован: 21.04.2014

Если есть, что-то по существу, то я готов выслушать комментарии... ну там типа "чувак, та как то странно сопротивления под диодом прикрутил...или там нужно задержки ставить при измерении сигналов...несколько раз значения замерять и среднее находить"...я только за...схоластику разводить я не собираюсь...
все так расписываю, потому что сейчас вспоминаю и учусь, мне так удобнее...это раз.
Два: опять же, пока я не знаю ответы на все вопросы, надеюсь что смогу получить на них ответы: например как из 12В сделать 5В для питания устройства.думаю что китайская зарядка для ЮСБ не совсем то...второе: нужно из 12 делать 5 В, чтобы отслеживать нажатие тормоза и сцепления, делать это быстро и точно, т.е. если я даже просто стукну по педали, гарантировано бы отключился КК...хотя до этого еще далеко... а сразу будут вопросы "а нафига тебе?" 

wOOlf
Offline
Зарегистрирован: 21.04.2014

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

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Из 12 5 как мне кажется проще всего сделать делителем (хотя проще - не надежнее - в бортовой сети авто бывают очень высокие броски).

Для питания устройства применить стабилизатор (ну типа 7805).

wOOlf
Offline
Зарегистрирован: 21.04.2014

CityCat пишет:

Интересна данная тема.

vlkam, а я бы поставил )) Естенственно, после отладки и с возможностью в случае чего быстро выключить сей девайс. Ведь даже кнопку запуска крутят, а это ИМХО даже постремнее :)

По поводу KIA и т.д. - даже обсуждать (лично я) не буду - пустое.

vlkam пишет:

Бумажкам, выданным контролирующими органами РФ у меня доверия абсолютный ноль.

Потому что я сам занимаюсь получением примерно таких бумажек и знаю, как все это делается

+1 - это все что я мог бы сказать на эту тему.

Ну а данный проект имеет место быть. Почему нет?

По блоксхеме в первом посте: я один не могу ничего прочитать? Может залейте уж куда-нибудь картинку нормального разрешения.

По коду. Сейчас постараюсь немного переписать (сразу навскидку - лишком многопамяти занимают ваши ненужные инты и в программировании кое-что можно упростить на несколько операций). В логику самой программы пока не вникал.

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

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Ну вот примерно отредактированный код.

Сразу оговорюсь - причесал не все. И еще - не вижу применения (присваивания каких-либо значений) переменных 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); //гасим красный диод
    }
  }
}

 

wOOlf
Offline
Зарегистрирован: 21.04.2014

U   некоторые константа, которая корректируют значения напряжения , т.е. принцип такой: если машина самостоятельно тормозит или разгоняется ( в горку или с горки) то напряжение на выходе с контроллера потихоньку увеличивается или уменьшается для автоматического разгона или сброса скорости...
I- это для корректировки заданной скорости при нажатии кнопок + или -
эти значения нужно будет подбирать экспериментально...поэтому пока просто U и i

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Ну тогда им хотя бы 1 пока присвоить ;) Опять-таки, если не прланируется брать значения больше 255 для экономии памяти лучше использовать тип переменных char (ну или byte - кому как удобнее - одно и тоже по сути).

P.S. Сейчас постараюсь понять логику программы :)

wOOlf
Offline
Зарегистрирован: 21.04.2014

сразу оговорюсь, это еще не весь код+ пока никакой адаптации к железу...на Рио, оказывается стоит 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); //гасим красный диод
    }
  }
}

 

vlkam
Offline
Зарегистрирован: 17.02.2013

.

stels
Offline
Зарегистрирован: 03.01.2014
Тимур
Тимур аватар
Offline
Зарегистрирован: 30.04.2014

самый главный момент не отображен ни где....................... Машина-то какая? А то может там и ардуина не нужна......

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Тимур пишет:

самый главный момент не отображен ни где....................... Машина-то какая? А то может там и ардуина не нужна......

дедушкина копейка :) на всех остальных нынче круиз идет с завода даже в минимальной комплектации :)

wOOlf
Offline
Зарегистрирован: 21.04.2014

Киа Рио QB. На ручке.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

wOOlf пишет:
Киа Рио QB. На ручке.

на ручке? эт брелок в смысле? :)

wOOlf
Offline
Зарегистрирован: 21.04.2014

На механике

raptoridze
Offline
Зарегистрирован: 10.01.2014

интересная тема.. у самого имеется ардуина мега  

недавно прикрутил сервопривод к дроссельной заслонке  +  по тестам вроде крутит туда сюда ... 

теперь осталось самое интересное написать непосрдественно программу... судя по данному топику, пока что нет уже готовых решений на ардуине?

пс

машина хонда цивик 98 год на механике

педаль газа троссиковая...

пока получилось подключиться через сериал порт к компу авто и снимать все данные с компа (скорость, обороты, разные датчики.. ) полноценный бортовой компьютер... 

автор не будет возражать если я тоже присоединюсь к его проекту и буду выкладывать то что у меня есть и соответсвенно юзать то что есть тут?! ))

кстати по поводу надежности .. реально стремная тема .. но!!! я думаю что нужно на педаль тормоза ставить отдельное реле, которое будет отключать, вне зависимости работает ли ардуина или нет, сервопривод ... 

у меня в данном случаи если обесточить сервопривод, пружина дроссельной заслонки закрывает дроссель сама ... 

dobrik
Offline
Зарегистрирован: 07.09.2014

Уже пол года занимаюсь разработкой круиза на ардуино, затык в малом кол-ве свободного времени и долго ждал подходящий сервопривод. Почти все готово для запуска, скоро, возможно, напишу тут отчет. п.с. для тех кто изобретает велосипед с алгоритмом подбора скорости, гуглите "PID регулятор на ардуино" есть готовые библиотеки и удобная на Processing программа для отладки.

А по поводу установки ардуино в машину нет ничего страшного. Чип в компьютере вашей машины тоже может глючить в теории, но он обычно этого не делает, просто надо все делать с умом.

Vikont5782
Offline
Зарегистрирован: 14.09.2014

Продолжу интересующую тему.

Пока осилил следующий код с поправкой на ПИД регулятор (информации на русском маловато). Хотелось бы услышать мнение профи по оптимальности кода и его работоспособности, а самое главное отключении. Две кнопки пульта управления еще не реализованы. хочу пока разобраться с концепцией и основой программы

#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);} //кнопки не задействованы, выдавать истиные значения с педали газа на ЭБУ
}

 

raptoridze
Offline
Зарегистрирован: 10.01.2014

не совсем понял как с этими коэффициентами работать в пид регуляторе

у меня например тросик газа дергает сервопривод

вот угол 0 на сервоприводе - 0% открытие дросселя

угол 5градусов - 10% дросселя

и так далее ... 

как мне применить в данном случае ? другие коэффициенты?

 

Vikont5782
Offline
Зарегистрирован: 14.09.2014

на сколько я разобрался (а информации на русском очень мало, а в формулы погружаться пока на созрел), угол так и будет как на сервоприводе. а вот команды сервоприводу на какой угол отклониться будут другие для более точного регулирования скорости.

А вот как раз скорост регулирования и точность задается этими тремя коэффициентами, условно первый самый грубый (скорость достигания заданной величины, а вторы два уже плавность подхода и колебаниячерез величину при при приближении к ней)

 

raptoridze
Offline
Зарегистрирован: 10.01.2014

первое что пришло на ум составить  таблицу соответсвия % нажатие на педаль газа и угол сервопривода ... 

alsila793
Offline
Зарегистрирован: 30.01.2015

Всем привет. Я тоже хочу сконструировать такую штуку для интеграции в Газель с электронной педалью газа. По программированию я не спец но по электрике мастерам фору дам. На этой неделе схемку соберу - буду на стенде пробовать

Vikont5782
Offline
Зарегистрирован: 14.09.2014

привет! если надо, пиши на medvedev_dv@mail.ru подскажу, порекомендую уже готовые. Все давно, оказалось, придумано за нас

alsila793
Offline
Зарегистрирован: 30.01.2015

А меня сподвигла идея одного деятеля по конструктиву на АТмеге 168 сделать контроллер круиза, там особо сложного то ничего нет. Главное развязку с педалью сделать, и напряжение только на ЭБУ пойдет если гашетку притопить а потом отпустить. Правда там только конструктив описан, а программы нет и настройка не описана. И тут Ардуино с АлиЭкспрессом подвернулись. Оказалось непаханое поле. Я всех заказал по парочке, и сижу - колдую. На самом деле там достаточно Про Мини на 168 контроллере, если монолит собирать, да так оно и надежнее будет, хотя 328 с модулем прошивки сразу, его перепрошивать удобнее. Пока пойду паралельно, а дальше посмотрим. Машина под рукой. Эбу, педаль запасные есть. Ошибаться не страшно, а круиз ой как хочется, ибо на море 2500км на Газели одному без отдыха тяжеловато преодолевать, так хоть периодичести ноги вытягивать по трассе можно днем. Вот такая скромная мечта)))))))))))))))))зы

Vikont5782
Offline
Зарегистрирован: 14.09.2014

как намучаешься, пиши

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

Притихла тема.

Есть прогресс, успехи?

Интересуюсь, ибо себе на Хюндай Туксон (механика) такое прикрутить хочеться.

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

Кому интересно вот ссылка на мой вариант. По опыту скажу, что очень долго шёл к алгоритму. Библиотекой ПИД не пользовался пока. Недавно выявил и устранил электронные помехи с датчика положения дроссельной заслонки из-за которых долго не удавалось добиться устойчивого результата. Теперь результат совсем новый и иной. Проходим обкатку.

#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

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

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

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

Anton_Kos87 пишет:

привод для управления педалью газа ижекторного автомобиля... все же можно сделть проще... если это не карбюратор конечно... сейчас же почти все используют электронную педаль газа!!! 

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