Кнопка запуска двигателя

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

// --------- определяем наименование портов ---------
const int butPin = 3;    // кнопка запуска
const int tormozPin = 4; // кнопка тормоза  
const int ledPin = 13; // пин светодиода
const int parkPin = 5; // кнопка положения P коробки передач
const int breakePin = 6; // сигнал с ручника

// --------- определяем переменные ---------
int Counter = 0; // переменная кол-ва нажатий
int butState = 0; // текущее положение кнопки
int lastButState = 0; // предыдущее положение кнопки
int tormoz = 0; // положение педали тормоза
int statPark = 0; // положение коробки передач 
int statBreake = 0; // положение ручника

// ---------- установки -----------
void setup() {
  pinMode(butPin, INPUT);
  pinMode(tormozPin, INPUT);
  pinMode(parkPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // считываем значения всех датчиков и кнопок
  statPark = digitalRead(parkPin); // значение коробки передач
  tormoz = digitalRead(tormozPin); // значение педали тормоза
  butState = digitalRead(butPin); // значение кнопки запуска
  statBreake = digitalRead(breakePin);
  delay(100); // защита от дребезга контактов кнопки (пока так)
  // -----------------------------------------
  if (butState != lastButState) { // проверяем изменения положения кнопки
    if (butState == HIGH) { // если она нажата (LOW отпущена) 
      Counter++;            // то прибавляем к счетчику 
         } 
      }
      
lastButState = butState; // записываем текущее положение кнопки как предыдущее

switch (Counter) {
    case 0:                  // если счетчик равен 0
          if (statPark == 1 && statBreake == 1) // то проверяем установлен ли акселератор в положение P и стоит ли машина на ручнике, если да то
                            {
                             digitalWrite (ledPin, 0); // выключаем все
                             Serial.println("OFF");    // пишем в порт OFF
                             } else {                  // если же акселератор вне положения P или не стоит на ручнике то
                                     Serial.println("no parking or no breake"); // ничего не делаем и пишем в порт  no parking or no breake               
                                    }
                                     break;
    case 1:                   // если счетчик равен 1
          if (statPark == 1){ // то проверяем установлен ли акселератор в положение P, если да то
                             Serial.println("ACC");    // пишем в порт АСС
                             digitalWrite (ledPin, 1); // зажигаем светодиод
                             } else {                  // если же акселератор вне положения P то
                                     Serial.println("no parking"); //пишем в порт  no parking
                                     }
                                      break;
    case 2:                   // если счетчик равен 2
          if (statPark == 1){ // то проверяем установлен ли акселератор в положение P, если да то
                             Serial.println("IGN");   // пишем в порт IGN
                             } else {                 // если же акселератор вне положения P то
                                     Serial.println("no parking"); //пишем в порт  no parking
                                     }
                                      break;
    case 3:                              // если счетчик равен 2
     if (tormoz == 1 && statPark == 1) { // то проверяем установлен ли акселератор в положение P и нажата ли педаль тормоза, если да то
     Serial.println("START");            // пишем в порт START
     }
        else {                  // если хотябы одно условие не выполняется то
          Serial.println("no START"); // пишем в порт no START
          }
          break;
        }
   if (Counter > 3) {Counter = 0;} // если счетчик превысил значение 3 то обнуляем его
  
}

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Скетч в стадии обкатки. спрашивайте что не понятно.

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

Nikelbak пишет:

 Скетч в стадии обкатки. спрашивайте что не понятно.

не проще ли будет вытащить кнопку с сигналки с автозапуском?

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

Mastino
Offline
Зарегистрирован: 03.12.2011

 Как раз и я в этой теме, по этому могу дать пару предложений. Или лучше опишу как я собираюсь сделать. Другую машину себе купил, предедуший владелец поставил ужасную красную кнопку внизу панели(видно на картинке) для включения звука усилителя. Я все это дерьмо вынул а дырка осталось.. думал думал что туда поставить и вот идея родилась - http://www.youtube.com/watch?v=JaubEfbpCNE :) На следующий день она уже у меня в руках по супер цене. В комплекте одна wireless реле которая замыкает два контакта, когда успешно проходит распознавание отпечатка. Вообщем - открываешь машину, включаешь зажигание поворачивая ключ, сканируешь палец если всё ОК(реле соединяет контакты между стартером или насосом), опять крутишь ключ чтобы привести в действие стартер и заводишь. Круто! но не очень:( по тому как после распознавания отпечатка, нужно опять крутит ключ.

Думаю сделать так:

открываешь машину, включаешь зажигание поворачивая ключ(повернешь дальше стартер не заработает), сканируешь палец если всё ОК, реле включает arduino. Arduino сначала "смотрит" когда потухнет лампочка накала свечей(у меня дизель), когда лампочка потухла, начинаем крутить стартер и смотрим когда генератор будет давать 12V(тонкий провод идущий из генератора). Генератор дает 12в, значит машина завелась стартер больше не крутим. Arduino входит в режим "сна" до следущего ресета, это для того если машина заглохнет чтобы стартер опять не начал крутит. Если же машина не заводится в течение 8 секунд стартер выключается, Arduino входит в режим "сна" и потом уже можно активировать стартер ключом. Конечно тоже самое можно сделать с кнопкой.

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

 А можно поинтересоватся что за "интелектуальные реле" там используются, и какой их принцып работы?

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Я занимаюсь точно тем же вопросом что и вы Nikelbak
Так вот у меня какая задумка! Снимаю с сигнализации - включется Arduino и ждет нажатия кнопки запуска авто-нажимаем кнопку включается 1 реле, которое в свою очередь включает зажигание, начинает мигать светодиод примерно-через 2.5 секунды включается второе реле, которое начинает крутить стартер, крутит оно до тех пор пока на проводе идущем к тахометру не появится (либо аналоговый сигнал "напряжение", либо будем считать обороты от датчика хола на коленвале) как только придет сигнал о том что двигатель завелся, мигаюший светодиод загорится ровным светом и будет гореть до тех пор пока не будет нажата кнопка, после ее нажатия реле 1 обесточится и машина заглохнет. Если же машина заглохнет на ходу, то процесс запуска снова будет запущен, но с условием нажатия педали сцепления! 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Вобщем, переспав ночь в машине. с этим кодом. изложеным выше, выяснилось очень много вещей с моим авто. Авто у меня nissan bluebird 1999 г sss. Так вот пока переписываю код с такой логикой.

Снимаем с сигнализации - просто снимаем с сигналки, ни как не привязывая к дальнейшему запуску.

садимся в авто, нажимаем кнопку 1й раз - включается ACC.

Нажимаем кнопку 2й раз - включается IGN.

Ардуино опрашивает положение акселератора, ручника и педали тормоза,

если акселератор в положении P (parking), ручник в положении Brake а тормоз не нажат, то 3е нажатие выключит все, 

если же акселератор в положении P, ручник в положении Brake,  и нажат тормоз, то 3е нажатие заведет двигатель

пока не привязываюсь к определению "двигатель завелся" крутим стартер 2 секунды.

все дальнейшие нажатия просто перебирают положения 1,2,3 .... 1,2,3. 

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

как то так. 

Но все бы ни чего. Да есть затык ... В момент запуска двигателя цепь ACC должна разъеденяться. причем в моей тачке это делается контактной группой самого замка, а городить кучу реле как то не хочется. т.е. в замке в режимее ACC  замыкаются 2а контакта, в режиме IGN к ним добавляются еще 2а. В момент запуска отсоединяется 1н контакт от режима ACC и от IGN и добавляется еще 2а один из которых провод со стартера. Контакт со стартера проходит прямо через замок, без реле и т.д. Коммутируется он судя по схеме по минусу. И вот тут тоже затык - в момент запуска там около 80 А (хотя я могу ошибаться), но все равно - чем коммутировать то - просто мощным реле или как? 

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Кстати очень рад что есть единомышленники - всеже вместе веселее.

Mastino
Offline
Зарегистрирован: 03.12.2011

chervyachok пишет:

А можно поинтересоватся что за "интелектуальные реле" там используются, и какой их принцып работы?

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

Dmitry23 пишет:

Я занимаюсь точно тем же вопросом что и вы Nikelbak
Так вот у меня какая задумка! Снимаю с сигнализации - включется Arduino и ждет нажатия кнопки запуска авто-нажимаем кнопку включается 1 реле, которое в свою очередь включает зажигание, начинает мигать светодиод примерно-через 2.5 секунды включается второе реле, которое начинает крутить стартер, крутит оно до тех пор пока на проводе идущем к тахометру не появится (либо аналоговый сигнал "напряжение", либо будем считать обороты от датчика хола на коленвале) как только придет сигнал о том что двигатель завелся, мигаюший светодиод загорится ровным светом и будет гореть до тех пор пока не будет нажата кнопка, после ее нажатия реле 1 обесточится и машина заглохнет. Если же машина заглохнет на ходу, то процесс запуска снова будет запущен, но с условием нажатия педали сцепления! 

А что если захочешь включить только зажигание? или только ACC чтобы магнитофон включить?

 

Mastino
Offline
Зарегистрирован: 03.12.2011

Nikelbak пишет:

 Вобщем, переспав ночь в машине. с этим кодом. изложеным выше, выяснилось очень много вещей с моим авто. Авто у меня nissan bluebird 1999 г sss. Так вот пока переписываю код с такой логикой.

Снимаем с сигнализации - просто снимаем с сигналки, ни как не привязывая к дальнейшему запуску.

садимся в авто, нажимаем кнопку 1й раз - включается ACC.

Нажимаем кнопку 2й раз - включается IGN.

Ардуино опрашивает положение акселератора, ручника и педали тормоза,

если акселератор в положении P (parking), ручник в положении Brake а тормоз не нажат, то 3е нажатие выключит все, 

если же акселератор в положении P, ручник в положении Brake,  и нажат тормоз, то 3е нажатие заведет двигатель

пока не привязываюсь к определению "двигатель завелся" крутим стартер 2 секунды.

все дальнейшие нажатия просто перебирают положения 1,2,3 .... 1,2,3. 

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

как то так. 

Но все бы ни чего. Да есть затык ... В момент запуска двигателя цепь ACC должна разъеденяться. причем в моей тачке это делается контактной группой самого замка, а городить кучу реле как то не хочется. т.е. в замке в режимее ACC  замыкаются 2а контакта, в режиме IGN к ним добавляются еще 2а. В момент запуска отсоединяется 1н контакт от режима ACC и от IGN и добавляется еще 2а один из которых провод со стартера. Контакт со стартера проходит прямо через замок, без реле и т.д. Коммутируется он судя по схеме по минусу. И вот тут тоже затык - в момент запуска там около 80 А (хотя я могу ошибаться), но все равно - чем коммутировать то - просто мощным реле или как? 

 

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

Был кстати случай жил я в городе Братске, купил мой знакомый поршика каена, немного битого но обсолютно "рабочего". Вобщем довел он его до ума. Система противоугона там родная стояла - хрен завдешь без родного ключа. да и коробка блокировалась. Так как то утром пришел он в гараж а его поршик стоит на чурках ... машина на сигналке, а внутри нет магнитолы. Он долго ни че понять не мог. Ладно колеса (они кстати на родном литье стояли - стоит дорого) так а как они магнитолу вытащили? Вобщем именно тогда мы сним познакомились с человеком который работает в сервисе по установке сигнализаций (благодаря милиции мы с ним познакомились), вот он нам повествовал чудную процедуру обходов различных сигнализаций и т.д. и даже как вынуть штифт блокировки коробки без повреждения последней. Ну да ладно - это оффтоп, давайте не будем об этом.

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

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Вообщем все просто, реле 2 будет иметь 2 состояния , когда реле без тока у него будет замкнута группа контактов, отвечающая за  ACC! И этим будет решатся проблемма с которой столкнулся Nikelbac, тоесть когда реле 2 будет становиться под ток цепь ACC будет разрываться, машина завелась и реле 2 обесточилось, замкнув цепь ACC.

А вот на счет зажигания я не думал, Возможно придется програмно сделать так чтобы после включения реле зажигания ничего не происходило до тех пор, пока не выжмешь педаль сцепления, и будет возможность пользоваться зажиганием без завода авто!

Спасибо Mastino навел на мысли!

 

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Nikelbak пишет:

 Вобщем, переспав ночь в машине. с этим кодом. изложеным выше, выяснилось очень много вещей с моим авто. Авто у меня nissan bluebird 1999 г sss. Так вот пока переписываю код с такой логикой.

Снимаем с сигнализации - просто снимаем с сигналки, ни как не привязывая к дальнейшему запуску.

садимся в авто, нажимаем кнопку 1й раз - включается ACC.

Нажимаем кнопку 2й раз - включается IGN.

Ардуино опрашивает положение акселератора, ручника и педали тормоза,

если акселератор в положении P (parking), ручник в положении Brake а тормоз не нажат, то 3е нажатие выключит все, 

если же акселератор в положении P, ручник в положении Brake,  и нажат тормоз, то 3е нажатие заведет двигатель

пока не привязываюсь к определению "двигатель завелся" крутим стартер 2 секунды.

все дальнейшие нажатия просто перебирают положения 1,2,3 .... 1,2,3. 

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

как то так. 

Но все бы ни чего. Да есть затык ... В момент запуска двигателя цепь ACC должна разъеденяться. причем в моей тачке это делается контактной группой самого замка, а городить кучу реле как то не хочется. т.е. в замке в режимее ACC  замыкаются 2а контакта, в режиме IGN к ним добавляются еще 2а. В момент запуска отсоединяется 1н контакт от режима ACC и от IGN и добавляется еще 2а один из которых провод со стартера. Контакт со стартера проходит прямо через замок, без реле и т.д. Коммутируется он судя по схеме по минусу. И вот тут тоже затык - в момент запуска там около 80 А (хотя я могу ошибаться), но все равно - чем коммутировать то - просто мощным реле или как? 

 

Вроде в цепи стартера замок подключает бендекс, а он в свою очередь комутирует ток примерно в 60 А, так что все норм должно быть! Хотя на моей машине стоит реле стартера!!! А во по поводу условий, может для дуино будет достаточно просто проверить состояние Рычага выбора передач что он находится в положении Р а электронника все равно не даст завести авто без нажатой педали тормоза!

Mastino
Offline
Зарегистрирован: 03.12.2011

Nikelbak пишет:

 не ключа вообще не будет, и самого замака тоже, имобилайзера нет.

Откуда вы знаете что имобилайзера нет?

Nikelbak пишет:

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

Ну если ключи постоянно ломаются, тогда да :)

