Forum: Mikrocontroller und Digitale Elektronik Balancierender Roboter Accelerometer Problem


von NuclearVirus (Gast)


Lesenswert?

Hallo,
ich habe mir zusammen mit einem Freund das Projekt vorgenommen einen 
Roboter zu bauen, der auf 2 Rädern (So wie der Segway) balanciert. Nun 
sind endlich die Motoren da, welche über H-Brücken angeschlossen wurden. 
Das klappt soweit auch alles. Gestern habe ich dann mal alles zusammen 
gebaut (nur ganz grob mit tesa ums mal zu probieren) und ein erstes 
kleines Programm geschrieben.
Zur erkennung der lage wurde ein analoger accelerometer eingesetzt 
(ADXL335)




Hier mal für die Lesefaulen eine Kurzfassung:

- Welchen Accelerometer kaufen (und evtl welchen gyro?)
- Wie an den Arduino anschließen?
- Wie bekommt man die durch die Bewegungen verursachten Schwankungen 
weg?

Das sah dann in etwa so aus:

Erst mal eine Achse vom accelerometer angeschlossen, die wenn der 
roboter aufrecht steht nach vorne oder hinten zeigt. Dann per Serieller 
Verbindung am PC die werte ausgelesen, wenn der Roboter aufrecht steht. 
Das war so zu sagen der mittelpunkt.

Dann was in der art:
Wenn mittelpunkt dann motor 0v
Wenn in eine Richtung gekippt Spannung je nach winkel ansteigend 
(map...)
Wenn in die andere Richtung gekippt das gleiche mit anders rum drehendem 
motor.

Das hat auch so halb geklappt nachdem ich mit den werten ein wenig 
rumgespielt habe aber durch die bewegung haben die werte extrem 
geschwankt. (ich habe dann 50 messungen mit 1ms abstand gemacht und den 
schnitt berechnet was ein klein wenig geholfen hat) Irgendwann wurde 
dann der Accelerometer extrem warum und gibt nun nur noch auf einer 
Achse werte aus, die auch etwas komisch sind. Ich habe keine Ahnung was 
da passiert ist. Der arduino war an 12,8v aus 8 AA batterien über den 
Vin pin angeschlossen, was ja in dem bereich (5-20v) drin ist. Am 5v 
ausgang lagen 4,96v an, welche an den accelerometer angeschlossen waren, 
der laut beschreibung 3-5v braucht. Er wurde auch nicht die ganze zeit 
sondern nach ca 30 minuten ganz plötzlich warm. Seitdem kommen aus dem 
3,3v port auch keine 3,3v mehr raus sondern genau wie aus dem 5v port 
4,96v

Naja wie auch immer. Nun würde ich gerne eien Digitalen accelerometer 
benutzten, da die 1024 werte bei 3g einfach nicht genug sind, da ja 
schon mal die 2 überflüssigen g wegfallen also nur noch 1024/3 übrig 
sind.....

Ich habe jedoch keine Ahnung wie ich sowas anschließe und das Problem 
mit den schwankenden werten bleibt immer noch. Ich habe mal was von 
einem Kalman filter gelesen, wo die werte mit einem gyro verglichen 
werden. Wie funktioniert sowas und ist der arduino schnell genug um das 
mehrmals pro sekunde zu machen?

ich würde mich über ein paar Antworten freuen!

mfG

von Michael (Gast)


Lesenswert?

NuclearVirus schrieb:
> Welchen Accelerometer kaufen (und evtl welchen gyro?)

Da dürfte so gut wie jedes geeignet sein.

NuclearVirus schrieb:
> Wie an den Arduino anschließen?

Es gibt welche mit SPI, I2C oder analoger Schnittstelle. Letzteres 
müsste man mit dem ADC einlesen. Absoluter Kinderkram mit Arduino.

NuclearVirus schrieb:
> Wenn mittelpunkt dann motor 0v
> Wenn in eine Richtung gekippt Spannung je nach winkel ansteigend
> (map...)
> Wenn in die andere Richtung gekippt das gleiche mit anders rum drehendem
> motor.

Ein Zweipunktregler wie du ihn vorschlägst ist absolut unangebracht und 
wird nie funktionieren. Regelungstechnik einlesen. 
http://www.rn-wissen.de/index.php/Regelungstechnik
Wird ein PID werden.

NuclearVirus schrieb:
> Ich habe mal was von
> einem Kalman filter gelesen, wo die werte mit einem gyro verglichen
> werden. Wie funktioniert sowas und ist der arduino schnell genug um das
> mehrmals pro sekunde zu machen?

