Помогите с сервоприводом.

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

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

 

 



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

int con_open = 7; // концевик полностью открытой заслонки
int con_clos = 4; // концевик полностью закрытой заслонки
int temp = A3; // датчик температуры
int gercon = 11; // геркон на мкпп
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)
  {
    if (digitalRead(gercon)==0)
    {
     avtomat();
    }
  }
  else
  {
    manual();
  }
}
void avtomat()
 // сама программа
{
 if (analogRead(temp) <= 5) 
   {
    if (rpm > 100)//если ни одно не верно то запускаем программу управления по температуре
    {
      chek_serva3();// вторая программа управления моторчиком
    }
   }
  else 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) // если обороты больше 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)  
      {
       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_serva3()
{
  if(rpm >= 1800)  
      {
       digitalWrite(out1, HIGH);
       delay(50);
       digitalWrite(out1, LOW);
      }
   else  if ((rpm <= 1350)&&(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 (rpm <300)
  {
    rpm = 0;
  }
  if (microsold > micros())
  {
    microsold = 0;
  }
  
  microsold = micros();
  }
d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

int con_open = 7; // концевик полностью открытой заслонки
int con_clos = 4; // концевик полностью закрытой заслонки
int temp = A3; // датчик температуры
int gercon = 11; // геркон на мкпп
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)
  {
    if (digitalRead(gercon)==0)
    {
     avtomat();
    }
  }
  else
  {
    manual();
  }
}
void avtomat()
 // сама программа
{
 if (analogRead(temp) <= 5) 
   {
    if (rpm > 100)//если ни одно не верно то запускаем программу управления по температуре
    {
      chek_serva3();// третья  программа управления моторчиком
    }
   }
  else 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) // если обороты больше 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)  
      {
       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_serva3()
{
  if(rpm >= 1800)  
      {
       digitalWrite(out1, HIGH);
       delay(50);
       digitalWrite(out1, LOW);
      }
   else  if ((rpm <= 1350)&&(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 (rpm <300)
  {
    rpm = 0;
  }
  if (microsold > micros())
  {
    microsold = 0;
  }
  
  microsold = micros();
  }

 

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

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

bwn
Offline
Зарегистрирован: 25.08.2014

А не рискуете влезая в отработанную систему управления мотором? Ну как серве на обгоне приспичит карбюратор регулировать?

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

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

 

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

такое элементарное помочь никто не может?... ну не хватает пока на это мозгов((

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

AP

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

Понял, спасибо всем

ilenowski
Offline
Зарегистрирован: 05.01.2016

d13lider, как получилось перейти от сервы к шаговику? можно пример)