Transceiver-Modul RFM69HW Anbindung, Programmierung & Ansteuerung

  • Hallo allerseits :^^:

    Ich habe momentan folgendes Raspberry Pi-Projekt:

    Ein String soll mittels eines speziellen Funkprotokolls codiert werden. Der entstandene String aus Nullen und Einsen soll per Funk wie folgt übertragen werden:

    - Frequenz: 433,92 MHz

    - Modulationsart: Muss unbedingt FSK sein

    -> Mit einem Frequenzhub von 4,5kHz und einer Baudrate von 1,2 kb/s

    Bisher bin ich so weit, dass die Nachricht korrekt in den besagten String umgewandelt wird, mit Präampel, Synchronwörtern, etc... das wird alles von einem Python-Script übernommen.

    Der nächste Schritt besteht jetzt also darin, den Code mit einem Sende-Modul auszusenden. Dazu habe ich mir heute ein RFM69HW über Pollin bestellt.

    Nun kommt das eigentliche Problem (bzw. die Herausforderung):

    Ich muss das Modul Programmieren und korrekt ansteuern und weiß noch nicht so recht, wie ich das in Python umsetzen kann.

    Ich habe im Datenblatt des Modules nachgelesen, dass es gewisse Adressen gibt, die man über SCI, MOSI und MISO programmieren muss.

    Hier das Datenblatt (ziemlich weit unten stehen die Adressen und die möglichen Einstellungen in Tabellenform):

    https://www.pollin.de/productdownloads/D810800D.PDF

    Dazu habe ich einen Beitrag mit Python-Script gefunden, der beschreibt, wie man relativ einfach über die besagte SPI-Schnittstelle Schreibzugriffe auf Module erzielt:

    http://www.gsurf.de/raspberry-pi-e…spi-und-python/

    Wie genau muss ich die Variablen in die Register des Modules schreiben?

    Wie genau übergebe ich dem Modul den String aus Nullen und Einsen? Das Modul soll selber nichts Codieren, sondern einfach den Code abarbeiten. Habe auch schon überlegt, das mit einer einfachen for-Schleife zu machen.

    Ich hoffe jemand kann mir Helfen. :helpnew:

  • Transceiver-Modul RFM69HW Anbindung, Programmierung & Ansteuerung? Schau mal ob du hier fündig wirst!

  • Für meine Anwendung benötige ich also den "Continuous Mode", wenn ich das Modul quasi mit vorgegebenen Bits "füttern" möchte.

    Gut ich werde mal ein paar Versuche Starten und mich dann wieder melden.

    Muss das Modul eigentlich bei jedem "Neustart" wieder neu programmiert werden oder bleiben die gesetzten Variablen erhalten?

  • Soo, nun habe ich das besagte Modul an den Pi angeschlossen (GND, 3,3V, MISO, MOSI, SC, CLK, Pins wurden am Pi angeschlossen wie im Link im ersten Beitrag beschrieben) und u.g. Code mehrmals durchlaufen lassen. Fazit: es tut sich nix. Kein Signal wird gesendet. Habe einen Funkscanner nebenbei laufen lassen mit einem sehr breiten Wasserfall Diagramm, aber da kann ich kein FSK Signal sehen.

    Theoretisch wird im Modul zunächst die Sendeleistung angepasst, danach der Continuous mode aktiviert, schließlich der Sendermodus angeschalten, 2 Sekunden gewartet und am Ende wird wieder in den StandBy gegangen. Leider funktioniert das aber nicht so wie geplant...

    Kann mit jemand bei der Sache irgendwie helfen?

    EDIT1: Ich habe eine PNG-Datei mit einem einfach dargestellten Schaltplan angehängt, der die aktuelle Belegung der Pins beschreibt.

    Mit dieser Schaltung und dem u.g. Programmcode funktioniert das Modul aktuell noch nicht wie gewünscht.

  • Ich bin in der Zwischenzeit schon folgende Lösungsansätze durchgegangen:

    - Das Funkmodul nutzt eine 3V Logik, der Pi aber 5V:

    -> Spannungsteiler an jeden GPIO Pin, vor allem bei den SPI-Pins MOSI, MISO usw... (180Ohm / 180Ohm -> ergibt ca. 2,5V bei maximal 13,5 mA pro Pin, müsste für das HIGH Signal ausreichen)

    - Das Funkmodul ist defekt oder hat bereits Schaden genommen, da ich erst mit 5V getestet habe:

    -> neues Modul besorgt, diesmal mit Spannungsteilern, aber gleiches Problem.

    - Das Modul zieht im Transmitter Mode zu viel Strom für den Pi und die Spannung bricht zusammen

    -> Das Modul hängt jetzt an einem Labornetzgerät mit 3.3V und kann genügend Strom ziehen.


    Momentan habe ich keine weiteren Ideen zur Lösung des Problems. Ich könnte höchstens noch einen anderen Pi verwenden um auszuschließen, dass die Logik in dem aktuellen Pi defekt ist.

    Es kann jetzt eigentlich nur noch der Fall sein, das ich einen oder mehrere wichtige Registereinträge über SPI vergessen oder überlesen habe. Oder reicht es möglicherweise nicht aus, lediglich den Transmitter Mode zu aktivieren? Vielleicht muss noch ein zusätzlicher Befehl zum Senden gegeben werden?

  • Moin Maskey,

    - Das Funkmodul nutzt eine 3V Logik, der Pi aber 5V:

    Noe, der RPi hat an den GPIO-Pins auch nur 3,3V!!! Und er darf da auch nicht mehr!!! Sonst isser putt

    Du hast weder die Frequenz, die Betriebsart noch sonstwas an dem Modul angestellt.

    Ich behaupte mal: Du hast dir das Datenblatt des Moduls nicht richtig angesehen.

    Zumindest bist du dir über die Nutzung des Continuous-Modus nicht im klaren.

    Vorschlag: Kläre erstmal die Theorie und dann programmiere.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo Bernd,

    dann kann ich die Spannungsteiler ja wieder entfernen. Habe selber nochmal recherchiert und es sind tatsächlich 3,3V.
    Beim Arduino waren es glaube ich 5V, da habe ich was durcheinander gehauen...

    Die Register haben doch aber Standardeinträge und das Modul sollte grundsätzlich auch ohne große Einrichtung funktionieren. oder?

    Die "Betriebsart" ist meines Erachtens nach die Unterscheidung zwischen den Modi Sleep, Standby, Senden, Empfangen, usw.

    Ich habe mir das Datenblatt jetzt schon ein gutes Dutzend mal angeschaut und finde keine Lösung. Mit meinen Kenntnissen und Ideen bin ich nach sehr langer Problem- und Ursachensuche am Ende angekommen.

    Den Thread habe ich ja nicht aus langer Weile eröffnet. ;)

  • Kurzes Update:

    Beim Testen bin ich auf etwas interessantes gestoßen:

    Beim Anlegen einer Spannung von 3,3V an den Pin DIO5 sendet das Modul ein Dauersignal auf der Frequenz 433,999MHz mit einem Frequenzhub von ca. 60 kHz.

    Wenn gleichzeitig ein weiteres 3,3V Signal an einen der anderen DIO-Pins angelegt wird, sendet das Modul auf der reinen Trägerfrequenz ohne Frequenzumtastung.

    bisher habe ich dazu noch nichts im Datenblatt gefunden.

    Jedenfalls ist das schon mal das erste Lebenszeichen vom Modul. Letztendlich auch nicht die Lösung meines Problems, aber schon mal nicht schlecht. ^^

  • Moin Maskey,

    mhm... Du hast das, von dir verlinkte, Datenblatt schon mehrfach gelesen....

    Siehe hier

    Quote

    5.4.1. General Description
    As illustrated in Figure 29, in Continuous mode the NRZ data to (from) the (de)modulator is directly accessed by the uC on
    the bidirectional DIO2/DATA pin. The FIFO and packet handler are thus inactive.

    Gruss Bernd

    ps.: die Suche in dem PDF ergibt das der Suchbegriff "Continuous Mode" 33mal vorkommt.

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo Bernd,

    so wie ich das verstanden habe passiert im Continuous Mode folgendes:

    DIO1 gibt ein Clock Signal aus. Das kann z.b. im Raspberry Pi als Trigger genutzt werden, um das nächste Bit auszugeben. Auf DIO2 wird dann mit einem GPIO Pin ein HIGH oder LOW gegeben. Das Modul sendet dann in jedem Clock das entsprechende Signal.

    Soweit die Theorie.

    Aus dem von dir zitierten Ausschnitt geht zusätzlich hervor, daß es sich bei DIO 2 um einen bidirektionalen Pin handelt (hier ist noch zu klären warum) und das natürlich das Fifo und der Packet Handler aus geschaltet sind, da diese ja nicht benötigt werden.

    Kann also sein das das Modul noch einen Befehl über den DIO2 erwartet (?)...

  • Moin Maskey,

    das kann ich dir nicht sagen.

    Ich habe mich noch nie mit diesem Baustein beschäftigt. Hat mich nur interessiert..

    Aus Erfahrung weiß ich aber, das man das nicht mal so eben aus den Ärmel schüttelt.

    Das Datenblatt sollte man mehrmals lesen.

    Dann jeden Schritt der Initialisierung aufschreiben.

    - QRG-Einstellung

    - Bandbreite

    - Modulation bzw. Betriebsart

    - Wie muss ich die Sendedaten aufbereiten? Beim Continuous Mode wird ein NRZ-Signal mit dementsprechenden Takt erwartet

    usw.

    Davon habe ich in deinem Python-Script nichts gesehen. Für das Forum sollte man irgendwelche Initsachen kommentieren. Nicht jeder kennt die Befehlsequenzen ...

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Guten Morgen Bernd,

    Jetzt ist natürlich die Frage ob der Pi so ein NRZ Signal (+- 3,3 V) generieren kann.

    Zum testen müsste es doch theoretisch ausreichen, ein HIGH Signal an den DIO2 anzulegen, das das Modul eben erstmal nur Nullen oder Einsen sendet.

    Das geht natürlich nur, wenn der DIO2 keine Präambel/ bzw. Keine Startbits erwartet...

    EDIT1:

    Hab mich nochmal belesen. NRZ heißt nicht zwingend, dass es sich um einen positiven/negativen Pegel handeln muss. NRZ ist einfach die Standard Übertragungsmethode für Bits, die einem bestimmten konstanten Spannungspegel zugeordnet werden. Es wird sich beim DIO2 also um einen "normalen" logischen Eingang handeln, der z.B. bei ca. 0V ein "LOW" definiert und bei ca. 3,3V ein "HIGH", oder eben anders herum.

    Es gibt aber auch Beispiele mit negativen Spannungen.

    Bei der seriellen RS 232 Schnittstelle werden z.B. 1en mit -3 bis -15V und 0en mit +3 bis +15V übertragen (relativ große Bereiche. Bereich zwischen -3 und 3 ist undefiniert).

    Edited once, last by Maskey (March 27, 2019 at 9:03 PM).

  • Moin Maskey,

    du hast recht. Eigentlich werden die zu sendenden Bytes einfach so auf die Leitung gelegt.

    Das grundlegende Problem ist bei so einem Byte: 0111 1111 sieben lange Bits kein Flankenwechsel statt findet. Da kann schon mal die Synchronität leiden, weil man ja keinen Takt regenerieren kann. Da kann man was gegen machen. Z.B.: nach 5 Highbit wird zwingend ein Lowbit eingefügt. Das muss man aber dem RX auch per Checksumme mitteilen. Aber das führt zuweit...

    Aber du kann ja an dem anderen Pin einen Takt mitliefern. Dadurch wird es einfacher.

    Du musst also einen Takt generieren der bei jeden Flankenwechsel ein Bit deines Bytes schickt.

    Zu beachten ist auch noch, ob es Start und Stop-Bedingungen gibt.

    Nur zur Erinnerung: Ich kann KEIN Python und habe nicht wirklich Zeit und Lust mich in diesen Baustein einzulesen.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo Bernd,

    ja, ich verstehe das Problem mit den "zu langen" Signalen. Das was Du ansprichst, scheint in dem Modul der so genannte "3.4.13. Bit Synchronizer" auf Seite 31 zu übernehmen. er benötigt eine Präampel von 12 Bit und lässt keine gleichen Bitfolgen zu, die länger als 16 Bit andauern.

    (Zumindest habe ich das so raus gelesen)

    Ich habe eigentlich gedacht, dass das Modul einen DCLK an DIO1 ausgibt, je nachdem welche Bitrate man ins Register schreibt.... Das muss ich mal noch klären. Falls das Modul einen externen Clock erwartet, kann natürlich nichts funktionieren...

    Danke erstmal für den Tipp!

    LG Maskey

  • Continuous Mode

    Für die Datenübertragung vom/zum Modul werden die beiden Pins "DIO1/DCLK" und "DIO2/DATA" verwendet. An DCLK gibt das Modul den Takt vor mit dem die Datenbits an DATA geschrieben oder gelesen werden müssen.

    Also es ist eindeutig beschrieben. Das Modul muss den Clock vorgeben.

    Ich habe jetzt mein Programm erweitert, so dass es mit einem vorgegebenen Clock bei fallender Flanke das nächste Bit nachschiebt.

    Das funktioniert auch. Habe mal von Hand einen Takt gegeben.

    Das Problem: Dieses Modul gibt einfach keinen Clock aus, obwohl es das eigentlich sollte.

    Ich verstehe das einfach aktuell nicht mehr... ^^

    Ich suche nochmal in den Beispiel-Bibliotheken wie das andere gemacht haben. Da kann doch nur irgend eine wichtige Einstellung fehlen...

    Vielleicht funktioniert auch einfach diese SPI-Kommunikation nicht, und es werden gar keine Befehle so richtig ans Modul weiter gegeben? Vielleicht sollte ich es mal mit einer richtigen SPI-Api versuchen...

  • Moin Maskey,

    gibt der Baustein irgendwie nach setzen eines Parameters ein ACK aus. Oder gibt es Statusabfragen??

    Damit kannst du kontrollieren ob dein SPI richtig ist.

    Sonst fällt mir auch nicht viel ein.

    Aber du bist ja am Ball....

    Gruss Bernd

    Es würde mich am Ende mal interessieren wie deine Lösung aussieht

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Und mal wieder guten Morgen Bernd! :D

    Also das Modul müsste über MISO auf jeden Fall ein ACK zurück geben, je nach dem was man eben geschrieben hat. Das wird aktuell einfach von Pi ignoriert, da ich ja im reinen Schreibzugriff auf die Rückmeldung verzichten kann.

    Ich teste das erstmal mit einem Script, das nur Pegelveränderungen registriert und die Nullen und Einsen notiert. Wenn garnix raus kommt kann ich gleich mit dieser Variante aufhören und brauche dann eine richtige API wie "WiringPi"(soweit ich weiß konnte die SPI...).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!