Also was der Kalmanfilter macht das kann jeder ergoogeln. Da darf man 
halt nicht zu faul dazu sein. Mit Fixkommaarithmetik kann man den Kalman 
gut realisieren. Dann reicht auch ein Arduino.

von Michael (Gast)


Lesenswert?

Für die die garnichts checken gibt es übrigens der Kalmanfilter auch 
schon als lib für Arduino.
http://diydrones.com/profiles/blog/show?id=705844%3ABlogPost%3A23188

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

NuclearVirus schrieb:
> Am 5v
> ausgang lagen 4,96v an, welche an den accelerometer angeschlossen waren,
> der laut beschreibung 3-5v braucht.

Das Datenblatt des ADXL335 sagt:
Low power : 350 μA (typical)
Single-supply operation: 1.8 V to 3.6 V

Mit 5 Volt wirst du ihn also zerstören.

von NuclearVirus (Gast)


Lesenswert?

Naja da stand 5v. da ist wohl auf der platine irgendwas was die spannung 
regelt: http://dx.com/p/adxl335-3-axis-accelerometer-module-167074

Ja dass das mit dem Arduino eigenen ADC ein Kinderspiel ist weiß ich. 
Aber wie erwähnt reicht mir da die auflösung nicht aus. So 14 Bit wären 
schon iwi geiler.
Wie benutzt man denn diese Digitalen? Mit SPI oder I2C? Ich kann mir das 
nicht so recht vorstellen...

Zum Kalman Filter.
Ich weiß schon was das ist. So im groben aber ganz verstehen wie das 
alles gerechnet wird tu ich nicht... So wie ich das verstanden habe:
Dier "Lagesensor" alleine wird ja durch bewegung beeinflusst, da ja dann 
g-Kräfte in andere richtungen wirken. Der Gyro alleine driftet 
logischerweise nach einer gewissen Zeit ab, da sich alle noch so kleinen 
Fehler addieren. Wenn mann jedoch die werte vom Gyro nimmt und sie duch 
die durchschnittswerte der letzten paar messungen vom Lagesensor wieder 
berichtigt bekommt man schöne glatte werte.
Denkt ihr, dass ein analoger accelerometer und ein analoger gyroskop von 
der genauigkeit ausreichen würden? Und gibt es analoge, die z.B. nur bis 
1,5g je achse messen? Dardurch hätte ich ja dann mehr genauigkeit, weil 
es weniger mögliche werte gibt.

von Michael K. (mmike)


Lesenswert?

Lass den Kalman filter ... Komplementärfilter reicht locker aus und ist 
im Vergleich Kinderfasching.

Hier ist eine gute Beschreibung:

http://web.mit.edu/scolton/www/filter.pdf

Beste Grüße,
Michael

von NuclearVirus (Gast)


Lesenswert?

OK Dann schaue ich mir das morgen mal an. Heute keine Zeit mehr...
Aber die frage ob analog reicht oder ob es einen Unterschied macht, wenn 
ich die  64 fache auflösung habe? (bei 16 bit) oder halt nur die 16 
fache bei z.B. 14 bit. Und gibt es da bei den einzelnen modellen der 
Accelerometer und Gyros merkliche unterschiede in der genauigkeit?

von Michael K. (mmike)


Lesenswert?

Ich hab damals nen Digi Sensor verwendet für meinen Tricopter. MPU6050 
von Invensense (gibts mittlerweile sehr günstig mit Headerboard bei 
ebay). Die Auflösung reicht Dir locker egal, ob 14 oder 16. Nimm das, 
was Dir lieber ist ...

Beste Grüße,
Michael

von Karl H. (kbuchegg)


Lesenswert?

NuclearVirus schrieb:
> OK Dann schaue ich mir das morgen mal an. Heute keine Zeit mehr...
> Aber die frage ob analog reicht oder ob es einen Unterschied macht, wenn
> ich die  64 fache auflösung habe? (bei 16 bit) oder halt nur die 16
> fache bei z.B. 14 bit. Und gibt es da bei den einzelnen modellen der
> Accelerometer und Gyros merkliche unterschiede in der genauigkeit?

Ich denke ganz ehrlich nicht, dass die Auflösung oder Genauigkeit das 
Problem ist.

Wenn ein Asuro mit der Helligkeitsvariation seiner Popel-LED, gemessen 
von einem Popel-Phototransistor und mit dem internen (verglichsweise) 
Popel-ADC-Wandler mit 10 Bit, auf den Hinter-'beinen' balanzieren kann

http://www.youtube.com/watch?v=EHcJAU3IcXU

dann ist das ein Software-Problem und hat wenig mit möglichst 
bit-starker Hardware zu tun.

von NuclearVirus (Gast)


Lesenswert?

Das war ja meine Frage. Ob die 10 Bit reichen oder nicht. Ich habe ja 
nur gesagt, dass mir aufgefallen ist, dass man das teil halt schon 
merklich neigen muss, damit die werte sich verändern. Ich schätze mal so 
ca 1° pro wert. Ich werde mir heute mittag mal alles anschauen, was 
vorgeschlagen wurde. Nach der Schule....

von Yalu X. (yalu) (Moderator)


Lesenswert?

NuclearVirus schrieb:
> Naja wie auch immer. Nun würde ich gerne eien Digitalen accelerometer
> benutzten, da die 1024 werte bei 3g einfach nicht genug sind, da ja
> schon mal die 2 überflüssigen g wegfallen also nur noch 1024/3 übrig
> sind.....

Du wirst das Sensorsignal vielleicht sowieso verstärken wollen. Die
Empfindlichkeit bei 3V Versorgungsspannung beträgt 300mV/g, d.h. bei ±3g
Beschleunigung variiert das Sensorsignal zwischen 0,6V und 2,4V. Der für
den Balanceakt interessierende Messbereich ist aber deutlich kleiner als
±3g, vielleicht etwa ±0,5g. Das würde einem maximalen Neigungswinkel von
30° entsprechen. Es bedarf schon einer guten Traktion der Räder auf dem
Boden, um das Gefährt aus dieser Schräglage wieder aufstehen zu lassen.
Außerdem sollte der Regler solche Schräglagen gar nicht erst entstehen
lassen.

Wenn du den genannten Bereich von ±0,5g mit 10 Bit auflöst, beträgt ein
Auflösungsschritt 1g/1024=0,00098g. Das entspricht einer Neigung von
0,056°. Das sollte vom Gefühl her locker ausreichen. Ein gewisser Anteil
der Auflösung wird sowieso im Rauschen untergehen.

> - Welchen Accelerometer kaufen (und evtl welchen gyro?)

Der, den du schon hast, sollte schon gehen. Ein Gyro ist aber ebenfalls
von Vorteil, vielleicht sogar erforderlich. Er hat nämlich zwei wichtige
Eigenschaften:

- Er reagiert nicht (oder kaum) auf Beschleunigungen, so dass du
  tatsächlich die unverfälschten Neigungsänderungen als Ergebnis
  bekommst.

- Da er nicht den Winkel, sondern die Winkelgeschwindigkeit misst,
  können mit ihm plötzliche Kippbewegungen schneller erkannt werden.

Mit der Kombination Beschleunigungssensor plus Gyro und einem geeigneten
Auswerteverfahren (Kalmanfilter oder vielleicht auch Komplementärfilter)
sollten Neigungsmessungen mit der geforderten Genauigkeit und Reaktions-
zeit möglich sein.

> - Wie an den Arduino anschließen?

Wie gesagt, schalte einen geeigneten Verstärker dazwischen, damit der
Messbereich des ADC gut ausgenutzt wird.

> - Wie bekommt man die durch die Bewegungen verursachten Schwankungen
> weg?

Wie oben geschrieben, durch den zusätzlichen Einsatz eines Gyros. Aber
auch die Störungen auf dem Beschleunigungssensor selber kannst du
reduzieren, indem du den Sensor möglichst hoch in dem Gefährt einbaust.
In großer Höhe bekommt er nämlich auf Grund des Trägheitsmoments des
Fahrzeugchassis nur wenig von den Unebenheiten des Bodens und den durch
den Regler generierten Korrekturbwegungen mit.

> Ich habe mal was von einem Kalman filter gelesen, wo die werte mit
> einem gyro verglichen werden. Wie funktioniert sowas und ist der
> arduino schnell genug um das mehrmals pro sekunde zu machen?

Der Rechenaufwand ist kein großes Problem. Er mag etwas höher liegen als
bei dem von Michael angeführten Komplementärfilter, trotzdem würde ich
schätzen, dass die Rechenzeit pro Zyklus auf einem 16MHz-ATmega unter
100µs, liegt, wenn man die Formeln einigermaßen geschickt hinschreibt.

