РУКОДЕЛКИ Откатные ворота

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Возвращаюсь к теме откатных ворот! Есть кое какие наработки и достаточно простенький скетч новичка в ардуино. Есть схема и уже настроенные каналы на пульте. Требуется небольшая доработка и подсказка по безопасности работы сего устройства!

Просил помощи по форумам, у видя что используются библиотеки ALEXGUVER - продолжения темы ,по непонятной для меня причине, стопорилось. Но это лирика, а по факту требуется корректировка скетча:
-непойму как откорректировать работу концевых выключателей, которые в схеме работают как обычные кнопки, т.е. они отключают релюхи в процессе имитации открытия(закрытия), но при повторном нажатии - не срабатывают как конечные концевики.
C++:
#include <GyverButton.h>
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
GButton Knopka (3,HIGH_PULL,NORM_OPEN);
GButton Knopka2 (10,HIGH_PULL,NORM_OPEN);
GButton Open  (5,HIGH_PULL,NORM_OPEN);
GButton Close (4,HIGH_PULL,NORM_OPEN);
bool releOpen = 8;
bool releClose = 9;
bool LedB = 7;
bool LedR = 6;
bool POWER = 10;


void setup() {
  Serial.begin(9600);
  Knopka.setDebounce(100);
  Knopka2.setDebounce(100);
  pinMode(releOpen, OUTPUT);
  pinMode(releClose, OUTPUT);
  pinMode (LedB, OUTPUT);
  pinMode (LedR, OUTPUT);
  Open. setDebounce (100);
  Close. setDebounce (100);
  mySwitch.enableReceive(0);
  //pinMode (POWER, OUTPUT);
}
void loop() {
   Knopka.tick();
   Knopka2.tick();
   Open.tick();
   Close.tick();
 
   //____________открытие ворот__________

    if (Knopka.isPress()
    || mySwitch.getReceivedValue() == 1234567
    || mySwitch.getReceivedValue() == .............
    || mySwitch.getReceivedValue() == ............. ) {
    digitalWrite (releClose, LOW);
    delay(1000);
    digitalWrite (releOpen, HIGH && Serial.println ("Ворота открываются") );    
    digitalWrite (LedB,HIGH);
    digitalWrite (LedR,LOW);
    mySwitch.resetAvailable();
  }    
       
if (Open.isPress() ) {
    digitalWrite (releOpen, LOW);
    digitalWrite (LedB,LOW);
    digitalWrite (LedR,HIGH);
    Serial.println ("Ворота открыты");
    //digitalWrite (POWER, LOW);
}  
   

  //_____________________закрытие ворот_____________

  if (Knopka2.isPress()
  || mySwitch.getReceivedValue() == 1234567
  || mySwitch.getReceivedValue() == ............
  || mySwitch.getReceivedValue() == ............ ) {
   digitalWrite (releOpen, LOW);
   delay(1000);
   digitalWrite (releClose, HIGH && Serial.println ("Ворота закрываются"));  
   digitalWrite (LedB,HIGH);
   digitalWrite (LedR,LOW);
   mySwitch.resetAvailable();
   }
   
    if (Close.isPress())   {
    digitalWrite (releClose, LOW);
    digitalWrite (LedB,LOW);
    digitalWrite (LedR,HIGH);
    Serial.println ("Ворота закрыты");
    //digitalWrite (POWER, LOW);
    }
   }
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
работают как обычные кнопки, т.е. они отключают релюхи в процессе имитации открытия(закрытия), но при повторном нажатии - не срабатывают как конечные концевики.
абсолютно непонятная фраза. Чем отличается ситуация "отключают релюхи" от ситуации "работают как концевики"? И как обычная тупая кнопка разберется, когда она должна реле выключить, а когда концевиком прикинуться? :)
 

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
абсолютно непонятная фраза. Чем отличается ситуация "отключают релюхи" от ситуации "работают как концевики"? И как обычная тупая кнопка разберется, когда она должна реле выключить, а когда концевиком прикинуться? :)
Выглядит это так: ВОРОТА открылись, кнопка отключила реле, но при повторном нажатии кнопки "открыть" и удержании кнопки "концевика" -снова открываются(
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
добавьте в условие, чтобы кнопка открытия срабатывала только при ненажатом концевике открытых ворот. И наоборот для закрытия

и, кстати, у вас в коде есть операторы delay() - в этом коде они категорически недопустимы
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Вот теперь все встало на свои места.
Метод isPress после 1-го использования сбрасывает свой флаг. Что считывать постоянно надо использовать isHold, но тогда возникнет другая ситуация - при откате ворот всегда будет вызываться то , что по условию удержания кнопки. Вывод: проверку isHold надо делать только тогда, когда ворота двигаются в нужную сторону и перед тем как запускать их в эту сторону тоже надо проверить не нажата ли случаем эта кнопка (концевик). А может проверки нажатия концевика будет достаточно перед запуском ворот.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
Метод isPress после 1-го использования сбрасывает свой флаг. Что считывать постоянно надо использовать isHold,
@Старик Похабыч, а зачем тут Hold? - судя по коду - тут достаточно однократной проверки кнопки - а потом ворота едут, пока не упрутся в концевик
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Так когда он второй раз нажимает кнопку. то isPress уже не работает. и ворота будут сносить концевик и часть забора. isPress тут не даст развернуться.
Повторное нажатие кнопки в ту же сторону
 
  • Лойс +1
Реакции: Rulya82

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
добавьте в условие, чтобы кнопка открытия срабатывала только при ненажатом концевике открытых ворот. И наоборот для закрытия
Ок, как?))

