logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Inteligentna kurtyna YOMOGI YO-WIFI-C02 z pilotem RF - postęp prac

iz1gww 18 Sie 2025 12:15 948 9
REKLAMA
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
  • Pomocny post
    #1 21637839
    iz1gww
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    Cześć chłopaki, zdemontowałem mod inteligentnego przełącznika kurtyny. YO-WIFI-C02 marki YOMOGI

    Niebieski moduł YOMOGI YO-WIFI-C02 z oznaczeniami złączy i schematem połączeń. Moduł YO-WIFI-C02 w niebieskiej obudowie z danymi technicznymi

    wewnątrz


    Płytka PCB modułu sterownika kurtyny z oznaczeniem QL-0870 Rev:A i datą 2024.03.30 Moduł elektroniczny z dwoma przekaźnikami i złączami śrubowymi na płytce PCB

    w środku znalazłem mcu W701, szukając informacji w sieci rozumiem, że jest to klon RTL8720 (lub kompatybilny)


    Moduł elektroniczny z układem W701, widok z góry na płytkę PCB Moduł elektroniczny z oznaczeniami pinów TXD, A19, A18, A0, A16, A15


    Zdjęcie dwóch stron modułu W701 z opisanymi pinami GPIO i połączeniami


    niż jest niestandardowy odbiornik rf dla pilota (przypuszczam, że na paśmie 2,4 GHz ze względu na kwarc 16 MHz)

    Moduł RF z oznaczeniem VCC i NC z widocznym układem scalonym i anteną

    Moduł QL-0866 z podpisanymi pinami GND i GPIO (TX & BINDING)

    i względny zdalny

    Biały pilot z sześcioma przyciskami do sterowania kurtynami i procentowymi ustawieniami

    z tym samym niestandardowym układem scalonym

    Płytka drukowana pilota z oznaczeniami przycisków i chipem pośrodku

    Zbliżenie na płytkę PCB z układem scalonym 2148aMC i rezonatorem kwarcowym 16 MHz

    do programowania używam klasycznych narzędzi i sprzętu : adapter usb do ttl z zasilaniem 3.3v i amebaZII PGTool 1.2.47, z OpenRTL87X0C_1.18.155.bin

    podłączone w ten sposób :

    Moduł W701 Moduł USB-TTL
    VCC 3.3v
    GND GND
    A15 TX
    A16 RX
    A0 3.3v (dla trybu bootloadera)
    RXD 3.3v (dla trybu bootloadera)

    cała procedura flashowania zakończyła się poprawnie i mogę przystąpić do konfiguracji



    PIN A07 - Przycisk 2 otwarty
    PIN A11 - DIODA LED
    PIN A12 - Zamknięcie przycisku
    PIN A13 - Dane z odbiornika zdalnego
    PIN A18 - Przekaźnik 1 zamknięty
    PIN A19 - Przekaźniki 2 otwarte

    tutaj mój skrypt autoexec

    Kod: Text
    Zaloguj się, aby zobaczyć kod

    w tym momencie mam inteligentny moduł kurtyny w zasadzie działający, ale bez funkcji zdalnej.... włączam sterownik tuyaMCU i widzę, że niestandardowy mcu używa protokołu innego niż klasyczny tuyaMCU, używa tylko 3 bajtów w ogóle, a 2 bajty nagłówka to 55 A5 zamiast klasycznego 55 AA, więc sterownik tuyaMCU nie może działać... zbieram kody wszystkich funkcji pilota i są one następujące

    Kod: Text
    Zaloguj się, aby zobaczyć kod



    teraz utknąłem, nie znalazłem żadnej funkcji do użycia w skrypcie do zarządzania tym kodem, nie znalazłem funkcji, która pozwala odczytać bajty odczytane przez gpio ...
    jakieś sugestie?

    dziękuję bardzo mutch
    Alex
  • REKLAMA
  • REKLAMA
  • #3 21638541
    iz1gww
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    >>21638242

    Cześć, divadiow, przepraszam, że nie... Zrobiłem zrzut, ale narzędzie nie rozpoznało żadnych informacji Tuya o pinie i funkcjach...
    Pa
    Alex
  • REKLAMA
  • #4 21638583
    divadiow
    Poziom 38  
    Posty: 4998
    Pomógł: 437
    Ocena: 890
    dziennik rozruchu z kopii zapasowej:

    Kod: Text
    Zaloguj się, aby zobaczyć kod
    .

    Dodano po 5 [godzinach] 12 [minutach]:

    Zastanawiam się, czy można to wykorzystać do odbierania bajtów z IO14

    insmod napisał:
    Udało się stworzyć sterownik mostka uart->tcp.
    Wygląda na to, że działa.


    Cytat:
    startdriver uarttcp 115200 512 1 1
    - https://www.elektroda.com/rtvforum/topic4130211.html
  • #5 21638896
    iz1gww
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    >>21638583
    dzięki za wskazówkę, ale bez rezultatu... prędkość to 9600, więc próbuję
    9600 512 1 1
    9600 512 0 1
    9600 512 0 0
    9600 512 1 0

    ale nikogo na wyjściu dziennika...
    Alex
  • #6 21638900
    divadiow
    Poziom 38  
    Posty: 4998
    Pomógł: 437
    Ocena: 890
    hmm OK. Tylko zgaduję, że może się tu przydać.

    Dodano po 2 [minutach]: .

    znaczenia argumentów

    https://github.com/openshwprojects/OpenBK7231...c7596281a55d7d/src/driver/drv_uart_tcp.c#L293

    Dodano po 6 [minutach]: .

    Myślę, że ten sterownik po prostu używa tego, co drv_uart.c mówi, że jest UART0

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    więc nie jesteśmy w stanie ustawić konkretnego IO

    @insmod będzie wiedział :)
  • #7 21638912
    iz1gww
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    >>21638900
    Przejrzałem oryginalną wiadomość, ponieważ zauważyłem, że jest niezgodność w definicji pinów, jest pin 13 podłączony do niestandardowego MCU, a nie 14, poprawiłem post ...
    przepraszam
    Alex

    Dodane po 4 [minutach]:

    Wystarczyłby sterownik, który przekierowuje pakiety przychodzące z wybranego UART (lub jeszcze lepiej GPIO) i pozwala na porównanie na poziomie skryptu...
    W międzyczasie patrzę na źródło kodu C++ sterownika tuyamcu, aby odtworzyć okrojoną wersję do tego celu...

    Dodano po 42 [minutach]:

    tutaj szkic kodu, ale potrzebuję dokumentacji o tym, jak połączyć wyjście na kanale jednostki openbeken ...

    
    #include "../new_common.h"
    #include "../new_pins.h"
    #include "../new_cfg.h"
    // Commands register, execution API and cmd tokenizer
    #include "../cmnds/cmd_public.h"
    #include "../mqtt/new_mqtt.h"
    #include "../logging/logging.h"
    #include "../hal/hal_pins.h"
    #include "drv_public.h"
    #include "drv_local.h"
    #include "drv_uart.h"
    #include "../httpserver/new_http.h"
    
    #define RF2148_CMD_75P    0x02
    #define RF2148_CMD_50P    0x03
    #define RF2148_CMD_25P    0x04
    #define RF2148_CMD_DOWN   0x07
    #define RF2148_CMD_UP     0x09
    #define RF2148_CMD_STOP   0x0A
    #define RFRemote2148AMC_PACKET_SIZE (3)
    
    
    const char* RFRemote2148AMc_GetCmdTypeString(int codeByte) {
       if (codeByte == RF2148_CMD_75P)
      {
        addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: 75% command received.\n");
        return "75P";
      }
       else if (codeByte == RF2148_CMD_50P)
      {
        addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: 50% command received.\n");
        return "50P";
      }
       else if (codeByte == RF2148_CMD_25P)
      {
        addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: 25% command received.\n");
        return "25P";
      }
      else if (codeByte == RF2148_CMD_DOWN)
      {
          addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: DOWN command received.\n");
        return "DWN";
      }
       else if (codeByte == RF2148_CMD_UP)
      {
        addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: UP command received.\n");
        return "UP";
      }
       else if (codeByte == RF2148_CMD_STOP)
      {
          addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: STOP command received.\n");
        return "STP";
      }
      else
      {
        addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "%s is not a valid codes command\n", codeByte);
        return "UNK";
      }
       
    }
    
    void RFRemote2148AMc_Init() {
      UART_InitUART(g_baudRate, 0, false);
      UART_InitReceiveRingBuffer(1024);
    }
    
    void RFRemote2148AMc_OnEverySecond() {
    
    }
    void RFRemote2148AMc_AppendInformationToHTTPIndexPage(http_request_t* request) {
      hprintf255(request, "<h4>RF Remote 2148Amc is running!</h4>");
    
    }
    void RFRemote2148AMc_QuickTick() {
    
    }
    void RFRemote2148AMc_StopDriver() {
    
    }
    
    void RFRemote2148AMc_ProcessIncoming(const byte* data, int len)
    {
     if (sizeof(data) !=3)
     {
          addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: packet data size is different from 3 bytes\n");
          return;
     }
     if (data[0] != 0x55 || data[1] != 0xA5) {
          addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "ProcessIncoming: header bytes values not correct %s\n", data);
          return;
       } 
    
      return RFRemote2148AMc_GetCmdTypeString(data[2]);
      
    }
    
    
    
    void RFRemote2148AMc_PrintPacket(byte *data, int len) {
       int i;
       char buffer_for_log[256];
       char buffer2[4];
       
             buffer_for_log[0] = 0;
             for (i = 0; i < len; i++) {
                snprintf(buffer2, sizeof(buffer2), "%02X ", data[i]);
                strcat_safe(buffer_for_log, buffer2, sizeof(buffer_for_log));
             }
             addLogAdv(LOG_INFO, LOG_FEATURE_RFREMOTE2148AMC, "Received: %s\n", buffer_for_log);
    #if 1
             // redo sprintf without spaces
             buffer_for_log[0] = 0;
             for (i = 0; i < len; i++) {
                snprintf(buffer2, sizeof(buffer2), "%02X", data[i]);
                strcat_safe(buffer_for_log, buffer2, sizeof(buffer_for_log));
             }
             // fire string event, as we already have it sprintfed
             // This is so we can have event handlers that fire
             // when an UART string is received...
             EventHandlers_FireEvent_String(CMD_EVENT_ON_UART, buffer_for_log);
    #endif
    }
    
    void RFRemote2148AMc_RunReceive() {
       byte data[192];
       int len;
       while (1)
       {
          len = UART_TryToGetNextTuyaPacket(data, sizeof(data));
          if (len > 0) {
             RFRemote2148AMc_PrintPacket(data,len);
             RFRemote2148AMc_ProcessIncoming(data, len);
          }
          else {
             break;
          }
       }
    }
    
    commandResult_t RFRemote2148AMc_SetBaudRate(const void* context, const char* cmd, const char* args, int cmdFlags) {
       Tokenizer_TokenizeString(args, 0);
       // following check must be done after 'Tokenizer_TokenizeString',
       // so we know arguments count in Tokenizer. 'cmd' argument is
       // only for warning display
       if (Tokenizer_CheckArgsCountAndPrintWarning(cmd, 1)) {
          return CMD_RES_NOT_ENOUGH_ARGUMENTS;
       }
    
       g_baudRate = Tokenizer_GetArgInteger(0);
       UART_InitUART(g_baudRate, 0, false);
    
       return CMD_RES_OK;
    }
  • REKLAMA
  • #8 21639009
    insmod
    Poziom 31  
    Posty: 1384
    Pomógł: 164
    Ocena: 432
    PA13 jest domyślny dla UART0. Tak więc, jeśli dodatkowy UART nie jest włączony we flagach, będzie używany jako RX.
    Sterownik UartTCP ma wyłączone logowanie. Jedynym sposobem na jego wykorzystanie jest symulacja urządzenia na komputerze PC za pomocą czegoś w rodzaju programu Python.
    Jeśli UTCP_DEBUG jest zdefiniowany w kompilacji, wówczas to, co jest odbierane przez moduł, można wyświetlić w dzienniku z włączonym sterownikiem UartTCP.
  • #9 21639026
    iz1gww
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    >>21639009
    Myślę, że w tym momencie jedynym sposobem na uzyskanie w pełni funkcjonalnego modułu jest napisanie specjalnego sterownika do tego celu...

    Alex
  • #10 21651441
    iz1gww
    Poziom 11  
    Posty: 6
    Pomógł: 1
    Ocena: 1
    Gdzie, jeśli to możliwe, mogę złożyć wniosek o utworzenie sterownika?
    Dziękuję

Podsumowanie tematu

✨ Dyskusja dotyczy demontażu i analizy modułu inteligentnego przełącznika kurtyny YOMOGI YO-WIFI-C02 z pilotem RF. Wewnątrz urządzenia znajduje się mikrokontroler W701, który jest klonem lub kompatybilny z RTL8720. Moduł posiada niestandardowy odbiornik RF, prawdopodobnie działający na paśmie 2,4 GHz, z kwarcem 16 MHz. Próby przechwycenia dziennika rozruchu UART nie przyniosły rezultatów, mimo różnych konfiguracji prędkości i parametrów portu szeregowego. Dyskutowano o wykorzystaniu sterownika UartTCP oraz o konieczności napisania dedykowanego sterownika do pełnej funkcjonalności modułu. Wskazano, że pin PA13 jest domyślnym RX dla UART0, a dodatkowe UART-y mogą wymagać aktywacji w flagach konfiguracyjnych. Zasugerowano również symulację urządzenia na komputerze PC w celu analizy komunikacji. Autor pytał o możliwość zgłoszenia wniosku o utworzenie sterownika dla tego modułu.
Wygenerowane przez model językowy.
REKLAMA