'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Autor Wątek: (Pomysłowy Dobromir) Czujnik położenia bramy garażowej  (Przeczytany 3613 razy)

vakul

  • Full Member
  • ***
  • Wiadomości: 149
    • Zobacz profil
(Pomysłowy Dobromir) Czujnik położenia bramy garażowej
« dnia: Listopada 19, 2017, 12:11:18 pm »

Tym razem brama garażowa.

Długo kombinowałem, jak uzyskać rzetelną informację o bieżącym położeniu bramy garażowej.

Podejście pierwsze - dwa kontaktrony w skrajnych pozycjach bramy. Dzięki temu wiemy, czy brama jest w pełni otwarta lub w całkowicie zamknięta. Położenia pośrednie można wyliczać wg czasu ruchu bramy. Temat ogólnie złożony i bardzo podatny na ewentualne nieścisłości w wynikach (brama ręcznie otwarta, zablokowana itd.).

Podejście drugie - odczyt impulsów z kręcących się elementów napędu bramy. Rozważałem 4 magnesy na kole nawojowym od linki i jeden kontaktron liczący impulsy z tych magnesów. Dodatkowo kontaktrony na skrajnych pozycjach, jak wyżej.

Podejście trzecie - odczyt impulsów z silnika napędu bramy (są tam enkodery optyczne) - porzuczone.

Rozwiązanie:
Podejście czwarte, które ostatecznie wdrożyłem oparte jest o moduł 4-20mA (Wago 750-492) + wieloobrotowy potencjometr zadający pozycję wałka, na który nawija się linka unosząca bramę.

Po obserwacji wyszło mi, że wałek przy pełnym zakresie ruchu bramy obraca się niecałe 7 razy. Potencjometr z kolei pozwala na wykonanie 10 obrotów. Dalej były dwa problemy do rozwiązania, podłączenie elektryczne i mechaniczne połączenie potencjometru z bramą.

Elektronika:
Przy sterowniku moduł 750-492, dalej dwa przewody do potencjometru przy bramie.
Skorzystałem z takiego schematu: http://forums.mrplc.com/index.php?/topic/30861-4-20ma-from-potentiometer/
Moje R1 to 220 Ohm, R2 chyba takie jak w schemacie, nie pamiętam. W internecie są dostępne kalkulatory, do wyliczenia poszczególnych rezystancji.

Mechanika:
Tutaj proszę zerknąć na zdjęcia. Na wałek bramy (średnica coś ok. 25mm) na gorąco nałożyłem mufę PCV (musiałem ją podgrzać bo nie chciała wejść, brakowało ok. 1,5mm na średnicy). W dużą mufę wcisnąłem mniejszą (weszła na wcisk). Teraz średnica była już zbliżona do tej, której potrzebowałem. W małej mufie włożyłem kawałek gumy tak aby gałka potencjometru weszła na delikatny wcisk. Pełni to rolę sprzęgła, w razie blokady, a dodatkowo pozwala tłumić bicie przez niewspółosiowe ułożenie wałka i potencjometru.

Na potencjometrze jest gałka, mimo odpowiedniego dokręcenia to i tak przy nadmiarze siły się obraca, czyli w razie konieczności będzie to drugi stopień sprzęgła.

Potencjometr umocowałem trytytkami do blaszki od regipsów (służyła do krzyżowego łączenia profili). Blaszka pozwoliła na ręczne dopasowanie odległości od ściany aby uzyskać w miarę równe ułożenie potencjometru w jednej osi z wałkiem bramy. W trakcie pracy blaszka lekko pracuje, co jest całkiem dobre i nie polecam robienia całości na sztywno.

Na górze umocowałem puszkę, w której ukryłem elektronikę i kabelki.

Program:
Po montażu trzeba było skalibrować pozycję bramy i odczyty z czujnika. Okazało się, że pozycja odczytana z czujnika zmieniała się wykładniczo (a miała być liniowa). Musiałem to uwzględnić w programie. Zanotowałem w excelu kilkanaście pozycji bramy w postaci par "uniesienie bramy w milimetrach" + "odczyt z czujnika". Pierwsze 60-70% uniesienia bramy daje odczyt z grubsza liniowy, później wzrost jest gwałtowny. Dlatego w pozostałych pozycjach zagęściłem odczyty. Mając zestaw takich par pozycje pośrednie interpoluję w programie.

W celu odfiltrowania wskazań czujnika użyłem funkcji FILTER_DW z bibliotek Oscat. Po filtrowaniu odczyty pozycji zmieniają się maksymalnie o kilka milimetrów.

Źródło w ST umieszczę w osobnym poście.

Podsumowanie:
Rozwiązanie w 110% spełniło moje oczekiwania a precyzja odczytów niesamowicie mnie zaskoczyła (dokładność rzędu 1cm). Na wizualizacji mogę wyświetlić sobie na ile centymetrów mam podniesioną bramę lub wyrazić to w procentach - wedle uznania. Kontaktronów, na skrajnych pozycjach, mimo że je zamontowałem, nie używam bo nie ma takiej potrzeby. Odczyt pozycji bramy jest niezależny od tego, czy ktoś uniósł ją ręcznie (bez prądu) czy ze sterownika. Rozwiązanie idealne.

Koszt części, to około 30-40zł (mufy PCV z castoramy, elektronika z allegro) nie licząc oczywiście modułu wago, który miałem na stanie. Z wykonaniem całości zeszło mi ze dwa dni, trochę pracy jednak było.

A jakby ktoś pytał "ale po co?", odpowiem "bo można" ;)
Zapisane

vakul

  • Full Member
  • ***
  • Wiadomości: 149
    • Zobacz profil
Odp: (Pomysłowy Dobromir) Czujnik położenia bramy garażowej
« Odpowiedź #1 dnia: Listopada 19, 2017, 12:15:01 pm »

PROGRAM GarageDoor
VAR
(* dane wyjsciowe *)
GATE_POSITION_MM : INT; (* pozycja bramy w milimetrach *)
GATE_POSITION_CM : INT; (* pozycja bramy w centymetrach *)
GATE_POSITION_PERCENT : INT; (* pozycja bramy wyrazona w procentach otwarcia *)
GATE_POSITION_PERCENT_CLOSED : INT; (* pozycja bramy wyrazona w procentach zamkniecia *)

(* dane wejsciowe *)
GarageDoorPositionSensor : DWORD; (* polozenie bramy odczytane z czujnika i wstepnie wygladzone *)
SensorSmooth : FILTER_DW; (* filtr z biblioteki oscat basic 333 *)

(* rzeczywiste pomiary odczytu czujnika 4-20mA i odpowiadajacej im pozycji bramy. W przypadku demontazu czujnika konieczne jest pownowna kalibracja *)
SensorCalibrationCount : INT := 16; (* ilosc dokonanych w naturze pomiarow - im wicej i gesciej tym wyniki beda dokladniejsze, szczegolnie gorny zakres *)
SensorCalibrationVal : ARRAY [0..15] OF INT := 3040, 3139, 3600, 4500, 4900, 5650, 6890, 7400, 7870, 8150, 9419, 9536, 13695, 13880, 17000, 19430;
SensorCalibrationPos : ARRAY [0..15] OF INT := 0, 45,185, 425, 520, 680, 915, 995, 1070, 1110, 1285, 1300, 1720, 1730, 1960, 2150;

(* zmienne pomocnicze *)
i : INT;
rel_val : REAL;
upper_val : INT;
END_VAR

(* na poczatek wygladzenie szybkozmiennej z czujnika *)
SensorSmooth(
   X:=GARAGE_DOOR_POSITION_SENSOR_RAW , (* wartosc odczyta bezposrednio z czujnika/modulu 750-492 *)
   T:= t#500ms,
   Y=> GarageDoorPositionSensor );

(* jezeli wartosci sa poza dolnym/gornym zakresem przechodzimy na koniec warunku *)
IF ((GarageDoorPositionSensor >= SensorCalibrationVal[0]) AND (GarageDoorPositionSensor <= SensorCalibrationVal[SensorCalibrationCount-1])) THEN
(* sprawdzenie w ktory przedzial trafia nasza zmierzona wartosc, wartosci w tablicy sa posortowane rosnaco *)
FOR i:=1 TO SensorCalibrationCount BY 1 DO
IF (SensorCalibrationVal[i] >= GarageDoorPositionSensor ) THEN
upper_val:=i;
i:=SensorCalibrationCount+1; (* exit_for *)
END_IF;
END_FOR;
(* okreslenie, pomiedzy ktorymi wartosciami wzorcowymi znalazl sie aktualny pomiar, wykonanie interpolacji *)
rel_val := DWORD_TO_REAL(GarageDoorPositionSensor-SensorCalibrationVal[upper_val-1]) / DWORD_TO_REAL(SensorCalibrationVal[upper_val]-SensorCalibrationVal[upper_val-1]) * 1.0;
GATE_POSITION_MM := REAL_TO_INT(SensorCalibrationPos[upper_val-1] + (SensorCalibrationPos[upper_val] - SensorCalibrationPos[upper_val-1]) * rel_val);
ELSE
IF (GarageDoorPositionSensor < SensorCalibrationVal[0]) THEN
GATE_POSITION_MM := SensorCalibrationPos[0]; (* odczyt poza dolnym zakresem - przyjmujemy, ze brama jest calkowicie zamknieta *)
END_IF;
IF (GarageDoorPositionSensor > SensorCalibrationVal[SensorCalibrationCount-1]) THEN
GATE_POSITION_MM := SensorCalibrationPos[SensorCalibrationCount-1]; (* odczyt poza gornym zakresem - przyjmujemy, ze brama jest calkowicie otwarta *)
END_IF;
END_IF;

(* wyliczenie procentowego otwarcia bramy, 0% = zamknieta, 100% = otwarta *)
GATE_POSITION_PERCENT := REAL_TO_INT((GATE_POSITION_MM *100.0) / INT_TO_REAL(SensorCalibrationPos[SensorCalibrationCount-1]));
GATE_POSITION_PERCENT_CLOSED := 100 - GATE_POSITION_PERCENT;

(* otwarcie bramy wyrazone w centymetrach - przeswit od podlogi *)
GATE_POSITION_CM := REAL_TO_INT(GATE_POSITION_MM/10.0);
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: (Pomysłowy Dobromir) Czujnik położenia bramy garażowej
« Odpowiedź #2 dnia: Listopada 19, 2017, 12:31:10 pm »

Super, uwielbiam takie projekty "bo można".  Nikt specjalnie nie rozumie dokładności do 1cm przy odczytywaniu pozycji, ale dla kogoś, kto to wymyślił i zrobił sam, ten 1cm znaczy wszystko :)

Dzięki za wpisy!
« Ostatnia zmiana: Listopada 21, 2017, 09:37:27 am wysłana przez admin »
Zapisane