[gelöst:] PID library - funktioniert [-nicht-]

hallo,
ich versuche mich an der PID library Arduino Playground - HomePage
Ich habe den ordner PID_v1 nach c:\programme\Arduino\Libraries kopiert,
das Demo programm geladen
und als pid1000 gespeichert.

/********************************************************
 * 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:

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 ?

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...

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?

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.

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:

#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

#include "PID_v1.h"

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

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!

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.

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 ???

HaWe:
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?

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.

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 :wink:

LG,
~Hubble

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?

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

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** !!

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.

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. :frowning:

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?

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.

Mit der protabeln Version ist das Windows Zip file gemeint. Lade Dir dies hier herunter:

http://arduino.googlecode.com/files/arduino-1.0.5-r2-windows.zip

Entpacken, und loslegen. Da wird nichts installiert. Dann kannst Du testen. Und bevor Du gleich Hyperventilierend explodierst, die 1.5.irgendwas ist Beta! Also, nicht aufregen. Wenn der Scheiß Dir nicht passt und Du es besser weißt, dann beteilige Dich an der Programmierung!

Grüße,

Sven

und wo soll da der PID_v1 reinkopiert werden ?

Kann ich Dir nicht sagen, weil mir von Dir dann Quatsch unterstellt wird, weil Du die Transferleistung von Linux auf Windows nicht hinbekommst, aber mach doch einfach was Dir weiter vorne schon empfohlen wurde. Nimm die automatische import Funktion bei Sketch -> Library importieren -> Add library
Spricht da was dagegen?

wo ist das denn? hab ja schon danach gesucht!

Da du ja die Betaversion benutzt, weiss ich das nicht (mal ganz ehrlich: wenns nicht wirklich triftige Gründe gibt, lässt man immer die Finger von Beta`s), bei der normalen IDE gehts ganz oben: Sketch-Library importieren-und da geht ne Liste auf, die alle Bibliotheken enthält, die die IDE "findet".

Sollte dort der Eintrag der PID nich da sein, hast du sie einfach am falschen Ort gespeichert.
Ist halt jetzt blöde weil du auf der Beta beharrst, die 1.05 hat zudem noch die Möglichkeit, Bibliotheken aus nem Zip-Archiv direkt zu importieren, auch das hilft, weil die dann automatisch an die richtige Stelle kopiert wird. Weiss aber nicht, iob das die Betaversion auch kann.