Forum: Mikrocontroller und Digitale Elektronik Arduino empfängt Daten von RC 2ch Receiver zu empfindlich?


von forgoden (Gast)


Lesenswert?

Hallo,

ich hab einen 2Ch Receiver an Arduino UNO geschlossen um die Daten der 
Fernbedienung zu empfangen.

nach dieser Anleitung: https://www.sparkfun.com/tutorials/348

was funktioniert. Im Serial Monitor erscheint der Ablauf so:
1
Channel 2: -5
2
Channel 2: -3
3
Channel 2: -6
4
Channel 2: -5
5
Channel 2: -4
6
Channel 2: -6
7
Channel 2: -6
8
Channel 2: -3
9
Channel 2: -6
10
Channel 2: -6
11
Channel 2: -5
12
Channel 2: -5
13
Channel 2: -8
14
Channel 2: -9
15
Channel 2: -7
16
Channel 2: -8
17
Channel 2: -7
18
Channel 2: -7
19
Channel 2: -8
20
Channel 2: -6
21
Channel 2: -4
22
Channel 2: -6
23
Channel 2: -5


jetzt hab ich ein Problem:

Wenn Fernbedienung ausgeschaltet ist erscheint im Serial Monitor:
1
Channel 2: 346
2
Channel 2: -29
3
Channel 2: -528
4
Channel 2: 316
5
Channel 2: -125
6
Channel 2: -700
7
Channel 2: -17
8
Channel 2: -377
9
Channel 2: -700
10
Channel 2: 562
11
Channel 2: -42
12
Channel 2: -700
13
Channel 2: 5
14
Channel 2: 1776
15
Channel 2: -71
16
Channel 2: -428
17
Channel 2: 1279
18
Channel 2: 144
19
Channel 2: 521
20
Channel 2: -700
21
Channel 2: -413
22
Channel 2: -700
23
Channel 2: -700
24
Channel 2: -152
25
Channel 2: -700
26
Channel 2: -700

Das ist für mich ein Problem. Der Motor würde dann anfangen 
rumzuspinnen, weil Arduino komische hin und her springende Werte 
empfängt.

Woran liegt das?

Ich gehe davon aus dass Arduino die Signale sehr empfindlich empfängt.

von forgoden (Gast)


Lesenswert?

ich hab den receiver abgemacht und sehe was komisches: nähere ich der 
arduino meine Hand, umso wahrscheinlich spuken da komische Werte raus. 
Arduino spürt meine Hand? Wie kommt das

von Markus M. (mark_m)


Lesenswert?

Wie wäre es mit ein paar Pullup Widerständen?

Grüsse

von Hannes L. (hannes)


Lesenswert?

forgoden schrieb:
> Arduino spürt meine Hand? Wie kommt das

Der Eingangspin wirkt als Antenne, da er sehr hochohmig ist. Je nach 
Ausgangsschaltung des Empfängers empfiehlt sich der Einsatz eines 
Ziehwiderstandes nach Vcc oder GND. Das Einschalten des internen 
PullUp-Widerstandes könnte helfen, wenn der Empfänger auch saubere 
L-Pegel liefert. Ansonsten ist pro Pin ein Widerstand nach GND 
erforderlich.

Am RC-Empfänger "Planet R6m" von J. Perkins habe ich die Kanäle 1, 3 und 
5 mittels Dioden zusammengefasst und mit einem Widerstand den Pegel nach 
GND gezogen. Dieses Mix-Signal wird dann über den Analog-Komparator und 
ICP-Interrupt detektiert, so dass mit einem Pin alle 5 Kanäle eingelesen 
werden. Allerdings nicht mit Arduino, sondern mit einem ATTiny2313, denn 
ich schieße nicht gern mit Kanonen auf Spatzen.

...

von Max D. (max_d)


Lesenswert?

