Профессура помогите!

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

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

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

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

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

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

после того как заслонка выставлена запускается проверка оборотов. ее решил сделать на внешнем прерывании по фронтам импульса используя (0 ) прирывание то есть 2 цифровой вход. считать будем импульсы от коммутатора зажигания ,( на 4 тактных 4 горшковых двигателях : 2имп= 1 оборот) на ваз 2109 это 6 контакт. можно и от бобины низковольтный контакт. подключаем аналогично датчику температуры. так вот. как только двигатель запущен, считаются обороты и посредством той же сервы приводятся в уровень 1500об/мин. для этой цели будет логичным использовать ПИД-регулятор.

серва будет подключена к 9 шим пину. так же нужна индикация: 8 шим пин будет светодиодом, который будет включаться как только заслонка примет некое положение отличное от "полностью открытая" и обратно, гаснуль при переводе заслонки в "открыта".

следующий этап залючается в том чтобы подать +5 вольт на 10 шим пин при наборе температуры в районе 65С . это позволит включить печку. но данная функция должна включаться только после того как данная температура набрана в прцессе прогрева, а не тогда когда производится повторный запуск прогретого двигателя. как это правильнее осуществить пока не знаю, но думаю что 3 минутный таймер сможет помочь. если с момента запуска до достижения 65С прошло 3 мин и более-включаем, если не прошло _то нет. все просто. или как то иначе. 

управляемый прогрев необходимо продолжать вплоть до достижения температуры 90С. как только данная температура набрана, серва полностью открывает заслонку и отключается. но +5 с 10 пина не снимается еще 5 минут. по истечении 5 промежутка времени все отключается и переходит в сон. 

Как говорилось выше, помощь не бескорыстна. проект для личного использования, при необходимости схема и готовый скетч будут выложены здесь же открыто. все текущие коррекции скетча , преобразования температур в напряжение и пр. беру на себя. жду ответа здесь или по почте.  gav707090@yandex.ru

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

Pnewmoslon пишет:

не очень приятно находиться в непрогретом авто

поставьте предподогреватель Webasto или Eberspacher, тогда в машине будет уже тепло когда вы только сядите.

Pnewmoslon пишет:

корректировать плавающие обороты ручкой подсоса которая постоянно заедает

а не легче поставить карбюратор с автоматическим подсосом?

 

art100
Offline
Зарегистрирован: 09.03.2014

Ну раз тут флудят. То и я пофлужу. Писать не мешки ворочать. В логике ошибки.

1. Ниже 0 градусов надо запустить "предпусковой подогреватель" и довести до +4 градуса охлаждающую жидкость. Например вебасто в Швеции.

2. Купить готовую "електронику кнопку старта" заводского изготовления, как я понимаю в вашем случае для карбюраторного двигателя. Например в Китае.

3. А вот кнопку можно уже поразвлекатся ардуинкой понажимать. Например если не хотим купить заводского изготовления сигнализацию с дистанционным пуском. Например в Москве.

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

 

5.Про подсос. Изучаем мат часть карбюраторного двигателя с подсосом. На сколько вытягивается при

5.1. -30...-10=100%

5.2. -10... 0... +4=30%

5.3.+4... +30= Не вытягивается!!! (Исключение сырая погода = 1%)

Вдумчивао перечитываем пункт 1-ый.

http://art1.by/vaz/

 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

возможно и легче, но в моем случае решено использовать именно то , о чем написанно выше! 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

art100 пишет:

Ну раз тут флудят. То и я пофлужу. Писать не мешки ворочать. В логике ошибки.

1. Ниже 0 градусов надо запустить "предпусковой подогреватель" и довести до +4 градуса охлаждающую жидкость. Например вебасто в Швеции.

2. Купить готовую "електронику кнопку старта" заводского изготовления, как я понимаю в вашем случае для карбюраторного двигателя. Например в Китае.

3. А вот кнопку можно уже поразвлекатся ардуинкой понажимать. Например если не хотим купить заводского изготовления сигнализацию с дистанционным пуском. Например в Москве.

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

 

5.Про подсос. Изучаем мат часть карбюраторного двигателя с подсосом. На сколько вытягивается при

5.1. -30...-10=100%

5.2. -10... 0... +4=30%

