PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Разработка программ (http://pccar.ru/forumdisplay.php?f=27)
-   -   HELP!! Arduino (http://pccar.ru/showthread.php?t=16136)

Dj Aleks 28.10.2011 17:52

HELP!! Arduino
 
Подскажите пожалуйста как зациклить программу, чтобы она читалась постоянно по кругу?

Dj Aleks 28.10.2011 17:54

перерыл все...
void loop()
{
тело программы
}
вроде это, но программа доходит до конца и не стартует заново :(

Dj Aleks 28.10.2011 17:57

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


int Vhod=2; //вход
int Vihod=13 //выход

void setup()
{
pinMode(VhodPin, INPUT);
pinMode(VihodPin,OUTPUT);

}


if (digitalRead(VhodPin) == HIGH)
{
digitalWrite(VihodPin, HIGH);
delay(100);
digitalWrite(VihodPin, LOW);
delay(100);
digitalWrite(VihodPin, HIGH);
delay(100);
digitalWrite(VihodPin, LOW);
delay(100);
}

Hamster 28.10.2011 20:23

Цитата:

Сообщение от Dj Aleks (Сообщение 200124)
что не правильно делаю?

Добавил жирным косяки:

// Неудачное название переменных. Отличаются одной буквой, да она еще в середине и не особо видна.
// Код становится хреново читаемый, появляется большая вероятность ошибки
// Обычно вход именуют от слова input, выход от output. Типа inPin и outPin будет much better :)

int VhodPin=2; //вход
int VihodPin=13 //выход

void setup()
{
pinMode(VhodPin, INPUT);
pinMode(VihodPin,OUTPUT);

}

void loop() //эта функция нужна, она собственно и вызывается в цикле
{
up_dn();
}


// Этот код надо оформлять в функцию и вызывать из loop()
// правда я не уверен, что ее нужно вызывать в цикле :)
// к примеру:
void up_dn()
{

if (digitalRead(VhodPin) == HIGH) // насколько я понимаю интересует переход из LOW в HIGH, для этого есть функция PulseIn()
{
digitalWrite(VihodPin, HIGH);
delay(100);
digitalWrite(VihodPin, LOW);
delay(100);
digitalWrite(VihodPin, HIGH);
delay(100);
digitalWrite(VihodPin, LOW);
delay(100);
}
}

Вообщем для начала читать:
http://www.freeduino.ru/arduino/lang.html
и
http://arduino.cc/en/Reference/HomePage

Dj Aleks 28.10.2011 20:47

это скинул пример... void loop() забыл поставить...
вот собственно программа сама... за ссылки спасибо, но уже все давно распечатано и по 1000000 раз штудировано :)
отладку веду в Proteus... когда нажимаю 2 кнопки StartPin и TormPin программа отрабатывает на ура весь цикл до (выделенного красным) потом если нажать кнопку StartPin, то программа все правильно тушит, если нажать сначала TormPin а потом StartPin, то ничего больше не происходит! если корректно все выполнить то она через раз возвращается в начало программы...

int StartPin=0; //вход для кнопки start stop engine
int TormPin=1; //вход для лягушки педали тормоза
int CamPin=2; //вход для камеры заднего вида
int ACCPin=8; //выход на реле зажигания АСС
int StPin=9; //выход на реле стартера
int MBPin=10; //выход на Блок питания ноутбука
int RemPin=11; //выход на включение усилителя (remote)
int CmPin=12; //выход кнопки переключения камеры заднего вида
int RSPin=13; //Выход кнопки для старта ноутбука

void setup()
{
/*Объявляем входы и выходы*/

pinMode(StartPin, INPUT);
pinMode(TormPin, INPUT);
pinMode(CamPin, INPUT);
pinMode(ACCPin, OUTPUT);
pinMode(StPin, OUTPUT);
pinMode(MBPin, OUTPUT);
pinMode(RemPin, OUTPUT);
pinMode(CmPin, OUTPUT);
pinMode(RSPin, OUTPUT);

}

void loop()
{
if (digitalRead(StartPin) == HIGH && digitalRead(TormPin) == HIGH) //сравнение 2 входов
{
digitalWrite(ACCPin, HIGH); //включаем зажигание
delay(150);
digitalWrite(StPin, HIGH); //включаем стартер
delay(200);
digitalWrite(StPin, LOW); //выключаем стартер через 10 сек
delay(50);
digitalWrite(MBPin, HIGH); //Подаем напряжение на блок питания ноутбука
delay(40);
digitalWrite(RSPin, HIGH); //нажатие кнопки ноутбука
delay(20);
digitalWrite(RSPin, LOW); //отпускаем кнопку
delay(1200);
digitalWrite(RemPin, HIGH); //remote усилителя

}

if (digitalRead(StartPin) == HIGH) //сравниваем значение кнопки
{
digitalWrite(ACCPin, LOW); //выключаем АСС
delay(100);
digitalWrite(RemPin, LOW); //Усилители
digitalWrite(RSPin, HIGH); //кнопка ноутбука
delay(100);
digitalWrite(RSPin, LOW); //отпускаем
delay(1200);
digitalWrite(MBPin, LOW); //глушим блок питания бука

}

}

Dj Aleks 28.10.2011 20:48

if (digitalRead(VhodPin) == HIGH) // насколько я понимаю интересует переход из LOW в HIGH, для этого есть функция PulseIn()

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

Hamster 28.10.2011 21:36

Цитата:

Сообщение от Dj Aleks (Сообщение 200134)
если честно интересует немного другое... а именно авто переключение на камеру заднего вида... но как заставить выполняться программу когда она стопорится пока на входе HIGH, как писал выше...

можно использовать прерывание. т.е. можно указать, что при переходе из состояния X в состояние Y вызывается определенная процедура.
Пример можно посмотреть тут. И вообще, на компкаре по ардуино много интерестного, целый раздел с подразделами.

BlkDem 28.10.2011 21:36

Попробуй вот так:

PHP код:

void loop()
{
if ((
digitalRead(StartPin) == HIGH) && (digitalRead(TormPin) == HIGH)) //сравнение 2 входов
{
digitalWrite(ACCPinHIGH); //включаем зажигание
delay(150);
digitalWrite(StPinHIGH); //включаем стартер
delay(200); 
digitalWrite(StPinLOW); //выключаем стартер через 10 сек
delay(50); 
digitalWrite(MBPinHIGH); //Подаем напряжение на блок питания ноутбука 
delay(40); 
digitalWrite(RSPinHIGH); //нажатие кнопки ноутбука
delay(20); 
digitalWrite(RSPinLOW); //отпускаем кнопку
delay(1200); 
digitalWrite(RemPinHIGH); //remote усилителя

}

if ((
digitalRead(StartPin) == HIGH) && (digitalRead(TormPin) == LOW)) //сравниваем значение кнопки
{
digitalWrite(ACCPinLOW); //выключаем АСС
delay(100);
digitalWrite(RemPinLOW); //Усилители 
digitalWrite(RSPinHIGH); //кнопка ноутбука
delay(100); 
digitalWrite(RSPinLOW); //отпускаем
delay(1200);
digitalWrite(MBPinLOW); //глушим блок питания бука

}



Код сознательно не оптимизирован ;)

Dj Aleks 28.10.2011 21:37

Цитата:

Сообщение от Hamster (Сообщение 200135)
можно использовать прерывание. т.е. можно указать, что при переходе из состояния X в состояние Y вызывается определенная процедура.
Пример можно посмотреть тут. И вообще, на компкаре по ардуино много интерестного, целый раздел с подразделами.

спасибо громадное за наводку... а что с основной прогой?

Hamster 28.10.2011 21:38

Цитата:

Сообщение от Dj Aleks (Сообщение 200134)
но как заставить выполняться программу когда она стопорится

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

Dj Aleks 28.10.2011 21:39

пробовал так))) схема перестает вообще работать! :( если void loop() зацикливает программу, то почему она после когда все потушили не запускается по новой?

BlkDem 28.10.2011 21:42

Код ТС работать не будет. Условия некорректны ;)

