Go Down

Topic: RCSwitch Library RAW Daten senden?? (Read 1 time) previous topic - next topic

TwinRacer850

Hallo,

ich bin zwar Elektroniker, aber eher analog unterwegs.

Mein erstes richtiges Arduino-Projekt soll folgendes werden:

Ich habe vor, wie schon viele andere vor mir, mit einer Infrarotfernbedienung 433MHz Steckdosen zu schalten.

Der Infrarotteil funktioniert auch schonmal sehr gut.

Mit dem Funk sah es da schon etwas schwieriger aus:

Am Anfang wollte ich die Daten des Senders mit hilfe der RCSwitch Library auslesen.
Ich, bzw. der Reciever empfing nichts. Laut Internet geht das per Soundkarte um das Signal zu sehen, oder halt direkt mit den Recieve_Demo_Simple und Advanced.
Ging aber nicht.

Also: Laborbnetzteil, Scope und verschiedene Sender...NIX!

Dann hab ich mir ein Herz gefasst (das Ding kostet ja auch nur soviel wie ein Bier) und den Lack abgekratzt und den Tuner verstellt... Nein eingestellt! Jetzt geht's! Wenn jemand Info braucht einfach an mich. p.s. So verhalf mir der Chinamann dazu wieder etwas Funktechnik zu machen. Zwar unnötig, aber das "Basteln" ist ja das Ziel. Danke.

Nun kann ich sowohl per Soundkarte aufnehmen und analysieren (Audacity oder bei mir beliebter Adobe Audtion) oder per Receive_Demo (beide gehen) die Signale auslesen.

Das mit dem Senden funktioniert auch recht gut. Aber die Steckdosen schalten nicht :(
Stand jetzt: (nach 4 spannenden Tagen des Versuchens)

- ich weiss was Tristate ist
- ich weiss was der 24 -Bit Code ist
- ich kann alles einstellen, wie Wiederholungen und Sendezeit in Abhängigkeit von Protokoll oder    pulsdauer........

und seit gestern habe ich das Problem etwas weiter eingekreist:

Ich habe einfach das was ich mit dem Arduino sende in umständlicher Kleinarbeit mit der Soundkarte aufgenommen und die Pulse und Pausen per Excel von Samples in Dauer (µS) umgerechnet. das gleiche mit dem Originalsignal der Fernbedienung des Herstellers.

Der vergleich ergibt:

- Die lange Pause zwischen den Pulsen ist beim original länger
- Und das Puls Pause Verhältnis ist bei Arduino ziemlich genau 1:1, beim org. 1:2,6

Wie kann man das jetzt senden?

Mir ist übrigens bewusst, dass viele im Netz das mit anderen Steckdosen, am besten mit Mäuseklavier zum einstellen der Adressen lösen. ES MUSS ABER AUCH SO GEHEN! ( Das sagt mir, zumindest bis jetzt, mein Ehrgeiz) Außerdem währe hier vielen geholfen.


Was ich noch herausgefunden habe: Die mit dem ReceiveDemo_Advanced ausgelesenen RAW-Daten sind "nichts weiter" als die Puls, bzw. Pausen längen des Empfangenen Signals in µSekunden. deswegen weichen sie auch jedesmal leicht ab.

Wenn es mir/euch gelänge diese Daten per RCSwitch zu senden sollte es funktionieren. Mit jeder Funksteckdose und eigentlich allem, was nicht gerade mit einem Rolling-Code Ausgestattet ist.

Da ich aber halt bei Programmierung gerademal über das Vorschulniveau hinausbekommen bin:

Wenn ich

 void loop() {
  mySwitch.send("9964,956,332,312,976,312,976,308,980,304,980,308,980,952,340,304,980,956,336,188,908,276,728,264,124,168,308,60,24,60,236,88,88,204,88,76,80,56,1020,284,440,56,24,40,100,84,12,36,56,
");
  delay(1000);
  mySwitch.send("9964,956,332,312,976,312,976,308,980,304,980,308,980,952,340,304,980,956,336,188,908,276,728,264,124,168,308,60,24,60,236,88,88,204,88,76,80,56,1020,284,440,56,24,40,100,84,12,36,56,
");
  delay(1000);
 }

so was sende ist das Ausgangsignal völlig falsch :(

Kann mir jemand helfen?

LG
TwinRacer850

HotSystems

Evtl. können wir helfen, wenn du uns verrätst, welche Funksteckdosen (Link posten) du hast und was du mit "Tuner verstellen" meinst.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

TwinRacer850

#2
Jan 26, 2017, 05:31 pm Last Edit: Jan 26, 2017, 05:42 pm by TwinRacer850
Es sind verschiedene Steckdosensets. Alle schön billig! UNITEC auf den verbauten IC's wurde zum glück auch extra die Beschriftung abgeschliffen. Durch laaaaaaaaanges Googeln vermute ich jedoch PIC Controller. Aber wenn euch Fotos dabei helfen mache ich die natürlich.

Komplette Einheiten
http://www.bilder-upload.eu/show.php?file=6805fc-1485448136.jpg

Rückseite Empfänger
http://www.bilder-upload.eu/show.php?file=b25b0e-1485448198.jpg

Rückseite Sender
http://www.bilder-upload.eu/show.php?file=15c620-1485448248.jpg



Mit Tuner verstellen meine ich:

- Am Empfänger habe ich den Lack von der Demodulatorspule gekratzt
- Anschließend habe ich den Empfänger mit einem Labornetzteil bestromt ( um die Stromaufnahme zu kontrollieren )
- Das Ausgangsignal mit einem 50MHz Analog Osszilloskop kontinuierlich Gemessen
- An einem der 433MHz Sender eine Taste überbrückt( damit dieser dauerhaft sendet)

Dann habe ich während ich auf's Scope schaute so lange an der Demodulatorspule gedreht, bis der Chinaempfänger tatsächlich Empfang hatte -> Statt Rauschen ist dann das PWM-Signal zu erkennen.


Der Empfänger war vom Hersteller nicht richtig abgeglichen worden.
Ich habe dies erwähnt, damit nicht jeder der einen defekten Empfänger kauft an der Software verzweifelt, obwohl wohlmöglich die Hardware nicht geht.

... habe den Empfänger übrigens von Amazon und extra nicht von Ebay China...


Am hilfreichsten wäre für mich zu wissen, wie ich mit der Arduino IDE und der RCSwitch Bibliothek den 433MHz Sender so ansteuern kann, dass die vorher empfangenen RAW Daten wieder gesendet werden können.

Also das quasi PWM Signal mit allen Puls-Pause-Verhältnissen/Zeiten inkl. der langen Pause zwischen den Signalbursts.

Da es ja als RAW empfangen wird, und daraus erst die Codierung herausgelesen wird, muss es doch aus andersherum gehen!?!
Wer weiß wie?

LG
TwinRacer850

TwinRacer850

Danke für die Tipps.

Mit der RC-Switch Libary hab ich es nicht bekommen.
Bin auch Anfänger und hab es nicht geschafft etwas aus den dort vorhandenen Befehlen so anzuwenden, dass es sich kompilieren ließ.

Eine detailliertere Beschreibung wäre wünschenswert.

Aber bevor sich jetzt jemand zu viel Arbeit macht:

Ich habe folgendes gefunden um das Signal "freihand" nachzubauen:

#define RF_DATA_PIN 8
#define CLOCK 10

void rf_send(char command[]) {
 int i;
 // send command (on/off)
 for(i=0;i<200;i++) {

   if(command == '1')
   {
     digitalWrite(RF_DATA_PIN, HIGH);
     delayMicroseconds(CLOCK*102);
     digitalWrite(RF_DATA_PIN, LOW);
     delayMicroseconds(CLOCK*56);
   }

   if(command == '0')
   {
     digitalWrite(RF_DATA_PIN, HIGH);
     delayMicroseconds(CLOCK*56);
     digitalWrite(RF_DATA_PIN, LOW);
     delayMicroseconds(CLOCK*102);
   }

   if(command == 'p')
   {
     digitalWrite(RF_DATA_PIN, HIGH);
     delayMicroseconds(CLOCK*320);
     digitalWrite(RF_DATA_PIN, LOW);
     delayMicroseconds(CLOCK*703);
   }

  if(command == 'b')
   {
     digitalWrite(RF_DATA_PIN, HIGH);
     delayMicroseconds(CLOCK*45);
     digitalWrite(RF_DATA_PIN, LOW);
     delayMicroseconds(CLOCK*225);
   }

 }
}

void setup()
{

 pinMode(RF_DATA_PIN, OUTPUT);

}

void loop(){

 rf_send("001111110011100001111100b001111110011100001111100b001111110011100001111100b001111110011100001111100b001111110011100001111100p001111110011100001111100p001111110011100001111100p001111110011100001111100p");


 delay(3000);


}


Habe den Sendebefehl natürlich mehrfach wiederholt.

Das Ergebnis ist recht gut:

http://www.bilder-upload.eu/show.php?file=4cab11-1485692595.jpg


Um es nicht zu verkomplizieren: Das Sendesignal des Handsenders ist zu 98% (leichte Zeitabweichung) Identisch!


Leider geht es immer noch nicht.
Die Sendeleistung meines Sendemoduls ist etwas größer als die des Handsenders. (falls jemand fragt: mit Spektrumanalysator gemessen)


AAAARG! Ich dreh noch durch :)

Aber jetzt werde ich mir als nächstes wohl mal nen Logik Analysator beschaffen.
Und vielleicht versuch ich das gleich nochmal mit dem anderen UNITEC Set (Dies war die schmalere Fernbedienung von den Bildern)

Vielleich kauf ich mir auch tatsächlich noch andere Funksets, aber was mache ich dann, wenn ci wie geplant irdendwann eine Funkgesteuerte Leinwand habe? Naja zur not könnte man ja auch mal per Kabel ansteuern.


Wenn jemand noch weitere Ideen hat, bin ich natürlich dankbar!

... Ich nehme auch Kritik und fragen an. Dann führe ich das auch gerne noch detaillierter aus und nicht so grob;)

LG

TwinRacer850

HotSystems

Ich kann deinen Ärger verstehen.
Leider habe ich keinen weiteren Tipp für die vorhandenen Funksteckdosen.
Solltest du dir doch andere besorgen wollen, dann nimm die von Pollin. Die sind preiswert und funktionieren.
Selbst getestet.
Funksteckdosen
Oder Brennenstuhl, die sind Baugleich.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

TwinRacer850

Danke für die Kaufempfehlung aber noch ärgere ich mich vorher noch ein paar Tage :)


LG



HotSystems

Danke für die Kaufempfehlung aber noch ärgere ich mich vorher noch ein paar Tage :)
Ehrlich, da hätte ich keine Lust drauf.
Aber so ist zum Glück jeder verschieden.

Bei mir muss das Projekt fertig werden und anschließend geh ich an die Dinge ran die nicht glatt laufen.
Zeit ist immerhin auch Geld. ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

TwinRacer850

Nachtrag!

Für alle die ähnliche Probleme haben.

... ich hab doch gesagt es muss gehen!

Aber jetzt vom letzten Stand aus.

Zuerst habe ich durch viel "Google-Time" herausgefunden, dass es auch noch Erweiterungen zur RCSwitch libary gibt, welche die RF Codes anders auslesen. Dazu gibt es auch noch einiges für rolling codes und alles mögliche.
   Dabei muss ich aber zugeben, dass ich den Hardwareteil oft viel besser als den Softwareteil verstehe.
Bei Google habe ich einfach mal die Beschriftung der Leiterplatte (IC wurde ja unkenntlich gemacht) eingegeben: FLF-130105 und 50027.01B
 Neben vielen anderen bin ich auf folgendes gestoßen:
https://forum.fhem.de/index.php?topic=43292.0

Nun ja. Ich hatte vorher ja schon den Code "nachgebaut", den ich erst per Audiosoftware analysiert hatte. - ohne Erbenis. Danach habe ich mir in Ebay einen USB Logikanalysator mit 24 MHz und 8 Bit breite zugelegt (der Elektroniker in mir war auch neugierig ob das tatsächlich für unter 10€ funktioniert; Antwort ist JA, zumindest in diesem "langsamen" Fall). Damit habe ich den Code dann nochmal ausgelesen und mit meinem selbst gebauten verglichen.
Das Timing stimmte! Ich schimpfte! Ging immer noch nicht!

Dann habe das Signal mit einem Spetrumanalysator untersucht: bei Orginal und "Nachbau" war alles gleich, wenn der Analysator mir auch sagte das beide Sender auf 430.885MHz sendeten.

Und dann habe ich, natürlich völlig zufällig herausgefunden, dass es doch geht!

Ich habe das nachgebaute Signal in den Sender der Orginalfernbedienung eingespeist(Kabel dran gehalten) und es ging!

Der Fehler lag im Einschwingen des billigen Senders und damit anscheinend "schlechten Flanken" und der Sendeleistung.


Laaaaange Rede!


FAZIT FÜR ALLE DIE EIN ÄHNLICHES PROBLEM HABEN!

Kauf euch mehrere, möglichst verschiedene 433MHz Sendemodule. Bei mir sehen beide fast gleich aus, aber das eine geht. Außerdem habe ich noch einen weiteren Euro in die gewickelten Antennen investiert.


Und jetzt bin ich zufrieden. Hoffe ich kann dem einen oder anderen Helfen.

Equarri