Dmitry23 пишет:

Вообщем все просто, реле 2 будет иметь 2 состояния , когда реле без тока у него будет замкнута группа контактов, отвечающая за ACC! И этим будет решатся проблемма с которой столкнулся Nikelbac, тоесть когда реле 2 будет становиться под ток цепь ACC будет разрываться, машина завелась и реле 2 обесточилось, замкнув цепь ACC.

если ACC будет всегда включено придется каждый раз включать и выключать магнитофон и другие аксессуары если такие присутствуют. А это не гламур :)

maksim
Offline
Зарегистрирован: 12.02.2012

Нажимаем только на кнопку:

1.Первое нажатие кнопки - включается АСС.

2.Второе нажатие - дополнительно включается зажигание.

3.Третие нажатие - OFF, выключает АСС и зажигание.

Удерживая педаль тормоза, нажимаем кнопку:

Короткое нажатие на кнопку включает зажигание (если не было включено в пункте 2 и выключает АСС если было включено в пункте 1) и стартер, до тех пор пока двигатель не заведется или не пройдет 5 секунд, при выполнении одного из условий выключается стартер и включается АСС, зажигание естественно остается включенным. Также если кнопку удерживать, то стартер будет работать пока не отпустишь кнопку (например в мороз).

Следующее нажатие то же самое что и в пункте 3, двигатель глохнет.

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

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Объясню почему в алгоритм хочу завести состояния акселератора, тормоза и ручника.

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