Dj Aleks 28.10.2011 21:42

Цитата:

Сообщение от Hamster (Сообщение 200138)
Программа не может взять и остановиться :)
Она может зациклится или тупо стоять и ждать определенного события (считай тот же цикл).

но событие есть)))
void loop()
{
if (digitalRead(VhodPin) == HIGH)
digitalWrite(VihodPin, HIGH); // вот первое, на котором останавливается
delay(100); //вот дальше
digitalWrite(VihodPin, LOW);
delay(100);
digitalWrite(VihodPin, HIGH);
delay(100);
digitalWrite(VihodPin, LOW);
delay(100);
}
}

Dj Aleks 28.10.2011 21:44

Цитата:

Сообщение от BlkDem (Сообщение 200141)
Код ТС работать не будет. Условия некорректны ;)

а в чем именно?!:hang::secret:

Dj Aleks 28.10.2011 21:46

уже вешаться хочется от arduino этого.... вроде все просто, а вроде.....

BlkDem 28.10.2011 21:50

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

Так еще попробуй.

PHP код:

void loop() 

if ((
digitalRead(StartPin) == HIGH
{
 if (
digitalRead(TormPin) == HIGH)) //сравнение 2 входов 

digitalWrite(ACCPinHIGH); //включаем зажигание 
delay(150); 
digitalWrite(StPinHIGH); //включаем стартер 
delay(200);  
digitalWrite(StPinLOW); //выключаем стартер через 10 сек 
delay(50);  
digitalWrite(MBPinHIGH); //Подаем напряжение на блок питания ноутбука  
delay(40);  
digitalWrite(RSPinHIGH); //нажатие кнопки ноутбука 
delay(20);  
digitalWrite(RSPinLOW); //отпускаем кнопку 
delay(1200);  
digitalWrite(RemPinHIGH); //remote усилителя 


else

digitalWrite(ACCPinLOW); //выключаем АСС 
delay(100); 
digitalWrite(RemPinLOW); //Усилители  
digitalWrite(RSPinHIGH); //кнопка ноутбука 
delay(100);  
digitalWrite(RSPinLOW); //отпускаем 
delay(1200); 
digitalWrite(MBPinLOW); //глушим блок питания бука 


}


Мог попутать количество скобок, не обессудь :)

