Funken mit dem Attiny - preiswert und einfach

Hier können Sie ihre eigenen Projekte vorstellen
Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Funken mit dem Attiny - preiswert und einfach

Beitrag von Heinrichs » Mo 10. Jun 2013, 21:39

An anderer Stelle habe ich schon einmal Funkmodule vorgestellt. Handelte es sich damals um sehr leistungsfähige, aber im Umgang auch nicht ganz einfache Bausteine, stelle ich nun ein Sender-Empfänger-Paar vor, welches ganz einfach aufgebaut ist, unkompliziert in der Bedienung und äußerst preiswert ist. Bei Ebay findet man das Paar (inkl. Porto) für 2 bis 3 Euro, im Fünfer-Pack auch schon für 8 Euro. Einzig und allein mangelhaft ist die Dokumentation: Trotz intensiver Suche habe ich kein Manual bzw. Datasheet zu diesem Sender-Empfänger-Paar finden können.

fs1000a.jpg
Sender (links) und Empfänger
fs1000a.jpg (34.48 KiB) 85651 mal betrachtet

Immerhin gibt der Händler folgenden Daten:

Receiver module parameters
1. Product Model: MX-05V
2. Operating voltage: DC5V
3. Quiescent Current: 4mA
4. Receiving frequency: 315MHZ/433MHZ
5. Receiver sensitivity:-105DB
6. Size: 30 * 14 * 7 mm

Technical parameters of the transmitter head
1. Product Model: MX-FS-03V
2. Launch distance :20-200 meters (different voltage, different results)
3. Operating voltage :3.5-12V
4. Dimensions: 19 * 19 mm
5. Operating mode: AM
6. Transfer rate: 4KB / S
7. Transmitting power: 10mW
8. Transmitting frequency: 315MHZ/433MHZ
9. Pinout from left to right: (DATA; VCC; GND)

Hier und da findet man in Foren vereinzelte Hinweise zu diesen oder ähnlichen Bausteinen. Ich will hier versuchen, die wichtigsten Informationen zu diesen Bausteinen zusammenzufassen.

Sowohl Sender als auch Empfänger arbeiten mit einer Betriebsspannung von 5 V; sie können also direkt an die Buchsenleiste der Attiny-2.0-Platine angeschlossen werden. Die Versorgungsspannung des Senders kann auch bis auf 12 V angehoben werden; seine Sendeleistung soll dann höher werden. Bei einer Versorgungsspannung von 5 V habe ich aber schon über 2 Betondecken hinweg Daten übertragen können. Dazu habe ich allerdings die 433-MHz-Module jeweils mit einer Antenne von 17 cm versehen.

Der Sender sendet nur dann sein hochfrequentes Signal, wenn der Daten-Eingang auf High gelegt wird. Der Empfänger zeigt dieses durch ein High-Signal an seinem Ausgang an. (Welchen der beiden Ausgänge man benutzt, scheint egal zu sein.) Der Empfänger verstärkt das empfangene Signal automatisch um so mehr, je schwächer es ist. Das hat folgende unangenehme Konsequenz: Wenn der Sender schweigt, registriert der Empfänger sämtliche elektromagnetischen Umgebungssignale und gibt sie entsprechend verstärkt als "Daten" aus. Ein wesentliches Problem bei der Konzeption und Programmierung eines Übertagungsprotokolls besteht demnach darin, diese Rauschsignale von echten Datensignalen zu unterscheiden.

Hinzu kommt: Der Empfänger kann keine statischen Signale empfangen; das bedeutet: Wenn der Sender längere Zeit auf High oder Low gesetzt wird, zeigt der Empfänger nur noch das verstärkte Umgebungsrauschen an. Das Übertragungsprotokoll muss derart konzipiert sein, dass das Sendesignal sich häufig genug ändert - selbst wenn z. B. nur 0-Bytes übertragen werden. Ein Protokoll, welches dieses leistet, ist die Manchester- oder Biphasenkodierung.

