Inhaltsverzeichnis:
- Schritt 1: Vivado Hardware-Setup
- Schritt 2: Blockdesign einrichten
- Schritt 3: Erstellen Sie einen benutzerdefinierten PWM-IP-Block
- Schritt 4: PWM-IP-Block zum Design hinzufügen
- Schritt 5: Konfigurieren Sie den HDL-Wrapper und richten Sie die Einschränkungsdatei ein
- Schritt 6: Bitstream generieren
- Schritt 7: Projekt im SDK einrichten
- Schritt 8: FreeRTOS-Code-Änderungen
- Schritt 9: 3D-Druck für Stabilisator
- Schritt 10: Zusammenbau der Teile
- Schritt 11: Zybo mit Stabilisator verbinden
- Schritt 12: True North Correction
- Schritt 13: Ausführen des Programms
Video: Handheld-Kamerastabilisator - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Einführung
Dies ist eine Anleitung zum Erstellen eines 3-Achsen-Handkamera-Stabilisierungs-Rigs für eine GoPro mit einem Digilent Zybo Zynq-7000-Entwicklungsboard. Dieses Projekt wurde für die Klasse CPE Real-Time Operating Systems (CPE 439) entwickelt. Der Stabilisator verwendet drei Servos und eine IMU, um die Bewegung des Benutzers zu korrigieren, um die Kamera waagerecht zu halten.
Erforderliche Teile für das Projekt
- Digilent Zybo Zynq-7000 Entwicklungsboard
- Sparkfun IMU Breakout - MPU 9250
- 2 HiTec HS-5485HB Servos (180-Grad-Bewegung kaufen oder von 90 bis 180 Grad programmieren)
- 1 HiTec HS-5685MH Servo (180-Grad-Bewegung kaufen oder von 90 bis 180 Grad programmieren)
- 2 Standard-Servohalterungen
- 1 Steckbrett
- 15 Stecker-zu-Stecker-Überbrückungsdrähte
- 4 Stecker-zu-Buchse-Überbrückungsdrähte
- Heißkleber
- Griff oder Griff
- Holzdübel mit 5 mm Durchmesser
- GoPro oder andere Kamera und Befestigungsmaterial
- Netzteil, das 5V ausgeben kann.
- Zugriff auf 3D-Drucker
Schritt 1: Vivado Hardware-Setup
Beginnen wir mit der Erstellung des zugrunde liegenden Blockdesigns für das Projekt.
- Öffnen Sie Vivado 2016.2, klicken Sie auf das Symbol "Neues Projekt erstellen" und klicken Sie auf "Weiter>".
- Benennen Sie Ihr Projekt und klicken Sie auf "Weiter >".
- Wählen Sie das RTL-Projekt aus und klicken Sie auf "Weiter >".
- Geben Sie in die Suchleiste xc7z010clg400-1 ein und wählen Sie dann das Teil aus und klicken Sie auf "Weiter >" und "Fertig stellen".
Schritt 2: Blockdesign einrichten
Jetzt beginnen wir mit der Generierung des Blockdesigns, indem wir den Zynq IP-Block hinzufügen und einrichten.
- Klicken Sie im linken Bereich unter IP Integrator auf "Blockdesign erstellen" und dann auf "OK".
- Klicken Sie mit der rechten Maustaste in die Registerkarte "Diagramm" und wählen Sie "IP hinzufügen…".
- Geben Sie "ZYNQ7 Processing System" ein und klicken Sie auf die Auswahl.
- Doppelklicken Sie auf den angezeigten Zynq-Block.
- Klicken Sie auf "XPS-Einstellungen importieren" und importieren Sie die bereitgestellte Datei "ZYBO_zynq_def.xml".
- Gehen Sie zu "MIO Configuration" und wählen Sie "Application Processor Unit" und aktivieren Sie Timer 0 und Watchdog-Timer.
- Wählen Sie auf derselben Registerkarte unter "I/O Peripherals" ENET 0 (und ändern Sie das Dropdown-Menü auf "MIO 16.. 27", USB 0, SD 0, UART 1, I2C 0).
- Überprüfen Sie unter "GPIO" GPIO MIO, ENET Reset, USB Reset und I2C Reset.
- Navigieren Sie nun zu „Uhrenkonfiguration“. Wählen Sie FCLK_CLK0 unter PL Fabric Clocks aus. Klicken Sie dann auf "OK".
Schritt 3: Erstellen Sie einen benutzerdefinierten PWM-IP-Block
Dieser IP-Block ermöglicht es der Platine, ein PWM-Signal auszusenden, um die Bewegung der Servos zu steuern. Die Arbeit basierte stark auf dem Tutorial von Digitronix Nepal, das hier zu finden ist. Logik wurde hinzugefügt, um den Takt zu verlangsamen, damit der Impuls mit der richtigen Rate ausgegeben wurde. Der Block nimmt eine Zahl von 0 bis 180 und wandelt sie in einen Impuls von 750-2150 us um.
- Klicken Sie nun auf der Registerkarte Extras in der oberen linken Ecke auf "IP erstellen und paketieren …" und klicken Sie auf Weiter.
- Wählen Sie dann "Neues AXI4-Peripheriegerät erstellen" und klicken Sie auf Weiter.
- Benennen Sie Ihren PWM-IP-Block (wir haben ihn pwm_core genannt) und klicken Sie auf Weiter und dann auf der nächsten Seite auch auf Weiter.
- Klicken Sie nun auf "IP bearbeiten" und klicken Sie auf Fertig stellen. Dies öffnet ein neues Fenster zum Bearbeiten des PWM-Blocks.
- Erweitern Sie im Reiter "Quellen" und unter "Designquellen" 'pwm_core_v1_0' (ersetzen Sie pwm_core durch Ihren Namen) und öffnen Sie die sichtbar werdende Datei.
- Kopieren Sie den unter 'pwm_core_v1_0_S00_AXI.v' bereitgestellten Code und fügen Sie ihn in die Zip-Datei am Ende des Projekts ein. Strg + Umschalt + R und ersetzen Sie 'pwm_core' durch Ihren Namen für den IP-Block.
- Als nächstes öffne ' name _v1_0' und kopiere den bereitgestellten Code in die Datei 'pwm_core_v1_0.v'. Strg + Umschalt + R und ersetzen Sie 'pwm_core' durch name.
- Navigieren Sie nun zur Registerkarte "Paket-IP - Name" und wählen Sie "Anpassungsparameter".
- Auf dieser Registerkarte befindet sich oben eine gelbe Leiste mit verknüpftem Text. Wählen Sie dies aus und "Hidden Parameters" wird im Feld angezeigt.
- Gehen Sie nun zu "Customization GUI" und klicken Sie mit der rechten Maustaste auf Pwm Counter Max und wählen Sie "Edit Parameter…".
- Aktivieren Sie die Kontrollkästchen "In Anpassungs-GUI sichtbar" und "Bereich angeben".
- Ändern Sie das Dropdown-Menü "Typ:" in Bereich von ganzen Zahlen und setzen Sie das Minimum auf 0 und das Maximum auf 65535 und aktivieren Sie das Kontrollkästchen "Bereich anzeigen". Klicken Sie nun auf OK.
- Ziehen Sie Pwm Counter Max unter den Baum „Seite 0“. Gehen Sie nun zu "Re-Package and Package" und klicken Sie auf die Schaltfläche "Re-Package IP".
Schritt 4: PWM-IP-Block zum Design hinzufügen
Wir werden den IP-Block zum Blockdesign hinzufügen, um dem Benutzer den Zugriff auf den PWM-IP-Block über den Prozessor zu ermöglichen.
- Klicken Sie mit der rechten Maustaste in die Registerkarte Diagramm und klicken Sie auf "IP-Einstellungen…". Navigieren Sie zum Register "Repository-Manager".
- Klicken Sie auf die grüne Plus-Schaltfläche und wählen Sie sie aus. Suchen Sie nun ip_repo im Dateimanager und fügen Sie es dem Projekt hinzu. Klicken Sie dann auf Übernehmen und dann auf OK.
- Klicken Sie mit der rechten Maustaste in die Diagrammregisterkarte und klicken Sie auf "IP hinzufügen…". Geben Sie Ihren PWM-IP-Blocknamen ein und wählen Sie ihn aus.
- Am oberen Bildschirmrand sollte ein grüner Balken angezeigt werden. Wählen Sie zuerst "Verbindungsautomatisierung ausführen" und klicken Sie auf OK. Klicken Sie dann auf "Blockautomatisierung ausführen" und klicken Sie auf OK.
- Doppelklicken Sie auf den PWM-Block und ändern Sie Pwm Counter Max von 128 auf 1024.
- Bewegen Sie Ihren Mauszeiger über PWM0 auf dem PWM-Block. Es sollte einen kleinen Bleistift geben, der auftaucht, wenn Sie dies tun. Klicken Sie mit der rechten Maustaste und wählen Sie „Port erstellen…“und klicken Sie auf OK, wenn sich ein Fenster öffnet. Dadurch wird ein externer Port erstellt, an den das Signal weitergeleitet wird.
- Wiederholen Sie Schritt 6 auch für PWM1 und PWM2.
- Suchen Sie das kleine kreisförmige Doppelpfeilsymbol in der Seitenleiste und klicken Sie darauf. Es wird das Layout neu generieren und Ihr Blockdesign sollte wie im Bild oben aussehen.
Schritt 5: Konfigurieren Sie den HDL-Wrapper und richten Sie die Einschränkungsdatei ein
Wir werden jetzt das High-Level-Design für unser Blockdesign generieren und dann PWM0, PWM1 und PWM2 auf Pmod-Pins auf dem Zybo-Board abbilden.
- Wechseln Sie zum Reiter "Quellen". Klicken Sie mit der rechten Maustaste auf Ihre Blockdesigndatei unter "Designquellen" und klicken Sie auf "HDL-Wrapper erstellen…". Wählen Sie "Generierten Wrapper kopieren, um Benutzerbearbeitungen zuzulassen" und klicken Sie auf OK. Dadurch wird das High Level Design für das von uns erstellte Blockdesign generiert.
- Der Pmod, an den wir ausgeben werden, ist JE.
- Wählen Sie unter Datei "Quellen hinzufügen…" und wählen Sie "Einschränkungen hinzufügen oder erstellen" und klicken Sie auf Weiter.
- Klicken Sie auf Dateien hinzufügen und wählen Sie die enthaltene Datei "ZYBO_Master.xdc" aus. Wenn Sie in diese Datei schauen, werden Sie feststellen, dass bis auf sechs "set_property"-Zeilen unter "##Pmod Header JE" alles unkommentiert ist. Sie werden feststellen, dass PWM0, PWM1 und PWM2 die Argumente für diese Zeilen sind. Sie sind auf Pin 1, Pin 2 und Pin 3 des JE Pmod abgebildet.
Schritt 6: Bitstream generieren
Wir müssen den Bitstream für das Hardwaredesign generieren, um ihn in das SDK zu exportieren, bevor wir fortfahren.
- Wählen Sie in der Seitenleiste unter "Programmieren und Debuggen" die Option "Bitstream generieren". Dadurch wird die Synthese ausgeführt, dann die Implementierung und dann der Bitstrom für das Design.
- Korrigieren Sie alle angezeigten Fehler, aber Warnungen können im Allgemeinen ignoriert werden.
- Gehen Sie zu Datei->SDK starten und klicken Sie auf OK. Dadurch wird das Xilinx-SDK geöffnet.
Schritt 7: Projekt im SDK einrichten
Dieser Teil kann ein wenig frustrierend sein. Stellen Sie im Zweifelsfall ein neues BSP her und ersetzen Sie das alte. Das hat uns eine Menge Debugging-Zeit gespart.
- Laden Sie zunächst die neueste Version von FreeRTOS hier herunter.
- Extrahieren Sie alles aus dem Download und importieren Sie FreeRTOS in das SDK, indem Sie auf Datei->Importieren klicken und unter "Allgemein" auf "Vorhandene Projekte in den Arbeitsbereich" klicken und dann auf Weiter klicken.
- Gehen Sie im FreeRTOS-Ordner zu "FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702". Importieren Sie "RTOSDemo" nur von diesem Speicherort.
- Erstellen Sie nun ein Board Support Package (BSP), indem Sie auf Datei->Neues Board Support Package klicken.
- Wählen Sie "ps7_cortexa9_0" und aktivieren Sie "lwip141" und klicken Sie auf OK.
- Klicken Sie mit der rechten Maustaste auf den blauen Ordner von RTOSDemo und wählen Sie "Projektreferenzen".
- Deaktivieren Sie "RTOSDemo_bsp" und überprüfen Sie das neue BSP, das wir gerade erstellt haben.
Schritt 8: FreeRTOS-Code-Änderungen
Der von uns bereitgestellte Code kann in 7 verschiedene Dateien unterteilt werden. main.c, iic_main_thread.c, xil_printfloat.c, xil_printfloat.h, IIC_funcs.c, IIC_funcs.h und iic_imu.h. Der Code in iic_main_thread.c wurde aus der Bibliothek von Kris Winer übernommen, die Sie hier finden. Wir haben seinen Code hauptsächlich transformiert, um Aufgaben zu integrieren und ihn mit dem Zybo-Board zum Laufen zu bringen. Wir haben auch Funktionen zur Berechnung der Ausrichtungskorrektur der Kamera hinzugefügt. Wir haben einige print-Anweisungen belassen, die für das Debugging nützlich sind. Die meisten von ihnen sind auskommentiert, aber wenn Sie das Bedürfnis verspüren, können Sie sie auskommentieren.
- Der einfachste Weg, die Datei main.c zu ändern, besteht darin, den Code durch kopierten Code aus unserer mitgelieferten Datei main.c zu ersetzen.
- Um eine neue Datei zu erstellen, klicken Sie mit der rechten Maustaste auf den src-Ordner unter RTOSDemo und wählen Sie C-Quelldatei. Benennen Sie diese Datei "iic_main_thread.c".
- Kopieren Sie den Code aus dem mitgelieferten "iic_main_thread.c" und fügen Sie ihn in Ihre neu erstellte Datei ein.
- Wiederholen Sie die Schritte 2 und 3 mit den verbleibenden Dateien.
- erfordert eine Verknüpfungsanweisung in gcc. Um dies zum Build-Pfad hinzuzufügen, klicken Sie mit der rechten Maustaste auf RTOSDemo und wählen Sie "C/C++ Build Settings".
- Ein neues Fenster wird geöffnet. Navigieren Sie zu ARM v7 gcc-Linker->Bibliotheken. Wählen Sie die kleine Add-Datei in der oberen rechten Ecke aus und geben Sie "m" ein. Dies schließt die Mathematikbibliothek in das Projekt ein.
- Erstellen Sie das Projekt mit Strg + B, um zu bestätigen, dass alles funktioniert. Überprüfen Sie die generierten Warnungen, aber Sie können sie möglicherweise ignorieren.
- Es gibt ein paar Orte, die geändert werden müssen, hauptsächlich die magnetische Deklination Ihres aktuellen Standorts. Wie Sie dies ändern können, erklären wir im Kalibrierungsteil des Tutorials.
Schritt 9: 3D-Druck für Stabilisator
Sie müssen für dieses Projekt ein paar Teile in 3D drucken. Wahrscheinlich kann man Teile kaufen, die ähnliche Abmessungen/Größen wie unsere gedruckten Teile haben.
- Verwenden Sie die mitgelieferten Dateien, um den Arm und die Halteklammer für die GoPro auszudrucken.
- Sie müssen der.stl-Datei ein Gerüst hinzufügen.
- Schneiden/Reinigen Sie Teile des überschüssigen Gerüsts nach dem Drucken.
- Sie können den Holzdübel bei Bedarf durch ein 3D-gedrucktes Teil ersetzen.
Schritt 10: Zusammenbau der Teile
Die Montage des Stabilisators besteht aus mehreren Teilen. Die gekauften Halterungen werden mit 4 selbstschneidenden Schrauben und 4 Schrauben mit Muttern geliefert. Da es 3 Servos gibt, muss eines der Servohörner vorgebohrt werden, damit 2 der Schrauben durchpassen.
- Löten Sie 8 Pins auf den IMU-Breakout, 4 auf jeder Seite.
- Die IMU wird an der 3D-gedruckten Halteklammer für die GoPro in der Mitte der Halterung befestigt.
- Richten Sie die Halterung so aus, dass sich die Servomontagelöcher auf Ihrer linken Seite befinden. Platzieren Sie die IMU an der Ihnen am nächsten liegenden Kante, wobei die Stifte von der Kante hängen. Platzieren Sie dann die GoPro-Halterung oben auf der IMU und kleben Sie die IMU und die Halterung an der Halterung fest.
- Befestigen Sie einen HS-5485HB an der Servohalterung, die in den 3D-gedruckten Arm integriert ist.
- Schrauben Sie die GoPro-Halterung in das am Arm befestigte Servo und achten Sie darauf, dass das Servo so eingestellt ist, dass es sich in der Mitte seines Bewegungsbereichs befindet.
- Als nächstes befestigen Sie das HS-5685MH-Servo an einer Servohalterung. Tippen Sie dann mit einer der Schrauben auf das Servohorn. Befestigen Sie nun das Servo an der Unterseite der letzten Servohalterung.
- Befestigen Sie nun das letzte Servo an der Halterung, in die das HS-5685MH-Servo eingeschraubt ist. Schrauben Sie dann den Arm in dieses Servo und stellen Sie sicher, dass der Arm angeschraubt ist, damit er sich in jede Richtung um 90 Grad bewegen kann.
- Um die Konstruktion des Gimbals abzuschließen, fügen Sie ein kleines Stück des Holzdübels hinzu, um die GoPro-Halterung und den 3D-gedruckten Arm zu verbinden. Sie haben nun den Stabilisator zusammengebaut.
- Schließlich können Sie einen Griff hinzufügen, der mit der unteren Servohalterung verbunden ist.
Schritt 11: Zybo mit Stabilisator verbinden
Dabei sind ein paar Dinge zu beachten. Sie möchten sicherstellen, dass die 5V vom Netzteil niemals in das Zybo-Board gehen, da dies zu Problemen mit dem Board führen würde. Stellen Sie sicher, dass Sie Ihre Jumper überprüfen, um sicherzustellen, dass keine Drähte vertauscht werden.
- Um den Zybo am Stabilisator zu befestigen, benötigen Sie 15 männliche zu männliche Jumper und 4 männliche zu weibliche Jumper.
- Verbinden Sie zuerst zwei Jumper mit Ihrem 5V-Netzteil entlang der + und - Schienen des Steckbretts. Diese versorgen die Servos mit Strom.
- Verbinden Sie dann 3 Paar Jumper mit den + und - Schienen des Steckbretts. Dies ist die Leistung für jeden der Servos.
- Stecken Sie das andere Ende der + und - Jumper in jedes der Servos.
- Verbinden Sie einen Jumper zwischen der - Schiene des Steckbretts und einem der GND-Pins des Zybo JE Pmod (siehe Bild von Schritt 5). Dadurch wird eine gemeinsame Masse zwischen dem Zybo-Board und dem Netzteil geschaffen.
- Schließen Sie als nächstes ein Signalkabel an Pin 1, Pin 2 und Pin 3 des JE Pmod an. Pin 1 ist dem unteren Servo zugeordnet, Pin 2 ist dem Servo am Ende des Arms zugeordnet und Pin 3 ist dem mittleren Servo zugeordnet.
- Stecken Sie die 4 weiblichen Drähte in die GND-, VDD-, SDA- und SCL-Pins des IMU-Breakouts. GND und VDD stecken in GND und 3V3 an den JF-Pins. Stecken Sie den SDA-Pin in Pin 8 und SCL in Pin 7 am JF (siehe Bild von Schritt 5).
- Schließlich verbinden Sie den Computer mit einem Micro-USB-Kabel mit dem Board. Dies ermöglicht die Uart-Kommunikation und ermöglicht es Ihnen, das Zybo-Board zu programmieren.
Schritt 12: True North Correction
Die Kalibrierung des Magnetometers in der IMU ist für den korrekten Betrieb des Geräts wichtig. Die magnetische Deklination, die den magnetischen Norden zum geographischen Norden korrigiert.
- Um den Unterschied zwischen magnetischem und geographischem Norden zu korrigieren, müssen Sie eine Kombination aus zwei Diensten verwenden, Google Maps und dem Magnetfeldrechner von NOAA.
- Verwenden Sie Google Maps, um den Breiten- und Längengrad Ihres aktuellen Standorts zu ermitteln.
- Nehmen Sie Ihren aktuellen Längen- und Breitengrad und stecken Sie ihn in den Magnetfeldrechner.
- Zurückgegeben wird die magnetische Deklination. Fügen Sie diese Berechnung in den Code in Zeile 378 von "iic_main_thread.c" ein. Wenn Ihre Deklination Ost ist, ziehen Sie vom Gierwert ab, wenn West, addieren Sie den Gierwert.
*Foto stammt aus der MPU 9250-Anleitung von Sparkfun, die Sie hier finden.
Schritt 13: Ausführen des Programms
Der Moment, auf den Sie gewartet haben! Der beste Teil des Projekts ist, zu sehen, wie es funktioniert. Ein Problem, das uns aufgefallen ist, ist die Abweichung von den von der IMU gemeldeten Werten. Ein Tiefpassfilter kann helfen, diese Drift zu korrigieren, und das Hantieren mit Magnetometer-, Beschleunigungs- und Gyro-Kalibrierungen hilft auch dabei, diese Drift zu korrigieren.
- Erstellen Sie zuerst alles im SDK, dies kann durch Drücken von Strg + B erfolgen.
- Stellen Sie sicher, dass die Stromversorgung eingeschaltet und auf 5 V eingestellt ist. Überprüfen Sie noch einmal, ob alle Drähte an die richtigen Stellen gehen.
- Drücken Sie dann zum Ausführen des Programms auf das grüne Dreieck in der oberen Mitte der Taskleiste.
- Wenn das Programm läuft, werden die Servos alle auf ihre 0-Positionen zurückgesetzt, also seien Sie bereit für die Bewegung des Rigs. Sobald das Programm initialisiert ist, schnappen die Servos in ihre 90-Grad-Position zurück.
- Eine Magnetometer-Kalibrierungsfunktion wird ausgeführt und Anweisungen werden an das UART-Terminal ausgedruckt, das Sie über einen seriellen Monitor wie 'Putty' oder den im SDK bereitgestellten seriellen Monitor anschließen können.
- Bei der Kalibrierung müssen Sie das Gerät etwa 10 Sekunden lang in einer 8 bewegen. Sie können diesen Schritt entfernen, indem Sie Zeile 273 von "iic_main_thread.c" auskommentieren. Wenn Sie es auskommentieren, müssen Sie die Zeilen 323 - 325 "iic_main_thread.c" auskommentieren. Diese Werte wurden ursprünglich aus der obigen Magnetometerkalibrierung entnommen und dann als Werte eingesteckt.
- Nach der Kalibrierung wird der Stabilisierungscode initialisiert und das Gerät hält die Kamera stabil.