Dj Aleks 28.10.2011 21:51

Вложений: 1
вот отладочная схема...

BlkDem 28.10.2011 21:54

Таблицу соответствия пинов ардуины и атмеги имеешь перед глазами? Ничего не перепутано?

Dj Aleks 28.10.2011 21:55

Цитата:

Сообщение от BlkDem (Сообщение 200148)
У тебя оба условия будут выполняться. Пофиг, нажат тормоз или нет. Условия не исключающие. Поэтому, я тебе показал, что тормоз надо опрашивать в обоих случаях.

Так еще попробуй.

PHP код:

void loop() 

if ((
digitalRead(StartPin) == HIGH
{
 if (
digitalRead(TormPin) == HIGH)) //сравнение 2 входов 

digitalWrite(ACCPinHIGH); //включаем зажигание 
delay(150); 
digitalWrite(StPinHIGH); //включаем стартер 
delay(200);  
digitalWrite(StPinLOW); //выключаем стартер через 10 сек 
delay(50);  
digitalWrite(MBPinHIGH); //Подаем напряжение на блок питания ноутбука  
delay(40);  
digitalWrite(RSPinHIGH); //нажатие кнопки ноутбука 
delay(20);  
digitalWrite(RSPinLOW); //отпускаем кнопку 
delay(1200);  
digitalWrite(RemPinHIGH); //remote усилителя 


else

digitalWrite(ACCPinLOW); //выключаем АСС 
delay(100); 
digitalWrite(RemPinLOW); //Усилители  
digitalWrite(RSPinHIGH); //кнопка ноутбука 
delay(100);  
digitalWrite(RSPinLOW); //отпускаем 
delay(1200); 
digitalWrite(MBPinLOW); //глушим блок питания бука 


}


Мог попутать количество скобок, не обессудь :)

получается тогда, что если оба канала HIGH то действие выполнится, правильно... а потом else если на 2 каналах не будет HIGH то сработает второе правило... а это значит при движении нажмешь кнопку, понятно, ладно, проехали... а если тормоз)))))) сразу выполняется все что после else...

Dj Aleks 28.10.2011 21:57

Вложений: 1
Цитата:

Сообщение от BlkDem (Сообщение 200150)
Таблицу соответствия пинов ардуины и атмеги имеешь перед глазами? Ничего не перепутано?

имею....

Dj Aleks 28.10.2011 22:06

может тогда надо else if????


Оператор If..else

Конструкция if..else предоставляет больший контроль над процессом выполнения кода, чем базовый оператор if, позволяя осуществлять несколько проверок, объединенных вместе. Например, аналоговый вход может быть проверен и выполнено одно действие, если на входе меньше 500, или другой действие, если на входе 500 или больше. Код при этом может выглядеть так:
if (pinFiveInput < 500)
{
// действие A
}
else
{
// действие B
}

Другой способ создания переходов со взаимоисключающими проверками использует оператор switch case.

Else позволяет делать отличную от указанной в if проверку, чтобы можно было осуществлять сразу несколько взаимоисключающих проверок. Каждая проверка позволяет переходить к следующему за ней оператору не раньше, чем получит логический результат ИСТИНА. Когда проверка с результатом ИСТИНА найдена, запускается вложенная в нее блок операторов, и затем программа игнорирует все следующие строки в конструкции if..else. Если ни одна из проверок не получила результат ИСТИНА, по умолчанию выполняется блок операторов в else, если последний присутствует, и устанавливается действие по умолчанию.

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

