Reverseengeneering von Nebelmaschienen Protokoll

OP #7698671
Lesenswert?

Hi, ich habe mir letztens eine günstige Nebelmaschine aus China gekauft. Ich möchte sie jetzt gerne mit einem ESP32 und einem Knopf steuern können. Momentan läuft sie über eine RF-Fernbedienung, die ein Funkmodul RX480RA (jlcpcb.com/kr/partdetail/C2886635) nutzt und mit 5V von der Nebelmaschine betrieben wird. Diese 5V sind verfügbar, sobald die Maschine aufgewärmt ist. Ich habe das Ganze mal an ein Oszilloskop angeschlossen und festgestellt, dass es auch ohne Knopfdruck viele Stör- bzw. Idle-Signale gibt. Ein Muster wiederholt sich dabei: [0.2ms an; 0.36ms aus; 1.75ms an] mit einem Delay von 11.5ms zwischen den Wiederholungen. Die Fernbedienung hat einen SC2260 IC (sc-tech..cn/en/SC2260.pdf). Bei einem Knopfdruck wird ein 24-Bit-Signal gesendet, das so lange andauert, wie der Knopf gedrückt wird. Auf der Fernbedienung ist der dritte Adresspin auf 3V gezogen. Das 24-Bit-Signal startet mit einem 16-Bit-Header [0x5D55], der für das Adress-Coding steht, und die restlichen 8 Bits variieren je nach Knopf [0x0C 00001100; 0xC0 11000000; 0x03 00000011; 0x30 00110000]. Dieses Paket wiederholt sich mit einem Delay von 20ms, solange der Knopf gedrückt ist. Wenn ich das gleiche Signal mit einem ESP32 und einem Level Shifter aussende, passiert nichts. Der Stecker sieht aus wie ein 3-Pin-DMX-Kabel, aber die Signale sind ganz anders. Es könnte sein, dass das erste Paket beim Drücken anders ist, aber ich habe es noch nicht geschafft, das zu messen. Ich werde jetzt auch mal die Nebelmaschiene aufmachen.

1
const uint16_t header = 0x5D55;
2
const uint8_t R = 0x03;
3
const uint8_t G = 0x0C;
4
const uint8_t B = 0xC0;
5
const uint8_t Fog = 0x30;
6
 
7
void setup() {
8
  pinMode(33, OUTPUT);
9
  Serial.begin(115200);
10
}
11

12
void playPacket(uint8_t data) {
13
  uint32_t packet = ((uint32_t)header << 8) | data;
14
  for (int i = 0; i < 24; i++) {
15
    if ((packet >> i) & 1) {
16
      digitalWrite(33, LOW);
17
      delayMicroseconds(2000); 
18
      digitalWrite(33, HIGH);
19
      delayMicroseconds(750); 
20
    } else {
21
      digitalWrite(33, LOW);
22
      delayMicroseconds(750);         
23
      digitalWrite(33, HIGH);
24
      delayMicroseconds(2000); 
25
    }
26
  }
27
}
28

29
void loop() {
30
  for (int i = 0; i < 200; i++) {
31
    playPacket(Fog);
32
    delayMicroseconds(20000); 
33
  }
34
}
Angehängte Dateien:
OP #7698694
Lesenswert?

Okay, ich habe die Nebelmaschine geöffnet und einen Nuvoton-Mikrocontroller gefunden (nuvoton.com/export/resource-files/DS_N76E003_EN_Rev1.09.pdf). Das Signal ist mit dem Pin 11 oder 1 verbunden. Ich werde versuchen, den ROM zu dumpen. Es sieht auch so aus, als wäre neben dem Mikrocontroller ein Pin-Header vorhanden, um dies zu tun.

Angehängte Dateien:
OP #7698785
Lesenswert?

Harald A. schrieb:

Es scheint ja sogar galvanisch getrennt, aufgrund der Funkverbindung ist die Güte der Trennung allerdings fraglich.

Nimmste einen 74HC4052 Umschalter für RGB und ein OR aus zwei Dioden für den Nebel. Was willst Du am Ende erreichen? DMX?

Unter anderem... Könnte ich nicht eigendlich auch einfach an die schon vorhandenen Mosfets für Led und Rauch meinen Esp anschliessen? An der 5v Line von orginellen Reciver kann ich schauen ob aufgeheizt wurde.

#7698806
Lesenswert?

Hat die Fernbedienung einen kompletten AUS-Mode? Falls ja, könntest Du auch überall eine BAT54c einschleifen (siehe Bild, passt vom Layout ziemlich gut) und der freie Pin der Doppeldiode geht dann zu deinem ESP. Die Leiterbahn darunter auftrennen. Wozu? Du erhältst Dir die volle Funktionalität der FB und kannst parallel mit dem ESP steuern. Ist sozusagen ein Wired-OR. Den 4052 brauchst Du dann nicht. Du könntest auch den Transistor rausnehmen und einen „Digitaltransistor“ wie z.B. PDTD123YT einsetzen. Dann nämlich stünden die Pads vom aktuellen Vorwiderstand für die Doppeldiode zur Verfügung, dann muss man nichts aufkratzen.

Angehängte Dateien:
OP #7699109
Lesenswert?

Harald A. schrieb:

Hat die Fernbedienung einen kompletten AUS-Mode? Falls ja, könntest Du auch überall eine BAT54c einschleifen (siehe Bild, passt vom Layout ziemlich gut) und der freie Pin der Doppeldiode geht dann zu deinem ESP. Die Leiterbahn darunter auftrennen. Wozu? Du erhältst Dir die volle Funktionalität der FB und kannst parallel mit dem ESP steuern. Ist sozusagen ein Wired-OR. Den 4052 brauchst Du dann nicht. Du könntest auch den Transistor rausnehmen und einen „Digitaltransistor“ wie z.B. PDTD123YT einsetzen. Dann nämlich stünden die Pads vom aktuellen Vorwiderstand für die Doppeldiode zur Verfügung, dann muss man nichts aufkratzen.

