Подьемные ворота с дверью в полотне. Эконом :)
- Войдите на сайт для отправки комментариев
Чт, 04/11/2021 - 10:20
Видео работы:
Нужно:
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;}
}
Немного доработать
Не рекомендую повторять
Опасно, может упасть на голову.
Хорошо! Хотя стоило бы контролировать ток на двигателях. Мало-ли чего.
Вот как-нибудь соберусь и перерисую силовую схему ворот NICE. Там реле и полевики.
daniilguz В данном случае, эконом, является синонимом слова колхоз.
Меня эта тема беспокоила, скажем так.
Самое впечатляющее решение я видел в игре Deus Ex Human Revolution, где ворота складываются по горизонтали, пополам и поднимаются к потолку. И я не вижу серьезных контр-оснований чтобы не сделать точно так-же.
Цепные передачи в этом случае и надежнее и практичнее заменить трапецеидальный винт или на ШВП или на крайняк строительную шпильку. Ехать будет медленно, но ворота можно будет использовать вместо домкрата ;)
Упали ворота
Слабоваты моторчики. Отпишись к лету.Не для зтого они. Чем питаем? Ампер 30 тоже надо где-то взять. А в целом респект! Плюсик поставил.
Пусковой ток этих моторов не более 4-5 А при 12 В. Рабочий 0.5 - 3 А. Могут кратковременно работать и на 24 В.
У меня на гараже распашные ворота. Вот тоже иногда "почешу репу" - хорошо бы сделать простую автоматику... махну рукой, ничо, Петя, поднимешь свой зад и откроешь вручную)))
Упали
Ворота упали. На машину, не повторяйте моих ошибок.
по-моему, это троллинг.
Буду теперь всем "улудшателям" газовых котлов ссылку давать на эту тему