Vor zweieinhalb Jahren kaufte ich das Lego Mindstorms EV3-Kit, um meine ersten Schritte in der Robotik zu unternehmen. Nachdem ich die ev3dev-Baugruppe auf den Controller gerollt und genug mit der SSH-Motor- und Sensorsteuerung gespielt hatte, kühlte ich mich für zwei Jahre für einen Kauf ab. Der Grund war, dass ich nicht genug Fantasie hatte, um dies zu ermöglichen: Nach mehreren zusammengebauten Modellen von Lego Technics (sowohl verpackt als auch hausgemacht) war ich bereits an Wunder wie ferngesteuertes Spielzeug und einfache Roboter wie gewöhnt
Die Modelle von Lego, die auf der
Krakauer Ausstellung als Person vorgestellt wurden, die früher an einem Telemechanik-System gearbeitet hat, haben nicht mehr genug Inspiration inspiriert. Ich wollte die Erfahrung eines anderen nicht wirklich wiederholen.
Am Ende wurde mir klar: Eine Kuckucksuhr könnte ein Modell werden, das ziemlich komplex, interessant, praktisch und nicht zu abgedroschen ist. Inspiriert von dieser Idee machte ich mich an die Arbeit.
Nach meiner Idee sollte das Modell nicht nur ein Spielzeug, sondern ein voll funktionsfähiges Gerät werden. Dies war durchaus möglich: Die Uhr hängt an meiner Wand und zeigt die aktuelle Uhrzeit im 24/7-Modus an. Ich habe mir nicht die Aufgabe gestellt, den Mechanismus des Originals in allen Details zu reproduzieren - zum Beispiel sind die Pfeile unabhängig, der Ton wird über den Lautsprecher des Controllers wiedergegeben und die Gewichte und das Pendel werden ausschließlich für die Umgebung verwendet. Nachdem ich daher alle Hauptarbeiten auf den Softwareteil übertragen hatte, baute ich den Mechanismus in der einfachsten möglichen Version zusammen. Ich habe nicht den gesamten Montageprozess dokumentiert, daher kann ich das Modell nicht in derselben Form wieder zusammenbauen. Die Grundprinzipien für das Pairing von Software und Mechanik sind jedoch so, dass das Programm mit minimalen Änderungen an anderen Modellen arbeiten sollte, die nach einem ähnlichen Prinzip zusammengestellt wurden.
Uhren in verschiedenen Formen werden in dem Video präsentiert, das ich auf Youtube gepostet habe:
Grundlegende Informationen zum Modell finden Sie im Video. Im Folgenden werde ich Sie etwas detaillierter über die Mechanik, die Software sowie über die Probleme informieren, die bei der Montage und dem Betrieb dieses Entwurfs aufgetreten sind.
Die Mechanik
Die Montage des mechanischen Teils dauerte 6 Tage. Nachdem ich in den Neujahrsferien die Lego-Boxen auf den Tisch gelegt hatte, baute ich einen Mechanismus zusammen, der sich von der endgültigen Version nur in den Türen unterscheidet, hinter denen der Kuckuck lebt (mehr dazu weiter unten). Ich habe keine besonderen Designfähigkeiten, daher ist die Uhr eine rechteckige Box mit zwei Zeigern und einem Zifferblatt, das auf der Vorderseite mit Punkten markiert ist. Im oberen Teil der Uhr befindet sich ein durch zwei Türen geschlossenes Fach, in dem sich der Kuckuck niedergelassen hat, und im unteren Teil befinden sich ein schematisches Pendel und zwei Gewichte. Teile wurden aus mehreren Lego-Sets entnommen: einem
Lego Mindstorms EV3 (31313) , zwei
Volvo-Gradern (42030) , einem
Mercedes-LKW mit pneumatischem Ausleger (42043) und einem
LKW-Kran (42009) . Trotz der Fülle an Sets gab es für ein Modell dieser Größe kaum genug Details - das Uhrendeckel besteht aus Streifen unterschiedlicher Farben, die jedoch nicht ins Auge fallen, da es bei einer Wandmontage über Augenhöhe liegt.
Als Minutenzeiger wird die Standard-Lego-Technik-Leiste für 15 Einheiten verwendet. Es wird auf die Achse gelegt und fest mit dem Motor verbunden. Somit stellte sich heraus, dass die Genauigkeit der Einstellung des Minutenzeigers ausreichend war, um die minutengenaue Zeit zu bestimmen. Der Stundenzeiger ist kürzer und auf einem Schwenkmechanismus montiert. Es ist über mehrere Gänge mit dem Motor verbunden, so dass ein ziemlich merkliches Spiel auftritt - jedoch nicht so groß, dass es Probleme bei der Zeitbestimmung gibt.
Die Hände werden von zwei großen Motoren (LM) angetrieben. Zusätzlich funktioniert mit jedem der externen Zeiger ein anderer, der interne - für den Minutenzeiger ist er auf derselben Achse wie der erste fixiert, und für die Uhr ist der Drehmechanismus auf der Innenseite der Uhr dupliziert. Der Zweck der inneren Pfeile besteht darin, die Taste (Berührungssensor) zu drücken, während die äußeren Pfeile durch die obere Position geführt werden. Somit hat die Steuerung die Möglichkeit, die Position der Pfeile unmittelbar nach dem Einschalten zu bestimmen und ihre korrekte Position basierend auf der Systemzeit einzustellen, so dass der Benutzer die Pfeile nicht manuell eingeben muss.
Gewichte haben eine rein dekorative Funktion. Anfangs dachte ich daran, ein Gewicht zu machen, das sich langsam absenkt (wie bei einer normalen Uhr) und dann schnell in die obere Position zieht (analog zum manuellen Aufziehen einer Pendeluhr). Ich habe diese Option später aus mehreren Gründen abgelehnt. Erstens hat der Schaltmechanismus zwischen dem Motor und dem Gewicht dem Modell zusätzliche Komplexität verliehen (und der Antrieb des Pendels vom selben Motor hat ihn nur erhöht). Zweitens wird ein schneller Eyeliner, was auch immer man sagen mag, eine laute Operation sein, aber ich wollte, dass die Uhr so leise wie möglich arbeitet. Drittens gibt es bei einer herkömmlichen Kuckucksuhr normalerweise zwei Gewichte (eines liefert die Uhr, das zweite den Kuckuck), und die sofortige Platzierung von zwei Kipprädern für die Kette am unteren Ende der Uhr würde zu einer noch größeren Vergrößerung des Modells führen.
Ausgehend davon ging ich einen einfacheren Weg: Ich installierte tatsächlich zwei Gewichte auf der Uhr, platzierte sie jedoch auf einem gemeinsamen Stromkreis, der über ein einzelnes Antriebsrad geworfen wurde. In dieser Version bewegen sich die Gewichte immer in wetterfeindliche Richtungen und fallen abwechselnd ab. Dieses Verhalten hat wenig mit echten Pendeluhren zu tun, sieht aber recht interessant aus.
Die Kette besteht aus gewöhnlichen Verzierungen von drei Einheiten mit einer Kombination aus Achsen und Kolben: Ein Rutschkolben ist ein eher seltenes Stück, und ich habe die Achsen verwendet, um die Länge der resultierenden Kette zu verdoppeln. Es war nicht so einfach, ein Rad herzustellen, das eine solche Kette ohne Schlupf und Pannen bewegt, aber am Ende war es möglich.
Was das Umschalten der Bewegungsrichtung von Gewichten angeht, war meine erste Idee, es rein mechanisch zu machen: Beim Anheben an die Bodenwand des Uhrengehäuses drückt die direkt über dem Gewicht montierte breite Achse auf die Platte, durch die die Kette geführt wird, und bewirkt, dass sich das Rad dreht. Ich wollte das Schaltelement genauso verwenden wie zum Beispiel den
Kran 42009 : Das schaltende Antriebsrad tritt entweder mit dem rechten oder dem linken Nachbarn in die Kupplung ein. Diese Idee flog jedoch nicht: Die Druckplatte brachte das Gleitteil in die Mittelstellung, wenn es weder mit dem rechten noch mit dem linken Nachbarn in Eingriff stand, das Drehmoment nicht mehr auf das Rad traf und der Schalter in der Mittelstellung einfrierte.
Um diese Situation zu korrigieren, habe ich beschlossen, dieser Schaltung ein bewegliches Dreieck hinzuzufügen, dessen zwei Seiten eine feste Länge haben und dessen dritte Seite durch ein federbelastetes Gleitteil dargestellt wird, das in der Aufhängung desselben LKW-Krans verwendet wird. Die Bedeutung dieser Konstruktion war, dass sich das Dreieck immer auf der Seite der Druckplatte befindet, die dem Hubgewicht entspricht: Wenn die Kettlebell die Oberseite erreicht, drückt die Platte auf das Dreieck, die Feder drückt zusammen, das Dreieck geht durch die Gleichgewichtsposition und „kippt“ dann auf die andere Seite und löst sich Energie von einer Feder gespeichert. Diese Energie sollte nach meinem Plan den Geschwindigkeitsschalter durch die Gleichgewichtsposition verschieben und ihn sofort in die entgegengesetzte Position verschieben.
Ich konnte dieses System jedoch nicht stabilisieren. An der Größe der Uhr kann man verstehen, dass Miniaturmechanismen nicht mein Ding sind, aber mit zunehmender Größe des Knotens führen die darin auftretenden Verzerrungen zu Reibung, die den größten Teil der Schaltenergie auffrisst. Nachdem ich mit diesem Mechanismus gequält worden war, beschloss ich schließlich, die gesamte Drecksarbeit auf den Mikrocontroller zu verlagern, indem ich anstelle komplexer Mechaniken einen Knopf über den Drucktafeln (Berührungssensor) installierte.
Ein bisschen einfache Arithmetik. Der EV3 verfügt über vier Eingänge und vier Ausgänge. Zwei Eingänge und zwei Ausgänge waren bereits mit Tasten bzw. Pfeilmotoren belegt. Das Hinzufügen eines Motors zum Drehen des Kettenrads und zweier Knöpfe zu dieser Schaltung bedeutete, dass ich zum einen keine freien Anschlüsse zum Anschließen des Kuckuckspositionssensors hatte (ich dachte, ich würde zu diesem Zweck einen optischen Abstandsmesser verwenden), und zum anderen Die übrigen Knoten (Kuckuck und Pendel) haben nur einen Motor. Ich dachte über die Option nach, bei der beide Drucktafeln über den Gewichten mit einem gemeinsamen Knopf verbunden würden, lehnte dies jedoch ab, da sich die Uhr zum Zeitpunkt des Einschaltens eines der Gewichte in der oberen Position befand und den Knopf gedrückt hielt, nicht genügend Informationen zur Auswahl hatte Bewegungsrichtung der Kette.
Da das Pendel leichter mit dem Kettenbewegungsmechanismus als mit dem Kuckuck zu verbinden war (sowohl in Bezug auf die Art der Bewegung als auch auf die Position), platzierte ich einen weiteren großen Motor im unteren Teil des Körpers, der zum einen das Pendel hin und her antreibt (1 Motorumdrehung) Dies führt zu einem vollständigen Pendelschwung. Zweitens dreht sich durch ein Untersetzungsgetriebe das Rad, das die Kette antreibt. Ein solches System hat den Nachteil, dass beim Umkehren der Bewegungsrichtung der Kette und dementsprechend der Drehung des Motors das Pendel auch die Bewegungsrichtung ändert, selbst wenn es sich in einer Zwischenposition befindet, die hässlich aussehen kann. Das Umschalten der Bewegungsrichtung von Gewichten ist jedoch eine eher seltene Operation, daher habe ich dieses Problem vernachlässigt. Ein weiterer Nachteil meiner Baugruppe ist das ziemlich austauschbare Spiel im Pendelantrieb, weshalb das Pendel bei langsamer Bewegung für den Bruchteil einer Sekunde an einem niedrigeren Punkt stoppt, um ein wahrnehmbares Auge zu erhalten. Ich war zu faul, um dieses Problem zu beheben.
Apropos Pendelgeschwindigkeit. Nachdem ich damit experimentiert hatte, wählte ich einen Wert von 30 Grad des Motors pro Sekunde. Dies bedeutet, dass das Pendel in 12 Sekunden vollständig schwingt. Dies ist jedoch eine Menge, mit zunehmender Geschwindigkeit begann der Motor zu heulen, und die Aussicht, sein Lied kontinuierlich zu hören, lächelt mich überhaupt nicht an. Es war zu faul, durch den Mechanismus zu gehen und einen Overdrive einzuführen, also entschied ich mich für ein solches "Mond" -Format. Die Übersetzungsverhältnisse zwischen Motor und Kettenantriebsrad sind so, dass das Gewicht in 40-50 Minuten von der unteren in die obere Position geht.
Der EV3-Anschluss blieb nach allen vorherigen Manipulationen frei und belegte den mittleren Motor (mittlerer Motor), der den Kuckuck antreibt. Der Kuckuck selbst besteht aus Teilen derselben Lego-Technik. In der Höhe erreicht der Vogel 11 Einheiten und wird auf eine einziehbare Stange gestellt (auf diesen wurden im oben genannten LKW-Kran Fernstopps platziert). Ein Miniaturmechanismus führt eine Übertragung zwischen den Flügeln des Vogels und seinem Schwanz ein, durch die ich ein Kabel geworfen habe, das in der Uhr befestigt ist. Die Länge des Kabels wird so gewählt, dass der Kuckuck mit den Flügeln nach unten vollständig verlässt und sie erst ganz am Ende der Bewegung leicht auseinander spreizt. Es stellte sich als atmosphärisch heraus - gerade auf der Ebene der Mechanisierung einfacher Uhrenmodelle. Das Fehlen eines Positionssensors wird durch die Tatsache kompensiert, dass der Antrieb des Kuckucks über das Rutschgetriebe eingeschaltet wird - es hilft, den Motor nicht zu beschädigen, selbst wenn versucht wird, den Kuckuck über die Grenzpunkte hinaus zu bewegen. Die Türen sind eng mit der Planke verbunden, auf der der Vogel befestigt ist, und öffnen sich gleichzeitig mit dem Abgang des Kuckucks.
Anfangs habe ich 11 mal 5 für 1 Einheitspaneele als Türen verwendet, aber dies stellte sich als schlechte Idee heraus: Ihre Kanten waren nicht abgerundet, und die Türen, die an benachbarten Teilen hafteten, waren oft blockiert und ließen den Kuckuck im Inneren. Das Video zeigt die zweite Version der Türbaugruppe - gewöhnliche Verkleidungen mit abgerundeten Kanten verursachen kein solches Problem. Darüber hinaus öffnet und schließt die „Planken“ -Version der Tür viel leiser.
Die Uhr ist an einem an der Wand befestigten Armband befestigt. Die gesamte Struktur wiegt mehr als ein Kilogramm.
Damit endet im Prinzip die Beschreibung des mechanischen Teils. Es bleibt nur zu erwähnen, dass das Modell zu 100% aus Lego Mindstorms und Lego Technics zusammengesetzt ist. Der einzige Teil, der für diese Sets nicht gilt, ist das Netzkabel, das ich an meinen EV3 gelötet habe, damit ich die Batterien nicht ständig wechseln musste. Dieses Kabel führt zu dem in die Steckdose eingesteckten Netzteil.
Das Programm
Die ev3dev-Assembly bietet Ordner für viele Programmiersprachen. Um keine Schwierigkeiten mit der Assembly zu haben, habe ich mich auf ein Python-Skript beschränkt. Dieses Skript ist
im GitLab-Repository verfügbar. Im Folgenden werde ich kurz auf seine Funktionalität eingehen.
Der Code, mit dem die Pfeile bewegt werden, ist relativ einfach: Er berechnet die Minuten und Stunden in die Rotationsgrade der Motoren neu, indem Daten über die Gradzahl des Motors pro Umdrehung des Pfeils und die anfängliche Verschiebung des Pfeils von der vertikalen Position verwendet werden. Der ganze Spaß beginnt, wenn das Programm versucht, diese Daten zu erhalten.
Wie ich bereits sagte, wurde beschlossen, die manuelle Verbindung des Schützen aufzugeben. Stattdessen führt die Uhr beim Start eine Kalibrierung durch, indem Geometrieparameter bestimmt werden. Die Kalibrierung wird für beide Hände unabhängig voneinander durchgeführt.
Der Kalibrierungsalgorithmus ist wie folgt. Zuerst beginnt der Motor mit einer relativ hohen Geschwindigkeit zu drehen (ich verwende einen empirischen Wert von 180 Grad pro Sekunde), bis ein Bestätigungssignal von der Taste kommt, die die obere Position des Pfeils festlegt. Danach setzt der Motor die Drehzahl auf 30 Grad pro Sekunde zurück und dreht den Pfeil weiter im Uhrzeigersinn (die Drehrichtung des Motors ist im Programm eingenäht), bis er um 70 Grad vom Punkt der letzten Knopföffnung getrennt ist. Danach geht der Pfeil in entgegengesetzter Richtung durch die obere Position und fixiert den ersten Verschluss und die letzte Öffnung der Kontakte (der Knopf kann in den Kantenpositionen klappern). Wenn Sie sich um die gleichen 70 Grad von der letzten Öffnung entfernen, ändert der Pfeil erneut die Bewegungsrichtung zur Geraden, und der Vorgang zum Registrieren des ersten und des letzten Schaltkreises wird wiederholt.
Es wird angenommen, dass die obere Position des Pfeils dem arithmetischen Mittel zwischen den vier so erhaltenen Werten entspricht. Die Praxis zeigt, dass diese Annäherung recht gut ist - die Abweichung der Zielposition des Minutenzeigers vom tatsächlichen Wert beträgt selten mehr als einen Schritt und überschreitet fast nie zwei Schritte. (Das Video zeigt größere Abweichungen aufgrund der Tatsache, dass ich zum Zwecke der Aufnahme die Systemzeit verschoben habe und die Zeiger sich schneller als während des normalen Betriebs bewegten, wodurch der Korrekturfehler bei jeder Umdrehung erhöht wurde (siehe unten).) Bei Spielen im Uhrzeigersinn verschlingt das Spiel die Genauigkeit. aber der Algorithmus verwendet natürlich den gleichen.
Nach der Berechnung der oberen Position des Pfeils und der Differenz zwischen dem ersten Einschalten des Sensors und der oberen Position des Pfeils (dieser Wert wird zur Korrektur benötigt, siehe unten) erhöht der Kalibrierungsalgorithmus die Motordrehzahl erneut auf 180 Grad pro Sekunde und wiederholt die Suche nach der oberen Position. Die Differenz zwischen zwei aufeinanderfolgenden oberen Positionen bestimmt die Länge einer vollen Pfeilumdrehung in Rotationseinheiten des Motors. Der Suchvorgang für die oberste Position wird fünfmal wiederholt, wodurch wir die erhaltenen Werte mitteln und die Genauigkeit leicht erhöhen können.
Nach Abschluss der Kalibrierung wechseln die Zeiger in den aktuellen Zeitanzeigemodus. Darüber hinaus legt der Algorithmus auf jedem Pfeilkreis die Position fest, an der der Leistungsschalter zuerst geschlossen hat. Die Differenz zwischen dem tatsächlichen und dem erwarteten Drehwinkel des Motors zu diesem Zeitpunkt ist der Betrag der Korrektur; Selbst wenn die volle Kreislänge in der Kalibrierungsphase nicht korrekt berechnet wurde (die Debug-Ausgabe zeigt, dass die Abweichung selten 1 Grad überschreitet), kann sich der Pfeil bei der Korrektur auf jedem Kreis aufgrund der Anhäufung von Fehlern nicht verschieben.
Bitte beachten Sie, dass die einzige Information über das Verhältnis von Motor und Pfeil, die explizit in das Programm eingenäht ist, die Drehrichtung des Motors (vorwärts oder rückwärts) ist, die der Vorwärtsbewegung des Pfeils entspricht. Dank Positionssensoren entfallen Daten zum Übersetzungsverhältnis und zur Ausgangsposition des Pfeils. Wenn Sie also eine Uhr sammeln, für die neben Stunde und Minute auch ein Sekundenzeiger angezeigt wird, können Sie diese mithilfe des Algorithmus verwenden, indem Sie nur wenige Zeilen hinzufügen, ohne Zeit mit dem Zählen der Zähne zu verschwenden.
Was im Pfeilbewegungsprogramm fehlt, ist der Schutz vor Überlauf oder Genauigkeitsverlust. Ich habe die Frage, was früher passieren wird, nicht untersucht: Die Bittiefe des Drehwinkels des Motors läuft über, oder die Pfeile beginnen sich ruckartig zu bewegen, da die Genauigkeit in den höheren Ziffern der Gleitkommazahl abweicht. Die Praxis zeigt jedoch, dass in Zeiten in der Größenordnung von mehreren Wochen nichts dergleichen passiert. Wenn ich jemals auf dieses Problem stoße, füge ich höchstwahrscheinlich in jeder Runde einen Befehl zum Zurücksetzen des Motors hinzu, mit entsprechender Korrektur der Winkel im Programm.
Wenn die Hand-Klasse in meinem Programm für die Bewegung der Pfeile verantwortlich ist, leuchtet die LedIndication-Klasse auf und schaltet die LEDs an der EV3-Frontplatte aus. Ich weiß, dass der gleiche Effekt mit einem Team erzielt werden kann, aber ursprünglich wurde diese Funktion entwickelt, um Programmabstürze zu verfolgen, und dann blieb sie bestehen. In dieser Klasse gibt es nichts Interessanteres.
Die Pendelklasse ist für die Bewegung von Gewichten und einem Pendel verantwortlich.
Der Algorithmus startet den Motor einfach in eine Richtung und dreht ihn mit einer konstanten Geschwindigkeit, bis der Knopf, der dem vollständigen Anheben dieses Gewichts entspricht, festgeklemmt ist. Danach wird die Bewegungsrichtung des Motors umgekehrt.In dieser Klasse wird übrigens ein Schutz vor Programmabstürzen angeboten, der darin besteht, dass sich die Engine nur 2 Sekunden lang mit einer Befehlsaktualisierungsdauer von 1 Sekunde einschaltet. Wenn ich den Motor im Konstantdrehmodus einschalten würde, würde sich das Ausruhen auf der Taste beim Absturz des Programms weiter nach oben bewegen, was zu einer Überlastung des Motors, einem Durchrutschen der Gänge oder sogar zu einer Beschädigung des Mechanismus führen könnte. Mit dem Schutz können Sie dieses Problem verhindern., Cuckoo , 59 0 . , , EV3, . , — 1 12 .
FreeSound , EV3. ( , , .)
, , . , , ev3dev : - , SSH-. . , , ( ev3dev apt get upgrade, , , ), , .
, , , : , «», «» . , .
, . .
Die Drehzahl des Motors, der den Kuckuck antreibt, und der Drehwinkel sind im Programm festgelegt. Zu Beginn des Programms wird der Kuckuck in das Gehäuse gezogen. Unter Berücksichtigung des auf der Motorachse installierten Schlupfgetriebes ist dieser Vorgang sicher, hat jedoch Auswirkungen, wenn sich der Kuckuck zum Zeitpunkt des Starts der Uhr außerhalb des Gehäuses befand.Um den Schlaf nicht zu beeinträchtigen, kuckt der Kuckuck nur tagsüber. Ihr Arbeitstag beginnt um zehn Uhr morgens und das letzte Mal, dass sie spricht, ist Mitternacht. Ich habe den Kuckuck auch zu einem Zeitpunkt ausgeschaltet, an dem ich wöchentlich über Skype telefoniere, um mich nicht einzumischen.Debian. , , . — EV3 WiFi-. , , , , , .
BSD. , .