von PittyJ (Gast)


Lesenswert?

Bei Analog Devices kann man sich eine Übersicht abrufen.
Ich habe gute Erfahrungen mit den SPI-Sensoren der ADIS-Serie gemacht.

http://www.analog.com/ps/psthandler.aspx?pstid=10129&la=en
http://www.analog.com/ps/psthandler.aspx?pstid=10130&la=en

von Stefan (Gast)


Lesenswert?

Ich schätze, Du bist von falschen Annahmen ausgegangen. Vermutlich hast 
Du erwartet, dass der Sensor die Neigung des Roboters liefert.

Das ist aber nur die halbe Wahrheit. In erster Linie handelt es sich um 
einen Beschleunigungssensor. Es ist daher nur richtig, daß er auf jede 
bewegung empfindlich reagiert. Auch die Erdanziehungskraft ist eine 
Beschleunigung, und die kannst Du nutzen, um die Neigung zu ermitteln.

Gehen wir mal von einem 2-Achsen Sensor aus.

Stell Dir ein Auto mit einer extrem dünnen Radioantenne auf dem Dach 
vor, an dessen Spitze möglicherweise noch ein lsutiger Ball befestigt 
ist. Die Antenne ragt senkrecht in den Himmel. Die Biegung der Antenne 
wird durch durch irgendwelche Sensoren erfasst.

Solange das Autop nicht bewegt wird, steht die Antenne senkrecht, du 
erhälst kein Signal vom Sensor.

Wenn das Auto nach vorne gekippt steht, biegt sich die Antenne nach 
vorne.

Wenn das Auto noch vorne gekippt steht und dabei (schnell genug) nach 
vorne bewegt wird, biegt sich die Antenne nach hinten.

Der Sensor zeigt die Neigung des Autos also nur an, wenn es nicht fährt. 
Das ist Dein Problem. Du brauchst einen Algorithmus, der die momentane 
Beschleunigung des Roboters vom Meßergebnis subtrahiert.

Um zurück zu dem Beispiel mit der Antenne zu kommen: Nun schrauben wir 
eine zweite Antenne an das Auto, und zwar an die rechte Beifahrertüre. 
Sie ziegt nach rechts und hängt aufgrund der Erdanziehungskraft auch 
etwas nach unten durch.

Nun gibst Du Gas. Das Auto beschleunigt nach vorne. Sowohl die Antenne 
auf dem Dach als auch die Antenne an der Türe biegen sich nach hinten. 
Du bekommst also 2x das Signal "Biegung nach hinten", von zwei 
unterschiedlich ausgerichteten Sensoren (2 Achsen).

Wenn sich beide Antennen gleich stark nach hinten biegen, ist das Auto 
nicht gekippt.

Wenn sich die Antenne auf dem Dach stärker nach hinten biegt, als die 
Antenne an der Türe, dann beschleunigt das Auto gerade einen Berg 
hinauf.

Wenn sich die Antenne auf dem Dach weniger nach hinten biegt, als die 
Antenne an der Türe, dann beschleunigt das Auto gerade einen Berg 
hinunter.

Wenn sich die Antenne an der Türe nach vorne biegt, bremst das Auto.

Wenn sich die Antenne an der Türe weder nach vorne noch nach hinten 
biegt, dann beschleunigt das Auto nicht und es bremst auch nicht. Dann 
rollte es einfach. In diesem Fall sagt Dir die Dachantenne, in welche 
Richtugn es gerade geneigt ist, also ob es gerade den Berg hinunter oder 
hinauf rollt.

Das heisst: Die Differenz der beiden Achsen ist entscheidend, um 
zwischen Neigung und Beschleunigung zu unterscheiden.

Das Prinzip kann man jetzt noch auf drei Achsen erweitern, wenn man 
will. Bei einem 3-Achsen Sensor ist die Summe der drei Signale immer 
annähernd 1G (abhängig vom Abstand zum Erdmittelpunkt).

von Stefan (Gast)


Lesenswert?

Die Auflösung des Sensors ist übrigens gar nicht so kritisch.

Ich habe mal mit Lego einen Segway gebaut, der die Neigung mit einem 
optischen Sensor erfasst (Reflex-Lichtschranke zum Boden hin). Ich hatte 
da nur 5 nutzbare bits und die haben für eine flüssige Steuerung ohne 
Ruckeln, ungewolltes Kippen oder Zittern gereicht.