Das Problem wird sein, dass der Empfänger im "Leerlauf" einfach rauschen 
empfängt (und dann an den ardu weitergibt). Das ist bei vielen billigen 
433/868 MHz Systemen so, um das zu umgehen müssen die Daten auf die 
richtige Puls-Pausen-Länge geprüft werden (und sinnvollerweise gehört ne 
checksumme rein). Wenn du ein Beispiel willst kuk dir mal das FS20 von 
ELV an (ist jetzt nicht das Beste, aber gut um zu verstehen wie man mit 
dem Rauschen umgeht)...

von forgoden (Gast)


Lesenswert?

Heisst der Widerstand von pin nach GND nicht "pulldown-Widerstand" ?

Und Pullup Widerstand müsste nach 5V ?

Beides möglich?

Wie errechnet ihr den Wert für den Widerstand? Also welchen Ohm soll der 
Widerstand haben? Ich weiss nur dass der maximale Strom pro Pin 40mA 
liefern darf. Und Spannung glaub ich 5V


Gibt es Anleitungen dazu wie man mehrere channels in ein pin 
zusammenfasst? Analog-Komparator und ICP-Interrupt hört sich für mich 
kompliziert an.

von forgoden (Gast)


Lesenswert?

leider weiss ich nicht ob der Empfänger sauberer L-Pegel liefert. 
Jedenfalls ist der Receiver ein 2 Channel und ist sehr alt. (10 Jahre)

drauf steht nur Rx Band 6, 27MHz von Acoms
das käme am nächsten:
http://www.tamiyaclub.com/tc_userimages/169/img169_LYD9A_2.jpg

also mal ein Pulldown ausprobieren von 4,7 K von Pin nach GND ?

von Hannes L. (hannes)


Lesenswert?

forgoden schrieb:
> Heisst der Widerstand von pin nach GND nicht "pulldown-Widerstand" ?

Ja, aber in Deutschland darf man Pull-X-Widerstände auch Ziehwiderstände 
nennen, zumindest wenn man sich schon vor der Anglizismisierung mit 
Elektronik beschäftigt hat. Dass ich den AVR-internen Ziehwiderstand 
PuppUp nenne, hängt damit zusammen, dass dieser schon im AVR drin ist 
und in dessen Datasheet auch so bezeichnet wird. Da die meisten Arduinos 
AVRs verwenden sind die PullUps natürlich auch im Arduino drin. ;-)

forgoden schrieb:
> Und Pullup Widerstand müsste nach 5V ?

Ja, ist im AVR drin, muss nur per Software eingeschaltet werden.

> Beides möglich?

Ein PullDown ist im AVR aber nicht drin, den müsste man separat 
anbringen.

forgoden schrieb:
> Gibt es Anleitungen dazu wie man mehrere channels in ein pin
> zusammenfasst?

Das kommt auf den Einzelfall an. Viele ältere RC-Empfänger geben das 
Summensignal am dritte Pin des Akkusteckplatzes aus. Aber leider nicht 
alle.

> Analog-Komparator und ICP-Interrupt hört sich für mich
> kompliziert an.

ICP-Interrupt ist ein stinknormaler externer Interrupt, der als Zugabe 
beim Auslösen den Zählerstand des 16-Bit-Timers in sein Capture-Register 
kopiert, so dass die Software diesen dann in aller Ruhe auswerten kann, 
selbst wenn der Timer bis zum Auslesen des Capture-Registers bereits 
weitergelaufen ist. Das ermöglicht präzises Messen von Impulsbreite oder 
Periodendauer.