2. Не достаточно просто ручника так как иногда (ну я зимой всегда), в связи с радиусом разварота в 5 м, я использую ручник чтоб закинуть жопу в поворот.

3. Для остановки двигателя я выбрал комбинацию ручник и акселератор, так как для меня это единственная комбинация указывающая на то что я закончил движение и готов заглушить двигатель. 

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

Иммобилайзера точно знаю что у меня нет , сигналка Starline B9, вот кстати думаю зацепиться к 6ти контактному разъему автозапуска сигналки. Вобщем седня буду перерабатывать алгоритм в код.

 

Mastino
Offline
Зарегистрирован: 03.12.2011

 Странно как мне известно с 1998 года на все машины ставились иммобилайзеры. Может только на жигулях и других машинах подобного технического уровня иммобилайзеры появились позже.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Уже с 97 года появилось выражение "В комплектацию не входит", мой sss был укомплектован без иммобилайзера и без родной сигналки, чистый центральный замок и эл. приводы стекол. И еще в моей комплектации небыло блока ABS, хотя вся обвязка есть.

Салоны товарищи - салоны.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Жопа вобщем этот алгоритм  - все переделываю ......

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Nikelbak Так что у тебя с кодом не получается??

 

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Mastino пишет:

Nikelbak пишет:

 не ключа вообще не будет, и самого замака тоже, имобилайзера нет.