von NuclearVirus (Gast)


Lesenswert?

Es hängt ja auch immer vom bereich ab. Ich hätte ja bei dem 3g sensor 
den ich bis jetzt benutzt habe 1024 schritte von -3g bis +3g. da ich ja 
keine beschleunigung in dem sinne berechnen will sondern nur die lage 
brauche ich -1g bis 1g also nur noch 1/3 der werte also ca 340, wovon 
ich vllt 10-20 brauche, da das Teil ja aufrecht stehen soll. Aber ich 
denke, dass das mit einem Gyro zusammen verrechnet. Ob nun 
Kalman-,Komplementärfilter oder was auch immer.... Ich probiers einfach 
mal aus. (problem ist nur, dass ich bisher keinen Analogen 
Accelerometer+Gyro auf einer platine gefunden habe....)
@Stefan
Das war mir natürlich von anfang an klar. Das war ja auch nur ein 
Testaufbau... Ich wollte halt mal probieren wie sehr die Werte durch die 
Bewegung schwanken... Hab ja auch noch kein Programmcode. Das war nur 
irgendwas in 5 minuten  hingebasteltes....
Ich denke aber nicht, dass man nur duch einen accelerometer machen kann. 
Egal wieviele achsen man hat und wieviel man rumrechnet. Man hat ja eben 
nicht immer 1g. Im stillstand trifft das natürlich zu aber wenn man 
sagen wir mal die x-Achse senkrecht gerichtet hat und die y-Achse 
waagerecht hat man x=1g und y=0g beim stillstand. Wenn man das ganze nun 
bewegt ändert sich ja an den 1g von x nichts aber bei y wird der wert 
positiv bzw negativ.... Ich denke, dass man da mit nem gyro deutlich 
bessere Ergebnisse erzielt. Am beispiel von nem Auto: Der gyro zeigt 
überall 0°/s an aber der accelerometer sagt, dass er geneigt ist. 
Dadurch weiß man ja dass das auto grad in irgend ne richtung 
beschleunigt. In meinem Fall sagt er mir halt, wie das Teil grad gedreht 
ist aber er driftet nach einer gewissen zeit ab, wofür er dann wieder 
mit dem Accelerometer synchronisiert wird. Man könnte das ganze bestimmt 
auch nur mit einem Gyro machen. Dass er halt sieht, dass sich das Teil 
grad nach rechts dreht obwohl es gerade einen schub in diese Richtung 
gegeben hat und er dem entsprechend noch mehr schub braucht bis er sich 
auch ohne beschleunigung nicht mehr dreht..... wäre aber wohl für meine 
Programmierkenntnise ein Overkill.

Ich wäre dankbar, wenn mir jemand kurz erklären könnte wie ich Werte aus 
diesen digitalen Sensoren bekomme und wie oft pro Sekunde das möglich 
ist. Ich verstehe noch nicht so ganz wie das gehen soll. Da werden ja 
Nacheinander die einzelnen n-Bit werte der einzelnen Achsen 
übergeben.... Aber da das mein erster kontakt mit µcs ist weiß ich nicht 
wirklich wie ich diese werte als Zahlen (ob nun g-Werte, einfache n-Bit 
werte wie beim analogRead oder °/s sind ist mir egal. es geht mir nur 
darum erst mal überhaupt irgendwas aus diesem Sensor raus zu kriegen. 
Bzw zu wissen, dass das ohne größere Schwierigkeiten zu machen ist bevor 
ich jetzt so n Teil bestelle und es dann nicht hinkriege.

von NuclearVirus (Gast)


Lesenswert?

Ich habe mir jetzt mal diesen Artikel über Filter durchgelesen und zum 
großteil zumindest grob verstanden. Der komplementärfilter scheint da 
echt auszureichen. Nur frage ich mich wie lange so ein gyro braucht bis 
er merklich (also ca +- 1°) abdriftet? sein beispiel da mit 100hz und 
0,98xgyro integration + 0,2x accelerometer messung mit den 0,5s kommt 
mir ziemlich schnell vor. Also in der hinsicht, dass wenn das teil (das 
ist zumnindest geplant) irgnendwann fernsteuerbar wird bestimmt mehr als 
0,5s beschleunigen wird und dann die werte halt wieder abdriften.... 
kann man nicht davon ausgehen, dass so ein Gyro für ein paar Sekunden 
verwendbare Werte liefern kann? also sagen wir mal, wenn ich die 2 
sensoren  jeweils 5x mit 1ms abstand messe um halbwegs akzeptable werte 
raus zu kriegen bin ich mit der bearbeitungszeit.... vllt auch auf ca 
100hz.

von Michael K. (mmike)


Lesenswert?

So schlimmt ist die Drift nicht ... Wenn ich mit meinem Copter permanent 
Kreise fliege (so 30 Sekunden), dann merkt mans schon, dass die Winkel 
ein wenig driften, aber sobald er wieder schwebt, dann ists wieder ok.

Für meinen Filter hab ich an Faktoren 0.99 und 0.01. funzt prima!

Ausserdem: Sensor besorgen und einfach ausprobieren ;-)

