управление лифтом

drew
Offline
Зарегистрирован: 26.04.2014

есть необходимость управлять подьемником на 2,,3,4,5,6 остановок.

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

в программировании я полный чайник. вот из железа что угодно соберу. но хочется и колется. решил попробовать.\

алгоритм простой . 

есть 1,2,3,4...итд этажи. на каждом этаже датчик точной остановки (ДТО. дто1,дто2 итд) 

есть кнопки вызовов КН1, КН2,КН3 итд.

есть еще РКД (блокировки) без которых ехать вообще никуда не должен.

попробую сначала самый простой вариант на 2 остановки.

нажимем кнопку 1го этажа и должен включиться контактор низа (КН) до тех пор пока не сработает ДТО1

если ДТО1 включено.- ничего не делаем.

 

нажимаем кнопку 2го этажа и должен включиться контактор верха (КВ) до тех пор пока не сработает ДТО2

если ДТО2 включено- ничего не делаем.

вот что у меня получилось, спустя 3часа изучения вот этого- http://arduino.ru/Reference

буду очень признателен если укажете мне на ошибки. и укажете как быть дальше с 3мя остановками.

ну а если уж окажусь совсем необучаем- покажите тему плиз, где мне могут сделать это за цифирки на кредитке.



#define RKD 2       // РКД блокировки ( пока отложим)

#define FL1Call 3        // вызов 1этажа

#define FL2Call 4         //   вызов 2 этажа

#define DTO1 5 // ДТО 1этажа

#define DTO2 6 // ДТО 2 этажа

#define KV 10 // контакор вверх

#define KN 11 // контактор вниз




void setup ()

{

pinMode(KV, OUTPUT); // назначение   выходов и входов

pinMode(KN, OUTPUT);

pinMode(RKD, INPUT);

pinMode (FL1Call, INPUT);

pinMode (FL2Call, INPUT);

pinMode (DTO1, INPUT);

pinMode (DTO2, INPUT);

digitalWrite(KV, 0);  // назначение выходов

digitalWrite(KN, 0);
}


void loop ()
{
if (digitalRead(FL1Call)==HIGH && digitalRead(DTO1)==LOW)
 {
while (DTO1) 
   digitalWrite (KN ,1); // едем вниз на первый этаж пока не сработает ДТО1

 }

  if (digitalRead (FL2Call)==HIGH && digitalRead(DTO2)==LOW)
  {
    while (DTO2)
    digitalWrite (KV,1); // едем вверх на второй этаж пока не сработает ДТО2
  }
 }

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

блин, тема с лифтами на самом деле гораздо сложней описаной вами... особенно если задействовать микропроцесоры, а не реле... есть целые математические модели и дисертации... задачи ставятся тут немного по другому.. можно же собирать статистику. зависимость нагрузки от времени и по этажам... с этой статистики будет видно например что если задержать лифт на минуту то в нем уедет еще один человек, в целом тема интересная...

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

drew
Offline
Зарегистрирован: 26.04.2014

статистка, люди, анализ. это ни к чему.

это грузовой подьемник. с примитивной ллогикой. не нужно углубляться . чем проще -тем надежней.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Для начала надо придумать как они будут обьединяться - я думаю надо шину RS485 использовать и небольшой контроллер на каждый этаж. Или пучок проводов идущий от каждого этажа? Если пучок проводов то их нельзя подключать напрямую к мк - гроза, статическое электричество "Убьют вашу прелесть". Вобщем если остановок не так много то можно и пучком проводов обойтись с оптронами в управляющем блоке...

Только после этого надо приступать к програмированию - то что у вас написано в 1 сообщении не будет работать.

Нужно 3 переменные - пункт назначения и 2 состояние(старое значение и новое). Состояние - присваивается кодовым значениям которые определены оператором #define

 

drew
Offline
Зарегистрирован: 26.04.2014

от каждого этажа

идет провод : кнопки (2 в данном случае) и один датчик ДТО

то что написал. и так не работает(( уже проверил. 

и что т даж подобное наити не удается(  хотяб образец глянуть .

буду думать как это можно воплотить в жисть

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
#define UP 0x01 //вверх
#define DOWN 0x02 //вниз
#define STOP 0x00 // стоп
#define RT 0x03 // датчик безопасности
#define ERROR 0x0F

byte state = STOP;
byte old_state = STOP;
byte dst = 0x01; // конечная точка
byte pos = 0x01; // текущая точка

#define RKD 2       // РКД блокировки ( пока отложим)
#define FL1Call 3        // вызов 1этажа
#define FL2Call 4         //   вызов 2 этажа
#define DTO1 5 // ДТО 1этажа
#define DTO2 6 // ДТО 2 этажа
#define KV 10 // контакор вверх
#define KN 11 // контактор вниз


void setup ()
{
	pinMode(KV, OUTPUT); // назначение   выходов и входов
	pinMode(KN, OUTPUT);
	pinMode(RKD, INPUT);
	pinMode (FL1Call, INPUT);
	pinMode (FL2Call, INPUT);
	pinMode (DTO1, INPUT);
	pinMode (DTO2, INPUT);
	digitalWrite(FL1Call, HIGH); //Включим внутренние подтягивающие резисторы
	digitalWrite(FL2Call, HIGH);
	digitalWrite(DT01, HIGH);
	digitalWrite(DTO2, HIGH);
	digitalWrite(RKD, HIGH);
	digitalWrite(KV, 0);  // назначение выходов
	digitalWrite(KN, 0);
}


void loop ()
{       // определяем текущиее точки по датчикам и конечные по кнопкам
	if (digitalRead(FL1Call)==LOW)
	{
		dst = 0x01;
	}
	if (digitalRead(DT01)==LOW)
	{
		pos = 0x01;
	}
	if (digitalRead(FL2Call)==LOW)
	{
		dst = 0x02;
	}
	if (digitalRead(DT02)==LOW)
	{
		pos = 0x02;
	}
	if (digitalRead(RKD) == LOW)
	{
		state = RT;
	}
	
	if (state == STOP)// Мы в конечном пункте(стоим)
		if (dst > pos)// Выбираем направление
		{
			state = UP;
		}else{
			state = DOWN;
		}
	if (dst == pos)
	{
		state = STOP;
	}
	if( state != old_state)
	{
		switch(state){
			case UP:
				digitalWrite (KV,1);
			break;
			case DOWN:
				digitalWrite (KN,1);
			break;
			case STOP:
			case RT:
			default:
				digitalWrite (KV,0);
				digitalWrite (KN,0);
		}
		old_state = state;
	}
 }

Вот как то так.

toc
Offline
Зарегистрирован: 09.02.2013

drew,
сейчас ваш лифт не умеет останавливаться. Добавьте после 55 строки это:
digitalWrite (KN ,0);
digitalWrite (KV ,0);

Почитайте о конечных автоматах, может понравиться.

drew
Offline
Зарегистрирован: 26.04.2014

спс огромное буду разбираться. 

drew
Offline
Зарегистрирован: 26.04.2014

нашел управление аналоговыми выходами. 

неправильно, наверно, но работает. на 2 ост сойдет. а вот на 3 и более тут придется лес городить(

#define KV 10
#define KN 11
#define FL2call 7
#define FL1call 6
#define DTO2 2
#define DTO1 3



void setup(){
  pinMode(KV, OUTPUT); 
  pinMode(FL2call, INPUT);
  pinMode(DTO2, INPUT);
  pinMode(KN, OUTPUT);
  pinMode(FL1call, INPUT);
  pinMode(DTO1, INPUT);
}

void loop(){
  if(GoDown()){
    return goDown();
  }
  if(GoUp()){
    return goUp();
  }


  stopMotor();
}

boolean GoUp(){
  if(digitalRead(DTO2)){ 
    return false;
  }
  if(digitalRead(FL2call)){
    return true;
  }
  return false;
}

boolean GoDown(){
  if(digitalRead(DTO1)){
    return false;
  }
  if(digitalRead(FL1call)){
    return true;  
  }
  return false;
}



void goUp(){
  analogWrite(KN, 0);
  analogWrite(KV , 1000);
}

void goDown(){
  analogWrite(KV, 0);
  analogWrite(KN, 1000);
}

void stopMotor(){
  analogWrite(KN, 0);
  analogWrite(KV, 0);
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Напрашиваются пять параллельных процессов , взаимодействующих на уровне глобальных переменных, с частотой повторения, скажем 10 раз в секунду...

- собственно платформа , с сотстояниями едем/неедем и вверх/вниз.

- получение запросов на прибытие ( опрос кнопок на этажах)

- получение запросов на отправление ( опрос кнопок в кабине )

- получение информации о положении кабины ( опрос датчиков положения)

- процесс , формирующий состояние переменных для первого процесса на основании информации , полученной от 2,3,4 процессов, суть- конечный автомат, частота запуска этого процесса -100 раз в секунду.

важно при опросе датчиков контролировать состояние обрыва и последовательности, скажем после состояния "замкнуто" датчика положения кабины для 4го этажа могут менять состояния только датчики 3го и 2го . Важно при манипулировании движком применять активное торможение и контролировать ток потребления.

при использовании мультизадачности мне более всего нравится использовать http://blog.ksduino.org/post/42862084042/pseudo-multitasking-using-timer-in-arduino-sketch

работает устойчиво и удобно, хотя есть альтернативные библиотеки для мультизадачности. 

drew
Offline
Зарегистрирован: 26.04.2014

))) да я в программировании полный ноль)

а Вы мне мультизадачность..

drew
Offline
Зарегистрирован: 26.04.2014

работает но нет удержания во время движения вверх\вниз

что надо добавить в goUP\goDown чтоб оно сбрасывалось по DTO?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Тут же был специалист по управлению лифтами (Лифтанутый), только ник у него на этом форуме - другой. Где-то в нижнем разделе его представляли...

inspiritus
Offline
Зарегистрирован: 17.12.2012

На самом деле с мультизадачностью иногда проще разрулить , чем прямым кодом ...

фактически создаются сущности ... Тормознутые и быстрые, обитающие в едином пространстве глобальных переменных ( вселенной ;), некоторые могут менять правила вселенной ( воздействовать на переменные) , некоторые только слушать и повиноваться ( как мы их определим ;)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

inspiritus пишет:

На самом деле с мультизадачностью иногда проще разрулить , чем прямым кодом ...

фактически создаются сущности ... Тормознутые и быстрые, обитающие в едином пространстве глобальных переменных ( вселенной ;), некоторые могут менять правила вселенной ( воздействовать на переменные) , некоторые только слушать и повиноваться ( как мы их определим ;)

Как то раз я пытлся объяснить начальнику, что когда человек становится программистом он сворачивает себе мозги и начинает воспринимать действительность несколько иначе... Не смог объяснить, ибо выражение лица начальника было паническое, а рука тянулась набрать номер психиатрички :-)

 

 

 