5.3.+4... +30= Не вытягивается!!! (Исключение сырая погода = 1%)

Вдумчивао перечитываем пункт 1-ый.

http://art1.by/vaz/

 

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

теперь о принципах работы подсоса.:: -10 и +85 примем за 100%то 5 градусов ~5%  отсекаем все что до -10 и после 85. так же не стоит забывать что штатный датчик работает не стабильно линейно, при повышенных температурах напряжение смещения меняется достаточно чувствительно, а вот при низких температурах сопротивление практически одно и тоже.!! 

потому уважаемые коллеги предлагаю оставить немного покурить лишние советы которые мало чем помогают в данном проекте.

;)

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

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

Вам слово.

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

арт100 отпишись. gav707090@yandex.ru

art100
Offline
Зарегистрирован: 09.03.2014

Лень думать. 00:03 спать пора идти. Я проблем на вижу. Я решение уже дал. У меня -30 мороза часто. Мои:Инжектор при -30 заводился,заводится, думаю будет заводится. Карбюратор при -30 мороза всегда заводился,заводится, уверен всегда будет заводится. На инжекторе педальку газа Да ножкой поднажимаю. На карбюраторе фильтр правильно повернут подсос 100% 3 качка педалькой газа. Пока машина греется все равно вокруг машины ходишь 5 минут и сбиваю лед со стекол пока нитинакала подплавят. Не интересно. Вот электромобиль забабахать может будет интересно.

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

Pnewmoslon Как продвинулись дела в перед? думаю поставить похожую систему для поддержания оборотов на свой IFA W50. будет как автопилот.

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

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

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

давайте будем вместе код писать, не думаю что здесь нужен ПИД.. можно и без него обойтись. как вы обороты "смотрите"? Я вот думаю как мне это сделать? У меня дизель, причем старый без всякой электроники.. придется каким то способом к генератору подключается.

Что я хочу сделать:

1. Поставить серво на педаль газа которая будет подключена к ардуине.

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

3. Подключить ардуино через оптопару к генератору, к лягушки педали тормоза.

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

Логика моего кода будет примерно такова:

Режим "ожидание" - Ставим серво в положение 0. Считываем показания кнопки включения "автоматический газ". Если кнопка была нажата переходим в режим "подготовка". Все лампочки выключены.

Режим "подготовка" - Мигаем красной лампочкой. Считываем несколько раз показания генераторa и записываем эти показание, после переходим в режим "работы".  Смотрим не нажата ли педаль тормоза, если да то переходим в режим "ожидание".

Режим "работа" -  Зажигаем зеленую лампочку. Считываем показания генераторa и в зависимости от них управляем сервой. Смотрим не нажата ли педаль тормоза, если да то переходим в режим "ожидание".

Ну как то так

 

 

 

 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

только серву на такой ответственный участок поставь хорошую

и лучше цифровую. питание то ведь у тебя не ограничено

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

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

ага, серва около 40 гринов выходит с усилием более 30 кг на см, с металлическими и карбоновыми шестернями. питание от 4.8 до 7.2вольта  

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

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

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014
#include <PID_v1.h>//библиотека ПИД-ругулятора
#include <Servo.h> //библиотека серво привода

double Setpoint, Input, Output;

Servo myservo;//серво привод
int termopin = 0; // датчик температуры охл. жидк.
int val;
PID myPID(&Input, &Output, &Setpoint, 8.6, 0.5, 1, DIRECT); //создаем ПИД-регулятор
int ledpin = 8; //светодиод индикации включения автоподсоса
 int pechpin = 11;//управление печкой
boolean revers;
unsigned long micros_th = 0;
volatile int tz;
volatile int th;                            //импульсы тахометра
void setup()
{
 pinMode(ledpin, OUTPUT);      // устанавливает режим работы - выход
 pinMode(pechpin, OUTPUT);
  Serial.begin(115200);                     //инициализация ком порта
  attachInterrupt(0, tahometr,   RISING);   //прерывание тахометра по фронтам импульса на 2 цифровом пине
  Setpoint = 1500;//заданная температура в салоне автомобиля
  Input = th;//читаем показания оборотов
  myPID.SetOutputLimits(0, 180);//устанавливаем границы выходного сигнала для ПИД-регулятора
  if (Setpoint < Input) { //если начальные обороты больше заданных
    revers = true;
    myPID.SetControllerDirection(REVERSE);//ПИД-регулятор используем обратный
  }
  myPID.SetMode(AUTOMATIC);//включаем ПИД-регулятор
}

void loop() {
label:
  tz = tz - 1;
  if (tz == 0) {th = 0;}
  val = analogRead (termopin); //считали температуру
  int rpm = th;
if (val >= 1000 && rpm == 0) {digitalWrite(8, LOW); // если темп больше или ровна 85С и обороты ровны 0, гасим свет
digitalWrite(pechpin, LOW);//выключаем печку
goto label;//прыгаем на label
}
  if (val >= 1000 && rpm > 0) {digitalWrite(8, LOW);//если темп больше 85С и обороты больше 0, 
 digitalWrite(pechpin, LOW);//выключаем печку
  goto label;//прыгаем на label
}
if (val < 1000 && rpm == 0) {ustanovkaServa;}//температ меньше 85 и оборты = 0, запускаем функцию начальной устан сервы
  if (val < 1000 && rpm >= 750) {zapuskPid;}//темп меньше 85 и обороты больше или ровны 750. запускаем пид
  if (val >= 750 && rpm >= 750) {digitalWrite(pechpin, HIGH);}//если температура 60С и выше и двигатель заведен, включаем печку
 else {digitalWrite(pechpin, LOW);}
 }
//*******************функция начальной установки сервы по температуре*********************
void ustanovkaServa(){ 
    val = analogRead (termopin); //считали температуру
    myservo.attach(9);//подключаем серву на 9 пин
    int motorAngl = map(val,1000, 50, 23,179);//Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы
    myservo.write(motorAngl);// Устанавливаем серву на угол который получаем через преобразование
    delay (50); // задержка  ждем серву
    myservo.detach();// отключаем серву
    digitalWrite(ledpin, HIGH);
}
  //************************функция запуска пид регулятора***************************
  void zapuskPid(){
   Input = th;//анализируем обороты
  myPID.Compute();//считаем выходной сигнал ПИД-регулятора
  myservo.attach(9, 23, 180); //включаем серву на 9 цифровом пине, с длинной импульса от 630 до 2540(указываем границы поворота сервы)
  if (revers)//если пид регулятор обратный, то сервой управляем также относительно противоположной крайней точки
    myservo.write(180 - Output);
  else
    myservo.write(Output);
  delay(1000);//ждем серву
  myservo.detach();//отключаемся от сервы
  Serial.println(th);
  delay(50);
  }
 
//************************************измеряем частоту на входе тахометра по прерыванию***********
void tahometr() {
  th = (2900000 / ( micros() - micros_th));
  micros_th = micros();
  tz = 10;
}

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и что 1А? не самое большое потребление. XM1584 или MP1584 ищешь на али и радуешься. ток до 3 ампер

там такое большое усилие думаешь нужно?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

меня смущает оформление и goto как серпом по одному месту

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

у тросика моло того что трение большое, так и еще длинна хода не малая около 10 см. теперь считаем: 38кг/см, значит для того чтоб протягивать 10 см тросика нужно как минмум 5 см рычага, и того 38 /5=7.6 кг и это без преодоления трения тросика или тяги

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

Жека, я же только учусь. не все сразу, через некоторое время и оформление появится и прочие хитрости писания скетчей

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

так что 38кг/см еще может оказаться и мало 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хотя бы от goto избавься

но какое усилие нужно на троссик так и не прозвучало

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

а 1 А это при нормальной нагрузке, а при той что будет на тросике все 3 и вылезут

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

завтра проснется и напишет какое усилие)) я же его тросик не дергал))

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

на 2109 ваз газ тросик около 3 кило, подсос 5кг

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

jeka_tm пишет:

хотя бы от goto избавься

но какое усилие нужно на троссик так и не прозвучало

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

3 кило на каком рычаге?

может тогда использовать шаговый с редуктором

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

у меня не тросик..:) там тяга идет...  и сила немалая нужна, нога давит устает когда долго едешь..

http://funkyimg.com/i/RYCu.jpg

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно вызвать функцию и гонять определенное количество раз с использованием for или бесконечно по while

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Mastino пишет:

у меня не тросик..:) там тяга идет...  и сила немалая нужна, нога давит устает когда долго едешь..

http://funkyimg.com/i/RYCu.jpg

ты бы еще танк показал)))

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

jeka_tm пишет:

3 кило на каком рычаге?

может тогда использовать шаговый с редуктором

рычаг 1 см

 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

jeka_tm пишет:

можно вызвать функцию и гонять определенное количество раз с использованием for или бесконечно по while

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

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

а фор пока не трогал. думаю и до него доберусь, но не сегодня. устал, на работу утром рано

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

Pnewmoslon пишет:

jeka_tm пишет:

3 кило на каком рычаге?

может тогда использовать шаговый с редуктором

рычаг 1 см

 

с шаговым гемора много, концевики, медлительность, 

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014

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

Pnewmoslon
Offline
Зарегистрирован: 26.07.2014
#include <PID_v1.h>                                           //библиотека ПИД-ругулятора
#include <Servo.h>                                            //библиотека серво привода

double Setpoint, Input, Output;

Servo myservo;                                                //серво привод
int termopin = 0;                                             // датчик температуры охл. жидк.
int val;
PID myPID(&Input, &Output, &Setpoint, 8.6, 0.5, 1, DIRECT);   //создаем ПИД-регулятор
int ledpin = 8;                                               //светодиод индикации включения автоподсоса
int pechpin = 11;                                             //управление печкой
boolean revers;
unsigned long micros_th = 0;
volatile int tz;
volatile int th;                                              //импульсы тахометра

void setup()

{
  pinMode(ledpin, OUTPUT);                                     // устанавливает режим работы - выход
  pinMode(pechpin, OUTPUT);
  Serial.begin(115200);                                       //инициализация ком порта
  attachInterrupt(0, tahometr,   RISING);                     //прерывание тахометра по фронтам импульса на 2 цифровом пине
  Setpoint = 1500;                                            //заданные обороты двигателя об/мин
  Input = th;                                                 //читаем показания оборотов
  myPID.SetOutputLimits(0, 179);                              //устанавливаем границы выходного сигнала для ПИД-регулятора
  if (Setpoint < Input) {                                     //если начальные обороты больше заданных
    revers = true;
    myPID.SetControllerDirection(REVERSE);                    //ПИД-регулятор используем обратный
  }
  myPID.SetMode(AUTOMATIC);                                   //включаем ПИД-регулятор
}

void loop() {
label:
  tz = tz - 1;
  if (tz == 0) {th = 0;}
  val = analogRead (termopin);                                  //считали температуру
  int rpm = th;
  if (val >= 1000 && rpm == 0) {digitalWrite(8, LOW);         // если темп больше или ровна 85С и обороты ровны 0, гасим свет
     digitalWrite(pechpin, LOW);                              //выключаем печку
goto label;                                                   //прыгаем на label
}
  if (val >= 1000 && rpm > 0) {digitalWrite(8, LOW);          //если темп больше 85С и обороты больше 0, 
     digitalWrite(pechpin, LOW);                              //выключаем печку
goto label;                                                   //прыгаем на label
}
  if (val < 1000 && rpm == 0) {ustanovkaServa;}               //температ меньше 85 и оборты = 0, запускаем функцию начальной устан сервы
  if (val < 1000 && rpm >= 750) {zapuskPid;}                  //темп меньше 85 и обороты больше или ровны 750. запускаем пид
  if (val >= 750 && rpm > 0) {digitalWrite(pechpin, HIGH);}   //если температура 60С и выше и двигатель заведен, включаем печку
    else {digitalWrite(pechpin, LOW);}
 }
             //*******************функция начальной установки сервы по температуре*********************
void ustanovkaServa(){ 
    val = analogRead (termopin);                              //считали температуру
    myservo.attach(9);                                        //подключаем серву на 9 пин
    int motorAngl = map(val,1000, 50, 23,179);                //Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы
    myservo.write(motorAngl);                                 // Устанавливаем серву на угол который получаем через преобразование
    delay (1000);                                             // задержка  ждем серву
    myservo.detach();                                         // отключаем серву
    digitalWrite(ledpin, HIGH);                               //включаем светодиод индикации
}
                       //************************функция запуска пид регулятора***************************                 