Beste Grüße,
Michael

von Karl H. (kbuchegg)


Lesenswert?

NuclearVirus schrieb:

> Nur frage ich mich wie lange so ein gyro braucht bis
> er merklich (also ca +- 1°) abdriftet?

Ein reiner Gyro?

ca 1°?

-> ein paar Sekunden.

von Reinhard S. (rsd)


Lesenswert?

Schau mal bei Fritzing nach, da ist solch ein Bot beschrieben.
http://fritzing.org/projects/balancing-robot/

von NuclearVirus (Gast)


Lesenswert?

Das Teil ist nun angekommen. Nachdem ich die ganzen libraries 
installiert habe, hab ich mal den beispiel skatch, wo man die 
ungefilterten werte vom accelerometer und gyroskop bekommt. dann habe 
ich mir das mal angeschaut und ein wenig modifiziert. Mir aus der x und 
z achse mit   a = atan2(-ax,-az)*57.2957795+180; den winkel berechnen 
lassen und mal geschaut... Ist wenn der Sensor ruhig liegt auch relativ 
in Ordnung.
Dann habe ich mal mit dem gyro rumgespielt. Den wert mit der zeit 
multipliziert und zum vorheringen wert addiert. Ein drift von ca 1°/s 
war das ergebnis. Dann habe ich mir mal die rohwerte aus dem 
accelerometer mit jedem loop addieren lassen und dementsprechend den 
offset angepasst. Nach ein wenig probieren habe ich es geschafft, dass 
der integrierte wert kaum mehr drift hatte. Also bei 0° initialisiert 
und nach 1 Minute war er bei 0,5°... ein 10 sekündiges rumbewegen vom 
sensor endete mit einem drift von 2-3°. Das finde ich sehr akzeptabel. 
Jedoch kriege ich das mit dem Komplementärfilter irgendwie nicht hin.
Sobald ich auch nur ein wenig auf den tisch klopfe schwanken die werte 
um bis zu 50°. Beim reinen integrierten wert war ja alles relativ 
stabil...
Hier mal die Codezeile:

winkel = 0.001 * a + 0.999*gyro;

Dabei ist a der vom lagesensor errechente winkel ung gyro ist die 
gyroausgabe * dt.
Was habe ich da Falsch gemacht? (die 0.999 sind übrigens nicht 
übertrieben. Das sind 2,77s bei meinem Takt... Aber das sollte das ganze 
ja selbst wenn es zu groß ist eher zum driften verleiten als dazu 
aufeinmal so große sprünge zu machen...)

Beide werte einzeln geben akzeptable ausgaben aus....

von NuclearVirus (Gast)


Lesenswert?

Ich kann das jetzt nicht mehr bearbeiten oder zumindest finde ich den 
button dafür nicht. Da fehlt was... Die Zeile vom Komplementärfilter 
sollte so aussehen: winkel = 0.001 * a + (0.999*gyro + winkel);

von NuclearVirus (Gast)


Lesenswert?

boah mist wieder falsch. Da muss natürlich um (gyro+winklel) nochmal ne 
klammer

von NuclearVirus (Gast)


Lesenswert?

Nachdem ich den sketch nochmal neu geschrieben habe geht es nun. Es ist 
im prinzip alles gleich... Nun funktioniert auch alles aber beim 
übersprung von 359° auf 0° kommt natürlich vom gyro ein wert der größer 
als 359 ist raus, weil er ja einfach nochmal etwas draufaddiert. 
Dementsprechend dauert es dann mehrere sekunden bis er auf 0° runter 
gezählt hat... Gibts da irgend ne funktion in C dass eine Zahl nur eine 
gewisse größe haben kann und dann wieder 0 wird...

von Karl H. (kbuchegg)


Lesenswert?

Ich hab zwar nicht verstanden, was dein Filter jetzt wirklich macht, 
bzw. wo jetzt das Problem sein soll

aber

   winkel = .... welche Version auch immer ....;

   while( winkel > 360.0 )
     winkel -= 360.0;
   while( winkel < 0.0 )
     winkel += 360.0;

zu banal?

von NuclearVirus (Gast)


Lesenswert?

Was er macht ist den aufgeleiteten wert vom gyro zu 99,9% und den wert 
vom acelerometer zu 0.1% in den Gefilterten wert mit einbeziehen. Ich 
habe jetzt nochmal probehalber alles aufgebaut... Mit Motoren etc... und 
einfach nochmal linear mit der map funktion die motoren von 0.5° bis 6° 
neigungswinkel von minimum auf maximum geregelt und in der anderen 
richtung das gleiche. Das funktioniert recht gut. Das teil zittert kein 
bischen hin und her aber das problem ist halt, dass es nicht erkennt, 
wenn es in eine richtung langsam wegrollt. Wird dann immer schneller und 
fällt hin... Das war ja auch nur ein erster in wenigen minuten 
geschriebener code... Das umkippen lässt sich durch eine andere regelung 
bestimmt noch beheben aber wie kriege ich es hin, dass das Teil auf 
einer Stelle stehen bleibt? Da brauch ich warscheinlich Encoder für die 
Räder oder motoren. Wo kriege ich sowas? Wie suche ich danach? Ich habe 
mit ein wenig google nichts brauchbares gefunden. Außer ein 
Foreneintrag, wo das jemand mit einem Mausrad macht... Ich habe zwischen 
den Motoren nur etwa 2cm platz... Passen da 2 Encoder rein? Oder kann 
ich nicht irgendwie mit so etwas wie einer modifizierten lasermaus 
direkt die räder abtasten?

von NuclearVirus (Gast)


Lesenswert?

Das mit den 360° lässt sich so nicht lösen.  Manchmal ist auch der 
accelero wert bei sagen wir mal 5° und der integrierte wert bei 359.xx 
und dann geht er mit jedem durchlauf ein wenig runter.....  bis er nach 
mehreren 1000 durchläufen endlich bei dem richtigen wert angekommen ist. 
Und in die While schleifen geht er ja nicht rein, weil der wert 
insgesamt ja im bereich ist...

von Michael K. (mmike)


Lesenswert?

Nimm von jedem Winkel den cos oder sin und addier den Accelwinkel und 
den Gyrowinkel zusammen. Danach wieder die Inversfunktion und alles wird 
gut!

Alternativ ein wenig anspruchsvoller ist DCM (Direction Cosine Matrix).

Beste Grüße,
Michael

von J. T. (chaoskind)


Lesenswert?

Als einfache Radsensoren eignen sich Gabellichtschranken hervorragend. 
Wenn man den Platz hat, aber die sind nicht allzu groß. Einfach mal nach 
googeln.

Auf die Motorachse ne Scheibe mit Schlitzen, dadrüber die Gabel welche 
dir dann munter Impulse ausgibt, die du einfach zählen kannst. Die 
Richtung in die du fährst kennst du ja, da du weißt, in welche Richtung 
du deine H-Brücke ansteuerst.

Naja solang Impulse kommen, weißt du, die Räder drehen =)

MfG Chaos

P.S. ich lese grad, es ist nicht viel Platz

zur Not musst du die Räder mit nem kontrastreichen Muster markieren, 
SMD-LED und SMD-Phototransistor auf n kleines Stück Platine, das sollte 
locker auf 2 cm unterzubringen sein.
So ein Muster bekommt man aus dem Drucker, Kreissegmente schwarz/weis 
ausdrucken, auschneiden und auf die Räder kleben. Ist sicher auch 
proffesioneller zu lösen, aber zum basteln langts erstmal.
Die Kleinteile findet man bei den üblichen Verdächtigen. Im Zweifelsfall 
nach Elektronikversendern oder Lokale Elektronikhändler hier im Forum 
suchen.

von NuclearVirus (Gast)


Lesenswert?

