Forum: Mikrocontroller und Digitale Elektronik RaspberryPI ManchesterDecode eines 433mhz Signale


von Lars L. (vertigo)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe einen Tiny85 mit der Library von mchr3k/arduino-libs-manchester
 geflasht, um Daten an einen Raspberry Pi Model 1B zu senden. Die GPIOs 
des Raspberry Pi werden über die Schnittstelle pigpio angesprochen. 
Daher hatte ich gehofft, dass die Manchester-Implementierung unter 
pigpio examples – Kapitel „pigpiod_if2 code“
 die Daten lesen kann. Leider war dies nicht der Fall, weshalb ich in 
Ermangelung einer passenden Library versucht habe, die Arduino-Lib auf 
der Empfängerseite selbst zu programmieren.

Soweit ich es verstanden habe, sendet die Library in ihrem Beispiel ein 
8-Bit-Paket. Der Tiny85 läuft auf 8 MHz, und ich habe die Baudrate auf 
MAN_1200 eingestellt. Vor dem Senden der Nutzdaten wird ein Sync-Muster 
[0,0,0,1] geschickt, das in Manchester-Codierung als 
[(1,0),(1,0),(1,0),(0,1)] dargestellt wird. Wenn ich es richtig 
beobachtet habe, beträgt der Takt, den der Tiny sendet, stets 750 µs, 
auf den die Manchester-Codierung aufgesetzt ist.

Mein Problem ist nun, dass ich zwar die Flankenerkennung am GPIO bekomme 
– und das sind sehr wahrscheinlich meine Daten – ich diese jedoch nicht 
korrekt zusammenbauen kann. Wenn ich jedoch einen anderen Raspberry Pi 
mit einem Sender ausstatte und das Pigpio-Beispiel verwende, werden die 
Daten problemlos übertragen.

 Anbei die Flanken mit den Zeiten
1
 