Der Analog-Comparator vergleicht zwei analoge Signale. Bei moderneren 
AVRs kann man auch die AVR-interne Bandgap-Spannung als Referenz 
einschalten und sich den zweiten Pin sparen. Dadurch bekommt der AC-Pin 
eine Schaltschwelle in Höhe der internen Bandgap-Spannung, die bedeutend 
niedriger ist, als die Schaltschwelle eines normalen Portpins bei Vcc 4 
bis 5 V. Der Analog-Comparator kann zum Triggern des ICP-Interrupts 
verwendet werden. Dies habe ich genutzt, um den für normale I/O-Pins zu 
geringen Pegel der durch Dioden zusammengefassten Kanalimpulse ohne 
externen Pegelwandler einlesen zu können. Denn der Empfänger liefert nur 
3,0 V für H-Pegel, davon fällt noch 0,7 V über die Diode ab. Die 
verbleibenden 2,3 V waren zu wenig für einen normalen Portpin oder auch 
den ICP-Pin. Also ging ich den Umweg über den Analog-Comparator und 
ersparte mir dadurch einen zusätzlichen Pegelwandler. Die Software muss 
nun aber nicht mehr Impulsbreiten ausmessen, sondern den Abstand 
zwischen den Flanken.

forgoden schrieb:
> leider weiss ich nicht ob der Empfänger sauberer L-Pegel liefert.

Das kannst Du prüfen, indem Du den Ausgang mit einem Widerstand gegen 
Plus oder Minus belastest und Dir dabei das Signal am Oszilloskop 
ansiehst.

forgoden schrieb:
> also mal ein Pulldown ausprobieren von 4,7 K von Pin nach GND ?

Richtig. Ich habe hinter den Dioden 10 k nach Masse.

...

von forgoden (Gast)


Lesenswert?

Vielen Dank für die ausführliche Beschreibung!

Was ich herausgefunden habe ist: Aktiviere ich den internen 
PullUp-Widerstand, entfallen die Störungen, wenn nur ein Kabel hängt. 
(Unterdrückt Rauschen von Außen wie ihrs beschreibt) Schließlich ich 
jedoch den Receiver an, so sind weiterhin Störungen zu sehen.

Auch habe ich ein PullDown Widerstand von 4,7K versucht. Erfolglos. - 
Zeigt keine Wirkung. Wirkung zeigt er, wenn nur ein Kabel hängt.

Erst einen Widerstand ab 1K nach GND zeigt Wirkung, doch dafür kann Pin 
keine Signale vom Receiver empfangen.

