INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Fragen zu PID()
16.11.2015, 16:12
Beitrag #1
Fragen zu PID()
Hallo. Ich möchte mir gerne einen selbstbalancierenden Roboter bauen. Die Basis hierfür sind ein Nano V3, MPU6050 und Getriebemotoren mit 294rpm, die wie brushed ESC angesprochen werden. Der Arduino wiederum spricht die ESC via PWM an.

Da für einen selbstbalancierenden Roboter ein PID-Controller empfohlen wird, wollte ich gerne auf den zurückgreifen der nativ von Arduino angeboten wird. Grundlegende Erfahrungen mit PID-Controllern habe ich aus dem Copterbau schon, allerdings noch nicht in dem Umgang mit dessen Library.

Ehrlich gesagt verstehe ich auch nicht, wie ich diese verwenden soll, wo ihr nun ins Spiel kommt.

Ich habe also einen Sensor, der z. B. die variable y in einem Bereich von -100 bis +100 ausgibt, jenachdem wie der Roboter gerade steht. Ist er z. B. um 15 Grad nach vorn geneigt, schlägt die Variable mit +50 aus. Der PID-Controller soll nun mit dieser Variable arbeiten und den Roboter in die Senkrechte bringen. Die Ansteuerung der Motoren erfolgt wie gesagt per PWM. Um genau zu sein mit einer HIGH-pHase von 1.000-2.000 microsekunden (µs), und einer LOW-Phase von 20.000 mikrosekunden. Dabei drehen die Räder im Bereich von 1.500-2.000µs vorwärts, und im Bereich von 1.000-1.500µs rückwärts. Entsprechend der Sensorlage soll der PID-Controller einen Wert von z. B. 1.700µs ausgeben um die leichte Schräglage des Roboters zu korrigieren.

Wie verwende ich auf mein Beispiel gemünzt die PID();-Library? Insbesondere geht es mir gerade um Input, Output, Setpoint.

http://playground.arduino.cc/Code/PIDLibraryConstructor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.11.2015, 16:51
Beitrag #2
RE: Fragen zu PID()
Bei jeder vernünftig aufgebauten und dokumentierten Library werden Beispiele mitgeliefert, die die Funktionen exakt beschreiben. Wenn du dir die Beispiele ansiehst, wirst du sicher daraus entnehmen können, wie diese funktioniert.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.11.2015, 16:54
Beitrag #3
RE: Fragen zu PID()
Hi,
ich wuerde mal sagen: Input ist Dein y. Output sind Deine Mikrosekunden (1000 bis 2000). Setpoint ist 0.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.11.2015, 18:50 (Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2015 18:58 von scritch.)
Beitrag #4
RE: Fragen zu PID()
(16.11.2015 16:51)hotsystems schrieb:  Bei jeder vernünftig aufgebauten und dokumentierten Library werden Beispiele mitgeliefert, die die Funktionen exakt beschreiben. Wenn du dir die Beispiele ansiehst, wirst du sicher daraus entnehmen können, wie diese funktioniert.
Ich würde nicht schreiben wenn ich mir nicht schon die Library und Beispiele angesehen und diese verstanden hätte...

@Thorsten: Danke. Aber kannst du mir bitte den Setpoint erklären, warum ist der 0?

edit: ah, kann es sein, dass ich den setpoint später für das mitteln des Sensors benötige?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.11.2015, 19:25
Beitrag #5
RE: Fragen zu PID()
(16.11.2015 18:50)scritch schrieb:  Ich würde nicht schreiben wenn ich mir nicht schon die Library und Beispiele angesehen und diese verstanden hätte...

Ok, ein kurzer Hinweis darauf und ich hätte mir den Hinweis sparen können. Leider geht aus deinem Beitrag nicht hervor, was du bereits gemacht hast und was nicht.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.11.2015, 22:12
Beitrag #6
RE: Fragen zu PID()
(16.11.2015 18:50)scritch schrieb:  @Thorsten: Danke. Aber kannst du mir bitte den Setpoint erklären, warum ist der 0?
Ich bin davon ausgegangen, dass der Sensor 0 zurückgibt, wenn der Robot senkrecht steht.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.11.2015, 16:05 (Dieser Beitrag wurde zuletzt bearbeitet: 17.11.2015 16:41 von scritch.)
Beitrag #7
RE: Fragen zu PID()
Hallo. Habe das mit dem Setpoint nun auch geschnallt Smile Allerdings stellt sich mir nun folgendes Problem: Also, der PID-Controller regelt schonmal halbwegs so, wie er soll. Der Wert der ausgegeben werden soll, soll sich ja zwischen 1000 und 1500 bewegen. Tut er auch. Wenn der Roboter ausfrecht steht, bekomme ich einen entprechenden Wert gelifert, der plausibel ist, z. B. 1000. Nun verändert sich dieser Wert aber innerhalb kurzer Zeit, ohne dass ich den Roboter überhaupt bewege. Er nähert sich langsam der 1500, bis der Wert letzlich nach ca. 15 sek. bei 1500 angekommen ist. Wie kann das nun wieder sein?

Der bisherige Code:
Code:
#include<PID_v1.h>
#include<Wire.h>

const int MPU_addr = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

float Kp = 0.8;                                                       //Initial Proportional Gain
float Ki = 0.07;                                                      //Initial Integral Gain
float Kd = 0.12;                                                     //Intitial Derivative Gain
double Setpoint, sensor_y, pwm;

PID myPID(&sensor_y, &pwm, &Setpoint, Kp, Ki, Kd, DIRECT);           //Initialize PID object, which is in the class PID.

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  AcZ = 0;
  sensor_y = AcZ;
  Setpoint = 3000;                //verändert den mittelpunkt des sensors
  myPID.SetMode(AUTOMATIC);                                          //Set PID object myPID to AUTOMATIC (see playground for more details)
  myPID.SetOutputLimits(15000, 22500);
}

void loop()
{
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers
  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  //Serial.println(AcZ);
  delay(10);
  sensor_y = AcZ;                                            //Input same as above in function setup() (see above for more details)
  myPID.Compute();                                                   //The 'magic' happens and algorithm computes Output in range of 80 to 100 degrees
  Serial.println(pwm / 15.0);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.11.2015, 17:54
Beitrag #8
RE: Fragen zu PID()
Hi,
naja, ein PID-Regler integriert den Fehler ueber die Zeit auf. D.h. auch eine kleine Abweichung, wenn sie nur lange genug bestehen bleibt, wird im Endeffekt eine maximale Steuergroesse zum Ergebnis haben.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Anfänger Fragen zum Thema Pc & Datenverarbeitung Hurdy 0 297 29.03.2016 12:36
Letzter Beitrag: Hurdy
  Fragen zu TM1638 Binatone 2 496 16.01.2016 14:11
Letzter Beitrag: arduinofan
Lightbulb Fragen zu Ablauf/Schrittmotor/Referenzfahrt Tom5000 4 1.741 09.09.2014 05:11
Letzter Beitrag: Corvus
  AlarmBit und weitere Fragen beim DS3231 itsy 0 1.056 19.06.2014 14:00
Letzter Beitrag: itsy
  Neueinsteiger mit Fragen Dietmar 9 4.170 18.12.2013 09:13
Letzter Beitrag: burgi650
  Arduino Mega 2560, 1000 Fragen zum Start.... alpenpower 7 5.936 06.09.2013 11:17
Letzter Beitrag: admin
  Fragen für Props aus Alien HartlMax 0 1.163 20.05.2013 19:05
Letzter Beitrag: HartlMax

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste