Hallo ihr lieben :) ich habe durch Zufall auf Hackaday ein interessantes cooles projekt gefunden nämlich eine Plotclock. Wie sie funktioniert und was das ist hier unter im Link zufinden ===================================================================== http://wiki.fablab-nuernberg.de/w/Ding:Plotclock Zusammengebaut ist es alles jedoch einwandfrei funktioniert es nicht. Ich hab zwar einige Teile im Code verstanden was da gemacht wird so genau bin ich mir bei jeder funktion nicht so sicher wie was macht die funktion void bogenUZS oder void set_xy hab einiges auch im Code geändert z.b dass er zu Begin direkt zum Wischer fährt und nicht schon vorher mit dem wischen fährt. Was auch noch nicht so funktionert ist das richtige schreiben ohne realtime clock und dass er mit dem Stift genau auf dem wischer geht kurz alles sauber wischt und dann wieder mit dem Wischer zurückfährt und erst dann mit dem schreiben anfängt. Ich füge mal den code gerne dabei. Hoffe ihr könnt was damit anfangen danke schonmal:) Achja die Calibrierung hat soweit funktioniert nach der anleitung
falls der code nicht gelesen werden kann hier stelle ich ein anderes format rein :)
bogenUZS zeichnet einen Bogen und set_XY bewegt den Stift zu einer bestimmten Position.
Hier kurz die "Abfolge" der Funktionen: number: Bildet Ziffern mittels drawTo (für Linien) und bogen Funktionen bogenXZS: Zeichnet Kreisbögen mittels kurzer drawTo Liniensegmente (U/G: Uhrzeiger/Gegenuhrzeigersinn) drawTo: Die eigentliche Zeichenfunktion, unterteilt Liniensegmente in Punkte (set_XY) mit ~0,1mm Abstand. set_XY: Rechnet die geforderten X/Y Punkte in Servowinkel um (inverse Kinematik). Für den Aufbau ist vorallem die korrekte Kalibrierung der Servos wichtig, so dass der eingestellte "Softwarewinkel" dem der Realität entspricht
Wie ist denn die Auflösung, laut SW Kommentar sollte dieser ca 0.25mm sein. Trifft dies zu ?
Wie groß ist den das Spiel? Ich habe am Wochenende selber ein bisschen mit zwei Billig-Schrittmotoren am Raspberry rumgebastelt, und anfangs war das gezeichnete schon etwas krumm und schief, weil es doch einen ziemlichen Versatz bei Bewegungen in die eine und in die andere Richtung gab. Liess sich aber halbwegs beherrschen und ich konnte nette Sachen damit machen. Nur das Anheben des Stiftes habe ich noh nicht gelöst gekriegt. Hast du dir die Teile selber mit nem 3D-Drucker gedruckt, oder lasergeschnittenen Teile benutzt?
Cooles Projekt! Ich werde mal den 3D Drucker anwerfen und mir die Servos besorgen. Mal sehen wie das klappt. Grüsse, René
Sabine W. schrieb: > Wie groß ist den das Spiel? Ich habe am Wochenende selber ein > bisschen > mit zwei Billig-Schrittmotoren am Raspberry rumgebastelt, und anfangs > war das gezeichnete schon etwas krumm und schief, weil es doch einen > ziemlichen Versatz bei Bewegungen in die eine und in die andere Richtung > gab. Liess sich aber halbwegs beherrschen und ich konnte nette Sachen > damit machen. Nur das Anheben des Stiftes habe ich noh nicht gelöst > gekriegt. > Hast du dir die Teile selber mit nem 3D-Drucker gedruckt, oder > lasergeschnittenen Teile benutzt? Also da musst du einmal mit der funktion lift(0) für absetzen und lift(1) fürs aufsetzen arbeiten. Dies habe ich alles in der void setup funktion reingeschreiben. Jedoch macht der eig nur eins von beiden und ich versuche erstmal dasss erzum wicher geht unn den stift da eingsteckt und dann mit dem wischen anfängt. Also mit drawTo(22.5, 16.5); ist er ungefährt beim wischer oben rechts wie er auch im video dahin geht. Aber wenn ich es klappt nichdt so dass er erst den stift an hebt mit lift(1) zum wischer geht lift(0) nach unten geht und dann beginnt zu wischen und wenn er fertig damit geworden ist den wischer an seienm alten platz stellt und erst dann schreibt. Ich weiss gerade nicht wo in dem code er mit dem wischen anfängt. Meine zweite Frage ist zeichnet er eig die Zahlen eigentlich richtg? könnte ich das z.b in der Calibration mal testen ? Wenn ja wie müsste ich dass dann machen stehe gerade echt etwas auf dem Schlauch danke :)
chris schrieb: > Was ist der Verfahrensweg des Stiftes ? Zunächste wischt er und nach jeder minute schreibt er die aktuelle Uhrzeit auf und dann wischt er sie nach einer minute
Kannst du mir das bitte ausmessen, wie groß der Verfahrensweg ist ? Hintergrund ist, daß ich die Konstruktion gerne für eine andere Anwendung verwenden würde. Also das Wischen, das ist die Nummer 111 number(3, 3, 111, 1); Und die Doppelpunkte sind nummer 11 also number(28, 25, 11, 0.9); Du könntest auch #define WISCHEN 111 #define DOPPELPUNKT 11 dazuschreiben, und dann number(3,3,WISCHEN,1) verwenden, dasselbe mit dem Doppelpunkt, dies sollte es dann leserlicher machen, aber auch im switch statement sollte man 111 und 11 mit WISCHEN und DOPPELPUNKT ändern, wie ev. auch ein AUSRUFEZEICHEN, welches z.B. vor der Sommer/Winterzeit Umstellung anstelle des Doppelpunktes gezeichnet werden kann, als hypotetisches Beispiel.
chris schrieb: > Kannst du mir das bitte ausmessen, wie groß der Verfahrensweg ist ? Zeichne dir einen Kreis mit dem Radius der Summe der beiden jeweiligen Schenkel um den Drehpunkt des jeweiligen Servos. Die Fläche, die von beiden Kreisen überdeckt wird ist die Fläche, die du mit dem Schnittpunkt der beiden Arme nach aussen erreichen kannst. Mehr geht prinzipiell nicht, denn mehr als einen komplett gestreckten Arm an einem der beiden Servos kannst du nicht haben. Ein klein wenig kannst du noch zugeben, weil der Stift ja nicht in diesem Schnittpunkt sitzt, sondern dazu einen kleinen Offset hat. Es gibt noch weitere begrenzende Kurven. Mit ein wenig nachdenken findest du die aber leicht.
:
Bearbeitet durch User
Kleine Bemerkung(en) am Rande: 1. Ich finde die Idee / das Konzept äußerst originell. 2. Die Schrift sollte um 180° gedreht werden. 3. Würde man die analogen Servos durch digitale Servos oder sogar Festplattenarme ersetzen, könnte man die Schreibgeschwindigkeit enorm erhöhen...
noch paar Hinweise für die, die zurzeit am basteln sind: Für die "Sauberkeit" wichtig sind primär 2 Faktoren: Die Lagerung der Servobefestigung muss ziemlich spielfrei sein und die Armgelenke des Stifthalters müssen möglichst frei beweglich sein, da selbst kleine Kräfte den normalen billig Servos zu schaffen machen. Wenn das alles stimmt ist mit vernünftiger Kalibrierung ne Schrift wie im Video möglich. Klar kann man das ganze auch mit Steppern, Kugellagern etc realisieren, aber das Projekt zielt auf die Verwendung der üblichsten billigsten Materialien ab, die man im bestfall eh rumliegen hat.
Ich bastle auch, mit Holz und Scharnieren, und etwas anderer Z Achsen. Da bin ich noch am tüfteln. Verfahrensweg 40x100mm ca. Zusammen mit einer Drehscheibe sollte dies mein neuer Lötroboter werden, um am Platinenrand THT Bauteile zu löten.
Es gibt auch Stepper, die kaum teurer als billige Servos sein dürften. Weil ich von denen halt welche rumzuliegen hatte, habe ich was aus denen gebaut: Beitrag "Plotter aus Billig-Steppern ( 28BYJ-48)"
ich komme gerade ehrlich gesagt nicht mehr weiter mit mein projekt zuhause:( was als erstes nicht mal funktioniert dass er zum wischer hinfährt und den annimmt dann wischt und den wieder zurückstellt. Und ich weiss nicht ob er die zahlen richtig schreibt. Das funktioniert ebenfalls nicht hab mich genau an die Anweisung des Tutorials gehalten. Welche Befehle muss ich denn da schreiben?
hast du evtl. Bilder/Videos vom Aufbau? Benutzt du nen Arduino oder nen rohen AVR? Die Servofaktoren sind mit 680 und 550 ziemlich unterschiedlich, sollten eigenltich kaum abweichen... oder verwendest du zwei verschiedene Arten Servos links und rechts?
Ich sehe in dem Programm nur eine Sammlung von Funktionen. Braucht es da keine main-Funktion, die erstmal setup() und dann loop() aufruft?
ich verwende für meine plotclock ein ardunino und dementsprechend die arduino software. Verwende als servo den HS-55 Multiplex. Die Kalibrierung habe ich so eingestellt dass die Servos 90 drehen und den gleichen Nullpunkt haben. Und wenn ich dann den Griff auf die Motoren drauf setzte und die Kalibrierung nochmalstarte dann bewegen sich die Arme wie auf dem bild hier: http://wiki.fablab-nuernberg.de/w/Datei:calibration.jpg Jedenfalls die Kalibrierung bei mir funktioniert aber der rest leider nicht. Im Anhang findet Ihr zwei bilder wie das ganze gerade bei mir in echt aussieht.
Wie bewegt sich den dein Teil bisher? kannst ja erstmal das Wischen weglassen und schauen, ob überhaupt Ziffern gezeichnet werden.
Sabine W. schrieb: > Wie bewegt sich den dein Teil bisher? kannst ja erstmal das > Wischen > weglassen und schauen, ob überhaupt Ziffern gezeichnet werden. ja das habe ich auch versucht in der luft wenn er was zeichnet erkenne ich schon die umrisse einer zahl aber wenn er etwas aufs papier zeichnen soll kommen nur striche heraus gerade.
Dann ist das Spiel der Konstruktion vielleicht zu groß. Wie sehr läßt sich denn der Stift hin- und herbewegen, wenn du an ihm wackelst? Versuche mal, einzelne Ziffern vergrößert zu zeichnen, etwa mit number(20,15, 8, 2); eine größere 8 zu zeichnen.
Ich persönlich hab beim Testen mir öfter mal einfach ein Rechteck mit: drawTo(5, 45); drawTo(65, 45); drawTo(65, 5); drawTo(5, 5); in Dauerschleife (bei arduino innerhalb der loop() ) laufen lassen, dabei den Lift-Servo abgestöpselt und manuell den Stift auf die Zeichenfläche malen lassen. Wenn die Linien gerade gezeichnet werden, sollte auch der Rest funktionieren. Auf der Thingiverse Seite haben schon manche das Problem gehabt, dass die Servos invertiert angesteuert werden mussten, kann sein das da dann auch die komplette Kalibrierung nichts bringt. dazu einfach in der set_XY Funktion servo2.writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) + SERVOLEFTNULL)); in servo2.writeMicroseconds(3000-floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) + SERVOLEFTNULL)); abändern, das gleiche bei servo3 etwas später im code
joo schrieb: > Ich persönlich hab beim Testen mir öfter mal einfach ein Rechteck > mit: hab das auch mal so ausprobiert wie beschreiben und den den code genauso verändert jedoch bekomme ich immer nur ein halbes ordentliches viereck raus. der untere Teil sieht nicht geradlinig aus:(
hmm, kanns sein, dass deine Arm-Gelenke bei spitzen Winkeln schwergängig sind? Hatte bei meinen Tests auch links, oben, rechts schön gerade Linien und unten auf einmal iwas halbkreismäßiges. Lag bei mir entweder daran, dass die Servos am Anschlag waren, oder schlicht die Gelenke zu schwärgängig für meine schwachbrüstigen Servos waren.
joo schrieb: > servo2.writeMicroseconds(3000-floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) > + SERVOLEFTNULL)); Ich habe nur diesen code in dem programm geändert und in der calibration die koordinaten eines Rechecks angegeben aber bekomme kein vernünftiges recheck raus. Hab die Servos so leicht wie möglich angeschraubt
hm, ist schwierig ohne bilder/videos die Situation einzuschätzen. Kurze Erklärung zu: servo2.writeMicroseconds(3000-floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) + SERVOLEFTNULL)) Die Servosignale sind Pulssignale mit einer Pulszeit von 500-2500 µs wobei 500 µs = Anschlag rechts, 2500 µs = Anschlag links entspricht. In den meisten online-resourcen werden 1000-2000 µs angegeben, das entspricht jedoch nur einen Winkel von 90°, die meisten können 180°. Zieht man den normal gebildeten Pulswert von 3000 ab, so erhält man den Wert für "invertierte" servos, da leider nicht alle Servos in die gleiche Richtung drehen. a2 und a1 entsprechen den Winkeln in diesem Bild: http://wiki.fablab-nuernberg.de/w/Datei:erklaerung.jpg Abzüglich Pi, Multipliziert mit einem Kalibrierfaktor und addiertem Null-Offset ergibt das ganze den gewünschten Servo-Winkel. Ich würde an deiner Stelle evlt. in der Hauptschleife nur diese eine servo2-Funktion kopieren und anstatt (a2 + a1 - M_PI) ne Laufvariable setzten (radian!) und schauen wie sich über den gesamten Winkelbereich der Servo verhält.
> Ich würde an deiner Stelle evlt. in der Hauptschleife nur diese eine > servo2-Funktion kopieren und anstatt (a2 + a1 - M_PI) ne Laufvariable > setzten (radian!) und schauen wie sich über den gesamten Winkelbereich > der Servo verhält. wie setzte ich da ne laufvariable den da ein? ich kenne nur eine for schleife als laufvariable?
Beispiel: #define STEP 0.001 float winkel = 0; char richtung = 1; im loop: if (richtung) { winkel += STEP; if (winkel > M_PI) { richtung = 0; } } else { winkel -= STEP; if (winkel < 0) { richtung = 1; } } servo2.writeMicroseconds(3000-floor(((winkel) * SERVOFAKTORLEFT) + SERVOLEFTNULL));
danke :) aber hat wenig mir gebracht:( wenn ich die schleife in der setxy funktion mit einbinde dann macht der motor gar nichts sondern steht nur da und brummt vor sich hin. Leider funktionert nicht dass sich der Servo hin und her bewegt. Wenn ich z.B eine gerade Linie zeichen möchte z.B drawTo(50, 1; drawTo(50, 10); dann kommt eher was bogenförmiges raus anstatt eine gerade Linie. Und so funktionert es auch mit dem Viereck. Was machen den eig diese Variablen? volatile double lastX = 75; volatile double lastY = 47.5; Mir ist da gerade durch den Sinn gekommen dass wenn die nicht mit meiner Plotclock stimmenn er vll wohlmöglich die Punkte woanders setzt als er sie eig setzen sollte. Ich bin mir da nicht sicher und stelle deswegen vielleicht waage vermutungen auf. Auch weiss ich bis jetzt überhaupt noch nicht ob er die Zahlen auch richtig schreibt. Ich weiss auch nicht wie ich dies am besten überprüfen sollte . Hätte mal jemand eine beste Anleitung wie ich an sowas am besten ran gehen sollte könnte. Hat es schon bei jemanden geklappt der ein ähnliches problem wie ich hatte?
Adrian schrieb: > Ich bin mir da nicht sicher und stelle deswegen vielleicht waage > vermutungen auf. Und das ist eigentlich auch das Hauptproblem. Du gehst nicht systematisch an die Sache ran sondern hoffst dich irgendwie und ohne Kentniss der dahinterliegenden Mathematik (Trigonometrie) durchmogeln zu können. Und das funktioniert nun mal eben nicht. > Hätte mal jemand eine beste Anleitung wie ich an sowas am besten ran > gehen sollte könnte. Hat es schon bei jemanden geklappt der ein > ähnliches problem wie ich hatte? Leg die Plotclock erst mal beiseite und beschäftige dich damit, wie Servos angesteuert werden. Das ist dein erstes Ziel. Du musst vestehen, wie das eigentlich funktioniert - das ist unabhängig von der Plotclock. Die Plotclock fügt da dann näcmlich noch einen Teil Trigonometrie dazu, so dass das alles komplizierter wird. Daher: Plotclock erst mal weglassen (Mechanik von den Servos abbauen) und die Servos für sich alleine in den Griff kriegen. Erst dann macht es Sinn, sich die mathematischen Grundlagen anzusehen, wie man die Winkel bestimmt, die die Servos anzufahren haben, damit die Bleistiftspitze auf der Zeichenfläche eine ganz bestimmte Position einnimmt. Aber das kommt später, erst mal müssen die beiden Servos unabhängig voneinander genau die Winkel anfahren können, die du für sie ausrechnest. Und das kontrollierst du am besten, indem du dich nicht auf die Scheren-Mechanik konzentrierst, sondern dich nur um die Servos selber kümmerst. Wenn du dich nicht darauf konzetrieren kannst, dann musst du halt diese Teile erst mal abbauen und dir eine einfachere Mechanik machen, auf die du dich konzentieren kannst ohne ständig abgelenkt zu werden. Ein paar simple Zeiger auf den Servo-Achsen, die dir einfach nur eine Richtung anzeigen, und die du zb mit einem Winkelmesser gegenüber der Basislinie kontrollierst, wirken da Wunder. Servo 1 auf 45° fahren lassen und kontrollieren, ob es das auch wirklich tut. Auch mit anderen Winkeln kontrollieren. Dann dasselbe Spiel mit dem anderen Servo. Sind die beiden Drehrichtungen identisch und so wie sie (laut Formel sein müssten). Sind die 0-Punktlagen dort wo sie sein sollten oder sind die Servohebel verdreht aufgesetzt? etc. etc. Alle Tests, die dir einfallen und die mit Servos alleine sinnvoll sind, ehe sie dann im Konzert miteinander spielen müssen. Wenn ein komplexer Mechanismus nicht auf Anhieb funktioniert, dann ist es sinnlos den Mechanismus anzustarren. Der Weg, wie man solche Dinge löst, besteht darin, dass man Komplexität rausnimmt, indem man eben nicht den ganzen Mechanismus auf einmal betrachtet, sondern an einem Ende mit der simpelst möglichen Situation anfängt und dann sukzessive Komplexität ergänzt bis man erkennt, wo das Problem entsteht und wie man es lösen kann.
:
Bearbeitet durch User
Naja, bei dem Plotclock Projekt war das Hauptziel, dass es schnell genug funktioniert, aber viel Potential für Verbesserung und Erweiterung behält. YouTube nach zu urteilen (nach Plotclock gesucht), hat das wohl so auch grob geklappt. Mit etwas funktionierenden anzufangenund und dann Stück für Stück abzuändern und so die Auswirkungen zu erleben ist oft wesentlich effektiver als von 0 zu versuchen sich mit etwas zu beschäftigen, bei dem man dann ewig sich mit trivialen Fehlern rumschlägt. Für Adrian: Versuche bitte den Plotclock Code so unverändert wie möglich nach Anleitung zum laufen zu bekommen. Wenns dann immernoch nicht klappt dann mach bitte ein Video im Kalibrations-Modus und im normalen Betrieb, anders wird man schwer helfen können.
joo schrieb: > für Stück abzuändern und so die Auswirkungen zu erleben ist oft > wesentlich effektiver als von 0 zu versuchen sich mit etwas zu > beschäftigen, bei dem man dann ewig sich mit trivialen Fehlern > rumschlägt. ahm, Ja genau. Ich sehs, wie das klappt. Nach fast einem Monat hat er seine Probleme immer noch nicht gelöst. Das Problem ist nicht, dass das so schwierig ist. Dsa Problem ist, dass diese Leute nie simple Fehlersuch und Behebungsstrategien lernen. Das wäre eigentlich die Hauptlektion aus dem (seinem) Disaster, das ihm auch in Zukunft noch zu statten kommt: Wie kann ich rausfinden, was da wirklich abgeht? In der Programmierung, besser gesagt 'gerade in der Programmierung', ist das eine ungemein wichtige Fähigkeit.
:
Bearbeitet durch User
Ist ja nicht so als würde ich gar nichts machen! Im Übrigen funktioniert es jetzt alles wie ich es haben möchte. Er schreibt vernünftig die Zahlen auf dem Tisch. Jedoch stört mich eine Sach gewaltig und zwar möchte ich dass die Zahlen gleich groß und in einer Zeile geschrieben werden. Er schreibt die unterschiedlich groß und nicht auf gleicher ebene. Auch sieht man den Doppelpunkt nicht so richtig. Beim zweiten Punkt des Doppelpunktes überschreibt er dies. Kann ich dies mit der number(48, 25, (minute() - i * 10), 0.9); wobei 48 die x-achse ist und 25 die größe der schrift? Ist dies richtig?
Karl Heinz schrieb: > Das Problem ist nicht, dass das so schwierig ist. Dsa Problem ist, dass > diese Leute nie simple Fehlersuch und Behebungsstrategien lernen. Das > wäre eigentlich die Hauptlektion aus dem (seinem) Disaster, das ihm auch > in Zukunft noch zu statten kommt: Wie kann ich rausfinden, was da > wirklich abgeht? Klar, aber speziell wenn man anfängt zu lernen ist es äußerst schwierig sich überhaupt zurechtzufinden. Strategien zur Fehlerbehebung entwickeln sich zwangsweise wenn man irgendwann eigene Sachen entwickelt, in diesem Fall gings ja ehr darum ein bestehendes dokumentiertes Projekt überhaupt zum laufen zu bekommen. Adrian schrieb: > wobei 48 die x-achse ist und 25 die größe der schrift? > Ist dies richtig? siehe Code:
1 | // Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
|
2 | void number(float bx, float by, int num, float scale) |
Alles weitere liegt jetzt an dir :)
Mach doch mal ein Bild von deinen jetzigen Ziffern, damit lässt sich vielleicht etwas leichter beurteilen, was noch zu verbessern wäre.
Hier so sieht das gerade aus. Leider bin ich noch sehr unzufrieden. Den Doppelpunkt macht er noch nicht richtig und die Zahlen sind etwas schief
Es gibt nur 4 Möglichkeiten * entweder sind deine geometrischen Werte für die Arme falsch * oder in der inversen Kinematik ist noch ein Fehler (hab die Mathe noch nicht kontrolliert * oder deine Servo Werte für die Umrechnung Winkel zu Pulslänge bzw. die 0-Punktsverschiebung der Winkel stimmt nicht. * oder es gibt noch irgendwo einen Programmfehler in der Art, dass irgendwo eine implizite Konvertierung double auf int statt findet, die nicht sein sollte. Punkt 1 und 3 sind Kalibrationssachen. Punkt 3 könnte man leicht aussschliessen, indem man sich da mal ein Testprogramm dafür macht, welches die Servos den Winkelbereich durchfahren lässt und sich am realen Objekt davon überzeugt, dass die geforderten Winkel auch tatsächlich erreicht und eingehalten werden. Hat man das überprüft, kann man Punkt 3 abhaken Punkt 1 ist eine reine Messache. Am realen Arm die Werte zwischen den Lagermittelpunkten nochmal nachmessen und kontrollieren ob die eingetragenen Werte wirklich damit übereinstimmen Punkt 2 ist eine Sache, die mit der im verlinkten Artikel angegebenen Zeichnung kontrolliert werden müsste. Stimmt die Herleitung der Formeln? Wahrscheinlich wird sie stimmen, sonst würde es beim Autor auch nicht funktionieren (obwohl: in einem seiner Videos sehen die gemalten Zeichen auch etwas seltsam verzerrt aus. Die Mathe würde ich daher noch mal durchgehen, der traue ich erst mal nicht) Nachdem Punkt 2 kontrolliert worden ist, würde ich mich auch mal auf das Programm und da speziell auf die Funktion SetXY stürzen und nachsehen, ob die hergeleitete Mathematik auch korrekt umgesetzt wurde. Spezielles Augenmerk auf mögliche implizite Konvertierungen. Und dann würde ich zum Testen auch keine Buchstaben malen lassen, sondern die Plotclock kriegt POsitionen, die sie mittels SetXY anzufahren hat und dann messe ich mir am Zeichentisch aus, ob der Stift auch tatsächlich dort gelandet ist, wo er hin muss. Wenn ich vorher die Servos kontrolliert habe UND die geometrischen Dimensionen korrekt sind, dann kann eine Abweichung davon nur in einer fehlerhaften Herleitung der Mathematik begründet werden. D.h. Ich nehm mir einen dieser fehlerhaft angefahreren Punkte her und mach mal händisch die ganze Mathematik bzw. kontrolliere mittels Zeichnung ob das Ergebnis stimmen kann (igitt, igitt da muss man ja Papier, Bleistift, Zirkel und Winkelmesser verwenden! Keine Angst, alternativ geht auch ein CAD wenn man damit umgehen kann). Als Ergebnis davon ergeben sich auf meinem Papier Winkel, die die Servos realisieren müssen. Dabei gibt es jetzt 2 Fragestellungen: Kriegt das Programm dieselben Winkel raus wie ich und zweitens: stehen die Servos auch tatsächlich auf diesen Winkeln. So würde ich die Sache angehen. Und dann ist das Problem in einem Nachmittag, längstens zwei, gefixt und nicht nach einem Monat noch immer ungelöst. Aber solange ich den Plotarm mittels SetXY auf eine Koordinate schicke und der Stift trifft diesen Punkt nicht, solange brauch ich gar nicht erst mit darauf aufbauenden Funktionen wie Buchstaben malen anfangen. Ein Plotter, der innerhalb seiner Zeichenfläche eine angegebene kartesische Koordinate nicht trifft, ist nichts wert. Das können auch darauf aufbauende Softwareschichten nicht mehr ausgleichen. Dieser Teil (SetXY) muss innerhalb der kompletten Zeichenfläche korrekt arbeiten. Das kann man testen und wenn das Ergebnis nicht zufriedenstellend ist, dann muss man eben den Fehler suchen. Siehe vorhergehende Überlegungen.
:
Bearbeitet durch User
Karl Heinz schrieb: > Punkt 1 und 3 sind Kalibrationssachen. Punkt 3 könnte man leicht > aussschliessen, indem man sich da mal ein Testprogramm dafür macht, > welches die Servos den Winkelbereich durchfahren lässt und sich am > realen Objekt davon überzeugt, dass die geforderten Winkel auch > tatsächlich erreicht und eingehalten werden. Hat man das überprüft, kann > man Punkt 3 abhaken Und wenn ich mir die Bilder vom 11.05.2014 00:33 so ansehe, dann ist da von rechten Winkeln nicht viel zu sehen, selbst dann wenn ich einen gewissen optischen Versatz durch die unvermeidliche perspektivische Verzerrung auf Photos berücksichtige. Wenn die Kalibration so erfolgen muss, dass der Hebelarm senkrecht zur Servoachse wegstehen soll, dann muss der auch senkrecht wegstehen. Und zwar nicht ungefähr oder nahe drann, sondern so genau wie möglich. Das der Winkel des linken Servos in 080b6f53.xl.jpg keine 90 Grad sind, bzw. im anderen Bild das rechte Servo mehr als 90° gefahren ist, das kann ich von hier sehen ohne vor Ort zu sein.
:
Bearbeitet durch User
Eine sehr schöne Anleitung an der ich mich sehr gut orientieren kann. Leider kann ich Punkt 3 nicht überprüfen ich weiss nicht genau wo ich das testprogramm schreiben soll. Alles in der Calibration? Hab versucht ein Testprogramm zuschreiben wo ich überprüfen möchte ob auch die Winkel der servos eingehalten werden. Jedoch wenn ich das Programm laufen lasse bleiben nur die Arme gestreckt und mehr kommmt da auch nicht. Hier mein testprogramm: #define STEP 0.001 float winkel = 0; char richtung = 1; if (richtung) { winkel += STEP; if (winkel > M_PI) { richtung = 0; } } else { winkel -= STEP; if (winkel < 0) { richtung = 1; } } servo2.writeMicroseconds(floor(((winkel) * SERVOFAKTORLEFT) + SERVOLEFTNULL)); servo3.writeMicroseconds(floor(((winkel) * SERVOFAKTORLEFT+ SERVORIGHTNULL)) + SERVOLEFTNULL));
Adrian schrieb: > Eine sehr schöne Anleitung an der ich mich sehr gut orientieren kann. > Leider kann ich Punkt 3 nicht überprüfen ich weiss nicht genau wo ich > das testprogramm schreiben soll. Du kannst nicht schreiben?`
1 | void loop() |
2 | {
|
3 | double winkel1 = 90 * M_PI / 180.0; |
4 | double winkel2 = 0 * M_PI / 180.0; |
5 | |
6 | servo2.writeMicroseconds(floor(((winkel1) * SERVOFAKTORLEFT) + SERVOLEFTNULL)); |
7 | |
8 | servo3.writeMicroseconds(floor(((winkel2) * SERVOFAKTORRIGHT) + SERVORIGHTNULL)); |
9 | }
|
(mit dem Rest des Programmes so wie er ist) Dann muss das linke Servo auf 90° stehen und das rechte auf 0° Und dann tauscht du eben bei winkel1 bzw. winkel2 die Werte gegen andere aus. zb winkel1 auf 0 und winkel2 auf 90
1 | double winkel1 = 0 * M_PI / 180.0; |
2 | double winkel2 = 90 * M_PI / 180.0; |
und dann muss das andere Servo auf 90° stehen WEnn nicht: Die Werte in SERVOFAKTORLEFT, SERVOFAKTORRIGHT bzw. die entsprechenden Null-Punkts Werte verändern. Also: die FAKTOR Werte beeinflussen den Winkel der überstrichen wird. Die NULL Werte bestimmen, wo der gedachte 0 Winkel rund um das Servo ist. Wenn man nicht mit WInkelmesser an die Sache rangeht, dann ist das zugegebenermassen ein bischen eine Spielerei, aber machbar. Ohne Winkelmesser: Erst mal mit den NULL Werten die 0° Position der Hebel so ausrichten, dass die Hebel in der Flucht der Servo-Basislinie stehen. Danach auf 90° gehen und mit den FAKTOR Werten so einrichten, dass der jeweilige Hebel 90° zu dieser Basislinie steht. Noch mal die 0 Position kontrollieren, nochmal die jeweiligen 90° Positionen kontrollieren und dann ist die Kalibrierung der Winkel-Servo Konstanten erledigt und abgeschlossen. wo liegt da jetzt das genau Problem?
:
Bearbeitet durch User
Keine Ahnung, welcher Teufel mich da geritten hat. Hab den Code noch mal nachgebessert. Die Umrechnung eines WInkels von Grad auf Radianten ist natürlich
1 | Radiant = Grad * PI / 180 |
Und es wär wahrscheinlich nicht schlecht, wenn man die Mechanik soweit schützt (sprich abbaut), dass dir deine Hebelchen nicht zerstört werden, wenn die Drehrichtungen massiv falsch sind. Aber das ist nur so ein Gedanke.
:
Bearbeitet durch User
Adrian schrieb: > Hier mein testprogramm: Selbst wenn es laufen würde: was willst du damit? Wie misst du denn mit einem Geodreieck (oder einem anderen rechten Winkel), ob die Arme 90° vom Servo abstehen, wenn sich die Arme dauernd bewegen?
:
Bearbeitet durch User
Bzgl. Mathe Den ersten Teil der Berechnung für das linke Servo kann ich nachvollziehen. Den zweiten Teil noch nicht ganz. Liegt aber daran, dass ich noch keine Zeichnung gemacht habe um zu sehen, welche Winkel da eigentlich voneinander abgezogen werden und ob das mit rechten Dingen zugeht. Es sieht aber nicht unplausibel aus. Wenn ich Lust und Laune habe, schreib ich heute mal ein Testprogramm, welches die Mathe überprüft, indem sie die Vorwärtskinematik mittels Vektoren simuliert und nachsieht, ob die ermittelten Winkel der inversen Kinematik aus einer vorgegebenen Position auch tatsächlich diese Position ergeben. Das wäre auch nicht ganz uninteressant, da man so ermitteln könnte, wie sich ein Positionierfehler der Servos auf die erzielte Genauigkeit in den Koordinaten auf der Zeichenfläche auswirkt und wie sich die verändert, je nachdem wo man auf der Zeichenfläche arbeitet.
:
Bearbeitet durch User
Karl Heinz schrieb: > Erst mal mit den NULL Werten die 0° Position der Hebel so ausrichten, > dass die Hebel in der Flucht der Servo-Basislinie stehen. Danach auf 90° > gehen und mit den FAKTOR Werten so einrichten, dass der jeweilige Hebel > 90° zu dieser Basislinie steht. Noch mal die 0 Position kontrollieren, > nochmal die jeweiligen 90° Positionen kontrollieren und dann ist die > Kalibrierung der Winkel-Servo Konstanten erledigt und abgeschlossen. > Wenn die 0 bzw. 90° Positionen dann mittels Kalbrierwerte stimmen, kann man natürlich auch mal zur eigenen Erbauung 45° bzw. 60° bzw. 30° einstellen und mit einem Zeichendreieck kontrollieren, ob das auch stimmt. Notwendig sollte es eigentlich nicht sein, aber es macht auch ein wenig Spass, ist schnell gemacht und verschafft einem eine gewisse Beruhigung, dass auch wirklich winkelmässig erst mal alles in Ordnung ist.
:
Bearbeitet durch User
Karl Heinz schrieb: > Und es wär wahrscheinlich nicht schlecht, wenn man die Mechanik soweit > schützt (sprich abbaut), dass dir deine Hebelchen nicht zerstört werden, > wenn die Drehrichtungen massiv falsch sind. > Aber das ist nur so ein Gedanke. Wenn die Richtungen massiv falsch sind: denk dran. Anstatt 0° könnten es auch 180° sein, bzw. anstelle von +90° auch -90°. Ich hab mir im Code jetzt nicht angesehen, wo da die 0° anfangen und ob es nicht eigentlich 180° sein müssten bzw. ob die Winkel im mathematisch positiven Sinn gerechnet werden. Wenn ein derartiger 'Vorzeichenfehler' vorliegt, dann kann es dir im schlimmsten Fall die Hebelchen um die Servos rumnudeln. Also Vorsicht und beim Einschalten sofort zur Stelle sein und abschalten, wenn das Servo in die falsche Richtung zu drehen anfängt.
Vielen lieben Dank für die großartigen Infos, die hätte ich früher brauchen können dann wäre ich jetzt viel weiter. Soweit funktionert das Testprogramm. Stelle ich den winkel1 auf 0 grad und den winkel2 auf 90 grad so erhalte ich das der linke servo auf 90 grad steht und der recht natürlich auf 0. Vertausche ich die Winkelwerten so steht aaber nicht das andere servo auf 90 grad ausser ich ändere was an den Null-Punkt Werten. Weiter bin ich heute nicht gekommen. Mit der Servorechnung werde ich mich dann morgen beschäftigen. Falls du neue Erkenntnisse daraus gewonnen hast lass mich es wissen. Ein paar Worte dazu: >Wenn die Richtungen massiv falsch sind: denk dran. >Anstatt 0° könnten es auch 180° sein, bzw. anstelle von +90° auch -90°. >Ich hab mir im Code jetzt nicht angesehen, wo da die 0° anfangen und ob >es nicht eigentlich 180° sein müssten bzw. ob die Winkel im mathematisch >positiven Sinn gerechnet werden. >Wenn ein derartiger 'Vorzeichenfehler' vorliegt, dann kann es dir im >schlimmsten Fall die Hebelchen um die Servos rumnudeln. Also Vorsicht >und beim Einschalten sofort zur Stelle sein und abschalten, wenn das >Servo in die falsche Richtung zu drehen anfängt. Bis jetzt hatte ich das Phänomen gehabt dass ich die Servos überdreht haben das auch die Heblechen darunter leiden mussten.
Adrian schrieb: > Vielen lieben Dank für die großartigen Infos, die hätte ich früher > brauchen können dann wäre ich jetzt viel weiter. Soweit funktionert das > Testprogramm. Stelle ich den winkel1 auf 0 grad und den winkel2 auf 90 > grad so erhalte ich das der linke servo auf 90 grad steht und der recht > natürlich auf 0. Vertausche ich die Winkelwerten so steht aaber nicht > das andere servo auf 90 grad ausser ich ändere was an den Null-Punkt > Werten. An den Faktoren. Mit den NULL Werten stellst du die 0 Achse ein. Mit den FAKTOR Werten wie weit das Servo dreht. Sorry. Aber noch einfacher kann ich das nicht ausdrücken. Und ja. Das bedeutet ein bischen probieren, bis die Werte stimmen.
Adrian schrieb: > Weiter bin ich heute nicht gekommen. Mit der Servorechnung werde ich > mich dann morgen beschäftigen. Falls du neue Erkenntnisse daraus > gewonnen hast lass mich es wissen. Ein erster schneller CHeck zeigt: Die Mathematik scheint falsch zu sein. setze ich bei den Geometrie-Werten
1 | #define L1 35
|
2 | #define L2 55.1
|
3 | #define L3 13.2
|
4 | |
5 | // origin points of left and right servo
|
6 | #define O1X 22
|
7 | #define O1Y -25
|
8 | #define O2X 47
|
9 | #define O2Y -25
|
den in der Kalibrierung angegebenen Punkt
1 | -3.0, 29.2 |
ein, dann errechnet der Originalcode die Servo-Winkel
1 | links: -0.0246° |
2 | rechts: 95.16° |
ok, die -0.0246° kann ich noch als 0 durchgehen lassen. Aber ~95° sind auch angenähert kein rechter Winkel. D.h. die Kalibrierposition taugt schon mal nichts. Und mit der anderen angegebenen Kalbrierposition sieht es nicht besser aus. Rechne ich aber mit den angegebenen Winkeln vorwärts die Position der Stiftspitze aus, dann erhalte ich die Koordinaten
1 | -14.07, 41.28 |
und das ist von der Originalposition von der weggerechnet wurde (-3.0, 29.2) weit entfernt. Erst konnte ich das gar nicht glauben, dass das rechnerisch so weit weg ist, ein paar Hunderstel hätte ich ja noch akzeptiert (wegen der Winkelfunktionen), also hab ich es mit einem CAD überprüft. Eine schnelle CAD Konstruktion mit den Armlängen 35, 55.1, 13.2 (und dem Winkel zwischen dem 2.ten Arm und dem Stift-Ausleger von 35.6°) bestätigte aber die Koordinaten, so dass ich recht zuversichtlich bin, dass meine Vorwärtsrechnerei stimmt. Hier noch die Daten für die beiden Kalbierpunkte. Die erste Zeile ist jeweils der Punkt selber, die jeweils 2.te Zeile sind die Winkel, die das Programm errechnet, und die 3.te Zeile sind die Koordinaten des Stiftes aus den Winkeln zurückgerechnet. 1.te und 3.te Zeile sollten eigentlich übereinstimmen.
1 | -3.000000 29.200000 |
2 | -0.000430 (-0.024618) - 1.660992 (95.167816) |
3 | -14.072315 41.288370 |
4 | |
5 | 74.100000 28.000000 |
6 | -1.571455 (-90.037718) - 0.093301 (5.345750) |
7 | 78.963920 43.926982 |
(Ja, ich habe berücksichtig, dass die Servos um 180° verdreht eingebaut sind, und daher unterschiedliche 0 Richtungen haben. Wie es zu der riesigen Diskrepanz in Y Richtung kommt, ist mir noch unerklärlich. Hat denn der Originalautor in der Realität, sozusagen am lebenden Objekt nie mal nachgemessen?) Ich kontrolliere noch mal alles. Wenn sich das bestätigt, dann ist es kein Wunder, dass du keinen einzigen gerade Strich hinkriegst.
:
Bearbeitet durch User
Das hatte ich mir zu anfangs auch gedacht doch der gedanke darum ist schnell verflogen gewesen weil ich mich eher mit der winkelrechnungen den Kopf zerbrochen habe. Danke für diesen Typ werde mal die Werte ausprobieren und schauen ob ich diesmal einen geraden Strich hinbekomme. Sorry dass ich mich jetzt melde aber im mom strikt unser Internet und wir bekommen nun eine ganz neue Box von 1 und 1, deswegen hat das mit dem Schreiben auch immer was gedauert :D
Adrian schrieb: > Das hatte ich mir zu anfangs auch gedacht doch der gedanke darum ist > schnell verflogen gewesen weil ich mich eher mit der winkelrechnungen > den Kopf zerbrochen habe. > Danke für diesen Typ werde mal die Werte ausprobieren und schauen ob ich > diesmal einen geraden Strich hinbekomme. Vergiss das bitte. Ich bin gestern die Mathe noch mal durchgegangen und hab festgestellt, dass ich mich bei der Interpretation von L2 vertan habe. Auch die 35.6° hab ich von der falschen Seite abgetragen. Das hat mich eine Weile gekostet, bis mir klar war, wie und warum er hier
1 | a2 = return_angle(L2, L1, c); |
2 | Hx = Tx + L3 * cos((a1 - a2 + 0.621) + M_PI); //36,5° |
3 | Hy = Ty + L3 * sin((a1 - a2 + 0.621) + M_PI); |
den Winkel von der Stiftspitze bis zum Verbindungspunkt der beiden Arme berechnet und wie sich die 35.6° (die 36.5 sind offenbar ein Tippfehler) in der Armgeometrie wiederfinden. D.h. meine Vorwärtsrechnung ist nicht korrekt. Ich habe mit einer anderen Geometrie gerechnet. Aus dem vorgegebenem Programm hab ich die Berechnung soweit für den linken Arm nachvollzogen. Die ist soweit ok und in allen Details nachvollziehbar. Nur der rechte Arm bereitet mir noch Kopfzerbrechen. Hier
1 | a2 = return_angle(L1, (L2 - L3), c); |
habe ich noch keine Begründung für L2-L3 gefunden. Messe ich im PDF die Armlängen nach, dann kommt da etwas anderes raus. D.h. ich muss meine Vorwärtskinematic erst mal überarbeiten. (Was natürlich nichts daran ändert, dass mit den gegebenen Referenzpunkten sich keine 0 bzw. 90° Winkel ergeben. Das ist von meiner fehlerhaften Dateninterpretation unberührt - ist ja schliesslich der Originalcode)
:
Bearbeitet durch User
Ich hab mal eine frage bezüglich der Berechnung mit den Gemeometrischen Werten. Mir ist es immer noch ein Rätsel wie du auf diese Werte gekommen bist: -3.000000 29.200000 -0.000430 (-0.024618) - 1.660992 (95.167816) -14.072315 41.288370 74.100000 28.000000 -1.571455 (-90.037718) - 0.093301 (5.345750) 78.963920 43.926982 Zeile 1 und 4 ist mir klar. Aber wieso muss zeile 1 gleich wie zeile 3 sein? und wie rechne ich die winkel aus der zweiten zeile aus die das programm ausrechnet? Ich weiss ich muss in der void set_XY funktion nachschauen da wird die eigentliche berechnung gemacht. Leider habe ich kein CAD sondern nur ein normalen taschenrechner ich versuche mir das gerade selber alles auf ein blattpapier aufzurechnen. Also scheint der Winkel von 36.5 Grad vom Stiftpunkt bis zu den beiden Verbindungspunken richtig zu sein jetzt oder nicht?
Hallo großes dank an Karl Heinz für die großartige Hilfe. Ich weiss gar nicht wie sehr dankbar ich für deine Tipps oftmals bin. Sie haben mir sehr geholfen. Alle Punkten bin ich habe ich nach einander abgehackt und das Ergebnis kann sich sehen. Nicht zu guter Letzt auch ein großer Dank an die andern. Nun kommm ich zum wesentlichen meines Eintrages. Ich fasse mal alle neuen Änderungen unter dem Punkt Update zusammen. Update: 1. Die Geometrie-Werten sind falsch, deswegen wurden diese geändert Die Armlängen sind alle richtig nur die origin points (orginal Punkte ich weiss nicht ob das so richtig übersetzt ist) der Servos müssen geändert werden bzw angepasst werden. 2. Die Pulslänge der Servos habe ich geändert also musste ich jedenfalls in meienr Plotclock ändern. 3. Die Umrechnung für die Zahlen musste ich verändern z.b musste ich einzelen Werte in der Funktion so anpassen dass eine halbwegs schöne Zahl auf dem Tisch gezeichnet wird siehe unten case 4: drawTo(bx + 10 * scale, by + 0 * scale); // Startet mit diesem Punkt lift(0); drawTo(bx + 10 * scale, by + 20 * scale); // Strich nach oben zeichnen drawTo(bx + 2 * scale, by + 6 * scale); // bogen der Vier zeichnen drawTo(bx + 12 * scale, by + 6 * scale); // Endpunkt der Vier lift(1); Dies fand ich das schwierigste an dem Projekt erstmal das heruaus zufinden welche funktion was macht. Anders als bei den ganzen Videos im Netz schreibt meine Plotclock spiegelverkehrt. Wäre einfach die Servos zur anderen Seite verdrehen die beste Alternative oder kann man im Programm verändern solange dies kein großer aufwand wäre?
Hallo ihr lieben, ich habe noch einige Verbesserungen an mein Projekt gemacht und möchte es jetzt als komplettes vollstängies Projekt hier freigeben für diejenigen die auch Probleme mit dem Projekt hatten. Über Tipps oder Kritik bin weiterhin sehr dankbar. Zusätlich habe ich noch die Realtimeclock mit eingebunden damit er immer die aktuelle Zeit aufschreibt. Dazu finden sich viele gute Seiten im Internet wie man den RTC richtig anschließt und konfiguriert. Ich persönlich empfehle lieber hier nachzuschauen: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html Hier wird alles kurz und knapp auf dem Punkt gebracht und wenn man alle Schritte befolgt, wirds auch dann funktionieren. Beim Programmieren des unten verwendetem Test-code führt zu einem Fehler, da er noch keine Uhrzeit aus der Realtimeclock lesen kann. Kein Wunder sie ist ja auch gar nicht initialisiert wurden. Aber hab auch ein kleines Testprogramm gefunden einfach ab spielen lassen, einstellen und es kann mit der Plotclock losgehen. Link: http://www.instructables.com/id/LED-Dawn-Sunrise-Alarm-Clock-Nightlight-Secur/step6/Module1-ArduinoRTC-Test-Code/ Letzlich funktioniert das Schreiben und Wischen der Uhr wunderbar mit einigen kleinen Macken!!!(bei denen ich leider keinen Rat mehr habe), nämlich sie schreibt momentan nur spiegelverkehrt.(siehe Bilder die ich in vorherigen Post hochgeladen habe.) Aber ich denke mal das sollte jetzt nicht das große Problem sein. Falls ja müsste man in der Mainloop die Positionierung der number()-Funktionen ändern und in der Zeichenfunktion die Zahlen einmal um 180°drehen. PS: Habe größtenteils alles mit kleinen Kommentaren zum besseren Verständnis beschrieben Bis dann:)
Adrian schrieb: > Aber hab auch ein kleines Testprogramm gefunden einfach ab spielen > lassen, einstellen und es kann mit der Plotclock losgehen. > > Link: > http://www.instructables.com/id/LED-Dawn-Sunrise-Alarm-Clock-Nightlight-Secur/step6/Module1-ArduinoRTC-Test-Code/ Hallo Zusammen, scheinbar bin ich zu doof, aber ich verstehe es nicht. Was muss ich da machen ? Ja, ich Neuling in der ganzen Geschichte aber nach vielem lesen und probieren komme ich irgendwie nicht weiter. MFG Jürgen
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.