Подьемные ворота с дверью в полотне. Эконом :)

daniilguz
Offline
Зарегистрирован: 13.01.2020

Видео работы:

https://youtu.be/Ttp6blBUtNU

Нужно:

2 двигателя Ваз Дворники :) не китай.

вал 40 над воротами

опорные подшипники для вала вверху.

шестеренки для велосипеда на 40 вал минимальное количество зубов - 4 шт

маленькая самодельная шестерня на 8 зубов

4 цепи велосипед Украина.

шим контроллер(драйввер) двигателя  на 40 ампер.

источник питания 24 вольта ( у меня 2 аккумулятора по 12 вольт от ибп) и зарядное из dc-dc повышайки с защитой по току.

Концевики 4 шт

ардуино нано.

макетная плата

бипер активный.

4 канальный брелок с приемником (в комплекте 2 брелка).

код ниже

#include <SPI.h>
#include <MFRC522.h>


#define L_PWM      2     // включаем опускание
#define EN         3     // сюда подаем шим   
#define R_PWM      4     // включаем подьем 

// свободны пока 5,

#define pin_dveri  6    //  свободны. для светодиода RGB

#define pinPult1   7   // кнопка пульта 1
#define pinPult2   8   // кнопка пульта 2

//#define RST_PIN    9    // пины спай ридера меток
//#define SS_PIN    10    // пины спай ридера меток
//// так же спай  11,12,13

#define buzer_pin    14    // пинпищалки

#define pinstopV    A4   // концевик верх
#define tok_pin    A6   // по этому пину меряем ток 
#define pinstopN    A7   // концевики замедления и останова

int verh_konc=0;
int niz_konc=0;

  unsigned long currentTime;  //тайминг
  unsigned long loopTime;     //тайминг

boolean pult1=false;
boolean pult2=false;

byte prpult1=0;
byte prpult2=0;

byte zamedl1=0;
byte zamedl2=0;
byte Speed=0;
byte status_vorot=8;
byte wey=0;

int tokmot=0;

int ibuz=0;
int ispeed=0;

int iserial=0;
int timer_stop1=0;

int timer_hoda =0;
int timer_verh =0;
int timer_niz  =0;
int timer_dovod=0;

byte prev_way=1;

byte stsatkoncV=0;
byte stsatkoncN=0;

void setup() {
  
   Serial.begin(9600);
//   SPI.begin(); // инициализация SPI
//   mfrc522.PCD_Init(); // инициализация MFRC522

    pinMode(pinPult1,    INPUT);
    pinMode(pinPult1,    INPUT);
   
    pinMode(pin_dveri,    OUTPUT);
    
    pinMode(buzer_pin,    OUTPUT);
    
    pinMode(EN,      OUTPUT);     // Конфигурируем вывод EN    как выход (выход Arduino, вход драйвера)
    pinMode(L_PWM,   OUTPUT);     // Конфигурируем вывод L_PWM как выход (выход Arduino, вход драйвера)
    pinMode(R_PWM,   OUTPUT);     // Конфигурируем вывод R_PWM как выход (выход Arduino, вход драйвера)
//
//TCCR2A = TCCR2A & 0xe0 | 3;
//TCCR2B = TCCR2B & 0xe0 | 0x09;
// Пины D3 и D11 - 8 кГц
TCCR2B = 0b00000010;  // x8
TCCR2A = 0b00000011;  // fast pwm


}

void loop() {
  
  knopki ();
  vorota ();
  currentTime  = millis(); //
  if(currentTime - loopTime  >  100)
 {   ///// тут события 10  раз в секунду.
    
     //tokmot = analogRead(tok_pin);
    Serial.print("verh_konc = "    );Serial.println(verh_konc);
//    Serial.print("in1 = ");Serial.println(pult1);
//    Serial.print("in2=  ");Serial.println(pult2);

 
switch (wey) {
  case 0:
      whear();if ( Speed > 0 ) {Speed=Speed-20;}
  break;
  case 1:
if ( status_vorot== 10     ) {status_vorot= 1;Speed=0;}             ////////// запуск разгона вверх

if ( status_vorot== 1      ) {if ( Speed < 120) { Speed = Speed+20;}
                              Speed = Speed+4;              ////////// изменение скорости набора скорости
if ( Speed >= 240          ) {Speed = 254;status_vorot= 2;}} ////////// изменение скорости набора скорости


if ( status_vorot== 2      ) {Speed = 254    ;}              ////////// задаем максимальную скорость вверх
if ( status_vorot== 3      ) {Speed = Speed-15;              ////////// задаем шаг изменения скорости при торможении
if ( Speed < 190           ) {Speed = 190;     }}           ////////// минимальную скорость доводки вверх
if ( stsatkoncV==1         ) {status_vorot = 3 ;}              ////////// задаем максимальную скорость вверх
if ( stsatkoncV==2         ) {status_vorot = 8;}              ////////// задаем максимальную скорость вверх
if (status_vorot== 8) {wey=0;};
  break;
  case 2:
if ( status_vorot== 8     ) {status_vorot= 4;Speed=0;}               ////////// запуск разгона вниз

if ( status_vorot== 4      ) {if ( Speed < 120) { Speed = Speed+20;}
                              Speed = Speed+4;               ////////// изменение скорости набора скорости
if ( Speed >= 210          ) {Speed = 220;status_vorot= 5;}} ////////// изменение скорости набора скорости

if ( status_vorot== 5      ) {Speed = 220    ;}              ////////// задаем максимальную скорость вниз

if ( status_vorot== 6      ) {Speed = Speed-6;               ////////// задаем шаг изменения скорости при торможении
if ( Speed < 140            ) {Speed = 140;}}                  ////////// минимальную скорость доводки вниз

if ( status_vorot== 7      ) {Speed = 140;}                   ////////// задаем шаг изменения скорости при торможении
if ( stsatkoncN==1         ) {status_vorot = 6;}              ////////// задаем максимальную скорость вверх
if ( stsatkoncN==2         ) {status_vorot = 7;}              ////////// задаем максимальную скорость вверх 
if (status_vorot== 10){wey=0;}  // стоим внизу
  break;}



if (status_vorot==7 ){timer_dovod++; 
if (timer_dovod>10  ){timer_dovod=10; status_vorot=10; wey=0; }
                }else{timer_dovod=0;} 
if (status_vorot==6){timer_niz++; 
if (timer_niz>30  ) {timer_niz=30;    status_vorot=10; wey=0; }
               }else{timer_niz=0;}
if (status_vorot==3){timer_verh++; 
if (timer_verh>30  ){timer_verh=30;    status_vorot=8; wey=0; }
               }else{timer_verh=0;}

if (status_vorot!=8 && status_vorot!=10){timer_hoda++; 
if (timer_hoda>170){  timer_hoda=170;
                    if ( status_vorot==1){prev_way=1;}else{prev_way=2;}
                    status_vorot=0;
                    }
                    }else{timer_hoda=0;}

/////////////////////////////////бузер

if (status_vorot!=8 && status_vorot!=10){ ibuz++;
if (ibuz>5)  {digitalWrite(buzer_pin, HIGH);       }
if (ibuz>10) {digitalWrite(buzer_pin, LOW); ibuz=0;}
} else {digitalWrite(buzer_pin, LOW);ibuz=0;}
//////////////////////////печать в сериал
iserial++;
if (iserial==11){iserial=0;
//   Serial.print("tokmot = ");Serial.println(tokmot);
//   Serial.print("verh_konc = "    );Serial.println(verh_konc);
//   Serial.print("status_vorot=  "     );Serial.println(status_vorot);
////
// Serial.print(" stsatkoncN = "      );Serial.println(stsatkoncN);
// Serial.print("  stsatkoncV = "      ); Serial.println (stsatkoncV);
} 
      
      
      loopTime = currentTime;
  }
}
void knopki ()
{
  
 /////////////////////////////////////////////концевики
verh_konc = analogRead(pinstopV);

if (verh_konc<250                 ){stsatkoncV=2;prev_way=1;}
if (verh_konc>250 && verh_konc<550){stsatkoncV=1;prev_way=1;}
if (verh_konc>750                 ){stsatkoncV=0;}

 niz_konc = analogRead(pinstopN);
if (niz_konc<250                 ){stsatkoncN=2;prev_way=2;}
if (niz_konc>250 && niz_konc <550){stsatkoncN=1;prev_way=2;}
if (niz_konc>750                 ){stsatkoncN=0;}

  
  ////////////////////////////////Кнопки пульта
if (digitalRead (pinPult1) == HIGH) { 
 if (prpult1==0){prpult1=1;
switch (wey) {
  case 0:
  whear ();
  if ( prev_way==1){wey=2;}else{wey=1;}
  break;
  case 1:
  wey=0; status_vorot=8;prev_way=1;
  break;
  case 2:
  wey=0; status_vorot=10;prev_way=2;
  break;}
}}else {prpult1=0; }

///////////////////////////////////определяем место положения


///////////////////////////////////Управление движком на основе данных


///////////////////////////////////Укправление дверью 
//if (digitalRead (pinPult2) == HIGH) { 
//if (prpult2=0){  prpult2=1;
//digitalWrite(pin_dveri, HIGH);
//}} 
//else{prpult2=0; digitalWrite(pin_dveri, LOW);}
  



}
    /*Управление драйвером мотора по 3 проводам:
    Движение вперёд с регулировкой скорости: «L_PWM» = 0, «R_PWM» = 1, «EN» = ШИМ (чем выше ШИМ тем выше скорость).
    Движение назад с регулировкой скорости: «L_PWM» = 1, «R_PWM» = 0, «EN» = ШИМ (чем выше ШИМ тем выше скорость).
    Свободное вращение: «L_PWM» и «R_PWM» не имеют значения, «EN» = 0 (мотор электрически отключён).
    Торможение: «L_PWM» = «R_PWM» = 0 или 1, «EN» = ШИМ (чем выше ШИМ тем сильнее торможение).*/
    void vorota ()
    { 
      
      if (status_vorot== 1) {digitalWrite (L_PWM, LOW   ); digitalWrite(R_PWM, HIGH); analogWrite (EN, Speed  );prev_way=1;}//разгон вверх
      if (status_vorot== 2) {digitalWrite (L_PWM, LOW   ); digitalWrite(R_PWM, HIGH); analogWrite (EN, Speed  );prev_way=1;}//полный ход вверх
      if (status_vorot== 3) {digitalWrite (L_PWM, LOW   ); digitalWrite(R_PWM, HIGH); analogWrite (EN, Speed  );prev_way=1;}//торможение вверх
      
      if (status_vorot== 4) {digitalWrite (L_PWM, HIGH  ); digitalWrite(R_PWM, LOW ); analogWrite (EN, Speed  );prev_way=2;}//разгон вниз
      if (status_vorot== 5) {digitalWrite (L_PWM, HIGH  ); digitalWrite(R_PWM, LOW ); analogWrite (EN, Speed  );prev_way=2;}//полный ход вниз
      if (status_vorot== 6) {digitalWrite (L_PWM, HIGH  ); digitalWrite(R_PWM, LOW ); analogWrite (EN, Speed  );prev_way=2;}//торможение вниз
      if (status_vorot== 7) {digitalWrite (L_PWM, HIGH  ); digitalWrite(R_PWM, LOW ); analogWrite (EN, Speed  );prev_way=2;}//доводка вниз
      
      if (status_vorot== 8) {analogWrite  (EN,  0);prev_way=1;}  //стоим вверху
      if (status_vorot== 10){analogWrite  (EN,  0);prev_way=2;}  // стоим внизу
      
    }
    void whear ()
    {
    if (Speed==0 && stsatkoncV>0                   ){status_vorot= 8 ; prev_way=1;}
    if (Speed==0 && stsatkoncN>0                   ){status_vorot= 10; prev_way=2;}
    if (Speed==0 && stsatkoncN==0 && stsatkoncV==0 ){status_vorot= 8 ; prev_way=1;}
      }

 

 

