Открывание ворот на ардуино. Помогите.

Igoreck
Offline
Зарегистрирован: 01.03.2017
 
Достался мне колекторный движок с редуктором, и я хочу его применить у себя, в качестве привода открывания ворот.
Но в коде я пока очень плохо разбераюсь. Помогите старику.
 
 
(по умолчанию замкнут)  
      концевик                                                                        концевик
       sb1                                                                                    sb2
      __/\__                         направление                                   __/__      
                                          __________\
                                                            /              
      ________________________________________________________
 
 
      Алгоритм работы привода.
1). Читаем "sb1", "sb2" и кнопку "пуск".
2). Если нажали кнопку "пуск", и был зажат концевик "sb1, то игнорим "sb1", включаем "dir", "PWM" и движемся в право.
3). Как только сработал "sb2", то отключаем "PWM", "dir".
4). Если нажали кнопку "пуск", и был зажат концевик "sb2, то игнорим "sb2", включаем "PWM" и движемся в лево.
5). Как только сработал "sb1", то отключаем "PWM" (возврат в исходное).
      Важно:
      а). сигнал "PWM" должен работать как електричка, тоесть сначала медленно, в середине максимум, в конце замедляемся!
      б). "dir" от слова "direction" (направления движения. простой сигнал высокого уровня).
      в). "sb1" и "sb2" - концевики начальный и конечный.
 
int PWM = 3;
boolean dir_flag = 0;
boolean butt_flag = 0;
boolean button;
boolean sb1;
boolean sb2;
int  a;
int  b;
void setup() {
  TCCR2B = 0b00000001;
  TCCR2A = 0b00000001;
  pinMode(8, OUTPUT);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
}
void loop() {
  logic();
  button = !digitalRead(4);
  if (a == 1 && b == 0) {
    if (button == 1 && butt_flag == false) {
      butt_flag = true;
    }
    if (button == 1 && butt_flag == true) {
      butt_flag = false;
      door();
    }
  }
  if (a == 0 && b == 1) {
    if (button == 1 && butt_flag == false) {
      butt_flag = true;
    }
    if (button == 1 && butt_flag == true) {
      butt_flag = false;   
      door();
    }
  }
}
void logic() {
  sb1 = !digitalRead(5);
  sb2 = !digitalRead(6);
  if (sb1 == 1 && sb2 == 0) {
 a = 1;
 digitalWrite(8, LOW);
  }
  else a = 0;
 if (sb1 == 0 && sb2 == 1) {
 b = 1;
 digitalWrite(8, HIGH);
  }
  else b = 0;
}
void door() {
  for (int fadeValue = 0;fadeValue <= 255; fadeValue += 5) {
    analogWrite(PWM, fadeValue);
    delay(30);
  }
  for (int fadeValue = 255; fadeValue >= 0; fadeValue -= 5) {
    
    analogWrite(PWM, fadeValue);
    delay(30);
    
  }
}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Igoreck пишет:
в коде я пока очень плохо разбераюсь.

К сожалению, не только в коде.

Вот так

Igoreck пишет:

(по умолчанию замкнут)  
      концевик                                                                        концевик
       sb1                                                                                    sb2
      __/\__                         направление                                   __/__      
                                          __________\
                                                            /              
      ________________________________________________________
 
      Алгоритм работы привода.
1). Читаем "sb1", "sb2" и кнопку "пуск".
2). Если нажали кнопку "пуск", и был зажат концевик "sb1, то игнорим "sb1", включаем "dir", "PWM" и движемся в право.
3). Как только сработал "sb2", то отключаем "PWM", "dir".
4). Если нажали кнопку "пуск", и был зажат концевик "sb2, то игнорим "sb2", включаем "PWM" и движемся в лево.
5). Как только сработал "sb1", то отключаем "PWM" (возврат в исходное).
      Важно:
      а). сигнал "PWM" должен работать как електричка, тоесть сначала медленно, в середине максимум, в конце замедляемся!
      б). "dir" от слова "direction" (направления движения. простой сигнал высокого уровня).
      в). "sb1" и "sb2" - концевики начальный и конечный.

Делать нельзя.

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

Таки образом,

  1. если, по каким-то причинам, ворота остановились не доехав до концевика. Вы их больше не сдвинете (ну или пойдёте руками концевики жать.
  2. если Вы начали их открывать, но передумали, то для чтобы закрыть обратно, придётся ждать пока полностью откроются. Очень неудобно.

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

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

В четвёртых, не предусмотрен механизм блокировки / разблокировки. Т.е. в нормальной ситуации не должно быть возможности просто потянуть их рукой и открыть. Но, если Вам надо (например, свет отключили) Вы должны иметь возможность это сделать.

И да, кстати, что такое "по умолчанию замкнут"? Имеется в виду "нормально замкнут", а когда воротина наедет - разомкнут? Или просто изначально ворота его подпирают?

Igoreck
Offline
Зарегистрирован: 01.03.2017

Так первая логика  (Читаем "sb1", "sb2" и кнопку "пуск".) как раз этим и занимается. То-есть если не нажат ни один концевик, или мы по каким-то причинам не доехали, - едем в любую по очереди сторону!

В драйвере, который я собераюсь использовать, есть "CS - Выход датчика тока.Напряжение на выходе пропорционально току двигателя при движении". https://www.pololu.com/product/2995 С помощью него, можно анализировать нагрузку движка, и если она, превышает заданную заранее откалиброванною нагрузку, тут-же отключает ШИМ, начинает мигать сигнальной лампой.

Это я сделаю на слесарном уровне, не проблема. 

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Igoreck пишет:

Так первая логика  (Читаем "sb1", "sb2" и кнопку "пуск".) как раз этим и занимается. То-есть если не нажат ни один концевик, или мы по каким-то причинам не доехали, - едем в любую по очереди сторону!

Ничего подобного в алгоритме не написано.

Также там ничего не написано про организацию очереди. Как она делается, на чём? Когда опрашивается? Просто "в любую по очереди сторону" не бывает.

Igoreck пишет:

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

Ничего подобного в алгоритме не написано. Про сигнальную лампу там вообще не упоминается.

Igoreck пишет:

Это я сделаю на слесарном уровне, не проблема. 

Только на слесарном уровне это не делается. Это надо как-то и программно тоже отрабатывать.

Igoreck пишет:

он нормально замкнут.

Тогда читайте п.1 Вашего алгоритма и смотрите, что получите (хотя хрен Вас знает, что Вы получите, т.к. здесь Вы используете слово "замкнут", а там "зажат". Одно это и то же или нет, никто не знает).

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

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

Igoreck пишет:

Помогите старику.

Старик! Мы тут тоже не мальчики. Вы можете описать алгоритм работы Вашего устройства? Херня на СИ++ не прокатывает. Нормальным языком, шаг за шагом...