и, кстати, у вас в коде есть операторы delay() - в этом коде они категорически недопустимы
[/QUOTE]
Я предположил что как раз delay() создает именно тот необходимый разрыв во времени, когда двигателю необходима пауза для реверса.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
потрудитесь сами, вы же умеете использовать оператор if() - добавьте еще одно условие...
это ж ваш код
delay() создает именно тот необходимый разрыв во времени, когда двигателю необходима пауза для реверса.
а тут еще и реверс есть? в коде не вижу
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
В данном случае, если я правильно все понял, задержка допустима, это пауза между сменой направления движения мотора. Вреда от нее не вижу.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
Вреда от нее не вижу.
если ворота стоят вплотную к концевику, но не нажимают его - по нажатии кнопки они будут двигаться вперед целую секундц. снося все что попадется.
Да и вообще, в управлении опасными механизмами делеи более нескольких миллисекунд, считаю, недоспустимы... они чреваты оторванными пальцами или чего похуже..

Может переписать код без использования "кнопки" и подключить на аналоговый прием +5в?
не понимаю, что вы имеете в виду... но пишите - посмотрим.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
@bort707,Ворота останавливаются и концевик остается нажатым. А что будет если нажать кнопку повтора действия с нажатым концевиком ?

Задержки опасны во время движения ворот, это да. В момент простоя не думаю
 

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
если ворота стоят вплотную к концевику, но не нажимают его - по нажатии кнопки они будут двигаться вперед целую секундц. снося все что попадется.
Да и вообще, в управлении опасными механизмами делеи более нескольких миллисекунд, считаю, недоспустимы... они чреваты оторванными пальцами или чего похуже..
на макете ворота двигаются не целую секунду, а пока не разомкнешь кнопку повторно, и без разницы была ли она зажата. Ладно, попробую isHold , посмотрим что получится
 

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Либо перед выполнением условия нужно обратиться к кнопке... Как это делается?)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
В голове каша. Это нормально.
Берете бумажку и ручку и пишете условия.

Код получил. Кода на открытие. Ворота открыт ? если да, то ничего не делать, если нет - открывать.
Процедура открытия. Ворота двигаются в сторону открытия ? Если да, ничего не делать, если нет - то! Ворота двигаются в противополжную сторону ? если нет, то запустить процедуру открытия, если да, то остановить, выждать и запустить процедуру открытия.

И так по всем пунктам.
обращение к кнопке
if (Open.isHold) - проверка что концевик открытия нажат.
if (!Open.isHold) - проверка что концевик открытия НЕ нажат.
 
  • Лойс +1
Реакции: Rulya82

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
В голове каша. Это нормально.
Берете бумажку и ручку и пишете условия.

Код получил. Кода на открытие. Ворота открыт ? если да, то ничего не делать, если нет - открывать.
Процедура открытия. Ворота двигаются в сторону открытия ? Если да, ничего не делать, если нет - то! Ворота двигаются в противополжную сторону ? если нет, то запустить процедуру открытия, если да, то остановить, выждать и запустить процедуру открытия.

И так по всем пунктам.
обращение к кнопке
if (Open.isHold) - проверка что концевик открытия нажат.
if (!Open.isHold) - проверка что концевик открытия НЕ нажат.
Все работает!!! Всавил функции перед условиями открытия и закрытия!

Осталось только добавить в условие закрытия, опрос сигнала с ИК датчиков и готово!)))
Спасибо Похабыч, очень аккуратненько в коде получилось!)
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
По хорошему концевики надо в прерывания пихать, нет?
Но если от delay() избавились, то может и не нужно
 

Rulya82

✩✩✩✩✩✩✩
23 Янв 2022
8
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
По хорошему концевики надо в прерывания пихать, нет?
Но если от delay() избавились, то может и не нужно
Мне кажется что прерывание не для этих случаев. Да и зачем усложнять код, если все работает по простому алгоритму
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Тут разные варианты можно делать. Для нешаговых моторов да, концевики надо бы на прерчывания вешать, но тут задержка именно при сменен направления , т.е. при выключенных воротах, а в остальных случаях мониторится концевик.
Задержка на дебонс 100 мкс, т.е. опрос будет проходтиь не чаще чем 10 000 раз в секунду, что вполне приемлемо.
Для шагового мотора даже на прерывания вешать не надо (хотя будет лучше!) - можно читать регистр пина (что быстрее) перед выполнением шага.
А еще можно уменьшить дебонс сделав аппаратный антидребезг. Но там тоже надо считать время срабатывания.

@Rulya82,Прерывания как раз для этих случае. Моментальное срабатывание для останова ворот. И еще на прерывание хорошо вешать безопасность по ИР. Я так понимаю изобретается аналог дорхана или подобного