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
Channel2:-5
2
Channel2:-3
3
Channel2:-6
4
Channel2:-5
5
Channel2:-4
6
Channel2:-6
7
Channel2:-6
8
Channel2:-3
9
Channel2:-6
10
Channel2:-6
11
Channel2:-5
12
Channel2:-5
13
Channel2:-8
14
Channel2:-9
15
Channel2:-7
16
Channel2:-8
17
Channel2:-7
18
Channel2:-7
19
Channel2:-8
20
Channel2:-6
21
Channel2:-4
22
Channel2:-6
23
Channel2:-5
jetzt hab ich ein Problem:
Wenn Fernbedienung ausgeschaltet ist erscheint im Serial Monitor:
1
Channel2:346
2
Channel2:-29
3
Channel2:-528
4
Channel2:316
5
Channel2:-125
6
Channel2:-700
7
Channel2:-17
8
Channel2:-377
9
Channel2:-700
10
Channel2:562
11
Channel2:-42
12
Channel2:-700
13
Channel2:5
14
Channel2:1776
15
Channel2:-71
16
Channel2:-428
17
Channel2:1279
18
Channel2:144
19
Channel2:521
20
Channel2:-700
21
Channel2:-413
22
Channel2:-700
23
Channel2:-700
24
Channel2:-152
25
Channel2:-700
26
Channel2:-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.
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
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.
...
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)...
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.
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 ?
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.
...
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... :(
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.
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
...
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.
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.
...
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?
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.
...