drew
Offline
Зарегистрирован: 26.04.2014
void setup()
{
pinMode(3, INPUT);
pinMode(6, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(5, INPUT);
pinMode(2, INPUT);

}
void loop()
{



if((digitalRead (3))&& (!((digitalRead (6))))){digitalWrite (8, 1);
}
if((digitalRead (6))&& (!((digitalRead (3))))){digitalWrite (8, 0);
}
if((digitalRead (2))&& (!((digitalRead (5))))){digitalWrite (9, 1);
}
if((digitalRead (5))&& (!((digitalRead (2))))){digitalWrite (9, 0);
}


}

ларчик просто открывался)) 

все работает на 2 остановки

drew
Offline
Зарегистрирован: 26.04.2014

усе) 

всем спасибо за пинки в нужном направлении. \

написал на 3 и более остановок. правда пришлось много рисовать(

терь прикручу семисегментку и лсд. и наступит полное счастье)

pikolo
Offline
Зарегистрирован: 07.06.2015

Не могли бы вы написать  тут, что у  вас получилось, я  сейчас  столкнулся  с  похожей на вашу  проблему, однако не  могу  сам  додуматься  как написать для  3-х и болеее остановок, буду очеь признателен

titamir
Offline
Зарегистрирован: 17.11.2016

Тоже интересно как автор реализировал проект

Барон
Offline
Зарегистрирован: 17.11.2016

Судя по всему: собрал и решил прокатиться.... боюсь ошибиться но в лифты наврядли можно пихать самопал.. 

Старый
Offline
Зарегистрирован: 09.10.2016

Барон пишет:

Судя по всему: собрал и решил прокатиться.... боюсь ошибиться но в лифты наврядли можно пихать самопал.. 

Чет давно не появлялся на форуме автор.Видать застрял между этажами, или того.... не дай бох...