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.
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
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.
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
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.
Schau mal bei Fritzing nach, da ist solch ein Bot beschrieben. http://fritzing.org/projects/balancing-robot/
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);
boah mist wieder falsch. Da muss natürlich um (gyro+winklel) nochmal ne klammer
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.
Dass die hauptschleife öfter durchläuft als das signal vom rad ist eher unrealistisch....
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.