Откуда вы знаете что имобилайзера нет?

Nikelbak пишет:

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

Ну если ключи постоянно ломаются, тогда да :)

Dmitry23 пишет:

Вообщем все просто, реле 2 будет иметь 2 состояния , когда реле без тока у него будет замкнута группа контактов, отвечающая за ACC! И этим будет решатся проблемма с которой столкнулся Nikelbac, тоесть когда реле 2 будет становиться под ток цепь ACC будет разрываться, машина завелась и реле 2 обесточилось, замкнув цепь ACC.

если ACC будет всегда включено придется каждый раз включать и выключать магнитофон и другие аксессуары если такие присутствуют. А это не гламур :)

Ну трол трол!!!

Если бы ты внимательно читал мое первое сообщение, там было написанно что после снятия с сигнализации включается ардуино, а реализуеся это поляризованным реле, которое в зависимости от полярности тока имеет 2 устоичивых состояния, вот при открытиии замков на реле поступит ток прямой полярности и и замкнет цепь ACC и ардуино! при закрытии замков пойдет ток обратной полярности и реле разорвет все цепи!!! А ЭТО ГЛАМУР :)

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 to Dmitry23. Да юзал код и так и этак и понял что нужно обязательно учитывать предыдущее положение. Т.е. включено ли ACC или IGN, а не просто перебирать количество нажатий. Условий в коде не хватает. Думаю переписать без switch. 

