[Gelöst] 433MHz-Übertragung klappt nicht

Ich versuche, einen 16bit-Wert zwischen zwei ATtiny85 zu übertragen.

Ich benutze dafür die Manchester-Lib (von mchr3k, https://github.com/mchr3k/arduino-libs-manchester).

Sender und Empfänger sind die hier: http://www.ebay.de/itm/433Mhz-Sender-Empfänger-Superregeneration-Modul-FS1000A-XY-FST-XY-MK-5V/121230187056?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2060353.m2749.l2649

Das Signal am DATA-Pin des Senders sieht so ganz okay aus - siehe Oszi-Screen:

beim Empfänger ist das Signal am DATA-Pin aber durch eine Art Rechtecksignal überlagert, was die Dekodierung verhindert :

Habe ich da irgendwo einen 433MHz-Sender in der Nähe, der das erzeugt? Andere Ideen?

Die Sender sind ok.
Aber die Empfänger sind sehr breitbandig.
Da kann das schon mal so enden, wenn z.B. ein Schaltnetzteil nahe dabei steht.

Verwende besser "Superheterodyne" Empfänger.

Hallo,
Sender/Empfänger mal von elektrischen Störfeldern weiter entfernen.
Sender/Empfänger in größerem Abstand betreiben.
Haben die Antennen die richtige Länge?
Das kann aber alles mögliche sein, am besten mit den Beispielen der Lib probieren.
Gruß und Glück
Andreas

Danke. Habe mir jetzt mal einen RX6B Superhet bestellt - mal sehen, wie der läuft.

Miq1:
Danke. Habe mir jetzt mal einen RX6B Superhet bestellt - mal sehen, wie der läuft.

Das ist eine gute Idee.
Da wirst du sicher mehr Erfolg haben.
Der von dir verwendete Empfänger ist einfach "Schrott".

So... Mit den neuen Empfängermodulen ist das Signal am DATA-Pin wunderbar. Allerdings bin ich immer noch nicht so recht weiter, denn der Empfänger-Sketch erkennt keine Datenpakete.

#include <Manchester.h>

#define ROSE_LED 0
#define BLUE_LED 2
#define DATA_433 1

Manchester receiver;

void setup() {
  pinMode(ROSE_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  digitalWrite(ROSE_LED, HIGH);
  digitalWrite(BLUE_LED, HIGH);
  receiver.setupReceive(DATA_433, MAN_1200);
  delay(5000);
  digitalWrite(ROSE_LED, LOW);
  receiver.beginReceive();
  digitalWrite(BLUE_LED, LOW);
}

void loop() {
  static long t0 = millis()+250;
  
  if (receiver.receiveComplete()) 
  {
    digitalWrite(ROSE_LED, HIGH);
    uint16_t packet = receiver.getMessage();
    if(packet&0x4000) digitalWrite(BLUE_LED, HIGH);
    receiver.beginReceive();
    t0 = millis()+250;
  }
  if(t0<millis())
  {
    digitalWrite(ROSE_LED, LOW);
    digitalWrite(BLUE_LED, LOW);
  }
}

Da sind nur die zwei LEDs dran; die rosafarbene sollte angehen, sobald receiveComplete() TRUE liefert. Genau das aber passiert nie.

Irgendwelche Tipps für mich?

Miq1:
Irgendwelche Tipps für mich?

Warum setzt du die "Manchester-Lib" ein ?
Was genau möchtest du erreichen ?
Evtl. ist die RCSwitch für dich eine bessere Alternative.

Ich will die Daten eines Ultraschallsensors über ein paar Meter zum Hauptgerät übertragen. Das ist jeweils ein 16bit-Wert. Sender und Empfänger sind jeweils ATtiny85 und eine ausführliche Internetrecherche hatte mich überzeugt, dass die Übertragung mit der Manchester-Lib die wenigsten Probleme hat. Die ATtiny85 sind ja in Bezug auf Speicher und Interrupts nicht sehr reichlich ausgestattet, wodurch einige Lösungen ausfallen, die auf anderen Arduinos laufen.

Miq1:
Ich will die Daten eines Ultraschallsensors über ein paar Meter zum Hauptgerät übertragen. Das ist jeweils ein 16bit-Wert. Sender und Empfänger sind jeweils ATtiny85 und eine ausführliche Internetrecherche hatte mich überzeugt, dass die Übertragung mit der Manchester-Lib die wenigsten Probleme hat. Die ATtiny85 sind ja in Bezug auf Speicher und Interrupts nicht sehr reichlich ausgestattet, wodurch einige Lösungen ausfallen, die auf anderen Arduinos laufen.

Dann nimm die "RCSwitch", damit geht es auch auf dem ATtiny85.
Die verwende ich auch problemlos.

Was für einen Ultraschall-Sensor setzt du ein ?

Nö, RCSwitch geht leider nicht, lässt sich wegen der Bezüge zu Serial darin nicht compilieren. Eine Alternative wäre ggfs. RemoteSwitch in der Modifikation von Jeroen Meijer, aber die habe ich bisher nicht probiert.

Ich denke, ich versuche es irgendwann mal mit einem anderen Core für den ATtiny85. Es gibt einige Hinweise im Internet, dass der ATtinyCore von Spence Konde, den ich verwende, bei den Interrupts problematisch sein könnte. Ich konnte mich aber bisher nicht dazu durchringen, einen anderen Core zu verwenden, weil es keinen klaren Beleg für die Abhängigkeit gibt.

Was meinst du mit "Bezüge zu serial" ?

Ich habe schon mehrere Projekte mit RCSwitch und ATtiny85 realisiert.

Ich verstehe nicht, warum du uns immer nur mit halben Informationen fütterst.
Wie sollen wir da helfen.
Nur du siehst dein Projekt und wir dürfen raten.
Das ist doch großer Mist.

Ich danke für die Hilfe... Menno, schreib' einfach, was Du wissen musst und ich antworte. Ich kann schlecht alle Internetreferenzen, die ich beackert habe, hier mit anhängen. Ich hatte daraus gelesen, dass nicht jeder Core per Software ein Serial emuliert - die ATtiny85 haben ja keine Hardware-Serial -, und die RCSwitch-Library benutzt eben Serial. :roll_eyes:

Ich glaube aber, ich habe es jetzt selbst gefunden: ich definiere im Code (siehe im Post oben) mit "Manchester receiver;" ein eigenes Objekt, die Library macht aber ganz am Ende von Manchester.cpp selbst ein "Manchester man;". Dadurch wird die Interruptroutine des Objektes "man" durch die des Objektes "receiver" überschrieben. Das könnte zu Problemen führen, denke ich. Beim Senden ist keine Interrupt beteiligt, deswegen passiert da nichts, obwohl ich auch da in Code ein "Manchester transmitter;" stehen habe.

Der Kram ist auf meinem anderen Rechner, deswegen kann ich das nicht sofort probieren. Ich schreibe aber hier, wenn es geklappt hat.

Ok....wenn du damit klar kommst dann lass es so.

Vermutlich setzt du tatsächlich eine falsche Core ein.
Ich musste auch meine Core wechseln um fehlerfreien Code für den ATtiny zu erstellen.
Seit dem bin ich damit zufrieden.

Das war es tatsächlich - mit dem in der Lib definierten "man"-Objekt geht es. Dokumentation mangelhaft...

Miq1:
Das war es tatsächlich - mit dem in der Lib definierten "man"-Objekt geht es. Dokumentation mangelhaft...

Ein aktueller Sketch wäre hier schon angebracht und hilft denen, die mit dem selben Problem kämpfen.

Sieht nicht viel anders aus - aber wenn's hilft... Ich habe ein bisschen kommentiert:

#include <Manchester.h>

// Basis ist ein ATtiny85 mit 8MHz internem Takt.
// Pinbelegung:
#define ROSE_LED 0
#define BLUE_LED 2
#define DATA_433 1

// KEIN eigenes Manchester-Objekt deklarieren! Die Lib erstellt selber eines namens "man"!

void setup() {
  pinMode(ROSE_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  digitalWrite(ROSE_LED, HIGH);
  digitalWrite(BLUE_LED, HIGH);

// man-Objekt als Receiver initialisieren
  man.setupReceive(DATA_433, MAN_1200);

  delay(5000);
  digitalWrite(ROSE_LED, LOW);

// Receive starten - läuft über eine Interruptroutine der Lib
  man.beginReceive();

  digitalWrite(BLUE_LED, LOW);
}

void loop() {
  static long t0 = millis()+250;
 
// Komplettes Paket empfangen?
  if (man.receiveComplete())
  {
    digitalWrite(ROSE_LED, HIGH);

    // Paket auslesen
    uint16_t packet = man.getMessage();

    if(packet&0x4000) digitalWrite(BLUE_LED, HIGH);

    // neuen Receivevorgang starten
    man.beginReceive();

    t0 = millis()+250;
  }
  if(t0<millis())
  {
    digitalWrite(ROSE_LED, LOW);
    digitalWrite(BLUE_LED, LOW);
  }
}

Ok...danke.
Das hilft sicher denen, die auch auf das Problem stoßen.
Nur warum verwendest du keine Code-Tags, damit wird der Sketch auch auf mobilen Geräten besser lesbar.

Done.

Miq1:
Done.

Prima....danke.