Bei dieser Kodierung werden die Bits 0 und 1 jeweils durch Flanken dargestellt, z. B. 0 durch eine fallende Flanke und 1 durch eine steigende Flanke. Gehen wir z. B. davon aus, dass die beiden Phasen, die ein Bit repräsentieren, jeweils 1 ms dauern, dann muss das Signal spätestens nach 2 ms seinen Zustand ändern, egal welche Bitfolge übertragen wird.
manchester.jpg
Manchester-Kodierung
manchester.jpg (5.84 KiB) 85646 mal betrachtet
Die folgenden beiden Programme dienen zur Übertragung von kurzen Texten. Der zu sendende Text wird über ein Terminal-Programm an die Sendeeinheit übertragen. An der Empfängereinheit ist ein kleines Display angeschlossen, welches den empfangenen Text anzeigt. Damit der Empfänger den Anfang einer Übertragung erkennt, schicken wir dem Text eine "Präambel" voraus. Diese wird vom Empfänger genau analysiert; hat sie das korrekte Zeitverhalten, dann werden die folgenden Bit-Signale ausgewertet, indem jeweils der Zustand in der Mitte der ersten Phase gemessen wird.

Die Analyse der Präambel könnte auch zu einer Synchronisation des Empfängers genutzt werden, wenn der Empfänger nicht die genaue Zeitdauer der Phasen beim Sendesignal kennt.

Zunächst das Sendeprogramm:

Code: Alles auswählen

' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' 433 MHz Sender FS1000A an Attiny-Platine 2.0
' 5 V -Versorgung
' Datenleitung an PB0
' Empfänger: empfaenger3.bas
'
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 4000000                                          '4 MHz
$baud = 9600

'**********************************************************
'******************* Deklarationen ************************

Dim Text As String * 10
Dim I As Byte
Dim J As Byte
Dim Praeambel As Byte
Dim Buchstabe As String * 1
Dim Asciicode As Byte
Dim Null As Byte
Declare Sub Sendehf(b As Byte)


'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen
Waitms 50                                                   'zum Laden des Kondensators bei Ta0
Praeambel = &B10101010
Null = 0

'**********************************************************
'******************** Hauptprogramm ***********************

Do
  Input Text , Noecho
  Portb.0 = 0
  Call Sendehf(praeambel)
  For I = 1 To Len(text)
    Buchstabe = Mid(text , I , 1)
    Asciicode = Asc(buchstabe)
    Call Sendehf(asciicode)
  Next I
  Call Sendehf(null)
Loop


'**********************************************************
'******************* Unterprogramme ***********************

Sub Sendehf(b As Byte)
' Manchesterkodierung
  For J = 0 To 7
    If B.j = 1 Then
      Portb.0 = 0
      Waitus 1000
      Portb.0 = 1
      Waitus 1000
    Else
      Portb.0 = 1
      Waitus 1000
      Portb.0 = 0
      Waitus 1000
    End If
  Next J
End Sub
Und nun das Empfangsprogramm:

Code: Alles auswählen

' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Empfänger für Datei sender3.bas zum Funkmodul FS1000A
' Empfänger-Signal an PortD.6
' Sender und Empfänger können keine (quasi-)statischen Signale übertragen; im Mittel sollen
' die Low- und High-Anteile des Signals etwa gleich sein. Dann kommt der Empfänger
' nämlich mit einer relativ kleinen Verstärkung aus. Ansonsten regelt der Empfänger die
' Verstärkung hoch; dann ist das Signal aber relativ stark verrauscht.
' Als Kodierung benutzen wir deswegen die Biphasen- bzw. Manchester-Kodierung. Bei ihr
' werden die einzelnen Bits durch Flanken kodiert; insbesondere ist der Low- und der High-Anteil bei jedem
' Bit gleich groß, und zwar hier jeweils genau 1 ms = 1000 us.
'
' Pollin-LCD (8 Zeichen) an PortB
'
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 4000000                                          '4 MHz


'**********************************************************
'******************* Deklarationen ************************