Das mit dem Cos/Sin... verstehe ich nicht so ganz. Bin aber grad noch am 
lesen. Ich habe ja durch diese atan... funktion meinen Winkel von 0 bis 
359,xx grad aus 2 verschiedenen Achsen berechnet. Also nur ein Winkel. 
Wenn ich davon den cosinus oder sinus berechne habe ich irgendwas 
zwischen -1 und 1. Was soll ich dann da drauf addieren?
Zur lichtschranke:
Wie kann ich die Werte davon ohne das Programm immer warten zu lassen 
und ohne interrupt auslesen? Der Arduino hat ja nur 2 Interrupt pins und 
die sind von den 2 Kanälen vom RC reciever belegt(Der gibt ja etwas pwm 
artiges aus). Oder gibt es eine Möglichkeit interrupts auf andere Pins 
zu legen? Und dann wäre noch, dass die interrupts nicht wie beim 
Reciever ca alle 15ms kommen sondern unregelmäßig je nach 
geschwindigkeit. Dadurch würde sich die Zeit vom Programmablauf jedes 
mal ändern. Da ich dt, was ich ja für die Gyrointegration brauche nicht 
jedes mal berechnen kann (durch das Teilen durch 1000000 bekomme ich 
0.00 raus, da float ja nur 6-7 genauigkeitsstellen hat), würde das die 
Winkelberechnung stören. Deshalb hab ich das mal gemessen und einfach in 
eine variable gespeichert. Wenn das Rad dann mit knapp 800rpm dreht hab 
ich während den ca. 4ms um die 5 interrupts oder bei 2 Rädern ca 10. 
Oder kann man die Zeit davon vernachlässigen?
Dann wäre noch das mit der Richtung. Wenn ich spannung auf die Motoren 
gebe, z.B. zum Bremsen, laufen sie ja durch den schwung noch ein wenig 
in die andere Richtung... Also müsste das Teil auch die Richtung messen.
Funktionieren die alten Mäuse mit Kugel nicht auch mit sowas? Und die 
erkennen ja auch in welche Richtung sich die gelochte Scheibe dreht... 
Könnte man diese Lichtschranken ausbauen und mit dem Arduino auslesen?

von J. T. (chaoskind)


Lesenswert?

Wenn dir die Richtungsgenauigkeit per H-Brücke nicht langt, gibt es 
mehrere Möglichkeiten. Du könntest entweder das Muster unsymetrisch 
machen, also sowas wie - - ----    - - ----   - - ----  dann liest du in 
der einen Richtung kurz kurz lang aus und andersrum lang kurz kurz.

Oder du liest das symetrische Muster aus, und wenn du die H-Brücke 
umschaltest, musst du die sinkende Frequenz der Pulse beachten, und die 
Zählrichtung erst dann umkehren, wenn sie wieder steigt...

Das sind aber nur kurze Ideenansätze, große Erfahrungen hab ich damit 
auch noch nicht gesammelt.

Mh und das generelle Auslesen sollte Idealerweise per Interrupt gemacht 
werden... aber wenn die voll sind. Bleibt dir vermutlich nur noch 
Polling. Da musst du dann drauf achten, das oft genug abgefragt wird, 
sprich deine Hauptschleife öfter durchläuft, als das Muster bei 
Maximaldrehzahl Pulse ausgibt, sonst verlierst du Schritte.

von NuclearVirus (Gast)


Lesenswert?

Dass die hauptschleife öfter durchläuft als das signal vom rad ist eher 
unrealistisch....

von NuclearVirus (Gast)


Lesenswert?

Was natürlich auch eine möglichkeit wäre:
Eine alte PS2 maus um die sensoren auszulesen und dann kann man ja 
bestimmt irgendwie die X,Y Koordinaten über den PS2 anschluss auslesen. 
Wäre das zu ralisieren?

von J. T. (chaoskind)


Lesenswert?

So eine PS2 Maus gibt meines Wissens nach keine Koordinaten X/Y aus, 
sondern nur Impulse X/Y, aus denen dann Koordinanten gebildet werden 
können...

Aber prinzipiell sollte das möglich sein, du musst dann halt einfach die 
Impulse zählen, und dir daraus Koordinaten errechnen. Wobei ich nicht 
weiß, wie das in sonner Maus mit der Richtungserkennung gelöst ist, aber 
auch dazu sollte einer hier n fachgerechten Kommentar abgeben könn =)

MfG Chaos

von NuclearVirus (Gast)


Lesenswert?

hab doch irgendwie keinen bock diese große hässliche Platine aus der 
Maus da einzubauen. Ich habe jetzt mal von einer der 2 Lichtschranken 
die LED und den Empfänger abgelötet. Die LED hat 3 Beinchen und der 
Empfänger hat 4... Keine Beschriftung. Woher weiß ich jetzt was ich wo 
anschließe?

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.