Eine synchrone Bewegung zwischen mehreren linearen Aktuatoren kann für den Erfolg einiger Kundenanwendungen von entscheidender Bedeutung sein. Eine häufige Bewegung sind zwei lineare Aktuatoren, die eine Falltür öffnen. Um dies zu erreichen, empfehlen wir die Verwendung des speziellen Firgelli Synchronsteuerbox FA-SYNC-2 und FA-SYNC-4. Einige Heimwerker und Hacker bevorzugen jedoch die Freiheit, die ein Mikrocontroller wie der Arduino bietet, und schreiben stattdessen lieber ihr eigenes synchrones Steuerungsprogramm. Dieses Tutorial soll einen Überblick darüber geben, wie dies mit dem erreicht werden kann Linearantrieb der optischen Serie.
Vorwort
Dieses Tutorial ist keine strenge Behandlung der Schritte, die erforderlich sind, um eine synchrone Steuerung mit Arduino zu erreichen, sondern eine umfassende Übersicht, die Sie beim Schreiben Ihres eigenen benutzerdefinierten Programms unterstützt. Dieses Tutorial ist fortgeschritten und setzt voraus, dass Sie bereits mit Arduino-Hardware und -Software vertraut sind und im Idealfall Erfahrung mit PWM-Signalen (Pulsweitenmodulation), ISR (Interrupt Service Routine), Entprellen von Sensoren und Motorcodierern haben. Das in diesem Lernprogramm bereitgestellte Beispiel ist ein primitiver Proportionalregler. Im folgenden Beispiel können viele Verbesserungen implementiert werden, einschließlich, aber nicht beschränkt auf: Implementieren eines PID-Regelkreises und Skalieren auf mehr als zwei lineare Aktuatoren. Bitte beachten Sie, dass wir nicht über die Ressourcen verfügen, um technischen Support für Arduino-Anwendungen bereitzustellen, und keine Debugging-, Bearbeitungs-, Code- oder Schaltpläne außerhalb dieser öffentlich verfügbaren Tutorials erstellen.
Übersicht Synchrone Steuerung
Die synchrone Steuerung wird erreicht, indem die Länge zweier Linearantriebe verglichen und die Geschwindigkeit proportional eingestellt wird. Wenn sich ein Aktuator schneller als ein anderer bewegt, werden wir ihn verlangsamen. Wir können die Position des Linearantriebs über den eingebauten optischen Encoder ablesen. Der optische Encoder ist eine kleine Kunststoffscheibe mit 10 Löchern, die mit dem Gleichstrommotor so verbunden ist, dass beim Drehen des Motors auch die Kunststoffscheibe funktioniert. Eine Infrarot-LED ist auf die Kunststoffscheibe gerichtet, so dass das Licht beim Drehen entweder durch die Löcher in der optischen Platte übertragen oder durch den Kunststoff der Platte blockiert wird. Ein Infrarotsensor auf der anderen Seite der Platte erkennt, wann das Licht durch das Loch übertragen wird, und gibt ein Rechtecksignal aus. Durch Zählen der Anzahl der vom Empfänger erfassten Impulse können wir sowohl die Drehzahl des Motors als auch die Entfernung berechnen, die der Linearantrieb zurückgelegt hat. Der optische Linearantrieb mit 35 lb hat 50 (+/- 5) optische Impulse pro Zoll Hub, während die Aktuatoren mit 200 lb und 400 lb beide 100 (+/- 5) Impulse pro Zoll haben. Durch den Vergleich, wie weit sich jeder Linearantrieb ausgefahren hat, können wir die Drehzahl der beiden Antriebe proportional so einstellen, dass sie beim Ausfahren immer auf der gleichen Länge bleiben.
Erforderliche Komponenten
- Zwei optische Linearantriebe
- Zwei IBT-2-Motortreiber
- Arduino Uno
- 12V Stromquelle
- 3 Tasten (nicht von Firgelli verkauft)
- Zusätzliche Verkabelung
Schaltplan
Stellen Sie die obigen Kabelverbindungen her. Überprüfen Sie immer die Drahtfarben, die aus dem Linearantrieb austreten, da sich die Farbkonvention von der in der obigen Abbildung gezeigten ändern kann. Achten Sie darauf, die 3 Tasten zwischen den digitalen Pins 7, 8, 9 und GND nicht zu übersehen.
Schnelles Tutorial
Wenn Sie nur Ihre beiden Linearantriebe synchron bewegen möchten, gehen Sie einfach wie folgt vor:
- Stellen Sie die Verbindungen wie im Schaltplan gezeigt her.
- Laden Sie das erste Programm unten hoch und führen Sie es aus.
- Kopieren Sie die beiden von diesem Programm ausgegebenen Werte in Zeile 23 des folgenden zweiten Programms.
- Laden Sie das zweite Programm hoch und führen Sie es aus.
- Optimieren Sie Ihr System durch Variieren der Variablen K_p (Zeile 37, zweites Programm). Dies geschieht am einfachsten, indem Sie ein Potentiometer an den analogen Pin A0 anschließen und den Code zum Lesen des Potentiometers ändern und die Funktion map () verwenden: K_p = map (analogRead (A0), 0, 1023, 0, 20000);
Im Rest dieses Tutorials werden einige der wichtigsten Funktionen der Programme ausführlicher behandelt. Wir wiederholen erneut, dass dies kein erschöpfendes Tutorial ist, sondern ein Überblick über die Dinge, die beim Erstellen Ihres eigenen Programms zu beachten sind.
Übersicht über das Kalibrierungsprogramm
Bevor eine synchrone Steuerung erreicht werden kann, müssen wir zuerst das System kalibrieren. Dies beinhaltet das Zählen der Anzahl von Impulsen pro Betätigungszyklus, da gemäß den Produktspezifikationen eine Toleranz von (+/- 5) Impulsen pro Zoll Hub besteht. Laden Sie das folgende Programm hoch und führen Sie es aus. Dieses Programm fährt die Aktuatoren vollständig ein (Zeile 53) und setzt die optische Impulszählervariable auf Null. Anschließend wird sie vollständig ausgefahren und vollständig eingefahren (Zeile 63 bzw. 74). Während dieses Betätigungszyklus wird die Anzahl der Impulse von der Interrupt-Serviceroutine (ISR), Zeile 153 und 166, gezählt. Sobald der Betätigungszyklus abgeschlossen ist, wird die durchschnittliche Anzahl der Impulse ausgegeben, Zeile 88, notieren Sie diese Werte für später.
https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904
Übersicht über das Synchronprogramm
Vor dem Hochladen des Synchronsteuerprogramms müssen Sie zuerst die vom Kalibrierungsprogramm ausgegebenen Werte in Zeile 23 kopieren und das aktuelle Array {908, 906} durch Ihre eigenen Werte ersetzen. Wenn Sie den 35-Pfund-Linearantrieb verwenden, müssen Sie außerdem den Wert der Variablen in Zeile 29 von 20 Millisekunden auf 8 Millisekunden ändern.
Nach einmaligem vollständigen Einfahren (um den Ursprung zu identifizieren) können Sie beide Linearantriebe synchron bewegen, indem Sie die drei Tasten drücken, die den Befehlen zum Ausfahren, Einfahren und Stoppen entsprechen. Die Aktuatoren bleiben auch bei ungleichmäßiger Belastung synchron, indem sie ihre relativen Impulszähler vergleichen und die Geschwindigkeit zwischen ihnen so einstellen, dass sie immer synchron bleiben. Beachten Sie, dass das aktuelle Programm einen einfachen Proportionalregler, Leitung 93, implementiert, der als solcher einem Überschwingen und Schwingen um das Gleichgewicht ausgesetzt ist. Sie können dies einstellen, indem Sie die in Zeile 37 definierte Variable K_p variieren.Dies geschieht am einfachsten, indem Sie ein Potentiometer an den analogen Pin A0 anschließen und den Code zum Lesen des Potentiometers ändern und die Funktion map () verwenden: K_p = map (analogRead (A0), 0, 1023, 0, 20000);
Für die besten Ergebnisse empfehlen wir dringend, den Proportionalregler zu entfernen und einen PID-Regelkreis zu implementieren. Dies geht jedoch über den Rahmen dieses einführenden Tutorials hinaus und wurde absichtlich weggelassen.
https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6
Verwenden von Bullet 36- und Bullet 50-Aktuatoren synchron
Zusätzlich zu unserem Linearantrieb der optischen Serie bieten wir zwei Linearantriebe mit eingebauten Encodern an: den Bullet 36 Cal. und der Bullet 50 Cal, die beide einen internen Quadratur-Hall-Effekt-Encoder haben. Der Hall-Effekt-Encoder arbeitet nach dem gleichen Prinzip wie der optische Encoder, verwendet jedoch anstelle von Licht Magnetismus. Als Quadraturcodierer verfügt er außerdem über zwei Signalausgänge, die jeweils um 90 Grad phasenverschoben sind. Daher müssen Sie eine Arduino-Karte mit 4 oder mehr Interrupt-Pins verwenden (der Arduino Uno hat nur zwei) und den Code ändern, um die Eingabe von zwei Signalen pro Aktor zu verarbeiten. Darüber hinaus muss die Entprellzeitvariable falsepulseDelay zusammen mit K_p abgestimmt werden.
Tipps zum Schreiben Ihres eigenen Programms
Mehr als zwei Linearantriebe
Bei Verwendung von zwei oder mehr Linearantrieben funktioniert der Arduino Uno nicht mehr, da nur zwei Interrupt-Pins verfügbar sind. Sie müssen eine Arduino-Karte mit der entsprechenden Anzahl verfügbarer Interrupt-Pins verwenden. Weitere Informationen: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
Zweitens ist es im Interesse der Effizienz ratsam, Ihre Programmierung mithilfe von Arrays und for () - Schleifen zu vektorisieren, um über jeden Aktuator zu iterieren.
Entprellen
Wie bei vielen Sensoren ist es wichtig, die reflektierenden Signale zu kennen. Wie bei mechanischen Schaltern können auch Encoder unter Prellen leiden. Im obigen Beispiel wurde der Entprellungsprozess durch eine einfache Verzögerung (definiert durch die Variable falsepulseDelay) behandelt. Es ist wichtig, dies bei allen Softwareänderungen zu handhaben, die Sie vornehmen, oder mit physischen Schaltkreisen, um das Prellrauschen herauszufiltern.
Handhabung rollen über
Wenn Sie den Code ändern, beachten Sie den Rollover, wenn Sie mit der Funktion millis () arbeiten. Sowohl millis () als auch das lastDebounceTime-Array werden als vorzeichenlose lange Variablen deklariert, was bedeutet, dass sie Werte bis zu 4.294.967.295 (32 ^ 2-1) speichern können. Dies entspricht einer Rollover-Zeit von 49,7 Tagen. Das aktuelle Programm ist für den Rollover in den ISR-Funktionen (Interrupt Service Routine) ausgelegt: count_0 & count_1. Wenn Sie dieses Programm jedoch ändern, müssen Sie den variablen Rollover korrekt verarbeiten. Andernfalls stürzt Ihr Programm nach ca. 49,7 Tagen ununterbrochener Verwendung ab. Weitere Informationen finden Sie unter: https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/