Hola.
Sigo haciendo las piezas del puzzle para el montaje del péndulo invertido aunque he cambiado algunos detalles.
No acababa de convencerme que fuera un potenciómetro el encargado de leer la posición del péndulo, lo he cambiado por un encoder de 500 pulsos.

Vista del péndulo:

Usare el arduino para leer desde 3 potenciómetros los valores que quiero asignar a los parámetros PID y así tener mas facilidad para "tunearlo"
He montado 3 potenciómetros de 10k en un panel, el cableado es fácil, consideramos que cada potenciómetro tiene los terminales positivo, señal y negativo, unir todos los positivos y llevarlo a +5 del arduino, igual con los negativos y nos quedan 3 cables que pongo en las 3 primeras entradas analógicas.


Un programa en el arduino lee las 3 señales y crea una palabra de las 3 lecturas poniéndole delante de cada lectura una P,D e I. ( ya esta hecho, no tiene porque ser asi,pero es que en esto de programar también estoy pegado ).
Código del programa en arduino:
/* Entradas analogicas, salidas serie. */
const int PinEntradaValorProporcional = A0;
const int PinEntradaValorIntegral = A1;
const int PinEntradaValorDerivativo = A2;
float ValorProporcional = 0;
float ValorIntegral = 0;
float ValorDerivativo = 0;
void setup() {
Serial.begin(9600);
}
void loop()
{
ValorProporcional = analogRead(PinEntradaValorProporcional);
ValorIntegral = analogRead(PinEntradaValorIntegral);
ValorDerivativo = analogRead(PinEntradaValorDerivativo);
Serial.print("P");
Serial.print(ValorProporcional,0);
Serial.print("I");
Serial.print(ValorIntegral,0);
Serial.print("D");
Serial.println(ValorDerivativo,0);
delay(2);
}Después de cargar el programa en el arduino, este se queda en ejecución enviando por su puerto serie la palabra con los datos.
Ahora le toca el turno a un programa en python que sera llamado por el linuxcnc y leerá estos datos por el puerto serie. Hay que guardarlo en un directorio que este en el PATH del usuario, recomiendan usr/local/bin. y darle permiso de ejecución.
Pido perdón a los "pica-teclas"

y aviso a los incautos de que estos programas no son ejemplos a seguir ya que soy un "lacuentadelavieja" y nunca aprobé esta dichosa asignatura.
Código en python para leer del puerto serie y pasar valores al HAL
#!/usr/bin/python
import hal, time, serial
h = hal.component("PID_Arduino")
h.newpin("P", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("I", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("D", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
cadena = ""
pos_P = 0
pos_I = 0
pos_D = 0
val_P = 0
val_I = 0
val_D = 0
ser = serial.Serial('/dev/ttyACM0', 9600, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=0, rtscts=0)
try:
while 1:
time.sleep(0.5)
cadena = ser.readline()
cadena = ser.readline()
pos_P = cadena.find("P")
pos_I = cadena.find("I")
pos_D = cadena.find("D")
val_P = int(cadena[1:(pos_I)])
h['P']=val_P
val_I = int(cadena[(pos_I+1):(pos_D)])
h['I']=val_I
val_D = int(cadena[(pos_D+1):])
h['D']=val_D
ser.flushInput()
except KeyboardInterrupt:
raise SystemExitEste programa al ser llamado desde el linuxcnc nos crea 3 pines para usarlos con el HAL que son "P", "I" y "D".
Desde el linuxcnc tan solo hay que cargarlo con la instrucción
loadusr nombredelphyton y ya se puede usar sus pines.
Ahora le toca el turno al panel de control que se crea con un fichero .xml y donde aparecerán los valores leídos por el arduino para usarlos como parámetros del PID.