User Guide

181. {
182. // We are somewhat close to being
183. // drive straight.
centered on the line:
eft of the line: turn right.
rs(100,0);
d(0);
e is never reached. A robot should
ach the end of its program, or unpredictable behavior
u
línea avanzado con 3pi: PID Control
en el directorio examples\3pi-
linefollower-pid
.
e de Pololu Arduino Libraries (ver Sección 5.g).
ermiten incrementar de forma
ea lo expresamos con un valor exacto de 0. Si esta a la izquierda
ar.
though we
able position es del tipo int en la fórmula para un
e almacenar valores positivos, luego la expresión
184. set_motors(100,100);
185. left_led(1);
186. right_led(1);
187. }
188. else
189. {
ar to the l190. // We are f
191. set_moto
le192. left_
193. right_led(1);
194. }
195. }
196. // This part of the cod
197. // never re
198. // will result as random code starts getting executed. If yo
199. // really want to stop all actions at some point, set your motors
200. // to 0,0 and run the following command to loop forever:
201. //
202. while(1);
203. }
7.c Seguimiento de
Un programa avanzado de seguimiento de línea para el 3pi está
Nota: Hay una versión compatible con el Arduino-compatible de este programa que puede
bajarse como part
La técnica usada en este ejemplo es conocida como PID control, dirigida a alguno de los
problemas que hemos mencionado en el programa anterior y que p
notoria la velocidad de seguimiento de la línea. Muy importante, el control PID usa
continuamente funciones para calcular la velocidad de los motores, la simpleza del ejemplo
anterior puede reemplazarse por una respuesta más suave. PID responde a Proporcional, Integral,
Derivación, estas son las tres entradas usadas en la fórmula para computar la velocidad del robot
al girar a izquierda y derecha.
El valor proportional es aproximadamente proporcional a la posición del robot. Esto es.
Si está centrado en la lín
de la línea, el valor será un número positivo y si está a la derecha de la línea será negativo.
Esto se computa por el resultado que devuelve read_line() simply restándole 2000.
El valor integral es un histórico del funcionamiento del robot: es la suma de todos los
valores del término proporcional que recuerda desde que el robot empieza a funcion
El derivative es el índice de cambios de los valores proporcional. Computamos en este
ejemplo la diferencia entre los últimos dos valores.
Este el trozo de código para la entrada de los valores PID:
// Get the position of the line. Note that we must provide1.
2. // the “sensors” argument to read_line() here, even
3. // are not interested in the individual sensor readings.
4. unsigned int position = read_line(sensors,IR_EMITTERS_ON);
5. // The “proportional” term should be 0 when we are on the line.
6. int proportional = ((int)position) - 2000;
7. // Compute the derivative (change) and integral (sum) of the
8. // position.
9. int derivative = proportional - last_proportional;
10. integral += proportional;
11. // Remember the last position.
12. last_proportional = proportional;
Hay que tener en cuenta que la vari
proporcional. Un unsigned int solo pued
position-2000, pone fuera de prueba y puede llevar a un negative overflow. En este caso