Servomotor controlado mediante señal PID

Hola a todos, primero me presento, soy Parish92 y soy nuevo por aqu y en la programación de arduino. Tengo un mar de dudas que me gustarís poder solucionar con esta comunidad.

Hola a todos, primero me presento, soy Parish92 y soy nuevo por aqu y en la programación de arduino. Tengo un mar de dudas que me gustaría poder solucionar con esta comunidad.
Os pongo en situación, hace una semanita empecé mis prácticas de ciclo (CS Mantenimiento Electrónico) en una empresa, donde se me pide que desarrolle mediante una señal PID que me la dará unos sensores y un amperímetro, controlar un servomotor que irá unido a una válvula y que servirá para controlar el caudal que recibe un depósito.
Por ahora y mediante los ejemplos que trae el propio arduino solo he conseguido mover el motor hacia ambos lados regulando su velocidad y en otro proyecto establcer un Setpoint y mediante un potenciómetro variar la entrada analógica para que ese servo intente corregir la tasa de error e intente buscar estar en ese setpoint antes establecido.
El problema que tengo es que el servo solo me empieza a corregir muy cerca de donde tengo establecido ese punto. (Por ejemplo, el setpoint lo establezco en 300 y el motor solo se empieza a mover entre 280 por anajo y 320 por arriba para intentar buscarlo) yo lo que busco es que me empiece a corregir desde el momento 0 hasta lo máximo de error, ¿es eso posible?. y también poder variar la velocidad con lo que lo hace (si esta muy lejos que corrija mas rápido y cerca de ese punto establecido, pues mas cerca)
Tengo que decir que el servo que utilizo es de 360º. Y aquí el código que tengo escrito hasta ahora:

#include <PID_v1.h>

int analogPin = 0; // el pin analógico 0 conectado al dial de un potenciómetro (terminal central del potenciómetro)
// los terminales exteriores del potenciómetro conectados a +5V y masa respectivamente

int val = 0; // declaración de la variable en la que se almacenará el valor leído por el conversor.

//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 = 300; //Establecemos el setpoint, que variandolo, en este caso con el potenciometro el servo intentar ajustarse siempre

Serial.begin(9600); // Inicialización del modulo Serial.

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

void loop()
{
Input = analogRead(0);
myPID.Compute();
analogWrite(3,Output);
delay(500); // espera a que el servo se posicione
val = analogRead(analogPin); // lee el valor de tensión del pin
Serial.println(val); // envía el valor leido vía serial.
}

Gracias a todos por vuestro tiempo y por favor, echadme un cable, que de verdad que me estoy deseperando porque no consigo avanzar nada., yo intentaré estar lo más activo posible a partir de ahora ayudando en lo que sea.
Un Saludo.

Hola Parish92

Quisiera ayudarte pero no entiendo mucho que estas haciendo. Ademas no se nada de PID.

Algunas observaciones:

  • analogRead es un int de 0 a 1023, analogWrite es de 0 a 255. ¿te acepta Double?
  • No se que pasa con analogWrite(3,Output); ¿mueve el motor y cambia el potenciómetro? pero tené presente que es pulsante, o sea no baja realmente el voltaje sino que se apaga y prende.
  • Usas tanto analogRead(0); como analogRead(analogPin) que es lo mismo.

Trata de revisar el código y poner en Serial.println a Input y Output a ver que esta haciendo el programa.

Bueno, no se si te ayude en algo. Saludos.

Hola perrociego, gracias por tu interés.

analogWrite(3,Output) efectivamente es a donde conecto la entrada de señal del servo. (la que que dice al servo mediante la distancia de los pulsos, hacia que lado debe girar.)

He avanzado algo, he conseguido que el servo me corrija en cualquier posición del potenciómetro, mediante: myPID.SetOutputLimits(0,1023).

Ahora lo que me pasa es que por encima de 300 (setpoint) (gira hacia la derecha) se mueve muuuy lento, y por debajo (gira a la izquierda) bastante rápido. Alguna idea de porque es esto?

y otra cosa, el potenciometro lo tengo conectado a la salida de voltaje del arduino de 3,3V; porque ahí es donde consigo un movimiento continuo, si lo conecto a 5V se mueve a pulsos muy pequeños.