Электролюк на два положения

coolibin
coolibin аватар
Offline
Зарегистрирован: 27.12.2015

Давно мучает идея оснащения люка своей старушки электроприводом в место весла...
Логика работы люка проста, представлена на видео 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 на ЦЗ ещё не разводил - т.к. ещё не знаю штатную (автомобильную) полярность управления ЦЗ.

Собрал я её по принципу "минимум" - прошу не кидаться помидорами... со знаниями аппартной части всё в порядке.

Решил начать освоение Ардуины с именно такой задачи.

Есть ряд вопросов про кнопки в одно касание с зависимостью от состояния концевиков.

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

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

coolibin пишет:
Пробовал через логические операторы, не вышло, решил написать за помощью сюда.

Попробуй так:

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

coolibin
coolibin аватар
Offline
Зарегистрирован: 27.12.2015

Andy пишет:

номера выходов объяви как константы, а не переменные: #define Relay_1    4

Когда выходы ставллю через define или const компилятор выдаёт ошибку...
Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

coolibin пишет:
Когда выходы ставллю через define или const компилятор выдаёт ошибку...
Какого рода ошибка? Код ниже компиляется без ошибок.

#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);
}