[parte 2]Muoviamo i motori col PID

Quì presento 2 classi: la classe Motore, molto semplice, e la classe PID, che però implementa solo la parte P (spero che basti! ;))

Motore.h:

#ifndef Motore_h
#define Motore_h

#include "WProgram.h"

class Motore{
  public:
  Motore(int);
  void update(int actualPower);
  private:
  int PWMpin;
};
#endif

Motore.cpp:

#import "Motore.h"

#define ENGINEMIN 20
#define ENGINEMAX 230

Motore::Motore(int pin){
  PWMpin=pin;
}

void Motore::update(int actualPower){
  actualPower=constrain(map(actualPower, 0, 255, ENGINEMIN, ENGINEMAX), ENGINEMIN, ENGINEMAX);
  analogWrite(PWMpin, actualPower);
}

ENGINEMIN e ENGINEMAX servono per evitare di fermare del tutto o mandare a massimo regime il motore.
l'input deve essere un numero compreso tra 0 e 255, anche se l'algoritmo risolve il problema di input errati, non lo farà proporzionalmente.

ed ecco la classe PID:
per capire meglio cosa fa in questo caso è pensata per passare da un angolo attuale ad un altro, e calcolarci la potenza del motore. Ma si tratta di una semplice proporzione, può essere usata anche per gestire temperature ecc...
per maggiori info date un'occhiata quì:
http://igor.chudov.com/manuals/Servo-Tuning/PID-without-a-PhD.pdf

PID.h

#ifndef PID_h
#define PID_h

class PID{
  public:
  PID(int);
  float update(float, float);
  void setP(int);
  private:
  int P;
};
#endif

PID.cpp

#include "PID.h"

PID::PID(int p){
  P=p;
}

float PID::update(float angle, float setPoint){
  return P*(setPoint-angle);
}

void PID::setP(int p){
  P=p;
}