Dim Pulsdauer As Word
Dim Text As String * 8
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim Pegel As Bit
Declare Sub Wait_for_praeambel
Dim Buchstabe As String * 1
Dim Asciicode As Byte
Declare Function Empfange_hf() As Byte
Dim Ergebnis As Byte

'****************** Initialisierung ***********************

Ddrb = &B01111111                                           'Port B als Ausgangsport, außer B.7
Ddrd = &B00110000                                           'D4, D5 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen
Waitms 50                                                   'zum Laden des Kondensators bei Ta0

Config Lcd = 16 * 2                                         'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.6
Cursor Off
Cls

'**********************************************************
'******************** Hauptprogramm ***********************

Do
  Call Wait_for_praeambel()
  Text = ""
  For I = 1 To 10
    Asciicode = Empfange_hf()
    If Asciicode = 0 Then Goto Ausgabe
    Buchstabe = Chr(asciicode)
    Text = Text + Buchstabe
  Next I
Ausgabe:
  Cls
  Lcd Text                                                  '
Loop

'**********************************************************
'******************* Unterprogramme ***********************

Function Empfange_hf() As Byte
  Waitus 500
  For J = 0 To 7
    If Pind.6 = 1 Then
      Ergebnis.j = 0
      Do
      Loop Until Pind.6 = 0
    Else
      Ergebnis.j = 1
      Do
      Loop Until Pind.6 = 1
    End If
    If J < 7 Then Waitus 1500
  Next J
  Waitus 1000
  Empfange_hf = Ergebnis
End Function

Sub Wait_for_praeambel()
  Tccr1b = &B00000001                                       'Timer1 starten mit prescale 1 (1 Timertick = 0,25 us)
Anfang:
  ' Bit 0
  Do
  Loop Until Pind.6 = 1
  Do
  Loop Until Pind.6 = 0
  Timer1 = 0

  Pegel = 1
  For K = 1 To 7
  ' Bit 1 - 7
    Do
    Loop Until Pind.6 = Pegel
    Pulsdauer = Timer1
    Timer1 = 0
    If Pulsdauer < 7000 Then Goto Anfang                    ' kleiner als 1,75 ms
    If Pulsdauer > 9000 Then Goto Anfang                    ' größer als 2,25 ms
    Toggle Pegel
  Next K

  Tccr1b = 0                                                ' Timer1 anhalten
  Waitus 1000                                               ' Ende der Präambel
End Sub
Beide Programme sind bewusst einfach gestaltet. Sie sollten als Ausgangspunkt für erste Experimente mit diesem Sender-Empfänger-Paar dienen und zu weiteren Untersuchungen anregen:
  • Wie hoch ist die Reichweite?
  • Hängt die Reichweite von der Phasendauer ab?
  • Welches sind die minimale bzw. maximale Phasendauer für eine korrekte Übertragung?
  • Wie kann man die Präambel zum Synchronisieren des Empfängers benutzen?

schnurps
Beiträge: 2
Registriert: Do 26. Jun 2014, 00:45

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von schnurps » Do 26. Jun 2014, 12:25

Hallo,

ich bin neu in der Welt der Mikocontroller und hoffe, ich stelle keine allzu dumme Frage.

Ich habe mir das besagte Funkmodul bestellt und wollte es eigentlich mit dem Raspberry Pi betreiben, um damit Funksteckdosen zu steuern. Da gibt es ganz idiotensichere Anleitungen z.B. hier.

Da ich ein großer Freund von einfachen Lösungen bin, bin ich damit, einen ganzen PC (wenn er auch so klein ist wie der PI) laufen zu lassen, um einem kleinen Funkmodul 01 und 10 zukommen zu lassen, nicht ganz zufrieden. Die hier vorgeschlagene Lösung mit der attiny-Platine gefällt mir besser. Noch lieber wäre mir aber, wenn ich das Funkmodul direkt mit dem sowieso laufenden Fileserver steuern könnte.