daniilguz
Offline
Зарегистрирован: 13.01.2020

Немного доработать
Не рекомендую повторять
Опасно, может упасть на голову.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Хорошо! Хотя стоило бы контролировать ток на двигателях. Мало-ли чего.

Вот как-нибудь соберусь и перерисую силовую схему ворот NICE. Там реле и полевики.

-Nord_Air-
Offline
Зарегистрирован: 21.08.2021

 daniilguz В данном случае, эконом, является синонимом слова колхоз.

 Меня эта тема беспокоила, скажем так.

 Самое впечатляющее решение я видел в игре Deus Ex Human Revolution, где ворота складываются по горизонтали, пополам и поднимаются к потолку. И я не вижу серьезных контр-оснований чтобы не сделать точно так-же.

 Цепные передачи в этом случае и надежнее и практичнее заменить трапецеидальный винт или на ШВП или на крайняк строительную шпильку.  Ехать будет медленно, но ворота можно будет использовать вместо домкрата ;)

daniilguz
Offline
Зарегистрирован: 13.01.2020

Упали ворота

bizzon
Offline
Зарегистрирован: 29.03.2016

Слабоваты моторчики. Отпишись к лету.Не для зтого они. Чем питаем? Ампер 30 тоже надо где-то взять. А в целом респект! Плюсик поставил.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Пусковой ток этих моторов не более 4-5 А при 12 В. Рабочий 0.5 - 3 А. Могут кратковременно работать и на 24 В.

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

daniilguz
Offline
Зарегистрирован: 13.01.2020

Упали

daniilguz
Offline
Зарегистрирован: 13.01.2020

Ворота упали. На машину, не повторяйте моих ошибок.

b707
Offline
Зарегистрирован: 26.05.2017

daniilguz пишет:
Ворота упали. На машину, не повторяйте моих ошибок.

по-моему, это троллинг.

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Буду теперь всем "улудшателям" газовых котлов ссылку давать на эту тему