Archiv verlassen und diese Seite im Standarddesign anzeigen : Mechanikanfänger braucht Tipps für den Einstieg am Bsp. Arm
thewulf00
19.11.2007, 09:53
Guten Morgen meine Modellbaufreunde,
im Roboterbereich gibt es ja drei grundlegende Bereiche, die man tangiert:
- Elektronik
- Software
- Mechanik
Nun sind die ersten beiden Kategorien für mich kein (größeres) Problem. Aber im Bereich Mechanik bin ich absoluter Anfänger und sehr ungeübt. Es ist nicht so, dass ich zwei linke Hände habe, aber ich habe keine Übung oder Erfahrung.
Da ich eher in Richtung Roboterarm tendiere, denke ich schon lange darüber nach, wie man da anfangen könnte. Ich habe auch im Studium einige Modelle in der Praxis gesehen und ein wenig Theorie kenne ich ebenfalls. Aber ich habe keinen Draht dazu.
Daher meine Bitte:
Gebt mir doch bitte Tipps oder Empfehlungen für mechanische Teile, die ich verwenden könnte. Dabei denke ich an:
- Motoren (Schrittmotoren, Servos, kräftige Motoren, Motoren mit eingebautem Getriebe, ...)
- Getriebe (Räder, Übersetzungen, Halterungen, ...)
- Chassi-Teile (Getriebeaufhängung, Befestigungen, Rahmen, ...)
- Zusammenpassende Systeme (nicht unbedingt Lego, Fischertechnik usw., aber auch nicht allgemeiner Kram, der dann doch nicht passt)
Mir gehts nicht darum, eine Lösung für einen Roboterarm zu finden, sondern einen Einstieg in die Mechanik für private Roboterbastler. Ich habe mir eine Weile die Shops angeguckt und da gibts tausende Teile. Welche passen da? Welche sind nötig, welche Luxus? Da bin ich einfach überfordert.
Ich habe auch schon versucht, ein paar Modelle aus einem Metallbaukasten zu zaubern, aber da ist es nur schwer, Fremdkomponenten zu integrieren, und schon die erste Achse (die unterste) macht einen Riesenlärm und ist total ungenau usw.
Viele Grüße,
Wulfi
PS: Am attraktivsten finde ich Schienenmechanik, bspw. die von Manf von 2005, die einfach mit einer Getriebestange verschoben werden. Aber da habe ich gesehen, ist Metall (Kupfer) selbst gebohrt und verlötet. Das ist für mich zu viel Aufwand, da dann hinterher nix passt :-)
Kommt ja immer drauf an, wie groß der Arm werden soll.
Mein Roboter-Arm hat auch noch einige Kinderkrankheiten, da ich einfach drauf los gebaut habe, aber vielleicht sind da ja doch noch ein paar Anregungen für dich drinne.
Zu finden ist das Ding hier: http://avr.shellpit.de/arm.htm
Leider grad nur ein Bild und ein altes Video online. Muss ich mal aktualisieren.
Der Arm selber ist aus Hartpapier. Das lässt sich ganz gut mit der Laubsäge aussägen und ist relativ stabil. Gibts bei Conrad komischerweise zu halbwegs bezahlbaren Preisen.
Dort rein hab ich dann 32N (4Euro p. Stk) Servos geschraubt. Die reichen auf alle Fälle dicke um den Arm zu bewegen. Als Gegenlager hab ich auf der Servoachse hinten immer noch eine Schraube reingedreht.
Der Arm an sich ist ziemlich stabil. Lediglich die Hauptachse ist etwas unglücklich geraten. Den ganzen Arm hab ich einfach auf ein Servohorn geschraubt, was eine ziemlich wacklige Angelegenheit ist.
Das Ganze kostet inkl. Hartpapier, Servos und Gewindestangen vielleicht 30 Euro und hält sich zum ausprobieren somit in einem vertretbaren Rahmen.
Zum ansteuern nehm ich einen Mega16, der reicht für 5 Servos, Display, RS232 und 4x4 Folientastatur.
Gesteuert wird momentan über ein C# Programm. Bewegugn vormachen, abspeichern und wieder abspielen.
Der Gripper (Bild kann ich nachreichen) besteht aus 4mm Plastik, 1 Servo und zwei aufgeschraubten Zahnrädern (conrad Zahnrad-Set) und lässt sich bis etwa 6cm öffnen.
Die Ausladung des Arms ist etwa 30cm (dann fällt er jedoch um, weil die Basis zu klein ist ;) )
Summa summarum mein Tip für den kleinen Geldbeutel und zum ersten ausprobieren:
Hartpapier/Platinenmaterial
paar Gewindestangen, Muttern, Schrauben
Conrad Standard-Servos (http://www.conrad.de/goto.php?artikel=233751)
Zannrad-Set (http://www.conrad.de/goto.php?artikel=297704)
Aber ich denke, du willst das etwas professioneller aufziehen...
thewulf00
19.11.2007, 12:56
Vielen Dank für Deine Antwort! Die Größe des Arms ist mit Deiner vergleichbar. Vielleicht ein wenig größer, vielleicht ein wenig kleiner.
Professioneller? Nene, als ersten Test würde mir ein 1:1-Nachbau Deines Modells völlig reichen. Ich möchte einiges lernen und an Erfahrung, vor allem für den Bezug von Teilen, sammeln.
Ich hab mir Dein Bild mal angeschaut. Das ist professionell genug für mich. Man muss also im Endeffekt für den Zusammenhalt der einzelnen Wände/Stangen und Motoren eigene, sehr kreative Ideen suchen. Das ist ja auch anfangs mein Problem.
Wie würdest Du in Deinem Modell ein Schiebesystem realisieren. Mit Zahnstangen und Ritzeln oder mit einer Gewindestange und einer am Schlitten befestigten Mutter?
Der Gripper würde mich auch arg interessieren!
Vielleicht klärst Du mich mal noch über die Nachteile Deiner Konstruktion auf. Zuwenig Robusheit? Zuwenig Kraft? (Außer dass er umkippen würde)
Aktualisiere doch einfach mal Deine Seite und gib mir dann bescheid.
Weitere Probleme bereiten mir Motoren. Ich weiß nie, wie stark oder schwach sie eigentlich sind. Also hab ich mal zwei stärkere bestellt. Das Resultat war, dass sie ne irre Geschwindigkeit drauf hatten. (15.000 U/min) :-)
Diese Servos, die Du nutzt: Ich nehme an, die sind nicht "gehackt", kommen also nur in einem nicht ganz gefüllten Kreis umher? Sind sie arg stark? Da ist ja ein Getriebe mit drin, wie schnell ist das dann? Mit welcher Spannung arbeiten die bzw. nutzt Du sie?
Vielen Dank für die Blumen :)
Die Geschwindigkeit der Servos kann man denk ich ganz gut in dem Video auf der Seite sehen, wenn er von A nach B fährt. (Link (http://avr.shellpit.de/video/servotest01.avi))
Das Geruckel der ganzen Konstruktion kommt daher, dass ich die Servos dort mittels Terminal in 5 Grad Schritten bewege und nicht so schnell tippe :)
Die Servos sind ungehackt und laufen per 7805 Spannungsregler mit 5V.
Den Gripper fotografier ich nachher mal, wenn ich zu Hause bin.
Was der Arm maximal für ein Gewicht heben kann, hab ich noch nicht ausprobiert.
Nachteile meiner Konstruktion sind:
Hauptachse direkt auf Servohorn - das ist zu wackelig. Eventuell dort eine Auflagefläche für den Arm einbauen oder ne ordentliche Achse und dann per Zahnrad drehen
Beim Gripper springen ganz gerne die Zahnräder raus, wenn zu viel Kraft aufgewendet wird. Aber dazu später, wenn Foto da
unterdimensionierte Basis
kein CAD-Programm - beim berechnen der Maße für den Gripper wär' das sehr praktisch gewesen. Aber hab mir dann nach 10 Jahren erstmals wieder 'ne Federmappe und Zirkel gekauft. Ging auch ;) Ansonsten hab ich in Paintshop gemalt, Pixel abgezählt und dpi umgerechnet
Ansonsten denke ich es ist am besten, man geht in den Baumarkt und besorgt sich dort: paar Gewindestangen+Alurohre in verschiedenen Stärken, 1-2 Aluprofile, Laubsäge+Bohrer(wenn noch nicht vorhanden) und bissl Sperrholz.
Beim Conrad: eine Hand voll Servos, Schrauben+Muttern in verschiedenen Größen und Hartpapier- und Plastikplatten.
Alle auftretenden Probleme konnte ich eigentlich bis jetzt immer mit diesen paar Grundmaterialien lösen. Braucht man für alles Mögliche immer wieder: Abstandshülsen, Motorhalterungen, provisorische Kühlkörper, Verbindungen aller Art,...
Was ein Schiebesystem ist, weiß ich leider nicht. Den Roboterarm mittels Linearantrieb entlang einer Achse verfahren?
Ich mach nachher noch paar Bilder.
PS.: Kauf dir keine Dekupiersäge und stell Sie ins Arbeitszimmer, wenn der Hausfrieden noch etwas länger anhalten soll ;)
thewulf00
19.11.2007, 13:39
Danke für die Beschreibung, das hilft mir sehr.
>Was ein Schiebesystem ist, weiß ich leider nicht. Den Roboterarm mittels Linearantrieb entlang einer Achse verfahren?
Genau das hab ich gemeint. Im Endeffekt Pneumatische Verschiebung, nur eben mit nem Motor :-)
Dazu noch ein paar Fragen:
- Was ist ein "Aluprofil"?
- Wofür nutzt Du denn die Abstandshülsen?
- Du sagtest was von Zahnrädern. Wo genau sind die verbaut?
- Was nutzt Du denn als Motorhalterungen?
- Du betreibst ALLE Servos mit EINEM 7805? Das geht? Mein 7805 schaltet sich ab, wenn ich einen Abstandssensor und 20 LEDs kopple.
- Was ist denn eine Dekupiersäge? Und warum ist sie so gefährlich? (Laut?)
- Wofür sind denn die Alurohre gut?
Das Gewichtsmaximum ist nicht so wichtig für mich. Der Gripper interessiert mich sehr. Und ich setzte für den Anfang lieber auf sehr langsame, aber dafür sehr stabile (nicht ruckelnde) und starke Bewegungen. Aber ich werd einfach die Conrad-Servos nehmen und gut. :-)
Du hast einfach einen Servo an Achse 1 befestigt und seinen "Servohorn" an die 2. Achse?
So, hab eben fix noch ein paar Bilder geknippst und ein kleines Video vom Gripper hochgeladen.
Die Gripperfunktionsweise hab ich mir bei Lynxmotion abgekupfert.
Hier kommen die Zahnräder ins Spiel und die 4mm Plasteplatte (Poly-irgendwas).
Plastik deshalb, da man das Zeug quasi mit 'nem heißen Fingernagel schneiden kann und somit fix nen Prototypen zusammengestückelt hat :)
Was Aluprofil und Abstandshülsen angeht, hab ich nur gemeint, dass es ratsam wäre sich einen Grundvorrat an Rohmaterial anzulegen um immer etwas griffbereit zu haben. Dann kommen auch die Lösungsideen für auftretende Probleme viel eher.
Abstandshülsen hab ich bei dem Arm nicht gebraucht, kann man aber fix von besagtem Alurohr absägen und somit bspw. zwei Platinen stapeln. Aluprofil sind bei mir Aluteile in U-Form oder L-Form, am besten in zwei Größen.
Alle Servos hängen bei mir samt Kontroller an einem 7805. Mit ausreichend großem Pufferkondesator läuft das recht gut.
Und wenn ich den Arm auf einer Achse verschieben müsste, würde ich da paar Inlinerrollen dranmachen, Getriebe oder Schrittmotor und das ganze auf einer Schiene (U-Profil) führen. Das ganze noch unter der Schiene sichern, damit es nicht rausspringt.
Gewindestange denk ich, dreht zu lange und ich denke die Präzison ist eh nicht so toll. Also tut's auch ein "normales Fahrwerk".
Nun muss ich aber erst mal fix wieder los...
thewulf00
19.11.2007, 19:40
Danke für die genauen und zahlreichen Antworten. Du hast mir den Beginn ermöglicht :-) Ich war auch vorhin fix beim Conrad und im Baumarkt und hab mir Servos, Getriebe, Wellen, Gewindestangen, Muttern und Hartpapier gekauft. Und die Laubsäge nicht vergessen. :-)
Die Servos sehen wirklich gut aus, wenn man sie mal in den Händen hält. Ich hab durch dran Drehen gemerkt, dass sie nur 180° mitmachen. Aber ich habe sie nicht zum Drehen bekommen. Gibt es da eine spezielle Ansteuertechnik, evtl. so wie bei Schrittmotoren? Mit einer angelegten Spannung hab ich nur ein Zucken erreicht, das kenne ich noch von meinen ersten Schrittmotorexperimenten.
Grüße,
Wulfi
Edit: Der Gripper sieht spitze aus. Ist Dir wirklich gut gelungen. Ich denke, ich nehme dennoch eine andere Variante. Welche, weiß ich jetzt noch nicht. Ist aber nicht wichtig, denn ich bin froh, wenn er die anderen 3-4 Achsen gescheit benutzen kann.
Edit2: Ich habe grad im RN-Wissen geschaut und einen Artikel über die Steuerung von Servos gefunden. Werd mal sehen, ob ich das teste.
Am attraktivsten finde ich Schienenmechanik, bspw. die von Manf von 2005, die einfach mit einer Getriebestange verschoben werden. Aber da habe ich gesehen, ist Metall (Kupfer) selbst gebohrt und verlötet. Das ist für mich zu viel Aufwand, da dann hinterher nix passt
Eine Bemerkung doch dazu:
Die Konstruktion sieht etwas nach solidem Metall aus, das aufwändig verarbeitet wird.
Es ist kupferkascherte Expoxidharzplatte. Ich habe sie für die genannte Konstruktion mit einer kleinen Kreissäge gesägt, man kann das Material aber auch mit einer Blechschere in From bringen.
Mein Lieblingswerkzeug dafür ist eine gezahnte überstzte Blechschere für 2,95€ bei Praktiker, es gibt sie auch bei Pollin.
Im "Idealfall" schneidet man ohne Anreißen etwas nach Augenmaß und fügt die Teile durch Punktlötung am Objekt zusammen. Nach Kontrolle und Justierung wird die Lötnaht vervollständigt und die Konstruktion nötigenfalls durch Streben verstärkt.
Die Materialstärke von 35µ Kupfer gestattet die Verarbeitung mit einem kleinen Elektroniklötkolben. Der geregelte 80W Kolben den ich dafür einsetze ist fast überdimensioniert.
Bei Bedarf zeige ich gerne auch noch Fotos von einer richtig improvisierten Konstruktion einer einfachen kleinen Halterung, um die Flexibilität der Konstuktion zu verdeutlichen. Eindrucksvoller wären sicher Aufnahmen vom Leiter der Feinmechanikabteilung gewesen, als er den Prototypenaufbau gesehen hat, da hatte ich aber gerade keine Kamera zur Hand. Es soll ja später alles nach guten Regeln gebaut werden aber bei einem Modell zählt eben auch die Effizienz.
Zum Thema Greifer habe ich hier noch ein paar Anregungen zusammengetragen.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=14770
Manfred
thewulf00
19.11.2007, 20:53
Vielen Dank Manf! Ich hatte gehofft, dass Du Dich auch noch äußerst.
Dann war das also kein Komplettkupfer, sondern nur eine Kupferoberfläche? Dann lohnt sich das darüber nachdenken ja fast wieder. :-)
Diese Bilder würde ich gern sehen.
thewulf00
19.11.2007, 21:07
Könnt ihr mir trotzdem nochmal wegen dem Servo helfen?
Im RN-Wiki steht, dass man ca. 1 ms HIGH, dann ca. 20 ms LOW anlegen muss, damit er nach Minimum fährt. und High auf 2 ms, damit er auf Maximum fährt. Nun habe ich einen Wert zwischen diesen beiden gewählt (ca. 1,25 ms) und nach dem Einschalten fährt er meist nach ganz hinten und bleibt nicht stehen, sondern versucht über das Ende hinauszudrehen, oder er bleibt auf einer Mittelstellung, wenn ich ihn vorher per Hand zum anderen Ende drehe, aber nicht immer.
Eben hab ich eingeschaltet und er fuhr ARG schnell in die richtige Posi. Das passiert aber nur alle paar Mal, und nur wenn die Luftfeuchtigkeit grad stimmt :-) (letzteres ist ein Witz unseres Physiklehrers.)
Zumindest bewegt er sich schonmal.
Wenn er das nur alle Jubeljahre einmal richtig macht, würde ich mit meinem Halbwissen vermuten, er resetet den AVR (Spannungseinbruch)
Hast du testweise mal versucht, den AVR und den Servo aus separaten Stromquellen zu versorgen?
Oder einen größeren Kondensator an die Versorgungsspannung von Controller o. Servo?
Edit:
Zum Thema Gripper gibt es hier auch noch eine einfach zu realisierende Lösung http://www.robotstore.com/store/product.asp?pid=267&catid=11
( darf man eigtl. auf kommerz. Seiten verlinken?)
Beim C Code im RN-Wissen ist diese Zeile meiner Ansicht nach falsch:
TIMSK|=(1<<TOIE2);
es sollte nicht der OVF Interrupt enabled werden, sondern der Output Compare Match, also OCIE2.
thewulf00
20.11.2007, 11:01
Guten Morgen!
>Hast du testweise mal versucht, den AVR und den Servo aus separaten Stromquellen zu versorgen?
Ich habe die Spannungsquelle gewechselt, auf eine bessere. Bei jedem Schubs hat sich die Spannungs-Kontroll-LED kurz verdunkelt. Das macht sie immernoch, aber das bringt dem µC keinen Abbruch.
>Oder einen größeren Kondensator an die Versorgungsspannung von Controller o. Servo?
Hab ich auch gemacht, da hängen jetzt zusammen 570 µF. Das ändert aber nichts.
Ich hab die Software gestern noch weiter bearbeitet, bis ich eine Art Drehung hinbekommen habe, die beweist, dass es möglich ist, und eigentlich nur an meiner Programmierung lag. Er geht ne Schleife durch, die eine PWM erzeugt, wobei der HIGH-Anteil sich verschiebt und wieder zurückgesetzt wird. Der Servo macht also etwa 9-11 merkbare Schritte mit einer Pause, dann dreht er sich blitzschnell zum Ausgang zurück und weiter gehts.
Ich muss also wohl oder übel doch eine fertig-PWM, oder zumindest einen Timer/IRQ benutzen, da ich gemerkt hab, dass die Servos nur dann gut funktionieren, wenn die Zeiten einigermaßen stimmen.
Hattest Du nicht gesagt, das Hartpapier lässt sich gut mit einer Laubsäge bearbeiten? :-(
Herrje, das wird'n Haufen Arbeit. Wie hast du Deine Schnitt so grade bekommen? Spannst Du das Hartpapier irgendwie ein?
Grüße,
Wulfi
PS: @pongi: Danke für den Hinweis, ich hab die Routine vorerst aber eh selbst gebaut, da ich auf ASM setze. Und wenn ich einen Timer oder IRQ benutze, guck ich mir sowieso die Register einzeln an und stelle die Flags selbst zusammen :-)
Wie kriegt man eigentlich einen gescheiten Timerzyklus hin, damit ich auf 20ms komme?
Hattest Du nicht gesagt, das Hartpapier lässt sich gut mit einer Laubsäge bearbeiten? :-(
Herrje, das wird'n Haufen Arbeit. Wie hast du Deine Schnitt so grade bekommen? Spannst Du das Hartpapier irgendwie ein?
Gut, das war ein wenig geflunkert. Man bekommt nach ein paar Teilen nen Krampf in der "Festhaltehand" :D
Ansonsten mit einer Hand festhalten, mit der anderen halbwegs gerade sägen. Dann jeweils zwei gegenüberliegende Teile in den Schraubstock spannen und mittels Feile den letzten Schliff geben.
Ist ein wenig Arbeit, aber man sägt ja nun nicht jeden Tag 20 Teile aus. Umso befriedigender ist's dann, wenn mans geschafft hat :)
Was den Timer angeht wäre ein Lösungsansatz:
Timer/Prescaler so wählen, dass man eine möglichst feine Auflösung für die High-Anteile bekommt, dann in der ISR entsprechend nen Zähler laufen lassen und irgendwann den Port tooglen. Nach dem der High-Teil abgearbeitet ist, kann man ja ruhig etwas größer vorladen, so dass die Auflösung gröber wird und zählt dann in der ISR wieder für den Low-Anteil.
Ob das Sinn macht, steht zur Diskussion. Man muss halt nicht so viel zählen, wenn man die Timezeit ja nach Low o. High anpasst.
thewulf00
20.11.2007, 12:02
Ja, so ähnlich mache ich das auch schon, nur ohne Timer. Die Timerauflösung bleibt dann wahrscheinlich. Aber das Problem ist, dass der Timer eine 2er-Potenz als Prescaler bekommt.
Ist es möglich, eine 20ms-PWM von AVR erzeugen zu lassen?
Ich halte das Hartpapier nicht fest, sondern presse es fest auf den Tisch, dann kann ich in Ruhe neben dem Tisch sägen und man bekommt keinen Krampf :-)
Mmh, die Frage verstehe ich nicht ganz.
Meinst du, ob es möglich ist, einen Interrupt exakt aller 20ms auszulösen?
Bei nem 12MHz AVR mit 8Bit Timer, würdest du bspw. einfach Prescaler 1024 einstellen und beim Start und jedem Interrupt immer 22 vorladen.
Damit wird der IRQ aller 19.968ms aufgerufen. Mit einer Zählvariablen in der InterruptServiceRoutine kannst du dir ja dann dein PWM softwareseitig basteln.
Oder reden wir von Hardware-PWM?
Da sollte sich das ähnlich lösen lassen. Hab ich bloss noch nie ausprobiert. Einfach immer etwas entsprechend im Zähler vorladen, damit man die Periodenlänge exakt einstellen kann. Beim Hardware-PWM muss man vor dem vorladen jedoch noch die Interrupts sperren ( cli(); )und den Wert in High-Byte und Low-Byte teilen. Danach wieder enablen ( sei(); )
thewulf00
22.11.2007, 08:07
Ja, ich meinte Hardware-PWM. Also Register initialisieren, und einen High-Level übergeben, und er macht dann von selbst eine 1:20ms-PWM. Das wäre schön.
Ich habe gestern mit C ein wenig herumgespielt (bin eigentlich ASM-Freak), und da hab ich dann die fertigen Funktionen _delay_us und _delay_ms genommen. Selbst damit war es noch schwer und die Schritte waren nicht sehr genau, denn ich habe es so programmiert, dass in jedem Schleifendurchlauf der aktuelle Stand per PWM übermittelt wird, und dann alle 100 Durchläufe der Stand verändert wird. Das klappt soweit ganz gut, bis auf zwei Tatsachen:
- Den ersten Wert muss ich mit _delay_ms einstellen (us geht nicht über 786 hinaus) und da brauch ich dann Kommazahlen (z.B. 1.2 ms) und dann kommt die Fließkommaberechnung mit hinein und das Programm wird größer als alle meine ASM-Programme zusammen. (Es geht zwar noch rein, aber für eine Software-PWM für EINEN Servo, über 4% des 32K-Speichers... Und ja, ich habe Optimierung an.)
- Bleibt er in einem Stand, wird jedesmal mit den Warteroutinen eine Warteberechnung durchgeführt, so dass er ETWA so lang wartet, wie angegeben, das merkt man, weil er in jedem Schritt um den Sollwert schwankt, d.h. er zittert, während er stehen sollte. Das geht so weit, dass die Katze auf den Tisch springt, um zu sehen, was da so quitscht.
PS: Wie genau funktioniert das mit dem Vorladen der Interrupts/Timer?
Im Code im RN-Wissen wirds so gemacht: der Timer wird mit einer Frequenz x betrieben, womit zB alle 1us ein der Zähler einen Schritt weitergeht. Der Compare Match Register wird so gestellt, dass CMPR*Periode = zB 0,01ms sind, also im unseren Fall wäre CMPR=100. Wenn der Wert im Zähler CMPR erreicht, wird ein Interrupt ausgelöst. Mit verschiedenen Frequenzeinstellungen und CMPR Werten kann man also genau ausrechnen, nach welcher Zeit ein Interrupt aktiviert wird.
In der Interruptroutine werden die Interrupts gezählt, und mit einer Variable verglichen, die die Länge des High-Impulses bestimmt. Willst du 1,2ms, muss dieser Wert 100 sein. Wenn die Zählvariable zwischen 0 u. High-Impuls Länge liegt, wird ein Pin auf High gesetzt, ist es größer als die High-Impuls Länge, wird es auf 0 gesetzt. Willst Du eine Periodendauer von insgesamt 20ms, wird die Zählvariable im Interrupt auf 0 gesetzt, falls es 2000 überschreitet, und das ganze fängt von vorn an.
Wars einigermassen vertsändlich?
Noch etwas, damit ersparst du die floats, du brauchst nur einen uint16, und sonst nur uint8.
MfG
pongi
thewulf00
22.11.2007, 08:37
Jepp, danke Pongi.
Ich habe dieses Beispiel als erstes benutzt, bevor ich auf delay_* umstieg, aber da das auf 10ms eingestellt war, habe ich dann die Interrupt-Zählung ausgeschaltet und die Interrupts selbst haben den timer_10ms dekrementiert. Da hats dann aber trotzdem noch gezittert.
Und wenn ich einen Servo sehr "smooth", d.h. weich und geschmeidig, in beliebigen langsamen Geschwindigkeiten bewegen will, müssten doch eigentlich meine Schritte unendlich klein und die Zeit dazwischen auch unendlich klein werden, richtig?
Weil bisher ist es ja so, dass ich viele Schritte mit kleinen Zeiträumen mache und er "springt" zu einem Schritt, wartet ne Miniweile und "springt" weiter, wenn ich das mit einem Roboterarm machen würde, dann würde das ganze Gestell pervers klappern und zittern, weil er ja sehr viele, sehr kleine, sehr ruckartige Bewegungen macht.
Wie stellt man das ab?
Mit dem vorladen funktioniert das prinzipiell, am Beispiel des 8Bit Timers erklärt, so:
12MHz, 8Bit, Prescaler 1024 -> zählt von 0..255 und löst Interrupt aus. Für die 255 Ticks benötigt er insgesamt 21.8453ms. Lädst du nun jedoch bei jedem Interrupt gleich 22 vor, zählt er nur noch 233 Ticks, was 19.968ms dauert.
Vorladen beim 8Bit Timer0:
ISR(TIMER0_OVF_vect)
{
/* preload counter */
TCNT0 = 22; // toogle breakpoint here to verify correct timings
/* code here */
}
Mit Timer1/2 im Hardware PWM sollte man da ähnliches basteln können. Eventuell gibt es da auch noch eine elegantere Möglichkeit, aber soweit hab ich mich nie mit PWM befasst.
Hat bis jetzt immer ohne irgendwelche Verrenkungen geklappt (Meine Servos laufen auch ganz normal mit einer Periode von 21.7ms, die mir der PWM-Mode ausspuckt).
Was du gerade mit delay() treibst kann ich nicht ganz nachvollziehen. Aber m.E. macht man es doch so, in einer Schleife 12 mal _delay_us(100) aufzurufen, um auf 1.2ms zu kommen. Wenn man denn delays nutzen will...
thewulf00
22.11.2007, 08:48
> in einer Schleife 12 mal _delay_us(100) aufzurufen
Ja, das stimmt schon, aber das ist eben immernoch nicht genau, er berechnet eine große Sache, die dann in etwa so lang dauert. Und wie gesagt, ist das Fließkommaberechnung, sobald ich diese Funktion benutzt, unabhängig von der Eingabe.
Das Vorladen ist neu für mich, vielen Dank für diesen Hinweis. Der Sinn dahinter ergibt sich mir dann auch :-)
Kannst Du mal Deinen PWM-Code-Ausschnitt posten?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.