Daher die Frage -- sorry, wenn sie off-topic ist -- : Kann man das Funkmodul direkt über die serielle Schnittstelle eines PCs ansprechen? Hier (PDF) gibt es ein Paper, dass sich dem Thema Manchester-Kodierung über RS232 widmet. Ich würde das einfach mal probieren, wenn es von berufener Seite her keine grundlegenden Einwände gegen den Plan gibt.

beste Grüße
Kalle

Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von Heinrichs » Sa 28. Jun 2014, 11:45

Hallo schnurps,

im Prinzip JA. Inzwischen habe ich folgendes Schaltbild des Senders gefunden:

MX-05V.jpg
Schaltbild des Senders
MX-05V.jpg (18.08 KiB) 82290 mal betrachtet

Der Schwingkreis (oberer Teil der Schaltung) wird durch den unteren Transistor nur ein- und ausgeschaltet. Ist die Spannung an der Basis groß genug (z. B. wenn am Eingang ein TTL-Signal 5 V - d. h. logisch 1 - anliegt), dann schaltet der Transistor durch, der Schwingkreis wird mit Strom versorgt und sendet ein HF-Signal. Nun entspricht das RS232-Signal nicht dem TTL-Standard: Logisch 1 entspricht - 12 V; logisch 0 entspricht + 12 V (Die Spannungsbeträge sind manchmal auch kleiner!).

Das bedeutet: Wenn der Transmitter direkt an die TxD-Leitung der seriellen Schnittstelle eines PCs angeschlossen wird, dann wird bei einer logischen 0 ein HF-Signal-Signal abgestrahlt und bei einer logischen 1 nicht! Letztlich wird also eine invertierte Signalfolge übertragen. Verschiedene Vorgehensweisen bieten sich an: So kann man vor den Eingang des Transmitters einen weiteren Transistor schalten; so arbeitet unsere Attiny-Platine. Man kann aber auch empfängerseitig eine Invertierung vornehmen.

Eine zusätzliche Pegelangleichung (5 V - 12 V) ist m. E. hier wegen des Eingangswiderstandes nicht nötig; eine Garantie gebe ich aber nicht. 8-)

Meine Erfahrung zeigt, dass nicht unbedingt eine Manchesterkodierung nötig ist; entscheidend ist, dass man auf eine Synchronisierung zwischen Sender und Empfänger achtet: Wenn die Verbindung zwischen Sender und Empfänger gestört worden ist oder der Sender eine gewisse Zeit lang inaktiv war, muss der Empfänger ja wissen, wann das neue Daten-Byte beginnt. In unserem Programm haben wir dies mit Hilfe einer Präambel gemacht.

Ich hoffe, diese Informationen helfen weiter. Viel Erfolg!

Georg Heinrichs

Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Zur Ergänzung

Beitrag von Heinrichs » Sa 28. Jun 2014, 11:49

Hier noch das Schaltbild des zugehörigen Empfängers...
MX-FS-03V.gif
Schaltbild des Empfängers
MX-FS-03V.gif (30.1 KiB) 82290 mal betrachtet

schnurps
Beiträge: 2
Registriert: Do 26. Jun 2014, 00:45

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von schnurps » Di 1. Jul 2014, 00:20

Super! Vielen Dank. Ich werd's in den nächsten Tagen probieren und posten, was rausgekommen ist.

RRRatke
Beiträge: 1
Registriert: Sa 26. Dez 2015, 10:53

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von RRRatke » Sa 26. Dez 2015, 13:41

Hallo,
ich habe mal aus der Platine ein Schaltbild erstellt.
Wie zu sehen ist, ergibt sich eine andere Auskoppelvariante.
Gruß Ralf
Dateianhänge
433MHz Empfänger.TIF
433MHz Empfänger.TIF (152.68 KiB) 76882 mal betrachtet
Zuletzt geändert von RRRatke am Sa 26. Dez 2015, 18:57, insgesamt 1-mal geändert.

Lordcyber
Beiträge: 4
Registriert: Do 13. Dez 2018, 16:05

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von Lordcyber » Do 13. Dez 2018, 20:39

