Проблемы с старт-стоп
- Войдите на сайт для отправки комментариев
Чт, 24/08/2017 - 14:15
Помогите разобраться,
void start() // Подпрограмма запуска ДВС { if(digitalRead(6)==HIGH) // если кнопка нажата, то .... { digitalWrite(9,LOW); // выключаем acc digitalWrite(10,HIGH); // включаем ing 1 digitalWrite(11,HIGH); // включаем ing 2 delay(2000); digitalWrite(12,HIGH); } if(digitalRead(7)==LOW&&digitalRead(8)==HIGH) // если есть сигнал с генератор(+12V) или отпущенн тормоз { digitalWrite(12,LOW); // выключаем стартер digitalWrite(9,HIGH); // включаем ACC } }
Отрывок из моего скетча,не могу понять что делаю не так,по условию при нажатии на кнопку включается зажигание ждем пару сек запускаем стартер и не выключаем пока не получим сигнал с генератора или не отпустим тормоз,а по-факту зажигание включается,стартер включается но при подаче сигнала с генератора или отпускания тормоза стартер не отключается,в чем может быть ошибка,и как в этом месте избавиться от delay?
В строке 11 в комментарии написано ИЛИ, а в программе условие И. Т.е. Вы требуете чтобы было и то, и другое.
Но, хрустальный шао показывает, что дело даже не в этом, думаю, что если поступит сигнал с генератора И Вы отпустите тормоз - один хрен не сработает. Так? Если так, то, скорее всего дело в том как эта функция вызывается, а этого Вы не показали.
Вы правы по-поводу ИЛИ,исправил стала гаснуть при отпушенном тормозе но если секунд пять не отпускать тормоз а потом отпустить то условие не срабатывает и стартер продолжает работать,думаю возможна проблема в delay Вот полный скетч
Вы пишите что неправильно вызывается ф-ция,а как нужно правильно ее вызывать?
Ну, нечто подобное я и предполагал.
Вот смотрите, функция start вызывается в строке 59 всегда, когда нажат тормоз. Никаких других условий нет. Притормозили перед ямкой – вызвалась функция start. Если тормоз держим долго, то функция start вызывается постоянно.
Идём дальше. Допустим, Вы вошли в функцию старт, и условие в строке 111 сработало, через 2 секунды в строке 117 включился стартёр. Разумеется машина не заведётся за доли микросекунды, потому условие в строке 119 будет пока ложным и из функции Вы выйдете. При следующем проходе loop Вы в неё снова войдёте и скорее всего кнопка ещё не будет отпущена, поэтому вместо того. чтобы ждать когда заведётся, Вы начнёте заводить снова.
В общем, с логикой у Вас напутано до безобразия.
Сейчас Вам надо не от делэя избавляться, а чётко продумать логику автомата и переписать скетч под неё.
В том-то и дело что напутано,два дня сижу уже никак не разобраться,мозги уже кипят.
Выпишите логику начисто простыми словами. А как выпишите, просто напишите под неё новый скетч.
У вас в функции start() неверная логика. Вы в строке 117 включаете стартер и сразу же, в строке 119 - проверяете, не появился ли сигнал с генератора. Между этими событиями в программе проходит несколько микросекунд, поэтому не удивительно, что сигнала с генератора еще нет и стартер не выключается. Вам надо в этой процедуре сделать условием выхода выключение стартера, а пока он работает - крутится в цикле и ждать.
update - Евгений уже все навписал
Здравствуйте, проверьте логику работы программы ещё раз, и ошибки в условиях If-ов (например, строка 87).
Ваша функция: что-то делает, ничего не делает 2 сек., что-то включает и сразу проверяет условие всего один раз, и если на тот момент ничего не произошло - выходит...
Можно дожидаться условия в цикле.
В while можно хоть бесконечно его ждать).
несколько микросекунд
Гораздо меньше. Там же между включение стартёра и проверкой нет ничего, так что речь идёт только о самой проверке - думаю, что максимум 0,25 - 0,5 микросекунды.
Логика вроде простая-должно быть три режима если не нажата педаль тормоза 1) все выключено 2)включено зажигание 1 3)включено зажигание 2 и если еще раз нажать на кнопку и нажать педаль тормоза то включаем стартер до тех пор пока не будет сигнала с генератора или пока не будет отпущена кнопка.Запуск в одно касание-если нажата педаль тормоза нет сигнала генератора,включаем зажигание 1и2 ждем 2 секунды,включаем стартер пока не поступит сигнал с генератора или не отпущена педаль тормоза и все,вроде ничего сложного но получается ерунда какая-то.
Здравствуйте,с while согласен буду пробывать,а в чем ошибка в 87 if немного не понял?если нажата кнопка и нажат тормоз и флаг 0
Это не логика, это набор слов. Так Вы ничего не запрграммируете.
Разработка автомата делится на следующие этапы:
1. Выписать все состояния в которых может находиться автомат
2. Выписать все управляющие воздействия, которые могут поступить
3. Выписать все действия, которые могут быть выполнены
Затем
4. составляется таблица. По горизонтали выписываются все сигналы, по вертикали все состояния. В клетках (пересечениях состояния и поступившего сигнала) записываются две вещи:
1) действие, которое должно быть выполнено если автомат находится в данном состоянии и поступил данный управляющий сигнал.
2) новое состояние, в которое автомат должен перейти после выполнения действия.
После того, как Вы нарисуете такую таблицу, программирование окажется примитивным процессов. Нужно будет просто сделать switch по состояниям и в каждом case проверять поступление управляющих сигналов. Как только выяснится, что какой-то поступил - вполнять действие и переходить в новое состояние записанные в таблице на пересечении текущего состояния и поступившего сигнала. И так постоянно в бесконечном цикле.
Заметьте, при таком подходе не нужно бороться с delay - он тут нигде не появляется сам по себе.
Я понятно обяснил?
Выходит есть какая-то кнопка и педаль тормоза?
Отбросив на время педаль тормоза, получается, что по каждому нажатию кнопки мы переходим циклично по режимам их всего 3 (пока всё просто, только от дребезга избавиться надо не только флагом, а то будет "рулетка", а не кнопка, если код выполняется быстрее чем проходит дребезг).
Но вот с педалью тормоза непонятно вообще, есть четвертый режим? если нажать педаль и щелкнуть одновременно кнопкой?
И пятый режим? Опять только педалью тормоза?
Ошибка в 87, забыли один &
Кнопка притянута к массе,есть 3 режима без нажатия тормоза,и автоматический пуск в одно касание при нажатой педали тормоза.
Вообще, знаете, возьмите вот эту книгу и прочитайте в ней раздел 1.2 - это всего несколько страниц. Там разобран пример с "умным светофором". Остальную книгу можете читать или не читать по желанию, но этот пример разберите обязательно причём так, чтобы Вы точно его полностью поняли.
Как только Вы поймёте этот пример, Вы увидите насколько он похож на то, что я Вам писал выше и, самое главное, Вы с удивлением обнаружите, что такой подход делает тривиальным программирование практичски любого "умного девайса" - практически любого. Потому что с таким подходом можно любой девайс программировать одинаково (так, как я описал парой постов выше с длинным switch и безо всяких делэев).
Возможно, у Вас после этого останется один вопрос - как отрабатывать временные задержки (там этого нет), но когда Вам всё остальное будет понятно, временные задержки я Вам за пять минут объясню - сейчас труднее, т.к. у Вас нет базовых понятий.
Изучите, не поленитесь - это будет такая прокачка Вашего скиллза - потом будете меня искать, чтобы коньяком напоить.
Спасибо обязательно сейчас посмотрю,а знаний действительно мало,интерес есть и хочется научиться,я примерно понимаю про что вы говорите,но пока сложновато это все,с коньяком без проблем.
Прочитал,не понял вообще ничего...
А не могли бы вы привести пример while в данном скетче?
Пользуйтесь справкой, копировать чей-то код пусть даже очень "хороший" хуже чем писать свой, в котором вы разобрались)))
http://arduino.ru/Reference/While
Про логику работы: Педаль тормоза из любого режима срабатывает или из определенного?
Что будет если несколько раз нажимать на тормоз? Если мотор уже работает, то зачем его заводить?
Для отладки: добавте себе в ключевых местах вывод в последовательный порт (Serial), входные данные, и режим в котором находится программа, очень иногда помогает...
Справкой пользуюсь но не все ясно особенно с while,пересмотрел кучу примеров,пока совсем не ясно,но направление понял while думаю будет то что мне нужно,педаль тормоза срабатывает так что бы пока ты на нее не нажмешь не возможно было запустить двигатель,получается только в двух режимах ручного пуска и пуска в одно нажатие.С портом мысль хорошая,попробую может быть что-нибудь даст,правда у меня диоды подключены и визуально я все так же вижу как и в порте.