void zapuskPid(){
   Input = th;                                                 //анализируем обороты
   myPID.Compute();                                            //считаем выходной сигнал ПИД-регулятора
   myservo.attach(9, 23, 180);                                 //включаем серву на 9 цифровом пине, с длинной импульса от 630 до 2540(указываем границы поворота сервы)
   if (revers)                                                 //если пид регулятор обратный, то сервой управляем также относительно противоположной крайней точки
   myservo.write(180 - Output);
     else
   myservo.write(Output);
   delay(10);                                                  //ждем серву
   myservo.detach();                                           //отключаемся от сервы
   Serial.println(th);
   delay(50);
  }
 
             //************************************измеряем частоту на входе тахометра по прерыванию***********
void tahometr() {
   th = (2900000 / ( micros() - micros_th));
   micros_th = micros();
   tz = 10;
}

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Pnewmoslon пишет:


   myservo.detach();                                           //отключаемся от сервы
   Serial.println(th);
   delay(50);
  }
 
             //************************************измеряем частоту на входе тахометра по прерыванию***********
void tahometr() {

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

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

с какой целью серву включаешь только в фукнции zapuskPid(). там же отключаешь. защита от чего то?

1. в 37, 40, 48, 49 строке лишние скобки

2. в 39 зачем каждый раз объявляешь? объяви один раз в самом начале

3. в 4 строке реально нужен такой тип? 

4. в 40 и 44 если уже дал название пину зачем управляешь через номер пина

ну и так пожелания:

1. пины объявляй через define

2. тяжело читается код. структурируй например. в самом начале пины объяви п.1. потом например переменные, потом еще что то.

через define также можно объявить константы в самом начале (которые в строках с 40 по 50) удобнее будет настраивать

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

год назад тема была))) думаю он сюда уже не заходит(( 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я ему почти не помогал. почитай. так общие разговоры

а вообще врое если добавить еще одно условие в функцию zapuskPid() выполнять только если газ не нажат или газ ниже заданного уровня

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

proverka:
if (rpm1-rpm2 => 600)
goto proverka; 
else код дальше

ну что то типа такого

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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


#define RPMpin 2 // датчик Холла
long microsold = 0;
int rpm = 0;

int con_open = 7; // концевик полностью открытой заслонки
int con_clos = 4; // концевик полностью закрытой заслонки
int temp = A3; // датчик температуры

int out1 = 5; //выход на любой мотор
int out2 = 6; // выход на любой мотор
int knopka_high = 8; // кнопка управления заслонкой вручную
int knopka_low = 9;// кнопка управления заслонкой вручную
int knopka_avtomat = 10;// переключатель автомат-ручное управление
void setup()
{
  
   Serial.begin(9600);
 digitalWrite(RPMpin, 1);
  attachInterrupt(0, RPM1, FALLING);
 
  // объявляем входом
pinMode(con_open, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм 
pinMode(temp, INPUT);
pinMode(con_clos, INPUT);  // подтяжку к минусу реализуем аппаратно резистором в 10кОм 
pinMode(knopka_avtomat, INPUT);
pinMode(knopka_low, INPUT);
pinMode(knopka_high, INPUT);

// объявляем выходом
pinMode(out1, OUTPUT);
digitalWrite(out1, LOW); 
pinMode(out2, OUTPUT);
digitalWrite(out2, LOW);

}
 
void loop()
{
  
 Serial.print("rpm");
  Serial.println(rpm, DEC);
  delay(500);
  if (digitalRead(knopka_avtomat)==1)
  {
    
    avtomat();
  }
  else
  {
    manual();
  }
}
void avtomat()
 // сама программа
{
 
  if ((analogRead(temp) <= 30) && (rpm > 100)) // если температура меньше 30 и двигатель не заглушен то управлять первым режимом управления моторчиком
{
 chek_serva();// первая программа управления моторчиком
}
    else if ((analogRead(temp) <= 60) && (rpm > 100))// если температура меньше 60 и двигатель не заглушен то управлять первым режимом управления моторчиком
    {
      chek_serva2();// вторая программа управления моторчиком
    }
    else  //если ни одно не верно то запускаем программу управления по температуре
    
 
 {
  chek_temp(); // программа управления по температуре
 }
 // тут ми считываем показания с датчиков что бы настроить под машину задержки нам не мешают, даже помогают, что бы моторчик бешано не крутился постоянно
 Serial.print("temp");
  Serial.println(analogRead(temp));
   
    
}  
void chek_serva()// первая программа управления моторчиком
{
  if((rpm >= 1500)&&(digitalRead(con_open)==0)) // если обороты больше 1500 то провернуть моторчик с небольшой задержкой в одну сторону( сами выберете в какую)
      {
       digitalWrite(out1, HIGH);
       delay(50);
       digitalWrite(out1, LOW);
      }
   else  if ((rpm <= 1200)&&(digitalRead(con_clos)==0)) // если обороты больше 1200 то провернуть моторчик в обратную сторону
      {
       digitalWrite(out2, HIGH);
       delay(50); 
       digitalWrite(out2, LOW);
      }
}
void chek_serva2() // вторая программа управления моторчиком аналогичная только для диапазона от 1300 до 1100( потому что двигатель более менее уже устоялся.
{
  if((rpm >= 1300)&&(digitalRead(con_open)==0))  
      {
       digitalWrite(out1, HIGH);
       delay(50);
       digitalWrite(out1, LOW);
      }
   else  if ((rpm <= 1100)&&(digitalRead(con_clos)==0))
      {
       digitalWrite(out2, HIGH);
       delay(50); 
       digitalWrite(out2, LOW);
      }
}
void chek_temp() // сюда попадаем если двигатель заглушен
{
  if ((digitalRead(con_open) ==0) && (analogRead(temp) > 60)) // если концевик еще не включен(т.е. если заслонка еще не <ОТКРЫЛАСЬ> полностью) а температура <БОЛЬШЕ> 60градусов то <ОТКРЫВАЕМ> на максимум заслонку
  {
    digitalWrite(out1, HIGH);
    delay(100);
    digitalWrite(out1, LOW);
  }
    else if ((digitalRead(con_clos) ==0) && (analogRead(temp) <60) ) // если концевик еще не включен(т.е. если заслонка еще не <ЗАКРЫЛАСЬ> полностью) а температура <МЕНЬШЕ> 60градусов то <ЗАКРЫВАЕМ> на максимум заслонку
    {
      digitalWrite(out2, HIGH);
    delay(100);
    digitalWrite(out2, LOW);
    }
    
  
}  
void manual() 
  {
    if((digitalRead(knopka_high)==1) &&  (digitalRead(con_open)!=1))
    {
       digitalWrite(out1, HIGH);
       digitalWrite(out2, LOW);
      }
   
      
   else  if ((digitalRead(knopka_low)==1)&&(digitalRead(con_clos) != 1))
     {
       digitalWrite(out2, HIGH);
       
       digitalWrite(out1, LOW);
      }
     
   
      else 
       {
        digitalWrite(out2, LOW);
       
       
       digitalWrite(out1, LOW);
   }
  }  
  void RPM1 (){
  rpm = (1000000.0/(micros() - microsold))*60;
  microsold = micros();
  }

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

не знаю зачем поправил под свой вкус


#define RPMpin           2  // датчик Холла
#define con_open         7  // концевик полностью открытой заслонки
#define con_clos         4  // концевик полностью закрытой заслонки
#define temp            A3  // датчик температуры
#define out1             5  //выход на любой мотор
#define out2             6  // выход на любой мотор
#define knopka_high      8  // кнопка управления заслонкой вручную
#define knopka_low       9  // кнопка управления заслонкой вручную
#define knopka_avtomat  10  // переключатель автомат-ручное управление

unsigned long microsold = 0;
int rpm = 0;
int analog=0;


void setup(){
  Serial.begin(9600);
  digitalWrite(RPMpin, 1);
  attachInterrupt(0, RPM1, FALLING);

  // объявляем входом
  pinMode(con_open, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм 
  pinMode(temp, INPUT);
  pinMode(con_clos, INPUT);  // подтяжку к минусу реализуем аппаратно резистором в 10кОм 
  pinMode(knopka_avtomat, INPUT);
  pinMode(knopka_low, INPUT);
  pinMode(knopka_high, INPUT);

  // объявляем выходом
  pinMode(out1, OUTPUT);
  digitalWrite(out1, LOW); 
  pinMode(out2, OUTPUT);
  digitalWrite(out2, LOW);

}

void loop(){
  Serial.print("rpm");
  Serial.println(rpm, DEC);
  delay(500);
  (digitalRead(knopka_avtomat))? avtomat(): manual();
}

================================================================================================// сама программа
void avtomat(){
  analog = analogRead(temp);
  if ((analog <= 30) && (rpm > 100)) chek_serva();// если температура меньше 30 и двигатель не заглушен то управлять первым режимом управления моторчиком
  else if ((analog <= 60) && (rpm > 100)) chek_serva2();// если температура меньше 60 и двигатель не заглушен то управлять первым режимом управления моторчиком
  else  chek_temp();//если ни одно не верно то запускаем программу управления по температуре

  // тут ми считываем показания с датчиков что бы настроить под машину задержки нам не мешают, даже помогают, что бы моторчик бешано не крутился постоянно
  Serial.print("temp");
  Serial.println(analog);
} 

// ========================================================================================================================================================================
// ==================================================================================================================================первая программа управления моторчиком
// ========================================================================================================================================================================
void chek_serva(){
  if((rpm >= 1500)&&(digitalRead(con_open)==0)){ // если обороты больше 1500 то провернуть моторчик с небольшой задержкой в одну сторону( сами выберете в какую)
    digitalWrite(out1, HIGH);
    delay(50);
    digitalWrite(out1, LOW);
  }
  else  if ((rpm <= 1200)&&(digitalRead(con_clos)==0)){ // если обороты больше 1200 то провернуть моторчик в обратную сторону
    digitalWrite(out2, HIGH);
    delay(50); 
    digitalWrite(out2, LOW);
  }
}

// ========================================================================================================================================================================
// ================================= вторая программа управления моторчиком аналогичная только для диапазона от 1300 до 1100( потому что двигатель более менее уже устоялся.
// ========================================================================================================================================================================
void chek_serva2(){ 
  if((rpm >= 1300)&&(digitalRead(con_open)==0)){
    digitalWrite(out1, HIGH);
    delay(50);
    digitalWrite(out1, LOW);
  }
  
  else  if ((rpm <= 1100)&&(digitalRead(con_clos)==0)){
    digitalWrite(out2, HIGH);
    delay(50); 
    digitalWrite(out2, LOW);
  }
}

// ========================================================================================================================================================================
// ================================================================================================================================== сюда попадаем если двигатель заглушен
// ========================================================================================================================================================================
void chek_temp(){
  if ((digitalRead(con_open) ==0) && (analogRead(temp) > 60)){ // если концевик еще не включен(т.е. если заслонка еще не <ОТКРЫЛАСЬ> полностью) а температура <БОЛЬШЕ> 60градусов то <ОТКРЫВАЕМ> на максимум заслонку
    digitalWrite(out1, HIGH);
    delay(100);
    digitalWrite(out1, LOW);
  }
  else if ((digitalRead(con_clos) ==0) && (analogRead(temp) <60)){ // если концевик еще не включен(т.е. если заслонка еще не <ЗАКРЫЛАСЬ> полностью) а температура <МЕНЬШЕ> 60градусов то <ЗАКРЫВАЕМ> на максимум заслонку
    digitalWrite(out2, HIGH);
    delay(100);
    digitalWrite(out2, LOW);
  }
}  

// ========================================================================================================================================================================
// ================================================================================================================================================================= Ручное
// ========================================================================================================================================================================
void manual(){
  if((digitalRead(knopka_high)==1) &&  (digitalRead(con_open)!=1))  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, LOW);
  }


  else  if ((digitalRead(knopka_low)==1)&&(digitalRead(con_clos) != 1)){
    digitalWrite(out2, HIGH);
    digitalWrite(out1, LOW);
  }

  else{
    digitalWrite(out2, LOW);
    digitalWrite(out1, LOW);
  }
}  


void RPM1 (){
  rpm = (1000000.0/(micros() - microsold))*60;
  microsold = micros();
}

единственное странно. как реально работает if потом else if а потом еще else. вроде как снова должно быть else if

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

а почемуу бы не работать else. если ни одно условие не верно то выполнить функцию, if добавляют только для заданияя определенного условия я так понял. и еще вопросик. как мне можно в этом скетче использовать серву? что бы она шагала на 1 градус допустим в плюс или минус?