Projekt 57: Arduino Segway: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 6: | Zeile 6: | ||
<div class="tright" style="clear:none">[[Datei:Segway_Freigestellt.jpg|200px|thumb|Segway Gesamt]]</div> | <div class="tright" style="clear:none">[[Datei:Segway_Freigestellt.jpg|200px|thumb|Segway Gesamt]]</div> | ||
<br/> | <br/><br/><br/><br/> | ||
<br/> | |||
== Das Projekt == | == Das Projekt == | ||
Zeile 38: | Zeile 37: | ||
*7x Metall Unterlegscheibe (Innendurchmesser 0,8cm Außendurchmesser 2,3cm) | *7x Metall Unterlegscheibe (Innendurchmesser 0,8cm Außendurchmesser 2,3cm) | ||
*3x Metallschrauben M5 Länge 3cm | *3x Metallschrauben M5 Länge 3cm | ||
* | *4x M5 Unterlegscheiben | ||
*10x Isolierende Gummi-Abstandsscheiben (für M3 Schrauben, 3mm Stärke) | |||
*1x M5 Mutter | *1x M5 Mutter | ||
*1x M4 Gewindestange 1m | *1x M4 Gewindestange 1m | ||
Zeile 94: | Zeile 94: | ||
*5mm Löcher in das Plexiglas für die Potentiometer gebohrt | *5mm Löcher in das Plexiglas für die Potentiometer gebohrt | ||
*Potentiometer in das Plexiglas eingeschraubt. Über Gewinde am Potentiometer. | *Potentiometer in das Plexiglas eingeschraubt. Über Gewinde am Potentiometer. | ||
*Folgende Komponenten mit einer Gummi Abstandsscheibe versehen | |||
*Gyroskop an die mit 3mm Vorgeborten Löcher mit M3 Schrauben geschraubt und mit Mutter auf der Unterseite befestigt | *Gyroskop an die mit 3mm Vorgeborten Löcher mit M3 Schrauben geschraubt und mit Mutter auf der Unterseite befestigt | ||
*Platine Ebenfalls mit M3 Schrauben verschraubt und befestigt | *Platine Ebenfalls mit M3 Schrauben verschraubt und befestigt | ||
*In die Unterseite ein 9mm Loch gebohrt um die Kabel rausführen zu können | *In die Unterseite ein 9mm Loch gebohrt um die Kabel rausführen zu können | ||
*Zusätzlich wurde eine kleine Schaltung entworfen. Diese besitzt einen 10 nanofarad Keramik Kondensator (C1) zwischen Plus und Minus für die Entstörung. Ein weiterer 10 Mikrofarad Elektrolyt Kondensator (C2) ist dabei für eine Strom Speicherung für den Gyrosensor vorhanden. Denn der Gyrosensor benötigt eine sehr stabile Spannung um fehlerfreie Werte liefern zu können. | *Zusätzlich wurde eine kleine Schaltung entworfen. Diese besitzt einen 10 nanofarad Keramik Kondensator (C1) zwischen Plus und Minus für die Entstörung. Ein weiterer 10 Mikrofarad Elektrolyt Kondensator (C2) ist dabei für eine Strom Speicherung für den Gyrosensor vorhanden. Denn der Gyrosensor benötigt eine sehr stabile Spannung um fehlerfreie Werte liefern zu können. | ||
<br/> | |||
[[Datei:Segway_Steuerbox_Schaltung.PNG|500px|mini|left|Schaltplan]] | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
Zeile 110: | Zeile 113: | ||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
---- | ---- | ||
Zeile 122: | Zeile 119: | ||
[[Datei:Segway_Schaltplan.jpg|500px|mini|right|Schaltplan]] | [[Datei:Segway_Schaltplan.jpg|500px|mini|right|Schaltplan]] | ||
Die Verkabelung wurde in Fritzing geplant und wie in der Abbildung umgesetzt, einzig das Sensor Shield stand dort nicht zur Verfügung. Dies stellt aber kein Problem bei der Planung der Verkabelung dar, denn auf dem Sensor Shield gibt es einen extra Anschluss für den Gyro Sensor. Bei den Motoren wurde dabei auf ein Kabel mit 0,5mm Querschnitt gesetzt, für die restlichen Kabel 0,25mm. Der Akku wurde dabei mit dem Tamya Stecker und 5cm Kabel in die Klemmen des Rechten Shields geklemmt. Von hier aus gehen noch 2 Kabel zum Linken Shield, um dieses Ebenfalls mit Spannung vom Akku zu versorgen. Die Kabel wurden von der Bohrung aus am Stil verlegt, an diesem wurden sie mit Kabelbinder befestigt. | Die Verkabelung wurde in Fritzing geplant und wie in der Abbildung umgesetzt, einzig das Sensor Shield stand dort nicht zur Verfügung. Dies stellt aber kein Problem bei der Planung der Verkabelung dar, denn auf dem Sensor Shield gibt es einen extra Anschluss für den Gyro Sensor. Bei den Motoren wurde dabei auf ein Kabel mit 0,5mm Querschnitt gesetzt, für die restlichen Kabel 0,25mm. Der Akku wurde dabei mit dem Tamya Stecker und 5cm Kabel in die Klemmen des Rechten Shields geklemmt. Von hier aus gehen noch 2 Kabel zum Linken Shield, um dieses Ebenfalls mit Spannung vom Akku zu versorgen. Die Kabel der Steuerbox wurden von der Bohrung ider der Bodenplatte der Steuerbox aus am Stil verlegt, an diesem wurden sie mit Kabelbinder befestigt. Bevor die Verkablun nach dem Friting Plan vorgenommen wurde, musste das Sensor Shield auf den Arduino UNO aufgesteckt. | ||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
Zeile 132: | Zeile 129: | ||
<div class="tright" style="clear:none">[[Datei:Segway_Reifen_Achse_Anschliff.jpg|410px|mini|Angeschliffene Achse]]</div> | <div class="tright" style="clear:none">[[Datei:Segway_Reifen_Achse_Anschliff.jpg|410px|mini|Angeschliffene Achse]]</div> | ||
Weil es sich bei den Reifen um RC Reifen in der Größe 1:8 Handelt sind diese nicht für den Betrieb an den Getriebemotoren vorgesehen gewesen. Aus diesem Grund musste ein eigener | Weil es sich bei den Reifen um RC Reifen in der Größe 1:8 Handelt sind diese nicht für den Betrieb an den Getriebemotoren vorgesehen gewesen. Aus diesem Grund musste ein eigener kleiner Adapter nach der Folgenden Abbildung zusammengebaut werden. Bei dieser Verbindung war auf besonders hohe Stabilität zu achten, denn sie bilden gleichzeitig die Achse. Die Schrauben wurden dabei noch an einer Stelle etwa 1mm mit einer Pfeile abgeflacht. So war eine Sicherung gegen verdrehen durch das Anfahrdrehmoment der Motoren sichergestellt. An den Motoren ist diese Abflachung bereits vorhanden. Die Achskupplungen wurden auf die Schrauben gesteckt und mit den Schauben der Achskopplung festgeklemmt. Die Schrauben sollen dabei auf die Abflachungen Radschrauben geschraubt werden. | ||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
---- | |||
=== Montage === | |||
Begonnen wurde mit der Montage des Stiels, nach dem Vorbild der ersichtlichen Zeichnung. In diesem Schritt wurde gleich die Steuerbox befestigt. Dies wurde mit einer M5 Schraube in 3cm umgesetzt. Zusätzlich wurde die Verschraubung auf der Außenseite am Stil mit einer Unterlegscheibe versehen. Daraufhin wurden zunächst die Motoren an der Etage 2 befestigt. Dabei war zu beachten, dass zunächst alle schrauben in die zugehörigen Löcher gesteckt werden mussten, da die Halterung der Motoren die Löcher daraufhin bedeckte. Danach wurden die restliche Hardware mit den M3 Schrauben befestigt (Arduino UNO, Motor Shields). Diese haben haben pro Schraube eine Gummi Abstandsscheibe. Auf Etage drei wurde noch ein Gummi gespannt, dies soll ein Verrutschen des Akkus verhindern. Dann wurde Etage zwei und Etage drei mit einem Abstand von 7cm mithilfe der M4 Gewindestangen verbunden. Die Etagen wurden dabei durch die M4 Muttern Positioniert und von der Gegenseite mit einer Weiteren M4 Mutter leicht fest geklemmt. Der bereits vormontierte Stiel mit der Steuerbox wurde mit einer 3cm M5 Schraube an Etage ein befestigt. Dabei wurden auf beide seiten Unterlegscheiben untergelegt, um die Belastung auf das Glas zu verteilen. Bevor Etage eins ebenfalls verschraubt wurde mussten noch die Kabel des Stils auf dem Sensor Shield versteckt werden. Jetzt konnte auch Etage eins mit den Restlichen Etagen über die Gewindestangen verschraubt werden. Auchhier mit einem Abstand von 7cm. Als letzten Schritt mussten noch die Räder an den Motoren befestigt werden. Hierzu wurden die Achskupplungen auf die Motoren gesteckt und auch dort durch die Schrauben der Achskupplung fest geklemmt. | |||
---- | ---- | ||
<br/> | <br/> | ||
== Software des Arduino UNO == | == Software des Arduino UNO == | ||
Die folgende Software wurde mit der Arduino IDE Entwicklungsumgebung entwickelt. Es wurden einige Bibliotheken eingebunden, die bei der Kommunikation mit dem Gyrosensor helfen sollten. Zunächst sollten die gegebenen Offsets für unseren Gyrosensor herausgefunden werden. Dazu wurde ein Beispielprogramm genutzt, welches die aktuellen Gyroskop-Werte ausgab. Der aktuelle Wert im gerade stehenden Zustand wurde als Referenzwert, in welchen sich das Segway zu begeben versuchen sollte, gewählt. Der Hauptteil des Programms maß ständig die Winkeländerung und ermittelte über die vergangene Zeit den aktuellen Winkel. Sobald dieser über 45 Grad groß wurde, wurde nichts weiter ausgeführt um so beim Umfallen des Segway die Motoren zu stoppen. Solange aber der Winkel unter 45 Grad groß war sollte das Segway sich wieder in eine gerade Position bringen. Dieses sollte durch ansteuern der Motoren passieren, welche durch Fahrt in die Richtung in welche das Segway kippte, dieses wieder aufstellten. Die Kraft mit der die Motoren angesteuert werden sollten wurde mit einem PID Reglerberechnet. Dieser bekam als Eingangsgröße den aktuellen Abweichungswinkel und hatte die Kraft mit dem die Motoren angesteuert wurden als Ausgangsgröße. Die Werte mit denen der Regler laufen sollte wurden über feste Variablen definiert oder über die analogen Eingänge des Arduinos von den Potentiometern eingelesen. <br/><br/> | |||
Im Folgenden ist unser Programm angehangen. Die Biblioteken könen aus dem Internet oder dem Programmordner im Zugehörigen SVN Verzeichnis bezogen werden. | |||
---- | ---- | ||
Zeile 213: | Zeile 220: | ||
void loop() | void loop() | ||
{ | { | ||
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); | accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // Aktuellen wert des Gyro/Accelometer laden | ||
r_angle = (atan2(ay, az) * 180 / pi + Winkel_offset); // Aktueller Winkel (bei 0 Grad steht das Segway gerade) | r_angle = (atan2(ay, az) * 180 / pi + Winkel_offset); // Aktueller Winkel (bei 0 Grad steht das Segway gerade) | ||
omega = Gyro_Verstaerkung * (gx + Gry_offset); Serial.print(" omega="); Serial.println(omega); | omega = Gyro_Verstaerkung * (gx + Gry_offset); Serial.print(" omega="); Serial.println(omega); | ||
if (abs(r_angle)<45){ // Winkel kleiner als 45 Grad | if (abs(r_angle)<45){ // Winkel kleiner als 45 Grad | ||
myPID(); // Berechnung der aktuelen PID Werte | myPID(); // Berechnung der aktuelen PID Werte | ||
PWMControl(); // Ansteuern der Motoren mit aktuellen Werten | PWMControl(); // Ansteuern der Motoren mit aktuellen Werten | ||
} | } | ||
else{ // Wenn der winkel größer als 45 Grad wird soll angenommen werden, dass das Segway umgefallen ist und keine Bewegung mehr ausgeführt werden | else{ // Wenn der winkel größer als 45 Grad wird soll angenommen werden, dass das Segway umgefallen ist und keine Bewegung mehr ausgeführt werden | ||
Zeile 336: | Zeile 343: | ||
<br/> | <br/> | ||
== Fazit == | == Fazit == | ||
Text... | Text... |
Version vom 5. Februar 2016, 17:59 Uhr
Autoren: Philipp Tewes, Janis Ostermann
Betreuer: Prof. Dr. Mirek Göbel
Das Projekt
Das Projekt wurde von Philipp Tewes und Janis Ostermann im Rahmen des Elektrotechnik Fachpraktikums im WS 2015/16 bearbeitet. Das Ziel sollte es sein ein Segway auf der Basis eines Arduino UNO's zu entwerfen, welches sich selbst balancieren sollte um somit ohne Hilfe stehen zu können. Bevor mit dem Bau und der Programmierung des Segways begonnen wurde, sollten erst einmal einige Ziele definiert werden. Zuerst sollte die Hardware des Segways geplanen werden. Dazu wurde eine Teileliste angefertigt. Nachdem alle benötigten Teile eingetroffen waren wurde mit dem Bau der einzelnen Etagen begonnen. Fortgesetzt wurde die Arbeit mit dem Bau der Steuerbox welche den Gyro Sensor und die Potentiometer enthalten sollte. Die Potentiometer sollten zur einfachen Regulierung der Reglparameter dienen.
Nachdem alle Einzelteile Fertiggestellt waren ging es um die Verkabelung der Komponenten. Nach Montage und der Verkabelung wurde das Segway anschließend durch Anbringung der Räder fertig gestellt.
Anschließend bestand die Aufgabe eine passende Software für die Reglung des Segways zu entwerfen und abzustimmen.
Bau
Teile Liste
- 2x RC Reifen 1:8 (Durchmesser 10cm)
- 1x Bastelglas 25cm x 34cm
- 1x Holzstab 70cm x 1,2cm
- 1x Arduino Uno R3
- 1x Saint Smart Sensor Shield
- 2x Motor Drive L298N
- 1x Beschleunigungs und Gyro Sensor MPU-6050
- 2x Getriebemotor 12V DC MFA 919D1481 148:1
- 3x Potentiometer 10K
- 1x Ladegerät APC300
- 1x Akku-Pack PP2
- 2x Achskupplung (M5 auf M5)
- 2x Gummi Unterlegscheibe (Innendurchmesser 0,4cm Außendurchmesser 1,7cm)
- 7x Metall Unterlegscheibe (Innendurchmesser 0,8cm Außendurchmesser 2,3cm)
- 3x Metallschrauben M5 Länge 3cm
- 4x M5 Unterlegscheiben
- 10x Isolierende Gummi-Abstandsscheiben (für M3 Schrauben, 3mm Stärke)
- 1x M5 Mutter
- 1x M4 Gewindestange 1m
- 24x M4 Muttern
- 1x Tamya Stecker mit 5cm Kabel
- 18x M3 Schrauben (1,5cm) mit Muttern
- 4x Kleine Nägel
- 4x Kleine Schrauben
Etagen
Beim Aufbau des Segways wurde sich für ein Konzept aus drei Etagen entschieden. Dabei dient Etage eins für die Befestigung des Holzstils mit der Kiste und dem Lenker. Etage zwei ist dabei die Etage an der die MotorShields, der Arduino UNO R3 und die Motoren verschraubt sind. Etage drei dienst dabei als Auflage für das Akku Pack. Beim Aufbau wurde darauf geachtet das der Schwerpunkt möglichst tief und unter der Fahrzeugachse liegt. Daher Befinden sich das Akku Pack und der Motor unter der Fahrzeugachse. Dadurch entsteht ein Pendel Effekt der das Segway stabilisiert.
Etage 1
- 3mm Bohrungen für M4 Gewindestandgen
- Langloch für die Bohrung eingeschnitten
Etage 2
- 3mm Bohrungen für M4 Gewindestangen
- 2mm Bohrungen für Motoren und Motor-Shield
- Rote Löcher für Motor-Shields, nur Außen Bemaßt. Innere Löcher können je nach Shield abweichen. Außen wurde gebohrt und dann Innen entsprechend angezeichnet
- Grüne Löcher für Motoren, nur Außen Bemaßt. Innere Löcher können je nach Motor abweichen. Außen wurde gebohrt und dann Innen entsprechend angezeichnet
- Die Löcher für die Befestigungen der elektrischen Bauteile wurden gesenkt
- Arduino nur zur Kannte bemaßt, mittig aufgesetzt und angezeichnet
Etage 3
- 3mm Bohrungen für M4 Gewindestandgen
- Gummi überziehen
Steuerbox
- 5mm Löcher in das Plexiglas für die Potentiometer gebohrt
- Potentiometer in das Plexiglas eingeschraubt. Über Gewinde am Potentiometer.
- Folgende Komponenten mit einer Gummi Abstandsscheibe versehen
- Gyroskop an die mit 3mm Vorgeborten Löcher mit M3 Schrauben geschraubt und mit Mutter auf der Unterseite befestigt
- Platine Ebenfalls mit M3 Schrauben verschraubt und befestigt
- In die Unterseite ein 9mm Loch gebohrt um die Kabel rausführen zu können
- Zusätzlich wurde eine kleine Schaltung entworfen. Diese besitzt einen 10 nanofarad Keramik Kondensator (C1) zwischen Plus und Minus für die Entstörung. Ein weiterer 10 Mikrofarad Elektrolyt Kondensator (C2) ist dabei für eine Strom Speicherung für den Gyrosensor vorhanden. Denn der Gyrosensor benötigt eine sehr stabile Spannung um fehlerfreie Werte liefern zu können.
Stiel und Querstange
- Holzstiel in zwei Stücke geschnitten, einmal 50,5cm und 14cm
- Den 14cm Stiel mittig in eine Stirnfläche des längeren Stiels verschrauben, mit M5 Schraube 3cm und M5 Unterlegscheibe (vorgebohrt)
Verkabelung
Die Verkabelung wurde in Fritzing geplant und wie in der Abbildung umgesetzt, einzig das Sensor Shield stand dort nicht zur Verfügung. Dies stellt aber kein Problem bei der Planung der Verkabelung dar, denn auf dem Sensor Shield gibt es einen extra Anschluss für den Gyro Sensor. Bei den Motoren wurde dabei auf ein Kabel mit 0,5mm Querschnitt gesetzt, für die restlichen Kabel 0,25mm. Der Akku wurde dabei mit dem Tamya Stecker und 5cm Kabel in die Klemmen des Rechten Shields geklemmt. Von hier aus gehen noch 2 Kabel zum Linken Shield, um dieses Ebenfalls mit Spannung vom Akku zu versorgen. Die Kabel der Steuerbox wurden von der Bohrung ider der Bodenplatte der Steuerbox aus am Stil verlegt, an diesem wurden sie mit Kabelbinder befestigt. Bevor die Verkablun nach dem Friting Plan vorgenommen wurde, musste das Sensor Shield auf den Arduino UNO aufgesteckt.
Reifen
Weil es sich bei den Reifen um RC Reifen in der Größe 1:8 Handelt sind diese nicht für den Betrieb an den Getriebemotoren vorgesehen gewesen. Aus diesem Grund musste ein eigener kleiner Adapter nach der Folgenden Abbildung zusammengebaut werden. Bei dieser Verbindung war auf besonders hohe Stabilität zu achten, denn sie bilden gleichzeitig die Achse. Die Schrauben wurden dabei noch an einer Stelle etwa 1mm mit einer Pfeile abgeflacht. So war eine Sicherung gegen verdrehen durch das Anfahrdrehmoment der Motoren sichergestellt. An den Motoren ist diese Abflachung bereits vorhanden. Die Achskupplungen wurden auf die Schrauben gesteckt und mit den Schauben der Achskopplung festgeklemmt. Die Schrauben sollen dabei auf die Abflachungen Radschrauben geschraubt werden.
Montage
Begonnen wurde mit der Montage des Stiels, nach dem Vorbild der ersichtlichen Zeichnung. In diesem Schritt wurde gleich die Steuerbox befestigt. Dies wurde mit einer M5 Schraube in 3cm umgesetzt. Zusätzlich wurde die Verschraubung auf der Außenseite am Stil mit einer Unterlegscheibe versehen. Daraufhin wurden zunächst die Motoren an der Etage 2 befestigt. Dabei war zu beachten, dass zunächst alle schrauben in die zugehörigen Löcher gesteckt werden mussten, da die Halterung der Motoren die Löcher daraufhin bedeckte. Danach wurden die restliche Hardware mit den M3 Schrauben befestigt (Arduino UNO, Motor Shields). Diese haben haben pro Schraube eine Gummi Abstandsscheibe. Auf Etage drei wurde noch ein Gummi gespannt, dies soll ein Verrutschen des Akkus verhindern. Dann wurde Etage zwei und Etage drei mit einem Abstand von 7cm mithilfe der M4 Gewindestangen verbunden. Die Etagen wurden dabei durch die M4 Muttern Positioniert und von der Gegenseite mit einer Weiteren M4 Mutter leicht fest geklemmt. Der bereits vormontierte Stiel mit der Steuerbox wurde mit einer 3cm M5 Schraube an Etage ein befestigt. Dabei wurden auf beide seiten Unterlegscheiben untergelegt, um die Belastung auf das Glas zu verteilen. Bevor Etage eins ebenfalls verschraubt wurde mussten noch die Kabel des Stils auf dem Sensor Shield versteckt werden. Jetzt konnte auch Etage eins mit den Restlichen Etagen über die Gewindestangen verschraubt werden. Auchhier mit einem Abstand von 7cm. Als letzten Schritt mussten noch die Räder an den Motoren befestigt werden. Hierzu wurden die Achskupplungen auf die Motoren gesteckt und auch dort durch die Schrauben der Achskupplung fest geklemmt.
Software des Arduino UNO
Die folgende Software wurde mit der Arduino IDE Entwicklungsumgebung entwickelt. Es wurden einige Bibliotheken eingebunden, die bei der Kommunikation mit dem Gyrosensor helfen sollten. Zunächst sollten die gegebenen Offsets für unseren Gyrosensor herausgefunden werden. Dazu wurde ein Beispielprogramm genutzt, welches die aktuellen Gyroskop-Werte ausgab. Der aktuelle Wert im gerade stehenden Zustand wurde als Referenzwert, in welchen sich das Segway zu begeben versuchen sollte, gewählt. Der Hauptteil des Programms maß ständig die Winkeländerung und ermittelte über die vergangene Zeit den aktuellen Winkel. Sobald dieser über 45 Grad groß wurde, wurde nichts weiter ausgeführt um so beim Umfallen des Segway die Motoren zu stoppen. Solange aber der Winkel unter 45 Grad groß war sollte das Segway sich wieder in eine gerade Position bringen. Dieses sollte durch ansteuern der Motoren passieren, welche durch Fahrt in die Richtung in welche das Segway kippte, dieses wieder aufstellten. Die Kraft mit der die Motoren angesteuert werden sollten wurde mit einem PID Reglerberechnet. Dieser bekam als Eingangsgröße den aktuellen Abweichungswinkel und hatte die Kraft mit dem die Motoren angesteuert wurden als Ausgangsgröße. Die Werte mit denen der Regler laufen sollte wurden über feste Variablen definiert oder über die analogen Eingänge des Arduinos von den Potentiometern eingelesen.
Im Folgenden ist unser Programm angehangen. Die Biblioteken könen aus dem Internet oder dem Programmordner im Zugehörigen SVN Verzeichnis bezogen werden.
Programmcode
#include "Wire.h"
#include "SPI.h"
#include "nRF24L01.h"
#include "I2Cdev.h"
#include "MPU6050.h"
// Variablen für das Accelometer und den Gyro
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
// Definitionen von Schlüsselwörtern
#define Gry_offset 300 // Offset des Gyro
#define Gyro_Verstaerkung 0.00763358 // Verstärkung des Gyro Analog Signal
#define Winkel_offset -22 // Offset des Aktuellen Winkels
#define Motor_offset 0 // Motor Offset
#define pi 3.14159 // Definition von der zahl pi
// Variablen für den PID Regler
float kp, ki, kd;
float r_angle, f_angle, omega;
// Variablen für die Zeitberechnung
unsigned long preTime = 0;
float SampleTime = 0.08;
unsigned long lastTime;
float Output;
float errSum, dErr, error, lastErr;
int timeChange;
// Definition der Ports mit Variable für Pinmode
//Reifen rechts
int TN1=8; //TN3=5;
int TN2=9; //TN4=6;
int ENA=5; //ENB=10;
//Reifen links
int TN3=11; //TN1=3;
int TN4=10; //TN2=4;
int ENB=6; //ENA=9;
int sensorPin0 = A0; // Input Pin für das Potentiometer 0
int sensorPin1 = A1; // Input Pin für das Potentiometer 1
int sensorPin2 = A2; // Input Pin für das Potentiometer 2
int sensorValue1 = 0; // Variable um den Wert des Potentiometer 0 zu speichern
int sensorValue0 = 0; // Variable um den Wert des Potentiometer 1 zu speichern
int sensorValue2 = 0; // Variable um den Wert des Potentiometer 2 zu speichern
void setup() {
Wire.begin(); // Start serieller Kommunikation
accelgyro.initialize(); // Initalisieren des Gyro/Accelometer
pinMode(TN1,OUTPUT); // Ausgänge zuweisen
pinMode(TN2,OUTPUT);
pinMode(TN3,OUTPUT);
pinMode(TN4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
Serial.begin(115200); // Serielle Bandrate
}
void loop()
{
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // Aktuellen wert des Gyro/Accelometer laden
r_angle = (atan2(ay, az) * 180 / pi + Winkel_offset); // Aktueller Winkel (bei 0 Grad steht das Segway gerade)
omega = Gyro_Verstaerkung * (gx + Gry_offset); Serial.print(" omega="); Serial.println(omega);
if (abs(r_angle)<45){ // Winkel kleiner als 45 Grad
myPID(); // Berechnung der aktuelen PID Werte
PWMControl(); // Ansteuern der Motoren mit aktuellen Werten
}
else{ // Wenn der winkel größer als 45 Grad wird soll angenommen werden, dass das Segway umgefallen ist und keine Bewegung mehr ausgeführt werden
analogWrite(ENA, 0); // Motor A Bremsen
analogWrite(ENB, 0); // Motor B Bremsen
}
}
// PID Werte Berechnung
void myPID()
{
kp = analogRead(A0)*0.1; Serial.print("kp= ");Serial.print(kp); //Einlesen des kp Wertes über Poti wählbar
ki = analogRead(A1)*0.001; Serial.print(" /// ki= ");Serial.print(ki); //Einlesen des ki Wertes über Poti wählbar
kd = analogRead(A2)*1.5; Serial.print(" /// kd= ");Serial.println(kd); //Einlesen des kd Wertes über Poti wählbar
// Wahlweise können auch feste Werte genutzt werden
//kp = 35; Serial.print(" kp=");Serial.print(kp);
//kd = 30; Serial.print(" kd=");Serial.print(kd);
//ki = 0; Serial.print(" ki=");Serial.println(ki);
unsigned long now = millis(); //aktuelle Zeit
float dt = (now - preTime) / 1000.0; //vergangene Zeit seit vor der letzten Berechnung
preTime = now; //Zeit zu Beginn
float K = 0.8;
float A = K / (K + dt);
f_angle = A * (f_angle + omega * dt) + (1 - A) * r_angle; Serial.print(" f_angle=");Serial.println(f_angle); //Winkel Berechnung
timeChange = (now - lastTime); //vergangene Zeit seit Beginn der letzten Berechnung
if(timeChange >= SampleTime){
error = f_angle; // Abweichung von 0 Grad
errSum += error * timeChange;
dErr = (error - lastErr) / timeChange;
Output = kp * error + ki * errSum + kd * dErr; Serial.print(" Output=");Serial.println(Output);
lastErr = error;
lastTime = now; //Zeitstempel nach Berechnung
}
}
void PWMControl(){
if(Output > 0){ //Vorwärts
digitalWrite(TN1, HIGH);
digitalWrite(TN2, LOW);
digitalWrite(TN3, HIGH);
digitalWrite(TN4, LOW);
}
else if(Output < 0){ //Rückwärts
digitalWrite(TN1, LOW);
digitalWrite(TN2, HIGH);
digitalWrite(TN3, LOW);
digitalWrite(TN4, HIGH);
}
else{ //Bremse
digitalWrite(TN1, HIGH);
digitalWrite(TN2, HIGH);
digitalWrite(TN3, HIGH);
digitalWrite(TN4, HIGH);
}
analogWrite(ENA, min(255, abs(Output) + Motor_offset)); //Geschwindigkeit rechts
analogWrite(ENB, min(255, abs(Output) + Motor_offset)); //Geschwindigkeit links
}
Regler Auslegung
Die Abstimmung des Realisierten PID Reglers wurde damit wie aus der Vorlesung der Reglungstechnik bekannt, mit der Schwingungsmethode vorgenommen. Vorgegangen wurde dabei nach den folgenden fünf Schritten.
PID Reglerauslegung mit Schwingungsmethode
Ziegler/Nichols
Vorgehen:
- Parametrierung des Systems als reiner P‐Regler. Dabei wurden die Anteile Ki und Kd auf null gesetzt
- Erhöhung der Regelverstärkung (Kp-Wert), bis Dauerschwingungen auftreten
- Bestimmen der Regelverstärkung Kp krit, und der Periodendauer T krit
- PID‐Reglerparameter aus der Tabelle des Einstellverfahrens ablesen. (siehe Tabelle)
- Test des eingestellten Reglers
Reglertypen | |||
---|---|---|---|
Kp | Ki | Kd | |
P | 0,5 Kp krit | - | - |
PI | 0,45 Kp krit | 0,85 T krit | - |
PID | 0,6 Kp krit | 0,5 T krit | 0,12 T krit |
Achtung: Es musste darauf geachtet werden, das das Segway beim überschwingen nicht umfällt und beschädigt wird!
Fazit
Text...
→ zurück zum Hauptartikel: Fachpraktikum Elektrotechnik (WS 15/16)