Электролюк на два положения
- Войдите на сайт для отправки комментариев
Давно мучает идея оснащения люка своей старушки электроприводом в место весла...
Логика работы люка проста, представлена на видео http://www.youtube.com/watch?v=JZGxaFHJQNY, НО не корректно (несколько не так как мне хочется), все действия должны происходить в одно касание и есть необходимость в привязке к ЦЗ для закрытия люка автоматически при поставновке на охрану.
Аппаратно планиурю применить следующие детали:
http://www.aliexpress.com/item/Free-Shipping-1PCS-LOT-5V-2-Channel-Relay...
http://www.aliexpress.com/item/Free-Shipping-1pcs-LM2596-LM2596S-DC-DC-4...
http://www.aliexpress.com/item/Freeshipping-Nano-3-0-controller-compatib...
Привод имеет два концевика и реперный диск, при некоторых положениях которого, тот или иной концевик находится в заданном состоянии. Что хуже всего для моего понятия, это наличие перетекающего процесса 0=>1. Т.е. один концевик отвечает за контроль положения люка в состоянии "закрыт" или "сдвинут", а второй в состоянии "закрыт" или "поднят". Когда люк двигается из состояния "закрыт" в состояние "сдвинут" концевик состояний ("закрыт" или "поднят") два раза меняет своё состояние из 0=>1=>0, причём цикл заканчивается позже "отслеживаемого" на данный момент.
Попробую описать так:
Для самоуспокоения дабы если не получится не тратиться на выше указанные ардуиновские примочки, эмулирую в https://123d.circuits.io
там начал делать скетч, и познания С++ заложенные с техникума у меня закончились.
int Relay_1 = 4; // реле 1
int Relay_2 = 5; // реле 2
int Button_1 = 6; // сдвинуть - открыть в одно касание
int Button_2 = 7; // сдвинуть - закрыть в одно касание
int Button_3 = 8; // поднять - опустить в одно касание
int Switch_1 = 9;// концевик 1
int Switch_2 = 10;// концевик 2
int CenZamok = 11;// сигнал с центрального замка, при активации подаётся (-)
void setup()
{
pinMode (Relay_1, OUTPUT);
pinMode (Relay_2, OUTPUT);
pinMode (Button_1, INPUT);
pinMode (Button_2, INPUT);
pinMode (Button_3, INPUT);
pinMode (Switch_1, INPUT);
pinMode (Switch_2, INPUT);
pinMode (CenZamok, INPUT);
}
void loop()
{
if (digitalRead(Button_1) == HIGH)
{
digitalWrite(Relay_1, HIGH);
}
else
{
digitalWrite(Relay_1, LOW);
}
if (digitalRead(Button_2) == HIGH)
{
digitalWrite(Relay_2, HIGH);
}
else
{
digitalWrite(Relay_2, LOW);
}
}
Схемка тут https://123d.circuits.io/circuits/1398606-
Ногу 11 на ЦЗ ещё не разводил - т.к. ещё не знаю штатную (автомобильную) полярность управления ЦЗ.
Собрал я её по принципу "минимум" - прошу не кидаться помидорами... со знаниями аппартной части всё в порядке.
Решил начать освоение Ардуины с именно такой задачи.
Есть ряд вопросов про кнопки в одно касание с зависимостью от состояния концевиков.
Пробовал через логические операторы, не вышло, решил написать за помощью сюда.



Попробуй так:
void loop() { switch (gear_status) { case CLOSED: if (button_open) {relay1(ON); gear_status = CLOSED1;} break; case CLOSED1: if (sw == 01) gear_status = OPENING; break; case OPENING: if (sw == 11) {relay1(OFF); gear_status = OPENED;} break; case OPENED: if (button_close) {relay2(ON); gear_status = OPENED1;} break; case OPENED1: ... и т.д. } }На кнопки и концевики нужен программный антидребезг и номера выходов объяви как константы, а не переменные: #define Relay_1 4
номера выходов объяви как константы, а не переменные: #define Relay_1 4
#define Relay_1 4 #define On HIGH #define Off LOW #define RELAY1(b) digitalWrite(Relay_1,b) int const Relay_2=5; int Relay_3=6; void loop() { RELAY1(On); digitalWrite(Relay_2, HIGH); digitalWrite(Relay_3, On); }