Go Down

Topic: [gelöst:] PID library - funktioniert [-nicht-] (Read 14854 times) previous topic - next topic

HaWe

Jul 04, 2014, 11:29 pm Last Edit: Jul 07, 2014, 11:38 pm by HaWe Reason: 1
hallo,
ich versuche mich an der PID library http://playground.arduino.cc/Code/PIDLibrary
Ich habe den ordner PID_v1 nach c:\programme\Arduino\Libraries kopiert,
das Demo programm geladen
und als pid1000 gespeichert.

Code: [Select]

/********************************************************
* PID Basic Example
* Reading analog input 0 to control analog PWM output 3
********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
 //initialize the variables we're linked to
 Input = analogRead(0);
 Setpoint = 100;

 //turn the PID on
 myPID.SetMode(AUTOMATIC);
}

void loop()
{
 Input = analogRead(0);
 myPID.Compute();
 analogWrite(3,Output);
}


Fehlermeldung:
Quote

Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

pid1000:12: error: 'PID' does not name a type
pid1000.ino: In function 'void setup()':
pid1000:21: error: 'myPID' was not declared in this scope
pid1000:21: error: 'AUTOMATIC' was not declared in this scope
pid1000.ino: In function 'void loop()':
pid1000:27: error: 'myPID' was not declared in this scope


was ist falsch und fehlt ?

Rabenauge

Ich würd sagen, die Bibliothek wird nicht gefunden.
Falscher Pfad?
Meine selber hinzugefügten sind in den eigenen Dateien/Arduino/libraries.

Du kannst auch mal versuchen, die Datei mittels Import reinzuholen.
Oben in irgendeinem Menü der IDE...
------------
Grüssle, Sly

HaWe

was heißt das jetzt?
Arduino\libraries ist bei mir eben in c:\Programme\...
ich hatte die libs(*.h. *.cpp)  auch schon im aktuellen Arbeitsverzeichnis, auch da wurde sie dann nicht gefunden.

Also wie jetzt genau oder was?

Klaus_ww

Ich tippe auch auf Verzeichnis-Salat.
Check doch sicherheitshalber, wo sich andere - einbindbare! - Libs befinden und ob im PID-Verzeichnis auch die Struktur stimmt. Nicht, dass da noch ein zusätzlicher Ordner reingerutscht ist.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

HaWe

#4
Jul 05, 2014, 11:05 am Last Edit: Jul 05, 2014, 11:41 am by HaWe Reason: 1
wie soll ich das tun?
ansonsten sind auch die Ordner von Audio, Bridge, Esplora, Ethernet,...PID_v1,......USBHost, WiFi alle im selben Verzeichnis.

In PID_v1 befinden sich
Examples (Ordner),
keywords.txt
PID_v1.cpp
PID_v1.h

PID_v1.h hat diesen Code:
Code: [Select]
#ifndef PID_v1_h
#define PID_v1_h
#define LIBRARY_VERSION 1.0.0

class PID
{


 public:

 //Constants used in some of the functions below
 #define AUTOMATIC 1
 #define MANUAL 0
 #define DIRECT  0
 #define REVERSE  1

 //commonly used functions **************************************************************************
   PID(double*, double*, double*,        // * constructor.  links the PID to the Input, Output, and
       double, double, double, int);     //   Setpoint.  Initial tuning parameters are also set here

   void SetMode(int Mode);               // * sets PID to either Manual (0) or Auto (non-0)

   bool Compute();                       // * performs the PID calculation.  it should be
                                         //   called every time loop() cycles. ON/OFF and
                                         //   calculation frequency can be set using SetMode
                                         //   SetSampleTime respectively

   void SetOutputLimits(double, double); //clamps the output to a specific range. 0-255 by default, but
 //it's likely the user will want to change this depending on
 //the application



 //available but not commonly used functions ********************************************************
   void SetTunings(double, double,       // * While most users will set the tunings once in the
                   double);          //   constructor, this function gives the user the option
                                         //   of changing tunings during runtime for Adaptive control
void SetControllerDirection(int);  // * Sets the Direction, or "Action" of the controller. DIRECT
 //   means the output will increase when error is positive. REVERSE
 //   means the opposite.  it's very unlikely that this will be needed
 //   once it is set in the constructor.
   void SetSampleTime(int);              // * sets the frequency, in Milliseconds, with which
                                         //   the PID calculation is performed.  default is 100
 
 
 
 //Display functions ****************************************************************
double GetKp();  // These functions query the pid for interal values.
double GetKi();  //  they were created mainly for the pid front-end,
double GetKd();  // where it's important to know what is actually
int GetMode();  //  inside the PID.
int GetDirection();  //

 private:
void Initialize();

double dispKp; // * we'll hold on to the tuning parameters in user-entered
double dispKi; //   format for display purposes
double dispKd; //
   
double kp;                  // * (P)roportional Tuning Parameter
   double ki;                  // * (I)ntegral Tuning Parameter
   double kd;                  // * (D)erivative Tuning Parameter

int controllerDirection;

   double *myInput;              // * Pointers to the Input, Output, and Setpoint variables
   double *myOutput;             //   This creates a hard link between the variables and the
   double *mySetpoint;           //   PID, freeing the user from having to constantly tell us
                                 //   what these values are.  with pointers we'll just know.
 
unsigned long lastTime;
double ITerm, lastInput;

unsigned long SampleTime;
double outMin, outMax;
bool inAuto;
};
#endif


wenn ich stattdessen PID_v1.h und PID_v1.cpp ins Arbeitsverzeichnis kopiere und den include-Befehl als
Code: [Select]
#include "PID_v1.h"

schreibe (also relative Adresse), kriege ich noch mehr Mist als Fehlermeldung!
Quote

Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

PID_v1\PID_v1.cpp.o: In function `PID::SetTunings(double, double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:83: multiple definition of `PID::SetTunings(double, double, double)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:83: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetSampleTime(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:105: multiple definition of `PID::SetSampleTime(int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:105: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetOutputLimits(double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:125: multiple definition of `PID::SetOutputLimits(double, double)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:125: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetMode(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:146: multiple definition of `PID::SetMode(int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:146: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Initialize()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:160: multiple definition of `PID::Initialize()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:160: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetControllerDirection(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:174: multiple definition of `PID::SetControllerDirection(int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:174: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKp()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:190: multiple definition of `PID::GetKp()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:190: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKi()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:191: multiple definition of `PID::GetKi()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:191: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKd()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:192: multiple definition of `PID::GetKd()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:192: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetMode()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:193: multiple definition of `PID::GetMode()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:193: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetDirection()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:194: multiple definition of `PID::GetDirection()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:194: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Compute()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:47: multiple definition of `PID::Compute()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:47: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:21: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:21: first defined here




Was für ein Mist mit den sch***- starren Verzeichnis- und Dateinamens-Strukturen!
Alleine schon, dass immer ein übergeordneter Ordner denselben Namen haben muss wie ein Programmdatei-Name!
Blödsinn³ !!
Und dass dann immer libs automatisch included werden, obwohl man es überhaupt nicht angegeben hat!!
Kein Wunder, wenn es da zu Konflikten kommt!!
Zum Kotzen!


Rabenauge

Hast du mal nachgesehen, ob du in den Eigenen Dateien _auch_  nen Arduino-Ordner hast??
Ich glaub, der wird standardmässig angelegt. DORT gehören eigene Lib`s rein.
Unter Programme geht das zwar im Prinzip auch, aber dann muss das auch entsprechend konfiguriert werden.

C:\Dokumente und Einstellungen\Anwender\Eigene Dateien\Arduino\libraries <--- da rein die Ordner für die einzelnen Lib`s.

------------
Grüssle, Sly

HaWe

#6
Jul 05, 2014, 12:08 pm Last Edit: Jul 05, 2014, 12:11 pm by HaWe Reason: 1
da gibt es einen Ordner, der ist aber leer, und ich verwende "Eigene Dateien" auch nie. Ich speichere meine Dateien ganz woanders ab.

Das wäre ja wohl ne Frechheit, wenn mir ein programm vorschreibt, wo ich meine Dateien abzuspeichern habe.
Wenigstens den include-Pfad muss man aber konfigurieren können! (Und den gibt's ja, wie gesagt, im Installationsverzeichneis, unter c:\Programme.
Oder eben alles ins aktuelle Arbeitsverzeichnis kopieren.
Oder den echten statischen Pfad angeben.

Was für ein Durcheinander, wie ich sowas hasse!
Wer programmiert so was ???

Klaus_ww


Was für ein Durcheinander, wie ich sowas hasse!
Wer programmiert so was ???


Ganz ruhig bleiben, es funktioniert bei anderen ja auch, also nicht aufregen.
Was passiert, wenn Du Rabenauges Tipp versuchst?
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Doc_Arduino

#8
Jul 05, 2014, 12:38 pm Last Edit: Jul 05, 2014, 12:43 pm by Doc_Arduino Reason: 1
Hallo,

Du bist wüdent und mußt erstmal runterkommen.
Ich nutze die portable Version der IDE.
Bei mir sieht das so aus, siehe Screenshot.

Welches Board hast Du denn?
Mich macht diese Zeile stutzig.
Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"
Wenn Du keinen Due hast, sollte man die IDE 1.0.5... nehmen.

Das Demoprogramm hast Du wie geladen? Über das IDE Menü > Datei > Beispiele ...?
Oder den Code einfach reinkopiert?
Wenn Du in Datei > Beispiele > PID_v1 > Examples siehst, dann liegt alles an der richtigen Stelle. Dann tippe ich auf einen Versionkonflikt zwischen IDE, dem Board oder Library. Wie gesagt, wenn kein Due hast, nimm die andere IDE Version.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Hubble_Pixel

Ich weiß, dass es unter Linux einen Ordner mit dem Namen sketchbook gibt, der sich (unter Linux) im Home-Verzeichnis des Nutzers befindet, dort gibt es drin wiederum einen Ordner libraries oder so und darin packe ich immer meinem Bibliotheken , jeweils in einen Ordner der so heißt wie die Bibliothek, also /home/USER/sketchbook/libraries/BibliothekXY/ worin sich dann der Rest befindet also BibliothekXY.h und BibliothekXY.cpp und noch andere Dateien die aber nicht wichtig für die Bibliothek an sich sind.

Sollte es so einen Ordner und Windows auch geben, dann würde ich die Bibliothek nach dem oben angegebenen Schema dorthin packen und wenn man sie dann braucht kann man sie in der IDE einbinden, dort sieht man dann auch direkt, ob die Bibliothek überhaupt zur Verfügung steht ;)

LG,
~Hubble

HaWe

#10
Jul 05, 2014, 01:14 pm Last Edit: Jul 05, 2014, 01:31 pm by HaWe Reason: 1
nein, ich nehme die 1.5x, weil die 1.0x kein CR an den seriellen Monitor übergibt und daher kein Ende der Eingabezeile registriert.

Ein Sketchbook habe ich auch irgendwo, aber nur wo?
In dem Ordner-Durcheinander kennt sich doch kein Mensch aus!

aah -  habs:

D:\Arduino


und da soll der Ordner mit der PID lib jetzt rein?
Nicht zu den libs im Installationsverzeichnis?

Und dann noch Linux? was will ich mit Linux? Ich programmiere in C auf Windows! Was soll der Linux-Quatsch? Hat der Arduino etwa ein Linux-Betriebssystem?

wer denkt sich sowas aus?

HaWe

hab also jetzt die PID lib nach D:\Arduino (Sketch-Ordner) kopiert:
Immer noch Fehlermeldungen ohne Ende:
Quote

Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

PID_v1\PID_v1.cpp.o: In function `PID::SetTunings(double, double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:83: multiple definition of `PID::SetTunings(double, double, double)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:83: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetSampleTime(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:105: multiple definition of `PID::SetSampleTime(int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:105: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetOutputLimits(double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:125: multiple definition of `PID::SetOutputLimits(double, double)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:125: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetMode(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:146: multiple definition of `PID::SetMode(int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:146: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Initialize()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:160: multiple definition of `PID::Initialize()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:160: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetControllerDirection(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:174: multiple definition of `PID::SetControllerDirection(int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:174: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKp()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:190: multiple definition of `PID::GetKp()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:190: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKi()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:191: multiple definition of `PID::GetKi()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:191: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKd()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:192: multiple definition of `PID::GetKd()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:192: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetMode()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:193: multiple definition of `PID::GetMode()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:193: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetDirection()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:194: multiple definition of `PID::GetDirection()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:194: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Compute()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:47: multiple definition of `PID::Compute()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:47: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:21: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:21: first defined here

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen



So ein Schei** !!

Doc_Arduino

Hallo HaWe,

kannst Du die Fragen die wir zur Hilfe stellen auch komplett beantworten? Sonst wird das nichts. Wir können nur das wissen was Du uns schreibst. Das mit Linux kannste wirklich vergessen. Du nutzt Windows auf Deinem Rechner. Und und die Librarys gehören in den libraries Ordner, sonst nirgends wohin.

Nur um auszuschließen das es nicht an der falschen IDE Version liegt. Lade Dir die portable IDE runter. Das .zip File.
Entpacke es wohin wo Du willst. Kopiere die PID_v1 Library dort in den libraries Ordner, starte die arduino.exe, wähle Dein Board aus und lade ein PID Beispiel über IDE Menü > Beispiele > PID_v1 > Examples ...
Kompiliere es testweise.
Wir sind gespannt was passiert.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

HaWe

sorry, verstehe ich nicht.
Ich habe alles über setup.exe installiert, das löscht alte Installations-Daten.
Ich will nicht wieder Chaos mit den Sketch-Versionen und abweichenden Einstellungen und Speicher-Ordnern.

ich habe aber auf einem anderen Rechner (in einem anderen Haus) noch eine alte 1.0.5 Version installiert, mit der kann ich ja stattdessen versuchen. Das geht aber blöderweise erst ab Montag. :(

Auch da ist der Sketch-Ornder aber nicht irgendwas mit Eigene Dateien, sondern d:\Arduino, aber auch da ist der Installationsordner c:\programme\Arduino, und die ganzen libs sind in c:\programme\Arduino\libraries.

In welchen ordner soll also dann bei mir der Ordner PID_V1 oder die darin enthaltenen .h und .cpp Dateien?

Rabenauge

Funktioniert denn  Sketch-Library importieren- die PID überhaupt??
Wenn _das_ nicht klappt, liegt sie am falschen Speicherort-welcher auch immer das bei dir sein mag.
Wenn es aber _so_ (die #includes selber tippen ist ne wacklige Geschichte! ) funktioniert, sollts dann auch laufen.
------------
Grüssle, Sly

Go Up