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 .

Napęd działa i spełnia swoje zadanie w zupełności. Co widać na powyższym filmie.
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. 

Dodaj komentarz