Spanky,
in Zeile 29 hast Du einen Zahlendreher:
if(upend >= 395)
upend = upend - 359;
muss heissen
if(upend >= 359)
upend = upend - 359;
Dadurch erzeugst Du einen Winkelfehler (gerechneter gegenüber gemessenem) von 36 Grad.
mare_crisium
Hi,
nach langer Zeit hat mich mal wieder der Bastelwahn gepackt und ich hab an meinem RP6 weiter gemacht.
Ich hab zum Geburtstag ein Kompassmodul bekommen (CMPS03).
Ich hab es an den I2C Bus angeschlossen und mit dem Programm von WarChild angesteuert. (danke für das Programm)
Nachdem ich herausgefunden habe, dass die Motoren den Kompass stören, hab ich ihn höher gesetzt. Jetzt stimmen die Werte.
Danach habe ich folgendes Programm geschrieben. Es lässt den Roboter solange drehen, bis er den gewünschten Winkel erreicht hat. Kontrolliert vom Kompass.
Hab mal die Fehler ausgebessertCode:#include "RP6RobotBaseLib.h" #include "kompass.c" void adv_rotate(uint8_t desired_speed, uint8_t dir, uint16_t angle) { // Calculate the Angle uint16_t old_comp; uint16_t comp; uint16_t new_comp; uint16_t upend; uint16_t downend; old_comp = dirCMPS03(); if(dir == RIGHT) { new_comp = old_comp + angle; if(new_comp >= 360) new_comp = new_comp - 360; upend = new_comp + 1; downend = new_comp - 1; if(downend <= 0) downend = downend + 360; if(upend >= 360) upend = upend - 360; writeString_P("\t"); writeInteger(new_comp,DEC); writeString_P("\t Upend: "); writeInteger(upend,DEC); writeString_P("\t downend: "); writeInteger(downend,DEC); writeString_P("\n"); moveAtSpeed(desired_speed, 0); while((comp <= downend) || (comp >= upend)) { comp = dirCMPS03(); task_RP6System(); writeString_P("Current: "); writeInteger(comp,DEC); writeString_P("\t Newcomp: "); writeInteger(new_comp,DEC); writeString_P("\t Upend: "); writeInteger(upend,DEC); writeString_P("\t downend: "); writeInteger(downend,DEC); writeString_P("\n"); } moveAtSpeed(0, 0); } while(!isMovementComplete()) task_RP6System(); } int main(void) { initRobotBase(); powerON(); uint16_t comp; adv_rotate(50, RIGHT, 90); while(true) { task_RP6System(); comp = dirCMPS03(); writeInteger(comp,DEC); writeString_P("\n"); } }
Und noch die kompass.c
Ganz fertig ist sie noch nicht. Links drehen fehlt.Code:#include "RP6I2CmasterTWI.h" #define CMPS03 0xC0 uint16_t dirCMPS03(void) { I2CTWI_initMaster(100); uint8_t cmpsbuffer[2]; uint16_t direction; I2CTWI_transmitByte(CMPS03, 2); // Ab dem zweiten Register Daten anfordern I2CTWI_readBytes(CMPS03, cmpsbuffer, 2); // und in dem Array speichern direction = ((cmpsbuffer[0] * 256) + cmpsbuffer[1]) / 10; return direction; }
Soweit funktioniert das auch. Nur wenn ich ihn um 90° drehen lassen will nimmt er nur ca. 45°. Auf dem Kompass jedoch sind es 90°
An den upend und downend liegt es nicht.
Falls ihr euch fragt warum upend / downend und nicht new_comp.
Mein Loop ist nicht schnell genug um jeden gemessenen Wert dazustellen. Deswegen kam es oft vor, das er sich 5-6 mal im Kreisgedreht hat. Also habe ich einen Bereich definiert, in dem der Wert liegen soll.
Ich bin verwirrt
Sieht jemand einen Fehler?
Einen kenne ich, aber ich finde die Ursache nicht.
Wenn ich das Programm starte um im Terminal nachschaue. Gibt er mir den new_comp wert aus. Bei der ersten Ausgabe ist er z.B 250. Und bei der zweiten und den folgenden ist er dann aufeinmal z.B. 30. Ist aber nur manchmal.
Gruß
Spanky
Spanky,
in Zeile 29 hast Du einen Zahlendreher:
if(upend >= 395)
upend = upend - 359;
muss heissen
if(upend >= 359)
upend = upend - 359;
Dadurch erzeugst Du einen Winkelfehler (gerechneter gegenüber gemessenem) von 36 Grad.
mare_crisium
danke
aber so richtig geht das immer noch net.
ich hab rausgefunden, das abunzu der wert nich auf 0 geht sondern zwichen 180 und 290 schwankt.
Warscheinlich stört der motor immernoch.
Ich melde mich morgen nochmal. Muss jetzt weg.
Gruß
Spanky
Bei den Winkeln ist nicht nur ein Zahlendreher, das muß auch 360 und nicht 359 sein die abgezogen oder addiert wird. Eine volle Drehung sind 360 Grad. Das wird aber auch nicht das Problem sein, sondern mehr eine kosmetische Korrektur.
Ich würde auch mal vermuten, das die Motoren immer noch etwas stören.
Als einen einfachen Test könnte man den ganzen Bot einfach mal von Hand drehen und sich dabei den Winkel vom Compass ausgeben lassen und sehen wie gut das hinkommt.
Hallo Spanky,
du hast auch noch Rundungsfehler in deinem Prog, wenn du die 16-bit-Werte des CMPS03 [0..3599] einfach durch 10 teilst. Es ist besser, mit dem kompletten 10-fachen Wert weiter zu rechnen. Dann geht dir nichts verloren.
Aber das erklärt auch nicht die Höhe der Abweichung.
Ich würde den Roboter immer stoppen, wenn gemessen werden soll. Dann würde ich 5 oder 10 Meßwerte mitteln (kleine Pause zwischen den Messungen!) und erst dann in die entsprechende Richtung drehen, usw.
Gruß Dirk
Hi,
tut mir leid das ich mich so lange net gemeldet hab.
Nach Silvester waren die Akkus leer und beim Laden ist irgentwie die Sicherung durchgebrannt (Fragt mich net wie ich das geschafft hab).
Ich hab weiter rum probiert und rausgefunden, wo der Winkelfehler liegt.
Wenn ich per MoveAtSpeed den Speed auf 0 stelle, stopt der Roboter nicht sofort, sondern lässt die Motoren auslaufen. Ich nehme mal an das ist um die Getriebe zu schonen.
(Dazu kam noch, dass die Motoren immernoch gestört haben)
Ich habe jetzt 3 Erweitungsplatinen übereinander. Bisher waren alle Messungen ok.
@Besserwessi
Ich hab mich da ein bischen irritieren lassen, weil der maximale Wert, der aus dem Kompass kommt 3599 (359,9 Grad) ist.
@Dirk
Meinst du nicht, dass die Drehung dann ein bischen zu lange dauert. Wenn er dreht, stoppt, misst und weiter dreht.
Ich hab mir überlegt, das ich mehrere UpEnd und DownEnd berechne, und der sich dann sozusagen bei zu großen Abweichungen einpendelt.
EDIT: Ich merke gerade, dass ich im Erdgeschoss keine Chance hab, irgentwas mit dem Kompass zu messen. Dort laufen ein paar Kabel durch den Boden. Gibt es eine Möglichkeit den Kompass nach untenhin abzuschirmen?
Gruß
Spanky
Ein Abschirmen des Kompasssensors ist praktisch nicht möglich. Wenn überhaupt wäre das für starke Wechselfelder nötig / Sinnvoll. Die könnte man theoretisch duch richtig dicke Aluminuimplatten (ein paar cm) üner Wirbelnströme abschirmen. Sinn voll und nötig ist das aber eher nicht. Solange das Wechselfeld nicht viel zu stark ist sollte es reichen ein paar werte zu mittelen. Bei normalen Leitungen kann ich mit da kaum vorstellen das die Störungen zu stark werden. Schwache Felder so wie um normale Kabel sollten den Kompass fast nicht beeinflussen. Auch hier wäre Abstand sehr effektiv.
Problematischer als Kabel kann der Stahl aus dem Stahlbeton werden, denn der Verbiegt das Erdmagnatfeld und schwächt das Feld das man eigentlich messen will. Da dürfte es eigentlich nur helfen den Sensor höher zu legen um mehr Abstand zu gewinnen. Eine richtig genaue Messung mit dem Magnetischen Kompass ist aber eventuell im Gebäude nicht mehr möglich.
Hallo Leute!
Nix zum Thema, aber ein wenig verwandt:
Ich würde meinen Robby gerne ebenfalls mit einem Kompass ausstatten. Welche Module gibt es, wo kann ich sie beziehen und vor allem: mit welchen kosten muss ich rechnen? Vielleicht hat ja noch jemand einen daheim rumfliegen, den er loswerden will?
Mit besten grüßen und tausend dank:
andieh
Hi,
@Besserwessi: danke für die Aufklärung. Eine Erweiterungsplatine habe ich noch. Muss aber erst diese Abstandhalter wiederfinden.
Zur Magnetfeldstärke im Erdgeschoss:
Wenn ich ein ferngesteuertes Auto fahren lasse, spielt es über den besagten Kabeln verrückt. Die Elektronik gibt dem Motor volle Power und zieht den Servo für die Lenkung voll in eine Richtung. Dann drehen die Reifen durch und das Auto dreht sich im Kreis (bzw. die hinterreifen drehen durch und einer der Vorderreifen ist wie auf den Boden geklebt)
Bei dem Auto handelt es sich um ein Spielzeug der Marke Nikko (Dort sind durchdrehende Reifen normalerweise nicht möglich)
Ich mach dann heute die Einpendelmethode.
Mal sehen ob das so funktioniert wie ich mir das vorstelle.
@andieh:
Ich verwende den CMPS03 von Robotikhardware.de.
Klick mich!
+ Kann einfach am XBUS auf dem Roboter angeschlossen und betrieben werden.
- Gibt ein leises hohes Pfeifen aus. Aber wenn man nicht unbedingt drauf achtet, merkt man es nicht.
Gruß
Spanky
Wenn da solch starke Störungen vorhanden sind, wäre es mal interessant einen einfachen HF detektor drüber zu halten. Da kann im einfachsten Fall eine kleine Luftspule mit Lastwiderstand am Osziloskop. Ohne Oszilloskop auch eine einfacher passiver HF-gleichrichter und dann ans DVM. So starke Störungen sollen eigentlich nicht vorkommen. Wäs hängt da denn drann ?
Die großen Störer die ich mir so vorstellen könnte wären größere Umrichter (für Motoren oder von Solaranlagen), große Computeranlagen und eher theoretisch ein Amateurfunker mit ganz schlechter Anlage.
Lesezeichen