Ich weiss nicht mehr wie weiter... :(

von forgoden (Gast)


Lesenswert?

Fehlerkorrektur oben:
Schließlich = Schliesse

von forgoden (Gast)


Lesenswert?

Ich glaube es liegt an der Stromversorgung an Receiver. Denn sobald 
Receiver Strom hat, kommen diese Störungen.

Auch das habe ich versucht: Stromversorgung von Arduino an Receiver 
getrennt, Akku an Receiver angeschlossen. Masse mit Arduino verbunden.

auch hier einmal internen pull up widerstand ausprobiert und 4,7K 
pull-down

Alles erfolglos.

von Hannes L. (hannes)


Lesenswert?

forgoden schrieb:
> Alles erfolglos.

Ist Dir bewusst, dass man den Empfänger erst nach dem Einschalten des 
Senders einschaltet? Und auch wieder ausschaltet, bevor man den Sender 
ausschaltet? Gerade im 27MHz-Band muss man aufgrund der 
Ausbreitungsbedingungen immer mit Störungen rechnen.

Es wird Dir also nichts anderes übrig bleiben, als Deine empfangenen 
Impulse auf Plausiblität zu prüfen. Ein paar uralte Beispiele (noch mit 
Classic-AVRs) findest Du auf meiner HP:
http://www.hanneslux.de/avr/mobau/index.html

...

von forgoden (Gast)


Lesenswert?

Okay. Wenn das so ist, dann schreib ich einen "intelligenten" Code der 
erkennt wenn Werte nicht stimmen. Ich kann deine Assemblercode nicht 
herauslesen, verstehe nur C. Aber Die Beschreibung ist verständlich. 
(Fehlerüberprüfung und H-Brückenmotor abschalten)

Mit 2.4GHz hat man dieses Problem nicht?


Ein bißchen wundert mich das schon. Denn wenn die Servos direkt am 
Empfänger angeschlossen sind, dann fangen die nicht an zu hin- und her 
zu wackeln.

von Hannes L. (hannes)


Lesenswert?

forgoden schrieb:
> Mit 2.4GHz hat man dieses Problem nicht?

Nein, denn da werden die Positionswerte mit einem Protokoll übertragen, 
das dem von WLAN ähnelt. Die vom Sender-Impulsteil generierten 
Impulsbreiten werden also ausgemessen und in ein Datentelegramm gepackt, 
dieses wird als Paket (bei manchen Anlagen auch mit Ack) übertragen, der 
Empfänger erzeugt daraus wieder ein Impulstelegramm, mit dem 
herkömmliche Servos und Fahrtregler was Gescheites anfangen können.

Bei kurzen Ausfällen der Funkstrecke generiert der Empfänger meist 
Impulstelegramme anhand des zuletzt empfangenen Paketes. Bei längeren 
Ausfällen der Funkstrecke greift das im Empfänger programmierte 
Failsafe, das dann Impulstelegramme mit vorher festgelegten 
Positionswerten generiert. Dies variiert aber von Typ zu Typ.

forgoden schrieb:
> wenn die Servos direkt am
> Empfänger angeschlossen sind, dann fangen die nicht an zu hin- und her
> zu wackeln.

Hast Du am Eingang des Controller(-Boards) Widerstände (etwa 1k) in 
Reihe zu den Impulsleitungen? Diese vermeiden Reflexionen und sind 
eigentlich so selbstverständlich, dass man nicht darüber spricht.

...

von forgoden (Gast)


Lesenswert?

Warum sind diese so selbstverständlich? 1K-Widerstände in die grünen 
Kabel wie in dieser Abbildung? Sind das die Impulsleitungen gemeint?

http://dlnmh9ip6v2uc.cloudfront.net/tutorialimages/RCReceivers/RC_Rec_bb.jpg

Auch schon probiert - vergeblich.

Ich bin jetzt inzwischen auf die Idee gekommen, dass diese Störungen vom 
PC über USB auf Arduino kommen könnte und tatsächlich: Als ich ein Servo 
am Empfänger angeschlossen habe: wackelt es hin und her. Trenne ich USB 
Kabel und schließe ein Akku an Arduino -> Keine Störungen. Allerdings 
kann ich die Werte jetzt nicht mehr am PC herauslesen. Kommen wir jetzt 
vielleicht der Lösung näher?

von Hannes L. (hannes)


Lesenswert?

forgoden schrieb:
> 1K-Widerstände in die grünen
> Kabel wie in dieser Abbildung?

Ja.

> Sind das die Impulsleitungen gemeint?

Ja, zum Servo gehen 3 Strippen: Masse, Plus und Impuls.

Hast Du schon mal geprüft, ob an der Impulsleitung des Akku-Anschlusses 
das Impulstelegramm (Summensignal, PPM) anliegt? Das ist bei vielen 
älteren RC-Anlagen der Fall. Dann bräuchtest Du nämlich nur eine Leitung 
zum AVR, aus der Du alle Kanäle extrahieren kannst.

forgoden schrieb:
> Als ich ein Servo
> am Empfänger angeschlossen habe: wackelt es hin und her. Trenne ich USB
> Kabel und schließe ein Akku an Arduino -> Keine Störungen.

Dann solltest Du bei Arduino nachfragen. Hier befassen sich nicht 
allzuviele Leute mit Arduino.

forgoden schrieb:
> Kommen wir jetzt
> vielleicht der Lösung näher?


Vermutlich nicht, denn Du hast immer noch nicht verraten, was Du 
überhaupt bezwecken willst. Vielleicht gibt es ja eine viel einfachere 
Lösung.

...

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.