Projekt 57: Arduino Segway: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „Kategorie:Projekte Autoren: [http://193.175.248.52/wiki/index.php/Benutzer:Philipp_Tewes Philipp Tewes], [http://193.175.248.52/wiki/index.php/Benutzer:Ja…“) |
Keine Bearbeitungszusammenfassung |
||
Zeile 2: | Zeile 2: | ||
Autoren: [http://193.175.248.52/wiki/index.php/Benutzer:Philipp_Tewes Philipp Tewes], [http://193.175.248.52/wiki/index.php/Benutzer:Janis_Ostermann Janis Ostermann]<br/> | Autoren: [http://193.175.248.52/wiki/index.php/Benutzer:Philipp_Tewes Philipp Tewes], [http://193.175.248.52/wiki/index.php/Benutzer:Janis_Ostermann Janis Ostermann]<br/> | ||
Betreuer: Prof. Dr. Mirek Göbel | Betreuer: Prof. Dr. Mirek Göbel | ||
[[Datei:Arduino_Segway_Aufsteller.jpg|500px|thumb| | [[Datei:Arduino_Segway_Aufsteller.jpg|500px|mini|right|]] | ||
[[Datei:Segway_Freigestellt.jpg|200px|thumb| | <div class="tright" style="clear:none">[[Datei:Segway_Body.jpg|500px|thumb|Segway Rumpf]]</div> | ||
<div class="tright" style="clear:none">[[Datei:Segway_Freigestellt.jpg|200px|thumb|Segway Gesamt]]</div> | |||
<br/> | |||
<br/> | |||
== Aufgabenstellung == | == Aufgabenstellung == | ||
Das Projekt wurde von [http://193.175.248.52/wiki/index.php/Benutzer:Philipp_Tewes Philipp Tewes] und [http://193.175.248.52/wiki/index.php/Benutzer:Janis_Ostermann Janis Ostermann] im Rahmen des Elektrotechnik Fachpraktikums im WS 2015/16 bearbeitet. Bevor mit dem Bau und der Programmierung des Segways begonnen wurde, ging es erst einmal um eine Definition der Ziele. Dabei war das Ziel zuerst die Hardware des Segways zu planen. Dazu wurde eine teileliste angefertigt, diese ist unter Teileliste einzusehen. Dabei wurde mit dem Bau der einzelnen Etagen begonnen, fortgesetzt wurde die Arbeit mit dem Bau der Kiste für den Gyro Sensor und der Potentiometer.<br/> | |||
Nachdem alle Einzelteile Fertiggestellt waren ging es um die Verkabelung der Komponenten, diese ist auf dem Fritzing Plan ersichtlich. Nach Montage der einzelnen Komponenten und der Verkabelung wurde das Segway anschließend mit dem Bau und der Montage der Räder fertig gestellt. | |||
Das Projekt wurde von [http://193.175.248.52/wiki/index.php/Benutzer:Philipp_Tewes Philipp Tewes] und [http://193.175.248.52/wiki/index.php/Benutzer:Janis_Ostermann Janis Ostermann] im Rahmen des Elektrotechnik Fachpraktikums im WS 2015/16 bearbeitet. | <br/> | ||
<br/> | |||
Anschließend war es das Ziel die Passende Software für die Reglung des Segways zu entwerfen. | |||
---- | |||
<br/> | |||
=== Ziele === | === Ziele === | ||
Text... | Text... | ||
---- | |||
<br/> | <br/> | ||
== Bau == | == Bau == | ||
Text... | Text... | ||
---- | |||
<br/> | |||
=== Teile Liste === | === 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 | |||
*3x M5 Unterlegscheiben | |||
*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 | |||
---- | |||
<br/> | |||
=== Etagen === | === Etagen === | ||
Text... | Text... | ||
---- | |||
==== Etage 1 ==== | ==== Etage 1 ==== | ||
[[Datei:Segway_Ebene_1.jpg|500px|mini|right|Technische Zeichnung der Ebene 1]] | |||
*3mm Bohrungen für M4 Gewindestandgen | |||
*Langloch für die Bohrung eingeschnitten | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | |||
---- | |||
==== Etage 2 ==== | ==== Etage 2 ==== | ||
[[Datei:Segway_Ebene_2.jpg|500px|mini|right|Technische Zeichnung der Ebene 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 | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | |||
---- | |||
==== Etage 3 ==== | ==== Etage 3 ==== | ||
[[Datei:Segway_Ebene_3.jpg|500px|mini|right|Technische Zeichnung der Ebene 3]] | |||
*3mm Bohrungen für M4 Gewindestandgen | |||
*Gummi überziehen | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | |||
---- | |||
=== Steuerbox === | === Steuerbox === | ||
[[Datei:Segway_Kiste_Gesamt.jpg|500px|mini|right|Technische Zeichnung der Steuerbox]] | |||
*5mm Löcher in das Plexiglas für die Potentiometer gebohrt | |||
*Potentiometer in das Plexiglas eingeschraubt. Über Gewinde am Potentiometer. | |||
*Gyroskop an die mit 3mm Vorgeborten Löcher mit M3 Schrauben geschraubt. Mit Mutter auf der Unterseite gekontert | |||
*Platine Ebenfalls mit M3 Schrauben verschraubt und gekontert | |||
*In die Unterseite ein 9mm Loch gebohrt um die Kabel rausführen zu können | |||
<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/> | |||
---- | |||
===Stiel und Querstange=== | |||
*Holzstiel in zwei Stücke geschnitten, einmal 50,2cm und 14cm | |||
*Den 14cm Stiel mittig in eine Stirnfläche der 50,2cm verschrauben, mit M5 Schraube 3cm und M5 Unterlegscheibe (vorgebohrt) | |||
=== Montage === | === Montage === |
Version vom 5. Februar 2016, 13:57 Uhr
Autoren: Philipp Tewes, Janis Ostermann
Betreuer: Prof. Dr. Mirek Göbel
Aufgabenstellung
Das Projekt wurde von Philipp Tewes und Janis Ostermann im Rahmen des Elektrotechnik Fachpraktikums im WS 2015/16 bearbeitet. Bevor mit dem Bau und der Programmierung des Segways begonnen wurde, ging es erst einmal um eine Definition der Ziele. Dabei war das Ziel zuerst die Hardware des Segways zu planen. Dazu wurde eine teileliste angefertigt, diese ist unter Teileliste einzusehen. Dabei wurde mit dem Bau der einzelnen Etagen begonnen, fortgesetzt wurde die Arbeit mit dem Bau der Kiste für den Gyro Sensor und der Potentiometer.
Nachdem alle Einzelteile Fertiggestellt waren ging es um die Verkabelung der Komponenten, diese ist auf dem Fritzing Plan ersichtlich. Nach Montage der einzelnen Komponenten und der Verkabelung wurde das Segway anschließend mit dem Bau und der Montage der Räder fertig gestellt.
Anschließend war es das Ziel die Passende Software für die Reglung des Segways zu entwerfen.
Ziele
Text...
Bau
Text...
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
- 3x M5 Unterlegscheiben
- 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
Text...
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.
- Gyroskop an die mit 3mm Vorgeborten Löcher mit M3 Schrauben geschraubt. Mit Mutter auf der Unterseite gekontert
- Platine Ebenfalls mit M3 Schrauben verschraubt und gekontert
- In die Unterseite ein 9mm Loch gebohrt um die Kabel rausführen zu können
Stiel und Querstange
- Holzstiel in zwei Stücke geschnitten, einmal 50,2cm und 14cm
- Den 14cm Stiel mittig in eine Stirnfläche der 50,2cm verschrauben, mit M5 Schraube 3cm und M5 Unterlegscheibe (vorgebohrt)
Montage
Text...
Verkabelung
Text...
Reifen
Text...
Software des Arduino UNO
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
Text...
Fazit
Text...
Erfüllte Ziele
Text...
Offene Aufgaben
Text...
→ zurück zum Hauptartikel: Fachpraktikum Elektrotechnik (WS 15/16)