2
Tick: 4193214804, Level: 0, Δt: 894 µs
3
Tick: 4193217125, Level: 0, Δt: 1655 µs
4
Tick: 4193218575, Level: 1, Δt: 1450 µs
5
Tick: 4193219450, Level: 0, Δt: 875 µs
6
Tick: 4193221765, Level: 0, Δt: 1645 µs
7
Tick: 4193223350, Level: 0, Δt: 890 µs
8
Tick: 4193224789, Level: 1, Δt: 1439 µs
9
Tick: 4193225645, Level: 0, Δt: 856 µs
10
Tick: 4193227965, Level: 0, Δt: 1630 µs
11
Tick: 4193228670, Level: 1, Δt: 705 µs
12
Tick: 4193229530, Level: 0, Δt: 860 µs
13
Tick: 4193231075, Level: 0, Δt: 855 µs
14
Tick: 4193232554, Level: 1, Δt: 1479 µs
15
Tick: 4193233390, Level: 0, Δt: 836 µs
16
Tick: 4193234100, Level: 1, Δt: 710 µs
17
Tick: 4193234960, Level: 0, Δt: 860 µs
18
Tick: 4193236505, Level: 0, Δt: 854 µs
19
Tick: 4193237205, Level: 1, Δt: 700 µs
20
Tick: 4193238054, Level: 0, Δt: 849 µs
21
Tick: 4193238760, Level: 1, Δt: 706 µs
22
Tick: 4193239600, Level: 0, Δt: 840 µs
23
Tick: 4193240310, Level: 1, Δt: 710 µs
24
Tick: 4193241925, Level: 0, Δt: 1615 µs
25
Tick: 4193242645, Level: 1, Δt: 720 µs
26
Tick: 4193243475, Level: 0, Δt: 830 µs
27
Tick: 4193244970, Level: 1, Δt: 1495 µs
28
Tick: 4193245805, Level: 0, Δt: 835 µs
29
Tick: 4193246520, Level: 1, Δt: 715 µs
30
Tick: 4193247350, Level: 0, Δt: 830 µs
31
Tick: 4193248075, Level: 1, Δt: 725 µs
32
Tick: 4193248905, Level: 0, Δt: 830 µs
33
Tick: 4193249625, Level: 1, Δt: 720 µs
34
Tick: 4193250465, Level: 0, Δt: 840 µs
35
Tick: 4193251180, Level: 1, Δt: 715 µs
36
Tick: 4193252790, Level: 0, Δt: 1610 µs
37
Tick: 4193254290, Level: 1, Δt: 1500 µs
38
Tick: 4193255105, Level: 0, Δt: 815 µs
39
Tick: 4193255840, Level: 1, Δt: 735 µs
40
Tick: 4193256660, Level: 0, Δt: 820 µs
41
Tick: 4193257395, Level: 1, Δt: 735 µs
42
Tick: 4193258210, Level: 0, Δt: 815 µs
43
Tick: 4193258945, Level: 1, Δt: 735 µs
44
Tick: 4193259770, Level: 0, Δt: 825 µs
45
Tick: 4193260500, Level: 1, Δt: 730 µs
46
Tick: 4193261320, Level: 0, Δt: 820 µs
47
Tick: 4193262051, Level: 1, Δt: 731 µs
48
Tick: 4193262870, Level: 0, Δt: 819 µs
49
Tick: 4193263605, Level: 1, Δt: 735 µs
50
Tick: 4193264425, Level: 0, Δt: 820 µs
51
Tick: 4193265155, Level: 1, Δt: 730 µs
52
Tick: 4193265980, Level: 0, Δt: 825 µs
53
Tick: 4193266710, Level: 1, Δt: 730 µs
54
Tick: 4193267530, Level: 0, Δt: 820 µs
55
Tick: 4193268260, Level: 1, Δt: 730 µs
56
Tick: 4193269075, Level: 0, Δt: 815 µs
57
Tick: 4193269810, Level: 1, Δt: 735 µs
58
Tick: 4193270625, Level: 0, Δt: 815 µs
59
Tick: 4193271370, Level: 1, Δt: 745 µs
60
Tick: 4193272185, Level: 0, Δt: 815 µs
61
Tick: 4193272920, Level: 1, Δt: 735 µs
62
Tick: 4193273731, Level: 0, Δt: 811 µs
63
Tick: 4193274470, Level: 1, Δt: 739 µs
64
Tick: 4193275285, Level: 0, Δt: 815 µs
65
Tick: 4193276020, Level: 1, Δt: 735 µs
66
Tick: 4193277610, Level: 0, Δt: 1590 µs
67
Tick: 4193278355, Level: 1, Δt: 745 µs
68
Tick: 4193279170, Level: 0, Δt: 815 µs
69
Tick: 4193280685, Level: 1, Δt: 1515 µs
70
Tick: 4193281495, Level: 0, Δt: 810 µs
71
Tick: 4193282240, Level: 1, Δt: 745 µs
72
Tick: 4193283040, Level: 0, Δt: 800 µs
73
Tick: 4193283790, Level: 1, Δt: 750 µs
74
Tick: 4193284595, Level: 0, Δt: 805 µs
75
Tick: 4193285350, Level: 1, Δt: 755 µs
76
Tick: 4193286145, Level: 0, Δt: 795 µs
77
Tick: 4193286895, Level: 1, Δt: 750 µs
78
Tick: 4193287695, Level: 0, Δt: 800 µs
79
Tick: 4193288452, Level: 1, Δt: 757 µs
80
Tick: 4193289255, Level: 0, Δt: 803 µs
81
Tick: 4193290000, Level: 1, Δt: 745 µs
82
Tick: 4193291575, Level: 0, Δt: 1575 µs
83
Tick: 4193293100, Level: 1, Δt: 1525 µs
84
Tick: 4193293910, Level: 0, Δt: 810 µs
85
Tick: 4193294655, Level: 1, Δt: 745 µs
86
Tick: 4193295460, Level: 0, Δt: 805 µs
87
Tick: 4193296215, Level: 1, Δt: 755 µs
88
Tick: 4193297005, Level: 0, Δt: 790 µs
89
Tick: 4193297765, Level: 1, Δt: 760 µs
90
Tick: 4193298555, Level: 0, Δt: 790 µs
91
Tick: 4193299315, Level: 1, Δt: 760 µs
92
Tick: 4193300110, Level: 0, Δt: 795 µs
93
Tick: 4193300865, Level: 1, Δt: 755 µs
94
Tick: 4193302435, Level: 0, Δt: 1570 µs
95
Tick: 4193303200, Level: 1, Δt: 765 µs
96
Tick: 4193303990, Level: 0, Δt: 790 µs
97
Tick: 4193304745, Level: 1, Δt: 755 µs
98
Tick: 4193305535, Level: 0, Δt: 790 µs
1
import pigpio
2
3
pi = pigpio.pi()
4
PIN = 17
5
6
last_tick = None  # Zeitpunkt der letzten Flanke
7
flanken_liste = []  # hier speichern wir die Flanken >700 µs
8
9
def callback_func(gpio, level, tick):
10
    global last_tick, flanken_liste