if (pinFiveInput < 500)
{
// выполнять действие A
}
else if (pinFiveInput >= 1000)
{
// выполнять действие B
}
else
{
// выполнять действие C
}

BlkDem 28.10.2011 22:22

Мы твое видение задачи не представляем, поэтому и советуем, считай, на ощупь. Но смысл ты улавливаешь - эт хорошо. Не спеши, разбирайся, понимание не сразу приходит ;)

Dj Aleks 28.10.2011 22:28

смысл простой...
1. Сделать запуск двигателя по кнопке.
2. Управление питанием усилителей, мониторов, компа. Включение и выключение компа по кнопке.
3. Переключение на камеру заднего вида и назад.

значит...
1 и 2. нажимаем кнопку. Включается АСС. включаем стартер на 10 секунд. через 1 сек подаем питание на блок питания ноутбука и монитора. нажатие кнопки ноутбука. через 30 сек включение усилителей.
нажимаем кнопку еще раз... выключение АСС, усилителей. нажатие на кнопку выключения компа. через 1 минуту выключение блока питания ноутбука...
3. при включении задней передачи, нажатие на кнопку один раз, при выключении нажатие на кнопку 2 раза.. вот весь алгоритм...

Dj Aleks 28.10.2011 22:37

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

Dj Aleks 28.10.2011 22:58

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

Dj Aleks 29.10.2011 01:15

Уважаемые Гуру. Работаю в эмуляторе proteus. на atmege328P попробовал поставить atmega8 подключил все так же... загружаю скетч, и не тут то было... не работает.. ставлю назад 328Р все ок... в чем может быть трабл?... от ардуины решил отказаться и усложнить себе задачу))) купить атмегу и самому печатку сделать... 8 атмега просто дешевле)))

Dj Aleks 29.10.2011 21:11

Вложений: 1
вот схема подключения

awtoap 30.10.2011 18:35

На вскидку могу сказать отличаются адреса и количество регистров у процов и тд. Поставь мегу 48,88,168 по идее это её братья, только с меньшей памятью программ.

Dj Aleks 30.10.2011 23:25

не идет все равно... на 6 выходе постоянно HIGH...

ide16rus 07.12.2012 22:44

Тоже задумал сделать систему Start/Stop по кнопке с помощью ардуино уно, но, ёптель, я никак не помышлял о том, чтобы тупо стартером 200мс крутить :) Я думал, что нужно для запуска двигателя по кнопке следующее:
1. Контрольный вход кнопки Start/Stop
2. Контрольный вход "Состояние сигнализации" (т.е. проверить на охране или нет)
3. Контрольный вход "ключ зажигания" (т.е. наличие разрешающего сигнала с некоего контрольного устройства, активируемого дистанционно или посредством вставки ключа или совмещённое с ним).
4. Контрольный вход "тахометр".
5. Контрольный вход "спидометр".
6. Управляющий выход "Зажигание".
7. Управляющий выход "Стартер".

Логику работы этого дела представлял себе так:
1. Ардуино без ключа работать не должно. Включаться и запускать циклическую программу должно только при вставке ключа (грубо говоря это дублирует контрольный вход 3. Можно от него отказаться заменив просто подачей питания на ардуино).
2. Далее при вставке ключа циклическая программа запускается и начинает опрашивать контрольные входы. Главным условием для разрешения является состояние "снято в охраны" на входе "состояние сигнализации".
3. Затем каким-то образом требуется проконтролировать состояние скорости. Если на входе "спидометра" нет импульсов (машина стоит на месте), то кнопка старт/стоп сработает... Если авто в движении - кнопка старт/стоп блокирована и не реагирует на нажатия.
4. Также необходимо как-то проконтролировать обороты двигателя. Притом там несколько функций: с одной стороны отсутствие оборотов должно при нажатии кнопки старт/стоп режим запуска двигателя. Если обороты уже есть до нажатия на кнопку, то должна быть выполнена остановка двигателя и через секунду отключение зажигания. Но помимо этого в цикле запуска двигателя этот вход должен помимо всего прочего проконтролировать нарастание оборотов двигателя. Т.е., скажем, ардуина крутит стартером 2,5-3 секунды ИЛИ пока на входе "тахометр" не появятся обороты выше, скажем, 400-500 об/мин. Вот это я вообще пока не знаю как можно реализовать... какими циклами, чтобы и интервал измерений небольшой был, и при этом нормальная разрешающая способность (т.е. чтоб уж обороты не сотнями считать, а хотя бы десятки различать).

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

Короче, может быть кто-нибудь уже сделал нормальный старт/стоп на ардуине? Или может вообще без неё!?


Часовой пояс GMT +4, время: 14:30.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot