Ustatnia modyfikacja 19 maja 2025 przez Olek
Nowa wersja
Pierwotna wersja napędu nie zdała egzaminu. Napę za pomocą samej powlekanej linki stalowej na dłuższą metę nie zdał egzaminu. Osłonka linki się ściera, a sama linka nie miała wystarczającego oporu na rolce.

Dlatego powstałą nowa wersja z innym medium napędowym. Tym razem próbuje z łańcuszek kulkowy, który jest ogólnie wykorzystywany do żaluzji poziomych.
Pierwsza (stara) wersja
W tym projekcie musiałem dobrać odpowiedni rozwiązanie i napęd do tego rolet. Równocześnie miało być na tyle proste i łatwe w montażu i było je łatwo demontować na zimie razem z resztą dachu.
Pomysł polega na naciągniętej lince napędowej, do której jest zamocowany rozsuwany koniec dachu. Do tego celu użyłem linki nierdzewnej 2mm w otulinie PCV. Otulina PCV zapewnia dobry opór w rolce napędowej na silniku. W moim przypadku, jeden koniec dachu jest umieszczony pod stały zadaszeniem, wiec za bardzo nie martwiłem się ochroną napędu przed deszczem.

Do napędu użyłem popularnych silników z integrowaną przekładnią ślimakowa typ 5840. Wybrałem opcje 24V z 80 obrotami na minutę. Taki wariant pozwolił mi zwinąć/rozwinąć dach w czasie poniżej 1 minuty o sile 133N (13kg).
Napędy te są ogólnie dostępne na popularnych krajowych i zagranicznych portalach.
Do silnika zaprojektowałem odpowiednią obudowę/mocowanie. Pozwala ona na wygodne i szybkie zamocowanie napędu do belki pergoli i zapewnia odpowiednie naprężenie linki napędowej.
Szczegóły obudowy na poniższej grafice 3D.
Do sterowania użyłem modułu na bazie mikrokontrolera rodziny ESP32. Sterują on silnikami DC poprzez moduł z układem L298N, który pozwala sterować dwoma napędami.
Do wykrywania momentu zasłonięcia czy odsłonięcia dachy użyłem układu INA219, który między innymi mierzy pobierany prąd. W momencie krańcowym wzrasta obciążenie silnika i tym samy prąd przez jego pobierany. W moim przypadku namolną pracą rozwijania i zwijania jednego dachu generuje prąd rzędu 0,5A. Jeżeli prąd przekroczy tę wartość, to znaczy, że dach dojechał do końca. Przy jednym sterowniku pomiaru prądu trzeba obsługiwać pojedyncze dachy (napędy) pojedynczo, lub rozbudować program sterujący, który uwzględni pracę dwóch równolegle pracujących silników. Ja niestety miałem na szybko dostępny tylko jeden układ INA219 .

Muszę tylko jeszcze przerobić program, aby obsługiwał dwa napędy równolegle.



Konfiguracja ESPHome
esphome: name: "dach-pergoli" friendly_name: dach-pergoli esp32: board: esp32dev framework: type: arduino # Enable logging logger: level: INFO # Enable Home Assistant API api: encryption: key: "xxx" ota: password: "xxx" wifi: networks: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Esp-Ble Fallback Hotspot" password: "xxx" manual_ip: static_ip: 192.168.x.x gateway: 192.168.x.x subnet: 255.255.255.0 dns1: 192.168.x.x web_server: port: 80 captive_portal: globals: - id: dach_1 # -1:otwarty; 0-w połowie; 1:zamkniety type: int restore_value: yes - id: dach_2 # -1:otwarty; 0-w połowie; 1:zamkniety type: int restore_value: yes # # # lambda: "return id(dach_1);" # # - lambda: "id(dach_1) = 0;" i2c: sda: 21 scl: 22 scan: true id: bus_a switch: - platform: gpio pin: GPIO04 #INT3 id: D1_open name: D1 otórz on_turn_on: - switch.turn_off: D1_close - platform: gpio pin: GPIO16 #INT4 name: D1 zamknij id: D1_close on_turn_on: - switch.turn_off: D1_open - platform: gpio pin: GPIO02 #INT2 name: D2 otórz id: D2_open on_turn_on: - switch.turn_off: D2_close - platform: gpio pin: GPIO15 #INT1 name: D2 zamknij id: D2_close on_turn_on: - switch.turn_off: D2_open sensor: - platform: ina219 address: 0x40 shunt_resistance: 0.1 ohm current: name: "INA219 Current" id: current on_value_range: - above: 0.8 then: - lambda: |- if ( id(D1_close).state || id(D1_open).state ) { if (id(D1_close).state) { id(dach_1) = -1; id(dach_1_cover).position = COVER_OPEN; id(dach_1_cover).publish_state(); }else{ id(dach_1) = 1; id(dach_1_cover).position = COVER_CLOSED; id(dach_1_cover).publish_state(); } } if ( id(D2_close).state || id(D2_open).state ) { if (id(D2_close).state) { id(dach_2) = -1; id(dach_2_cover).position = COVER_OPEN; id(dach_2_cover).publish_state(); }else{ id(dach_2) = 1; id(dach_2_cover).position = COVER_CLOSED; id(dach_2_cover).publish_state(); } } - switch.turn_off: D1_close - switch.turn_off: D1_open - switch.turn_off: D2_close - switch.turn_off: D2_open power: name: "INA219 Power" id: power bus_voltage: name: "INA219 Bus Voltage" shunt_voltage: name: "INA219 Shunt Voltage" max_voltage: 32.0V max_current: 3.2A update_interval: 1s cover: - platform: template device_class: "awning" name: "Dach 1" id: dach_1_cover has_position : true lambda: |- if (id(dach_1) == -1) return COVER_CLOSED; else if (id(dach_1) == 1) return COVER_OPEN; else return 0.5; open_action: - switch.turn_on: D1_open close_action: - switch.turn_on: D1_close stop_action: - switch.turn_off: D1_open - switch.turn_off: D1_close - lambda: |- id(dach_1_cover).tilt = 0.5; id(dach_1_cover).publish_state(); id(dach_1) = 0; - platform: template device_class: "awning" name: "Dach 2" id: dach_2_cover has_position : true lambda: |- if (id(dach_2) == -1) return COVER_CLOSED; else if (id(dach_2) == 1) return COVER_OPEN; else return 0.5; open_action: - switch.turn_on: D2_open close_action: - switch.turn_on: D2_close stop_action: - switch.turn_off: D2_open - switch.turn_off: D2_close - lambda: |- id(dach_2_cover).tilt = 0.5; id(dach_2_cover).publish_state(); id(dach_2) = 0; # optimistic: true # +-----------------+| # | | | | | | # [ EN ] |o o| [GPIO23] # [GPIO36] |o o| [GPIO22] SCL INA219 # [GPIO39] |o ESP-WROOM-32 o| [GPIO1 ] # ACS712(ADC) [GPIO34] |o o| [GPIO3 ] # [GPIO35] |o o| [GPIO21] SDA INA219 # [GPIO32] |o o| [GPIO19] # [GPIO33] |o PIN 30 o| [GPIO18] # [GPIO25] |o o| [GPIO5 ] # [GPIO26] |o DEVKIT V1 o| [GPIO17] # [GPIO27] |o o| [GPIO16] IN4 # [GPIO14] |o o| [GPIO4 ] IN3 # [GPIO12] |o o| [GPIO2 ] IN2 # [GPIO13] |o o| [GPIO15] IN1 # [ GND ] |o o| [ GND ] # [ VIN ] |o o| [ 3V3 ] # | | # | |usb| | # +------| |-------+ # # +-----------------+| # | | | | | | # [ EN ] |o o| [GPIO23] [VSPI MOSI] # [ VP ] |o o| [GPIO22] [ I2C SCL ] # [ VN ] |o ESP-WROOM-32 o| [GPIO1 ] [UART O TX] # [RTC_GPIO4] [ADC1 CH6] [GPIO34] |o o| [GPIO3 ] [UART O RX] # [RTC_GPIO5] [ADC1 CH7] [GPIO35] |o o| [GPIO21] [ 12C SDA ] # [RTC_GPIO9] [ TOUCH9 ] [ADC1 CH4] [GPIO32] |o o| [GPIO19] [VSPI MISO] # [RTC_GPIO8] [ TOUCH8 ] [ADC1 CH5] [GPIO33] |o PIN 30 o| [GPIO18] [VSPI CLK ] # [RTC_GPIO6] [ DAC1 ] [ADC2 CH8] [GPIO25] |o #o| [GPIO5 ] [VSPI CSO ] ##### # [RTC_GPI07] [ DAC2 ] [ADC2 CH9] [GPIO26] |o DEVKIT V1 #o| [GPIO17] [UART 2 TX] ##### # [RTC_GPIO17] [ TOUCH7 ] [ADC2 CH7] [GPIO27] |o #o| [GPIO16] [UART 2 RX] ##### #[RTC_GPIO16] [HSPI CLK] [ TOUCH6 ] [ADC2 CH6] [GPIO14] |o o| [GPIO4 ] [ADC2 CHO ] [TOUCHO] [RTC_GPIO10] #[RTC_GPIO15] [HSPI MISO] [TOUCHS ] [ADC2 CH5] [GPIO12] |o o| [GPIO2 ] [ADC2 CH2 ] [TOUCH2] [RTC_GPIO12] #[RTC_GPIO14] [HSPI MOSI] [TOUCH4 ] [ADC2 CH4] [GPIO13] |o o| [GPIO15] [ADC2 CH3 ] [TOUCH3] [HSPI CSO] [RTC_GPIO13] # [ GND ] |o o| [ GND ] # [ VIN ] |o o| [ 3V3 ] # | | # | |usb| | # +------| |-------+ # # #
Uwagi eksploatacyjne
W trakcie sprawdzania i kalibracji napędu okazało się, że napęd jest na tyle silny, że zaczął zrywać powłokę PCV z linki. Ale przy dobrze dobranym krańcowym prądzie nie powinno do tego w normalnej eksploatacji dochodzić.
Konsekwencją zdarcia osłony PCV jest zmieszony opór linki względem rolki napędowej, co powoduje ślizganie się linki na rolce. A to z kolei powoduje, że nie zwiększa się prąd i nierozpoznawany jest koniec pracy. Tarcie też spowodowało zdeformowanie plastykowej roli napędu. Taka sytuacja powstała mi na jednym napędzie. Druki pracuje bez problemu.
Dla tego dodałem jeszcze programowo ograniczenie czasowe pracy silnika do 40 sekund.
To chyba pozwoli na dalszą pracę do końca sezonu.
Rolki napędową też trzeba wykonać z twardszego materiału. Uruchamiam tokarkę, wiec w przyszły sezonie będę miał mosiężne.