11
12
    if level in (0, 1):  # nur echte Flanken
13
        if last_tick is not None:
14
            delta = pigpio.tickDiff(last_tick, tick)  # Zeitdifferenz in µs
15
16
            if delta >= 700:  # nur Flanken über 700 µs speichern
17
                flanken_liste.append((tick, level, delta))
18
                print(f"{'Steigende' if level == 1 else 'Fallende'} Flanke, Δt = {delta} µs gespeichert")
19
20
        last_tick = tick  # aktuelle Zeit speichern
21
22
# Callback für beide Flanken registrieren
23
cb = pi.callback(PIN, pigpio.EITHER_EDGE, callback_func)
24
25
print("Überwache Flanken an GPIO", PIN)
26
try:
27
    while True:
28
        pass
29
except KeyboardInterrupt:
30
    cb.cancel()
31
    pi.stop()
32
    print("Gesammelte Flanken (>700 µs):")
33
    for t, lvl, d in flanken_liste:
34
        print(f"Tick: {t}, Level: {lvl}, Δt: {d} µs")

: Verschoben durch Moderator
von Joachim B. (jar)


Lesenswert?

Wichtige Regeln - erst lesen, dann posten!

    Groß- und Kleinschreibung verwenden
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Falsches Forum.

Forum: Projekte & Code

Hier könnt ihr Projekte, Schaltungen oder Codeschnipsel vorstellen. 
Projekte bitte nur mit Code oder Schaltplan posten (falls ihr nur Fotos 
vorstellen möchtet, bitte in "Zeigt her eure Kunstwerke"). Bitte hier 
keine Fragen posten.

Ich verschiebe das mal...

von Cartman E. (cartmaneric)


Lesenswert?

Manchester kann man schon mit den nur 35 Befehlen der Base-PICs
sehr einfach dekodieren. Oder mit einem Z80 mit einem 1 MHz Takt.

Versuchs noch einmal etwas hardwarenäher.
Dabei lernst du dann auch, wie man auf die GPIOs z.B. in C zugreifen
kann. Für die reine Dekodierung würde ich aber immer noch ARM-Assembler
vorziehen. Beachte dabei auch, dass die graue Eminenz in einem Pi,
der Videocore, den ARM zu ihrer eigenen Disposition arbeiten lässt.
Das äussert sich dann in gewissen Aufmerksamkeitsdefiziten wenn dein
Code läuft. Ob das dann noch für dich brauchbar ist, musst du selbst
herausfinden. Bei mir ist an der Stelle der Pi vom Tisch in die Ecke
geflogen...

von Mario M. (thelonging)


Lesenswert?

Lars L. schrieb:
> ich habe die Baudrate auf MAN_1200 eingestellt. {...}
> Wenn ich es richtig
> beobachtet habe, beträgt der Takt, den der Tiny sendet, stets 750 µs,

Eher 833 µs (1/1200 Hz).

von Lars L. (vertigo)


Lesenswert?

