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
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.
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.
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.
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
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 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
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.
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....
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.
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).
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.
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.
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.
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
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.
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....
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);
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...
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?
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?
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...
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
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.
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?
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.
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?
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
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?