Например  - проверили стоит ли на P и на ручнике, нажали кнопку включили ACC.

Проверили стот ли в положении P на ручнике и если включена цепь ACC, нажимаем кнопку второй раз выключаем АСС.

___НО___

Если стоит на Р, на ручнике, включена цепь АСС и нажат тормоз то второе нажатие кнопки врубает IGN

Если же стоит на P, на ручнике, включена цепь IGN но не нажат тормоз, выключаем ьретьим нажатием IGN и оставляем только ACC.

___И__

Если стоит на P, на ручнике, включена цепь IGN и нажат тормоз,  то заводим двигатель (четвертое нажатие) при этом кратковременно отключая АСС.

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Итак переписал код и алгоритм, сегодня вечером на стенде проверю

// --------- определяем наименование портов ---------
const int parkPin = 2; // кнопка положения P коробки передач
const int brakePin = 3; // сигнал с ручника
const int tormozPin = 4; // кнопка тормоза  
const int butPin = 5;    // кнопка запуска

const int accPin = 10; // пин светодиода
const int ignPin = 11; // пин светодиода
const int startPin = 12; // пин светодиода

// --------- определяем переменные ---------
int statPark = 0; // положение коробки передач 
int statBrake = 0; // положение ручника
int statTormoz = 0; // положение педали тормоза
int butState = 0; // текущее положение кнопки
int Counter = 0; // переменная кол-ва нажатий

int lastButState = 0; // предыдущее положение кнопки

// ---------- установки -----------
void setup() {
  pinMode(parkPin, INPUT);
  pinMode(brakePin, INPUT);
  pinMode(tormozPin, INPUT);
  pinMode(butPin, INPUT);
  
  pinMode(accPin, OUTPUT);
  pinMode(ignPin, OUTPUT);
  pinMode(startPin, OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  // ----- считываем значения всех датчиков и кнопок ------
  statPark = digitalRead(parkPin); // значение коробки передач
  statBrake = digitalRead(brakePin); // значение ручника
  statTormoz = digitalRead(tormozPin); // значение педали тормоза
  butState = digitalRead(butPin); // значение кнопки запуска
  delay(100); // защита от дребезга контактов кнопки (пока так)
  // ------------------------------------------------------
  
  if (butState != lastButState) { // проверяем изменения положения кнопки start
    if (butState == HIGH) { // если она нажата то проверяем
       if (statPark == 1 && statBrake == 1 && Counter == 0) { //если акселератор стоит в положении P, ручник в положении Brake и счетчик равен 0 то
           Serial.println("ON ACC");    // пишем в порт "ON ACC"
           digitalWrite (accPin, HIGH); // включаем цепь АСС
           Counter++;                   // и увеличиваем значение счетчика   
                     } 
       if (statPark == 1 && statBrake == 1 && statTormoz == 0 && Counter == 1) { //если акселератор стоит в положении P, ручник в положении Brake и счетчик равен 1 но не нажата педаль тормоза то
           Serial.println("OFF ACC");   // пишем в порт "OFF ACC"
           digitalWrite (accPin, LOW);  // выключаем цепь АСС
           Counter--;                   // и уменьшаем значение счетчика 
                     } 
       if (statPark == 1 && statBrake == 1 && statTormoz == 1 && Counter == 1) { //если акселератор стоит в положении P, ручник в положении Brake и счетчик равен 1 и нажата педаль тормоза то
           Serial.println("ON IGN");    // пишем в порт "ON IGN"
           digitalWrite (ignPin, HIGH); // включаем цепь IGN
           Counter++;                   // и увеличиваем значение счетчика 
                     }
       if (statPark == 1 && statBrake == 1 && statTormoz == 0 && Counter == 2) { //если акселератор стоит в положении P, ручник в положении Brake, счетчик равен 2 но не нажата педаль тормоза то
           Serial.println("OFF IGN");   // пишем в порт "OFF IGN"
           digitalWrite (ignPin, LOW);  // выключаем цепь IGN
           Counter--;                   // и уменьшаем значение счетчика 
                     }
       if (statPark == 1 && statBrake == 1 && statTormoz == 1 && Counter == 2) { //если акселератор стоит в положении P, ручник в положении Brake, счетчик равен 2 и нажата педаль тормоза то
           Serial.println("Start");       // пишем в порт "START"
           digitalWrite (startPin, HIGH); // запускаем двигатель (здесь нужно добавить процедуру временного отключения цепии АСС, 
           Counter++;                     // и привязать определение запущенного двигателя, счетчbr увеличиваем.
                                          // все дальнейшие действия при отжатом тормозе приведут к о
                                         }
       if (statPark == 1 && statBrake == 1 && statTormoz == 1 && Counter == 3) {// если нажать кнопку после того как двигатель был заведен то 
           Serial.println("Stop");       // пишем в порт "STOP"  
           digitalWrite (ignPin, LOW);   // выключаем цепь IGN
           Counter = 1;                  // счетчику присваиваем значение 1
         } 
      }
  }
lastButState = butState; // записываем текущее положение кнопки как предыдущее
}

 

Mastino
Offline
Зарегистрирован: 03.12.2011

 а где (startPin, LOW)? 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

А вообще глушение мотора происходит отключением цепи IGN, в коде это 73 строка 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Опять жопа - теперь конкретно в коде. 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Ну вот наконец поправил код. Испытал его на стенде - все вроде работает без перебоев и ошибок. Единственное не удалось устранить вот какой момент: 

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

/ --------- определяем наименование портов ---------
const int parkPin = 2; // кнопка положения P коробки передач
const int brakePin = 3; // сигнал с ручника
const int tormozPin = 4; // кнопка тормоза  
const int butPin = 5;    // кнопка запуска

const int accPin = 10; // пин светодиода
const int ignPin = 11; // пин светодиода
const int startPin = 13; // пин светодиода

// --------- определяем переменные ---------
int statPark = 0; // положение коробки передач 
int statBrake = 0; // положение ручника
int statTormoz = 0; // положение педали тормоза
int butState = 0; // текущее положение кнопки
int Counter = 0; // переменная кол-ва нажатий
int activ = 0; // переменная введена как дополнительное условие

int lastButState = 0; // предыдущее положение кнопки

// ---------- установки -----------
void setup() {
  pinMode(parkPin, INPUT);
  pinMode(brakePin, INPUT);
  pinMode(tormozPin, INPUT);
  pinMode(butPin, INPUT);
  
  pinMode(accPin, OUTPUT);
  pinMode(ignPin, OUTPUT);
  pinMode(startPin, OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  // ----- считываем значения всех датчиков и кнопок ------
  statPark = digitalRead(parkPin); // значение коробки передач
  statBrake = digitalRead(brakePin); // значение ручника
  statTormoz = digitalRead(tormozPin); // значение педали тормоза
  butState = digitalRead(butPin); // значение кнопки запуска
  delay(100); // защита от дребезга контактов кнопки (пока так)
  // ------------------------------------------------------
  
  if (butState != lastButState) { // проверяем изменения положения кнопки start
    if (butState == HIGH) { // если она нажата то
        Counter++;              // увеличиваем счетчик на 1 и проверяем
       if (statPark == 1 && statBrake == 1 && Counter == 1) { //если акселератор стоит в положении P, ручник в положении Brake и счетчик равен 1 то
           Serial.println("ON ACC");    // пишем в порт "ON ACC"
           digitalWrite (accPin, HIGH); // включаем цепь АСС
           } 
       if (statPark == 1 && statBrake == 1 && statTormoz == 0 && Counter == 2) { //если акселератор стоит в положении P, ручник в положении Brake, тормоз не выжат и счетчик равен 2 то
           Serial.println("OFF ACC");   // пишем в порт "OFF ACC"
           digitalWrite (accPin, LOW);  // выключаем цепь АСС
           Counter = 0;                 // и сбрасываем счетчик до 0 
           } 
       if (statPark == 1 && statBrake == 1 && statTormoz == 1 && Counter == 2) { //если акселератор стоит в положении P, ручник в положении Brake и счетчик равен 2 и нажата педаль тормоза то
           Serial.println("ON IGN");    // пишем в порт "ON IGN"
           digitalWrite (ignPin, HIGH); // включаем цепь IGN
           activ = 1;                   // записываем в переменную activ значение 1
           }
       if (statPark == 1 && statBrake == 1 && statTormoz == 0 && Counter == 3) { //если акселератор стоит в положении P, ручник в положении Brake, счетчик равен 3 но не нажата педаль тормоза то
           Serial.println("OFF IGN");   // пишем в порт "OFF IGN"
           digitalWrite (ignPin, LOW);  // выключаем цепь IGN
           Counter = 1;                 // и сбрасываем счетчик до 1 
           }
       if (statPark == 1 && statBrake == 1 && statTormoz == 1 && Counter == 3 && activ == 1) { //если акселератор стоит в положении P, ручник в положении Brake, счетчик равен 3, доп условие равно 1 и нажата педаль тормоза то
           Serial.println("Start");       // пишем в порт "START"
           digitalWrite (startPin, HIGH); // запускаем двигатель (здесь нужно добавить процедуру временного отключения цепии АСС, 
           Counter = 2;                   // и привязать определение запущенного двигателя, счетчик сбрасываем до 2.
           activ = 0;                     // записываем в переменную activ значение 0, все дальнейшие действия при нажатом тормозе ни к чему не приведут
                 }
       if (Counter > 3) Counter = 2;      // если счетчик превышает значение 3 сбрасываем его до 2
      }
  }
lastButState = butState; // записываем текущее положение кнопки как предыдущее
}

Жду ваших коментариев и предложений. Особенно по оптимизации кода.

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Не плохой код!

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 То Dmitry23:

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Ребят подскажите как лучше и безопаснее коммутировать исполнительную часть. Мосфетами или релешками.

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Мне кажется в интернете про это очень много информации! MOSFET ключи они в принципе хороши, могут комутировать большие токи, да и управляющий ток гораздо ниже чем у реле!!! НО вот в чем дело как бы технологии небыли хороши, почему то автоконцерны продолжают применять реле, я думаю это связанно с тем что полупроводники не очень хорошо ведут себя при критически низких и высоких температурах, хотя ЭБУ ведь работают!!! Решать конечно же тебе но я бы выбрал Реле!!! Хотя цена импортных реле наверное выше чем MOSFET транзисторов!
 

Как дела у тебя с кодом, решил проблемму 69 строке??? 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Ну вот тот последний код я пока оставил как рабочую версию. Пока ни чего сильно не меняя. Так как все равно конечная версия кода будет писаться уже тогда когда будет готовое устройство. Есть предложения по этому поводу?

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

Попробовали с другом такую ситуацию. Он сел за стенд и начал тыкать - завести он не смог. После того как я ему показал как завести, он не смог заглушить, 1 раз из 3. После того как я ему показал как заглушить - все попытки были удачными. Это я к тому что если человек не знает какова логика действий - не так то просто завести двигатель, а это уже хорошо.

Dmitry23
Offline
Зарегистрирован: 16.09.2012

Ну вот Само собой родилась система защиты своеобразная!!! На счет определения завелся двигатель или нет вот какие мысли, стартер раскручивая двигатель достигает примерно >200  обборотов коленчатого вала, так вот если попробовать подобрать RC цепочку и настроить её таким образом чтобы допустим при 200 оборотах на выходе компаратора соединенного с этой RC цепочкой  появлялось постоянное напряжение, а там подключить к ардуино и в коде это дело отразить. Либо же раскурочить тахометр  взять прям постоянное напряжение с механизма стрелки и через аналоговый вход все остальное отразить в коде... а вот как это сделать програмно я еще пока понять не могу, толи счетчик какой нибудь мостырить, но это тогда будет не так то просто! 

maksim
Offline
Зарегистрирован: 12.02.2012

Dmitry23 пишет:

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

А с чего вы взяли, что механизм стрелки работает от постоянного напряженя? Такой принцип работы приборов только разве что на тазах ставили, а на иномарках уже наверное с середины 80 годов стрелки двигают шаговые двигатели.
Есть три универсальных способа определять состояние двигателя, это по сигналу аварийного давления масла, по сигналу заряда аккумулятора и по оборотам двигателя с датчика положения колен-вала/распред-вала или провод идущий к тахометру. Обороты определяются временем между импульсами.

Mastino
Offline
Зарегистрирован: 03.12.2011

 С генератора сигнал надо брать и все.. самое простое и надежное.. Ну конечно раскурочить тахометр или ловит сигналы от датчика хола принесет тот же результат.. только зачем это надо?

maksim
Offline
Зарегистрирован: 12.02.2012

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Вот окончательная схема подключения всего этого дела s41.radikal.ru/i092/1209/49/570729b90a9e.jpg

maksim
Offline
Зарегистрирован: 12.02.2012

 Что-то как-то релюшек многовато....

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Ну по другому  как-то ни как

maksim
Offline
Зарегистрирован: 12.02.2012

 Реле АСС, реле зажигания, реле стартера, а еще 2 зачем?

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Там еще отдельно идет цепь на вентилятор печки, который включается только в игн и отключается при старте. И отдельно цепь ECCS.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 При заведенном двигателе работать будут только три. Просто боюсь я запараллеливать цепь вентилятора с АСС. Лучше уж развести сразу под все - а если что то перекинуть и запрараллелить можно всегда

maksim
Offline
Зарегистрирован: 12.02.2012

А ECCS когда включается?

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

когда двигло запустилось, ща прикреплю схему может подскажите вариант 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 s017.radikal.ru/i415/1209/3c/e1bdb9249eb8.jpg

Боюсь что не желательно соединять провод ECCS и стартера. Всетаки не зря япошки так сделали.

maksim
Offline
Зарегистрирован: 12.02.2012

Nikelbak пишет:

 При заведенном двигателе работать будут только три. Просто боюсь я запараллеливать цепь вентилятора с АСС. Лучше уж развести сразу под все - а если что то перекинуть и запрараллелить можно всегда

Можно не параллелить

maksim
Offline
Зарегистрирован: 12.02.2012

Nikelbak пишет:

 s017.radikal.ru/i415/1209/3c/e1bdb9249eb8.jpg

Боюсь что не желательно соединять провод ECCS и стартера. Всетаки не зря япошки так сделали.

Сложно сказать зачем так сделано, может одно замыкается/размыкается чуть раньше другого, это надо видеть замок изнутри, а вообще и стартер и ECCS запускаются в одном положении... но может быть так, что ECCS продалжает работать и после того как ключ не в положении ST и на этом проводе (на ECCS) остается 12 вольт.... а выключается ECCS например при отключении зажигания.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Отличный вариант таким образом имеем всего 4 реле,  и при запущеном двигле работают только 2. Спасибо большое) s003.radikal.ru/i203/1209/f3/5a5d97b480f5.jpg