Cartman E. schrieb:
> Manchester kann man schon mit den nur 35 Befehlen der Base-PICs
> sehr einfach dekodieren. Oder mit einem Z80 mit einem 1 MHz Takt.
>
> Versuchs noch einmal etwas hardwarenäher.
> Dabei lernst du dann auch, wie man auf die GPIOs z.B. in C zugreifen
> kann. Für die reine Dekodierung würde ich aber immer noch ARM-Assembler
> vorziehen. Beachte dabei auch, dass die graue Eminenz in einem Pi,
> der Videocore, den ARM zu ihrer eigenen Disposition arbeiten lässt.
> Das äussert sich dann in gewissen Aufmerksamkeitsdefiziten wenn dein
> Code läuft. Ob das dann noch für dich brauchbar ist, musst du selbst
> herausfinden. Bei mir ist an der Stelle der Pi vom Tisch in die Ecke
> geflogen...

Hallo,

glaube es war mein Fehler, wollte das ganze eigentlich mit für ein 
Projekt verwenden und nicht noch ein extra IC dazwischen hängen. Die 
Interrupt Dekodierung sieht Interessant aus, wenn alles fertig ist zu 
Übungszwecken versuche ich es einmal.

Dieses ständige ändern der Zeiten der Daten hat mich auch ein wenig 
stutzig gemacht. Ich habe nun kein Gefühl dafür ob das diese Zeiten noch 
tolerierbar sind oder dies schon der Fehler ist. Wie gesagt von Raspi zu 
Raspi über C++ funktioniert es wunderbar und vermutlich funktioniert es 
auch blind von IC zu IC.

von Rainer W. (rawi)


Lesenswert?

Lars L. schrieb:
> Dieses ständige ändern der Zeiten der Daten hat mich auch ein wenig
> stutzig gemacht.

Du brauchst eine bimodale Verteilung, bei der die Häufigkeit in der 
Mitte zwischen den beiden Maxima wirklich auf 0 geht. Solange das 
erfüllt ist, ist alles gut.

: Bearbeitet durch User
von Lars L. (vertigo)


Lesenswert?

Rainer W. schrieb:
> Lars L. schrieb:
>> Dieses ständige ändern der Zeiten der Daten hat mich auch ein wenig
>> stutzig gemacht.
>
> Du brauchst eine bimodale Verteilung, bei der die Häufigkeit in der
> Mitte zwischen den beiden Maxima wirklich auf 0 geht. Solange das
> erfüllt ist, ist alles gut.

Hallo Rainer,

ich hatte zwar Jahren Statistik gehabt, aber der Begriff hat mir nichts 
gesagt :D
Also ja, zwischen den Maxima geht es auf null, der Mittelwert liegt bei 
783µs und die Standardabweichung liegt bei 50µs.
Mal so eine sidequest Frage, was ist der Hintergrund dieses Phänomens? 
Meine Erwartung wären eher das bei der Abbildung der Häufigkeiten der 
Zeiten eine Art Glockenkurve entsteht und nicht umgekehrt. Ich habe die 
höheren Werte die über 1000µs liegen rausgenommen und nur in dem Bereich 
zwischen 700 und 900 genommen. Oder habe ich da etwas komplett Falsch 
verstanden :D

von Rainer W. (rawi)


Lesenswert?

Lars L. schrieb:
> Meine Erwartung wären eher das bei der Abbildung der Häufigkeiten der
> Zeiten eine Art Glockenkurve entsteht und nicht umgekehrt.

Was meinst du mit "umgekehrt"?

> Also ja, zwischen den Maxima geht es auf null, der Mittelwert liegt bei
> 783µs und die Standardabweichung liegt bei 50µs.

Die 783µs ist der Mittelwert des einen Maximums und entspricht dem 
Abstand zwischen zwei Clockflanken. Der Mittelwert des zweiten Maximums 
muss etwa bei dem doppelten Wert liegen und der Symboldauer im 
Datenstrom entsprechen. Dein Mittelwert entspricht einer Datenrate von 
640 Bd.
Die langen Zeiten zwischen den Flanken entstehen, wenn im Datenstrom 
unterschiedliche Bits aufeinander folgen, die kurzen, wenn gleiche Bits 
aufeinander folgen.
https://de.wikipedia.org/wiki/Manchester-Code

Bei einer Datenrate von 1200 Bd müssten im Manchestercode Pulse/Pausen 
mit 417 µs und 833 µs, entsprechen der halben und der ganzen Symbolzeit, 
auftreten.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.