Открывание ворот на ардуино. Помогите.
- Войдите на сайт для отправки комментариев
Чт, 23/12/2021 - 20:57
Достался мне колекторный движок с редуктором, и я хочу его применить у себя, в качестве привода открывания ворот.
Но в коде я пока очень плохо разбераюсь. Помогите старику.
(по умолчанию замкнут)
концевик концевик
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); } }
К сожалению, не только в коде.
Вот так
Делать нельзя.
Во-первых, может случиться (по самым разным причинам), что в момент нажатия кнопки оба концевика разомкнуты. По Вашему алгоритмы в этом случает ничего не произойдёт от слова совсем.
Таки образом,
Во-вторых, не предусмотрена экстренная остановка, если на пути препятствие. Вы рискуете повредить машину или стукнуть ребёнка, который решил забежать во двор перед закрывающимся воротами.
В-третьих, не предусмотрено отключение двигателя, если ворота по каким-то причинам не идут (где-то что-то заледенело или на пути их движения оказалась снеговая лопата, которую вы приставили к забору и забили). В это случает движок будет тужиться пока не сгорит.
В четвёртых, не предусмотрен механизм блокировки / разблокировки. Т.е. в нормальной ситуации не должно быть возможности просто потянуть их рукой и открыть. Но, если Вам надо (например, свет отключили) Вы должны иметь возможность это сделать.
И да, кстати, что такое "по умолчанию замкнут"? Имеется в виду "нормально замкнут", а когда воротина наедет - разомкнут? Или просто изначально ворота его подпирают?
Так первая логика (Читаем "sb1", "sb2" и кнопку "пуск".) как раз этим и занимается. То-есть если не нажат ни один концевик, или мы по каким-то причинам не доехали, - едем в любую по очереди сторону!
В драйвере, который я собераюсь использовать, есть "CS - Выход датчика тока.Напряжение на выходе пропорционально току двигателя при движении". https://www.pololu.com/product/2995 С помощью него, можно анализировать нагрузку движка, и если она, превышает заданную заранее откалиброванною нагрузку, тут-же отключает ШИМ, начинает мигать сигнальной лампой.
Это я сделаю на слесарном уровне, не проблема.
Просто изначально ворота его подпирают, и он нормально замкнут.
Так первая логика (Читаем "sb1", "sb2" и кнопку "пуск".) как раз этим и занимается. То-есть если не нажат ни один концевик, или мы по каким-то причинам не доехали, - едем в любую по очереди сторону!
Ничего подобного в алгоритме не написано.
Также там ничего не написано про организацию очереди. Как она делается, на чём? Когда опрашивается? Просто "в любую по очереди сторону" не бывает.
можно анализировать нагрузку движка, и если она, превышает заданную заранее откалиброванною нагрузку, тут-же отключает ШИМ, начинает мигать сигнальной лампой.
Ничего подобного в алгоритме не написано. Про сигнальную лампу там вообще не упоминается.
Это я сделаю на слесарном уровне, не проблема.
Только на слесарном уровне это не делается. Это надо как-то и программно тоже отрабатывать.
он нормально замкнут.
Тогда читайте п.1 Вашего алгоритма и смотрите, что получите (хотя хрен Вас знает, что Вы получите, т.к. здесь Вы используете слово "замкнут", а там "зажат". Одно это и то же или нет, никто не знает).
В общем, прежде, чем приступать к написанию кода, Вам нужен чёткий алгоритм, которого у Вас нет. Это то, что я хотел сказать Вам вчера. Вы решили поспорить - это Ваше право, конечно.
Старик! Мы тут тоже не мальчики. Вы можете описать алгоритм работы Вашего устройства? Херня на СИ++ не прокатывает. Нормальным языком, шаг за шагом...