#8
Jan 21, 2018, 11:21 pm Last Edit: Jan 21, 2018, 11:26 pm by Equarri
Diese Unitec Steckdosen haben mich auch geärgert. Dank der Arbeit von TwinRacer funktioniert das Ganze jetzt aber einwandfrei. Ich habe mir mal erlaubt den Code von TwinRacer etwas handlicher zu gestalten. Statt des riesigen Strings mit den Binärwerten, benutze ich der Einfachheit halber Dezimalzahlen.
Wie TwinRacer ja schon erwähnt hat, bekommt man die Unitec Steckdosen mit der sui77/RCSwitch Library nicht sicher geschaltet. Allerdings kann man mit dem Example "ReceiveDemo_Advanced", aus dieser Library, die Dezimalcodes der Fernbedienung auslesen. Pro Taste werden vier unterschiedliche Codes gesendet. Da es sich aber nicht um einen echten Rollingcode handelt, reicht es wenn man nur einen Code sendet. 

Getestet habe ich mit den Funksteckdosen: Unitec 48110 (Receiver: 55206X10  Transmitter: 50074)
Als Sender kamen die ASK Module FS1000A und WLC-TX1 zum Einsatz. Mit beiden funktioniert es problemlos.   



Code: [Select]

#define RF_DATA_PIN 2

void rf_send(long code) {
int i,j,k;
  for (k=0;k<2;k++){
    for (j=0;j<4;j++){
      for(i=23;i>-1;i--) {
        if(code & (1L << i))
        {
          digitalWrite(RF_DATA_PIN, HIGH);
          delayMicroseconds(1020);
          digitalWrite(RF_DATA_PIN, LOW);
          delayMicroseconds(560);
          }
        else
        {
          digitalWrite(RF_DATA_PIN, HIGH);
          delayMicroseconds(560);
          digitalWrite(RF_DATA_PIN, LOW);
          delayMicroseconds(1020);
          }
      }
      if (k==0)
        {
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(450);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(2250);
        }
      else
        {
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(3200);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(7030);
        }
      }
   }   
}

void setup()
{
 pinMode(RF_DATA_PIN, OUTPUT);
}

void loop()
{
 rf_send(15279388);  //Kanal A Ein
 delay(2000);
 rf_send(15064108);  //Kanal A Aus
 delay(2000);
}


// Kanal A Ein  Kanal B Ein  Kanal C Ein  Kanal D Ein
// 15187372     14784757     15340430     15560519
// 15647852     15698405     14986174     14893255
// 15279388     15220229     15095678     15525527
// 15429980     14873141     15064110     14682839

// Kanal A Aus  Kanal B Aus  Kanal C Aus  Kanal D Aus
// 15340428     15560517     15187374     14784759
// 14986172     14893253     15647854     15698407
// 15095676     15525525     15279390     15220231
// 15064108     14682837     15429982     14873143

efalken

Hallo Equarri, hallo TwinRacer850,
vielen Dank für Eure Arbeit - großartig!
Ich habe somit endlich auch meine Steckdosen ansprechen können - tadellos.
Sind die Codes Eurer Meinung nach hard-coded, oder könnte man auch 'selbstgemachte' Codepärchen anlernen lassen? Dann könnte ich auch das Set, für das ich keine Fernbedienung habe, einbinden. Ich bin aus den Zahlenmustern (auch binär) nicht schlau geworden...
Danke nochmals!

roko5049

Danke, danke danke!!!!
War gerade dabei die die Steckdosen zurück zu senden xD

Jafix

Hallo Equarri und TwinRacer,

entschuldigt bitte die exhumierung hier, doch ich habe eine Frage zu Eurem konkreten Code.
Und zwar würde ich gerne wissen, wie Ihr auf die Werte für die delays kommt.

Ich habe finde dazu nichts.

Könnt Ihr mir dazu helfen?

postmaster-ino

Hi

@Jafix
Schuß ins Blaue: Analysieren des Signal per Oszi und/oder LA (Logik-Analyser) - Letzteres gibt's für kleines Geld beim fC (freundlichem Chinesen, also Ali-Express, eBay, ...) und wurde von TwinRacer benutzt.
Dort sieht man dann, wie lange der Pegel gehalten wird - zum Senden macht man Das dann 'nur' nach - fertig ist das kopierte Signal.

Bei beiden von Dir angesprochenen Usern ist die Post-Anzahl, trotz der langen Zeit, recht 'übersichtlich' - würde jetzt nicht drauf wetten, daß Die hier noch Mal auftauchen.
Entweder hat's das Hobby zerrissen, oder die Jungs sind besser als ich :)
(Letzteres soll durchaus schon Mal vorkommen * g *)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Jafix

Hey postmaster-ino,

Danke für Deine Inputs. Ich denke, so ist das machbar.
Das die beiden nicht mehr sooo dabei sind, hätte ich auch sehen können/müssen...  :smiley-sweat: Aber wer weis...  ;)

Dank, Dir noch mal und schon mal ein schönes Wochenende. ;)

Go Up