Автозапуск, первый проект
- Войдите на сайт для отправки комментариев
Первый проект на Ардуино Автозапуск
Здравствуйте.
Первый боле-мене серьезный проект на Ардуино, слизанный на http://compcar.ru/forum/showthread.php?t=9812&highlight=%C0%E2%F2%EE%E7%E0%EF%F3%F1%EA+%E0%F0%E4%F3%E8%ED%EE+nano и доработанный под свои требования. Ардуино появилась недавно …. Програмированием ни когда не занимался. Потихоньку разобрался с примерами из учебника. И вот что получилось (сильно не пинайте).Из оригинала удалено все относящееся к запуску по температуре (я не сторонник этого). На макетке заработало. Размышляя над помехозащишенностью сотовой связи, вспомнил о DTMF. На просторах интернета можно найти что угодно. Пошныряв по форумам понял что самостоятельно програмно этот вопрос не решу. DTMF-декодеров в нашем стольном граде Тамбовской губернии отродясь ни кто не видел. Схема нарисована для МТ8870 но применять наверное буду готовый http://ru.aliexpress.com/item/Free-shipping-1pcs-MT8870-DTMF-Voice-decoding-module-phone-module/32275055977.html (была распродажа, обошелся на порядок дедешевле). После вечера за компьютером скеч заработал на макетке. Алгоритм постановки на автозапуск описан в вышеупомянутой теме форума "компкара" Улучшать вроде есть что …… и добавлять тоже ……. Схема не очень то получилась ...... Но я первый раз на этом форуме ....... Научусь....
//Настройки unsigned long ENGINE_WARM_TIME = 600000; //В миллисекундах время работы мотора после запуска 600000 миллисекунд = 10 минут int ENGINE_START_MAX_TIME = 2; //В секундах масимальное время работы стартера //--------------выбор пинов ардуины по входу--------------------------------------------- const int hand_brake_in = 3; //d3 adruino Контакт стояночного тормоза "-" const int start_in = 4; //d4 adruino Сигнал команды на старт от мобильного телефона вибра звонка const int sharging_in = 5; //d5 adruino const int sharging_on = 0; // 0 когда во время работы генератора или от датчика давления масла на этом входе низкое состояние , 1 когда на лампе генератора при работе генератора высокое состояние const int hand_brake_on = 1; // 0= поднятый датчик ручника замыкает на массу тормоз активен (жигули), 1= датчик ручника в поднятом состоянии выдает высокий уровень напряжения // --------------выбор пинов ардуины по выходу--------------------------------------------- const int starter_out = 6; //d6 adruino реле стартера const int engine_out = 7; //d7 adruino зажигание const int secpower_out = 8; //d8 цепи вторичного питания печка, фары итд const int status_out = 9; //d9 светодиод статуса системы горит = система готова к работе(включена, ручник стоит). одно мигание запущен с первой попытки 2 со второй 3 с третьей int valu = 0; // переменные состояния входов сигнала DTMF //переменные входов двоичного сигнала DTMF int valu = 0; int vali = 0; int valo = 0; int valp = 0; //переменная для фактического режима int actual_mode = 0; // 2 двигатель начал работать int left_start_try = 0; // переменная для хранения остатка числа попыток запуска unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок void setup() { //---- настройка входов и выходов контроллера -------------- // init selected pins pinMode(hand_brake_in, INPUT); // enable input digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо pinMode(start_in, INPUT); // enable input // digitalWrite(start_in, HIGH); //pullup resustor enable pinMode(sharging_in, INPUT); // enable input // digitalWrite(sharging_in, LOW); //generator LOW normaly // это для DTMF pinMode(10, OUTPUT); // 10 пин - выход команды старта pinMode(A0, INPUT); // пины - вход с декодера DTMF pinMode(A1, INPUT); // подтянуть к "-" 10кОм (ежели треба) pinMode(A2, INPUT); pinMode(A3, INPUT); // init outputs pinMode(11, OUTPUT); // enable output digitalWrite(11, LOW); //set digital 0 //************реле обходчика*************** pinMode(12, OUTPUT); // enable output digitalWrite(12,LOW ); //set digital 0 //******************************************* pinMode(starter_out, OUTPUT); // enable output digitalWrite(starter_out, LOW); //set digital 0 pinMode(engine_out, OUTPUT); // enable output digitalWrite(engine_out, LOW); //set digital 0 pinMode(secpower_out, OUTPUT); // enable output digitalWrite(secpower_out, LOW); //set digital 0 pinMode(status_out, OUTPUT); // enable output digitalWrite(status_out, LOW); //set digital 0 //---- конец настройки входов и выходов контроллера -------------- Serial.begin(9600); } void loop() { //---- собственно это и есть весь код программы -------------- if (actual_mode < 2 ) //если двигатель не запущен { check_start(); //Управляем режимом запуска } //код условия обязательно включать в фигурные скобки если должно быть выполнено несколько инструкций, в данном случае одна, поэтому скобки опущены else // иначе { check_for_shutdown(); //Управляем режимом ожидания окончания прогрева } //но хорошая привычка фигурные скобки ставить всегда set_status_led(); //независимо от режима Управляем светодиодом статуса //------------------конец основного кода ----------------- } //---- дальше идут используемые функции и подфункции -------------- void check_start() { // опрашиваем входы vali = digitalRead(A0); valu = digitalRead(A1); valo = digitalRead(A2); valp = digitalRead(A3); if ((vali == 0)&&(valu == 0)&&(valo == 1)&&(valp == 1)){ //цифра старта в двоичном коде digitalWrite(10, 1); //при высоком уровне даём команду на старт } else {digitalWrite(10, 0); delay(1000); } if (digitalRead(hand_brake_in) != hand_brake_on) //без ручника не делаем запуск { actual_mode = 2; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны return; } if (digitalRead(start_in) == 1 && left_start_try == 0) // 1 is command for start - 1 значит импульс старта пришел с дистанционного управления <--- тут определяется полярность импульса запуска { left_start_try = 3; // указываем что нужно попытаться трижды запустить движок } if ( left_start_try > 0 ) { digitalWrite(12,HIGH);//включаем реле обходчика digitalWrite(engine_out, HIGH); //включаем зажигание digitalWrite(secpower_out, HIGH); //включаем печку фары итд delay(3000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление, все датчики включились if (digitalRead(hand_brake_in) != hand_brake_on) //без ручника не делаем запуск { actual_mode = 2; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны return; } if (digitalRead(sharging_in) != sharging_on ) // проверяем что генератор не работает { do_start(); // пытаемся запустить движок left_start_try = left_start_try - 1 ; //уменьшаем число попыток if (left_start_try == 0 ) actual_mode = 2; // заканчиваем попытки запустить движок } // конец проверки что ручник стоит а генератор не работает } } // конец процедуры старта void do_start() { //тут будет запуск движка // digitalWrite(engine_out, HIGH); //включаем зажигание // digitalWrite(secpower_out, HIGH); //включаем печку фары итд // delay(3000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление digitalWrite(secpower_out, LOW); //выключаем печку фары итд //----------------------------------------------------------------------------------- цикл стартера digitalWrite(starter_out, HIGH); //включаем стартер for (int secs=0; secs <= ENGINE_START_MAX_TIME ; secs++) // { delay(1000); // и продолжаем его держать включенным 1 секунду if (digitalRead(sharging_in) == sharging_on) //если зарядка пошла то break; // прерываем цикл } //----------------------------------------------------------------------------------- digitalWrite(starter_out, LOW); //отключаем стартер if (digitalRead(sharging_in) == sharging_on) //еще раз смотрим что зарядка пошла { actual_mode = 2; //Запоминаем что движок запущен last_start_time = millis(); // запоминаем время запуска движка } else { digitalWrite(engine_out, LOW); //выключаем зажигание чтбы разблокировать реле стартера digitalWrite(secpower_out, LOW); //выключаем печку фары итд delay(5000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление } } void check_for_shutdown() { //сюда мы попадаем когда контроллер считает что движок работает if (digitalRead(sharging_in) != sharging_on ) //проверяем что движок случайно не заглох do_shutdown(); else { digitalWrite(secpower_out, HIGH); //включаем печку фары итд digitalWrite(11,LOW); digitalWrite(12,LOW); } if (digitalRead(hand_brake_in) != hand_brake_on ) //проверяем что если злодеи сняли с ручника то глушим мотор { do_shutdown(); left_start_try =0; // и больше не заводим } //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время if (actual_mode != 0 ) //значит не выключили заглохший двигатель только что { if (millis() > last_start_time+ENGINE_WARM_TIME) // если текущее время больше чем время старта + время прогрева { do_shutdown(); left_start_try =0; // и больше не заводим } } } void do_shutdown() { digitalWrite(secpower_out, LOW); //выключаем печку фары итд digitalWrite(11,LOW); digitalWrite(12,LOW);//реле обходчика выключить digitalWrite(engine_out, LOW); //вырубаем зажигание actual_mode = 0; // движок выключили запомним это last_start_time = 0; // ну и забудем о том что он был включен } void set_status_led() { if (digitalRead(hand_brake_in) != hand_brake_on ) //Если ручник не стоит то выкл светодиод нечего ему в пути мигать попусту { digitalWrite(status_out, LOW); return; //прерываем выполнение функции } if (actual_mode == 2) //Движок запущен status_led_flash(); // показываем с какой попытки был прошлый запуск else digitalWrite(status_out, HIGH); // постоянное свечение - показываем что готов к следующему запуску } void status_led_flash() { static unsigned long big_interval = 0; static unsigned long flash_interval = 0; unsigned long flash_count = 0; flash_count = 3 - left_start_try; //сколько раз мигать //1 секундный интервал if (millis() > flash_interval + 1000L) flash_interval = millis() ; //задаем счетчие от 0 до 1 секунды //задаем 6 секунд if (millis() > big_interval + 6000L) { big_interval = millis() ; //задаем счетчие от 0 до 10секунд flash_interval = big_interval; } if (millis() < big_interval + flash_count * 1000L) // делим 6 секндный интервал на два периода, в первый мигаем количество раз соответствующее числу израсходованных попыток { //мигает if (millis() > flash_interval + 500L) digitalWrite(status_out, HIGH); else digitalWrite(status_out, LOW); } else { // негорит digitalWrite(status_out, LOW); //set digital 0 } }
Обработал немного схему
А чего строб с 8870 не используется? Как определить, что пришёл код DTMF?
Дело Ваше, куда проще по стробу считать полученный код. Надёжно и без зависимости от цикла опроса, который будет плавать. Плюс надежное считывание.
Понял . Спасибо. Буду в этом напрвлении упрощать-улучшать.
Прошу прощения . Нашел "оригинал" на этом форуме . http://arduino.ru/forum/proekty/kotntroller-distantsionnogo-progreva-avt... . Как перебраться в тему не знаю.
подскажите, пожайлуйста, форумчане, как реализрвать контроль запуска двигателя от сигнала тахометра или от датчика положения коленвала? в -17 заряд от генератора поступает схема считает запустился, а двигатель не успевает схватывать!
Лампочка заряда гаснет ещё при стартере? А давление масла ? Самое простое - переключиться к той лампочке которая гарантировано гаснет только после пуска двигателя. Тахометр - интересно, но времени пока нет заниматься......
стартер в мороз крутит так, что поднимается давление и начинает идти заряд аккумулятора. двигатель соответственно не заводится , а схема считает, что запуск произошел!
прикольненько, а что на счет того чтоб еще и сигналку оттключать во время пуска. датчик удара то еще никто не отменял? да и реле блокировки не у всех одно установленно, у кого то и 2 и три. кстати, есть и готовый скетч оттестированный и специально заточенный под карбюраторные авто с управлением заслонкой сервой и управлением ей же посредством пид
собственно основа кода взята там же)))
стартер в мороз крутит так, что поднимается давление и начинает идти заряд аккумулятора. двигатель соответственно не заводится , а схема считает, что запуск произошел!
возьмите за основу контроль по импульсам тахометра, из скетча выше. а уж какой градиент оборотов установыть как состояние (двигатель заведен) решайте сами
кстати в этом скетче имеется и запуск и глушение с кнопки. и отключение и включение сиги также посредством телефона. плюс ко всему после поворота ключа и выключения ручнтка включаются ДХО
И снова здравствуйте.
Следующий промежуточный скеч. С телефоном обкатал. И завожу и глушу. Шилд DTMF-декодера не дождался. Посему - решено програмно. Блокировка по импульсам датчика скорости примитивная. Пауза на 3600000. На нейтраль геркон прицепится .
Вроде всё в кучку собралось ....... Осталось звуковую индикацию влепить (на d11) для обратной связи..... Может что нибуть ещё придумать на аналоговые входы ........
Нужна помощь! Какой код необходимо и в каком месте прописать , чтобы когда запускался код поступал сигнал на один из выходов и по окончании как двигло прогрелось- пропадал? Очень нужно!
"чтобы когда запускался код поступал сигнал на один из выходов и по окончании как двигло прогрелось- пропадал? Очень нужно!"
Непонятно......
Что бы запускался код? ....Или когда запуститься двигатель?.... Двигатель прогрелся ?...... Или выключился (по истечении заданного времени) ?......
Если очень нужно - возьмите с одного из сигналов включения зажигания. Появляется по команде запуска , пропадает при выключении двигателя.
Температура двигателя в вышеприведенных скетчах не контролируется.
Здравсвтуйте, помогите новичку, как вписать в код программы, чтобы перед тем как завестись, авто синмалось с охраны, а потом обратно после того как заведется? И как это все оформить в электронике авто?
Здравсвтуйте, помогите новичку, как вписать в код программы, чтобы перед тем как завестись, авто синмалось с охраны, а потом обратно после того как заведется? И как это все оформить в электронике авто?
ответ в 10 посте в готовом виде. подключение посредством двух реле и лишнего пульта брелока.
"чтобы когда запускался код поступал сигнал на один из выходов и по окончании как двигло прогрелось- пропадал? Очень нужно!"
Непонятно......
Что бы запускался код? ....Или когда запуститься двигатель?.... Двигатель прогрелся ?...... Или выключился (по истечении заданного времени) ?......
Если очень нужно - возьмите с одного из сигналов включения зажигания. Появляется по команде запуска , пропадает при выключении двигателя.
Температура двигателя в вышеприведенных скетчах не контролируется.
"Температура двигателя в вышеприведенных скетчах не контролируется." не могу согласиться. изучите так же скетч из 10 поста.
В коде http://arduino.ru/forum/proekty/kotntroller-distantsionnogo-progreva-avt... контролируется . В Вашем наверное тоже(на досуге посмотрю). В моих - нет.
Пост 1 - "....Из оригинала удалено все относящееся к запуску по температуре (я не сторонник этого)......".
Пост 19 - Прошу прощения - "..... Температура двигателя в вышеприведенных МОИХ скетчах не контролируется....."
Здравствуйте форрумчане, собираюсь сделать что-то вроде такого же. Каким образом ардуинка понимает, что двигатель завелся?
Написал корявенький алгоритм, но не знаю как реализовать некоторые функции
алгоритм должен проверять датчик скорости и таходатчик, сигнал с которых идет импульсныйю Если есть какие предложения, как это в коде можно это сделать или аппаратно посоветуйте.
Здравствуйте форрумчане, собираюсь сделать что-то вроде такого же. Каким образом ардуинка понимает, что двигатель завелся?
155 |
if
(digitalRead(sharging_in) == sharging_on)
//если зарядка пошла то
Спасибо, а по остальному может есть у кого предложения?
А как добавить функцию питстопа?
Можно также добавить функцию, если машина завелась, то происходит дозвон на сотку.
Друзья помогите допилить скетч , для запуска двигателя при включеном зажигании(от ключа) педалью тормоза. вход с педали тормоза на arduino реализован по схеме выше ,контроль заряда.
сильно не пинайте, в коде пока не особо,учусь изучаю.
собственно основа кода взята там же)))
он не обработает такое количество информации. CPU загружается и умирает на первой секунде когда ставишь на ручник))) ну это симулировал в ПРОТЕУСе. может в реале справится.
Я собираюсь делать то же самое. Заказал Арду нано, стабилизатор и блок реле из четырёх реле. Но у моего телефона не будет батарейки, от сюда вопрос как добавить в скетч и куда строку в которой Андуин будет включать телефон по средством включения реле на 2 секунды?
И ещё вопрос про DTMF. В предложенной вами схеме процесс будет выглядеть так- звонишьтна телефон, на нем срабатывает автоподнятие, дальше набираешь комбинацию клавишь, и декодер разбирает тональности и при правильной тональности, а следовательно правильной последовательности нажатия кнопок, даёт команду на запуск? Я правильно все понял?
Такое устройство есть у старлайна называется Starline M21 стоит сейчас правда 5900р.
На Али экспрессе модуль dtmf для ардуино стоит 200 рублей.
5900 и 200 почувствуйте разницу
http://ru.aliexpress.com/item/wholesale-1pcs-MT8870-DTMF-Voice-decoding-...
ссылка на DTMF с али
есть тут знающие люди, которые могу допилть код? Кто нибудь уже собираль натуральную модель с DTMF?
пока жду от вас ответов дорогие форумчане, напишу о своих представлениях по поводу работы данного девайса.
1. Необходимо прикрутить DTMF к нему и аппаратно и програмно, с возможностью, при нажатии к примеру кнопки 1 во всемя разговора, завести двигатель, а нажатием кнопки 2 заглушить. Сейчас есть у каждого оператора тарифы с бесплатными исходящими внутрисетевыми звоками.
http://ru.aliexpress.com/item/wholesale-1pcs-MT8870-DTMF-Voice-decoding-...
2. Готовить релейный блок самому смысла не вижу, на алиэкспресе за 200 рублей есть готовый релейный модуль с 4 реле на борту, которые вполне подойдут для включения двух положений зажигания, стартера и имобилайзера.
http://ru.aliexpress.com/item/Free-Shipping-1PCS-LOT-5V-4-Channel-Relay-...
3. GSM модуль покупать смысла не вижу, так как у каждого дома есть какой нибудь старый телефон который не жалко использовать под эти цели.
4. телефон нужно использовать без акумуляторной батареии, так как со временем батарейка вздуется от постоянного стояния на зарядке, для этих целей нужно использовать DC-DC конвертер, и поэтому же в скетче нужно предусмотреть включение телефона путем появления 2 секундного сигнала на одном их выходов аврдуино, после его включения и до момента ожидания сигнала на пуск.
http://ru.aliexpress.com/item/New-Arrival-LM2596-Power-Module-DC-DC-Buck...
вот собственно и все мысли, с аппаратной частью справлюсь сам и по мере прихода с алиэкспресс посылок буду выклдывать фото изготовления устройства в целом. Но я не умею програмировать, хотя и понимаю что здесь к чему. Мне бы проще было бы если б кто то помог, но если таких не найдется то придется и програмирование ардуино самостоятельно изучать.
Здравствуйте, Хотел бы предостеречь Вас от использования релейного блока с али.
Я пробовал использовать такой на предыдущей своей версии автозавода.
Эти реле оказались слабоваты. На моем солярисе фары ключаются сразу.
Вот и посчитайте фары, печка, уменя еще обогрев сидений был задействован. ампер 20-30 спокойно наберется.
А на этих реле с али ножки тонюсенькие. Вобщем грелись у меня эти релюшки, поменял я их. Сечас на другой машине использую другие тоже с али:
http://ru.aliexpress.com/item/NEW-6PCS-Relay-T91-SLC-12VDC-SL-C-relay-12V-30A-250V/1848191813.html
Можете посмотреть в моей теме здесь.
Спасибо за совет. У меня проблема. Пока я жду все запчасти, я прибывал запустить виртуальный Арду нано на протеусе. Но почему то у меня не работают скетчи которые тут выложены. После команды на старт только зажигание включается и все. Не могли бы вы свой скетч мне скинуть. Заранее спасибо.
Так вот же мой скетч в этой теме http://arduino.ru/forum/proekty/avtomaticheskii-zapusk-dvigatelya-avtomobilya
Только у меня не используются DTFM команды. Запуск происходит по звонку. Логика такая позвонил автомобилю он трубку не берет, после второго гудка сбрасываешь, машина начинает пытаться заводиться, если завелась, отзванивается. Хозяин по желанию может взять трубку и послушать, а может не брать, а просто сбросить. Чтобы заглушить двигатель звонишь и после первого гудка машина глохнет и берет трубку. Сбрасываешь и все. Так же машина отзванивается когда глохнет по времени прогрева. Еще она отзванивается по сигналу от вибродатчика. На протеусе скетч не проверял.
Работает уже два месяца на машине.
Спасибо. Буду изучать ваш проект. Если возникнут вопросы можно как то связаться с вами по почте или ватсап? Моя почта. Constantinoff@list.ru. буду признателен если отправите пустое тестовое письмо, для того что бы когда у меня возникнет к вам вопрос я смог связаться с вами.
пытаюсь компелировать ваш скетч и выдает ошибку. У вас не осталось файла скетча? Если вам не трудно не могли бы вы выложить его куда нибудь на файлообменник? Хочу попробывать его на эмуляторе.
Доброго времени суток.
По Вашему коду возник вопрос. Какой датчик температуры Вы использовали?
Здравствуйте, Хотел бы предостеречь Вас от использования релейного блока с али.
Я пробовал использовать такой на предыдущей своей версии автозавода.
Эти реле оказались слабоваты. На моем солярисе фары ключаются сразу.
Вот и посчитайте фары, печка, уменя еще обогрев сидений был задействован. ампер 20-30 спокойно наберется.
А на этих реле с али ножки тонюсенькие. Вобщем грелись у меня эти релюшки, поменял я их. Сечас на другой машине использую другие тоже с али:
http://ru.aliexpress.com/item/NEW-6PCS-Relay-T91-SLC-12VDC-SL-C-relay-12V-30A-250V/1848191813.html
Можете посмотреть в моей теме здесь.
дешевле в магазине автомобильное реле взять