Hallo,
ich bin genauso Anfänger und habe diese Module.
Ich hab testweise mal die RCSwitch von Arduino verwendet.
Damit funktioniert das alles schon super. Aber mir liegt C eben nicht.
Daher bin ich froh hier was gefunden zu haben das diese Module verwendet.
Es geht mir weniger um die Kommunikation als darum mit dem Modul Codes von bestehenden Geräten zu empfangen und zu vergleichen.
Aber irgendwie werde ich aus dem Code von dir nicht ganz schlau.
Beim Arduino bekomme ich von den Geräten Codes wie zbsp. Received 14470538 / 24bit Protocol: 1
Das will ich mir Bascom auch und eben genau den vergleichen könne und entsprechend dauf reagieren.
Danke für eure Hilfe.

Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von Heinrichs » Fr 21. Dez 2018, 20:05

Hallo,

wenn Du mit "bestehenden" Geräten per Funk kommunizieren möchtest, musst Du deren Protokoll benutzen. In meinem Beitrag habe ich ein eigenes sehr einfaches Protokoll benutzt, weil es mir darum ging, das Funktionsprinzip deutlich zu machen; im Wesentlichen ist es nur durch die Benutzung der Manchester-Codierung und die Wahl einer speziellen Präambel charakterisiert.

Auf der Webseite https://github.com/sui77/rc-switch/wiki/HowTo_Send wird der von Dir erwähnte Arduino-Sende-Befehl vorgestellt; dieser benutzt ein Protokoll, welches auch von zahlreichen im Handel erhältlichen Geräten benutzt wird. Einige Details von diesem (deutlich komplexeren) Protokoll kannst Du erfahren, wenn Du auf der angegebenen Seite auf den Link "Line Coding" klickst.

Damit sich Sender und Empfänger verstehen, müssen beide dasselbe Protokoll benutzen. Damit ist klar: Mein Sende-Programm kann auf keinen Fall mit diesen Geräten kommunizieren. Allerdings spricht nichts dagegen, eine eigene passende BASCOM-Funktion für das Senden zu schreiben. Auf der Webseite https://www.mikrocontroller.net/topic/254620 scheint ein solcher Code angegeben zu sein.

Lordcyber
Beiträge: 4
Registriert: Do 13. Dez 2018, 16:05

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von Lordcyber » Fr 21. Dez 2018, 20:45

Hallo,
irgendwie blicke ich noch nicht durch. Ich will ja gar nicht senden.
Sondern nur Empfangen und den Empfangenen Code mit gespeicherten Vergleichen und darauf reagieren.
Alles was ich finde geht um das Senden.
Oder um die Kommunikation zischen zwei Geräten.

Ich funk Rauchmelder und diesen Code will ich lesen. Sobald der auslöst soll eine SMS per GSM Modul versendet werden.

Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Re: Funken mit dem Attiny - preiswert und einfach

Beitrag von Heinrichs » Fr 21. Dez 2018, 23:19

Hallo,

ich fürchte, dass sich ein BASCOM-Code für ein Empfangsprogramm nicht so einfach finden lässt. Um eine solche Funktion zu programmieren, muss man auf die Protokoll-Informationen aus dem angegebenen (ersten) Link zurückgreifen. Da es hier verschiedene Protokollvarianten gibt, dürfte es schon etwas aufwändiger sein, diese mit dem vollen Funktionsumfang der Arduino-Funktion herzustellen.

Vielleicht kannst Du mit Hilfe Deines funktionierenden Arduino-Programms mehr über das benutzte Protokoll herausfinden und meine Empfangsfunktion entsprechend modifizieren.

Ich habe eine Funksteckdose, die ähnlich funktioniert. Vielleicht schaffe ich es in den nächsten Wochen, für diese einen BASCOM-Empfänger zu programmieren. Das sollte sich dann auf Dein Problem übertragen lassen. Mal schauen...
Zuletzt geändert von Heinrichs am Mi 26. Dez 2018, 15:53, insgesamt 1-mal geändert.

Antworten