Würde wahrscheinlich den Transistor mit einem Digitaltransistor tauschen... Den Vorwiderstand würde ich dann ablöten und mein Kabel dranlöten. Eine Frage aber noch: Für was und wohin mit der Doppeldiode? Um den Transistor zu schützen oder am VCC vom ESP?

OP #7699298
Lesenswert?

Chris S. schrieb:

Er kann doch den Empfänger direkt abhorchen oder ein Arduino dazwischenschalten. Der gepostet Code ist jedoch nicht correct, und da die Tribits relativ unüblich sind, zweifle ich auch etwas an die publizierte Bytefolge, kann jedoch korrekt sein.

Das ist ja mein Plan. Der Code ist schon richtig, der Pin ist nur umgekehrt, weil ich einen NPN-Stepup habe, aber auf dem Oszi sehe ich das Richtige. Habe nochmal nachgemessen und das Timing ein bisschen verändert. Aber muss es noch an der Nebelmaschiene testen.

Angehängte Dateien:
#7699308
Lesenswert?

Beachte bitte, dass der Empfänger einen relativ langen (einige ms) Vorspann braucht. Als Beispiel kannst du die OOK Protokolle der Wetterstationen ansehen.

Literatur: https://forum.iobroker.net/topic/3478/l%C3%B6sung-dekodieren-t-h-sensor-wetterstation-hygrometer-von-bresser-angebot-bei-lidl-14-99-uvp-40-433mhz

https://www.langer-sebastian.de/funk-temperatursensoren-mit-arduino/

https://github.com/merbanan/OOK_gen

#7699314
Lesenswert?

Nein, du schiebst zuerst das LSb raus, also zuerst die Daten und dann den Header, ob die Reihenfolge auch invertiert ist, wahrscheinlich. Weiters fehlt bei dir das Sync bit am Ende der 12 Tribit's. Das Datenblatt gibt das Timing her, oder man verwendet die fertige lib von Arduino.

#7699320
Lesenswert?

Ben schrieb:

Eine Frage aber noch: Für was und wohin mit der Doppeldiode? Um den Transistor zu schützen oder am VCC vom ESP?

Mit der Doppeldiode wäre die Funktion entweder von der Funkfernbedienung ODER von deinem ESP aus steuerbar. Ein sogenanntes wired-OR. Die beiden Dioden entkoppeln den Nuvoton und den ESP voneinander. Du erhältst Dir also die gewohnte Funkionalität und ergänzt mit dem ESP. Das klappt aber nur, wenn es einen Betriebszustand gibt, wo der Nuvoton komplett ruhig ist, sonst würde der immer dazwischen funken. Hätte ich so gemacht, da die Pads vom Vorwiderstand sich so schön anbieten für diesen Zweck. Siehe auch das Bild. Letztlich gibt es aber auch andere Möglichkeiten, ganz wie Du möchtest.

Die 5V stehen erst an, wenn die Nebelmaschine fertig aufgeheizt hat? Ja, kannst Du ja als Signal einlesen. Nehme für deinen ESP doch einfach ein zusätzliches 5V Netzteil wie z.B. Meanwell APV-8-5, das dort eingebaute sieht etwas schwachbrüstig aus.

Angehängte Dateien:
OP #7699357
Lesenswert?

Georg G. schrieb:

Beachte bitte, dass der Empfänger einen relativ langen (einige ms) Vorspann braucht. Als Beispiel kannst du die OOK Protokolle der Wetterstationen ansehen.

Da ist etwas dran mit dem Vorspann... Ich habe mein Oszilloskop auf Trigger mit über 20 ms High eingestellt und siehe da: Ein Vorspann ist vorhanden, aber nach dem Vorspann sehen die Daten irgendwie anders aus als die von den Repeat(Hold)-Paketen. Der Vorspann, der durchgehend High ist, ist etwa 75 ms lang. Danach kommt gefühlt nur Rauschen. Insgesamt ist das erste Paket etwa 250 ms lang, danach folgen die Repeat-Pakete. Aber die Daten nach diesem langen High kann ich beim besten Willen nicht entschlüsseln, da sie alle unterschiedlich lang sind.

Angehängte Dateien:
#7699429
Lesenswert?

Es gibt keinen preamble, bzw das Preamble ist die erste Übertragung vor dem Sync. Übertragen werden 8 Adress-tribit, dann 4 button-tribit gefolgt von einem Sync signal. Das Sync signal ist eine Zeiteinheit high und dann 31 Zeiteinheiten Low. Eine Zeiteinheit ist ungefähr 460uS. Ein Frame besteht aus 4x 12 Tribit's sowie dem Sync. Das Preamble ist somit das Nutzsignal und es leicht möglich dass sich der Empfänger erst auf die letzte Wiederholung einschwingt. Ein tribit ist folgendes: 0 = 1x Zeiteinheit high und 3x Zeiteinheit Low 1 = 3x Zeiteinheit high und 1x Zeiteinheit how Sync = 1x Zeiteinheit high und 31x Zeiteinheit Low

Tribit 0 = 00 Tribit 1 = 11 Tribit F = 01. F=Float Tribit X = 10. Kommt bei Fernsteuerungen vor welche einem Timerwert senden (1/2/3/4 hours)

Der Sendechip ist sc2260, der Empfänger ist sc2270 oder sc2272 (auch IR) Für beides gibt es Datenblätter und auch beim pt2260, pr2262 sowie pt2272 reinschauen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren