Servomotores

y Pinguino
pic

Los servomotores son otro de los elementos más empleados en robotica y en muchas aplicaciones electronicas. Se trata de un tipo concreto de motores en los que es posible - y sencillo - controlar su posición con bastante precisión, o su velocidad en el caso de servos de rotación continua.

Simplificandolo mucho, un servomotor recibe un pulso mediante su cable de control y en función del ancho de ese pulso se coloca en una posición o en otra. Generalmente tienen un libertad de movimiento de 180 grados, por lo que la posición en la que se coloca dentro de ese margen es proporcional a la anchura del puslo que recibe. Si quieres saber más sobre los servomotores te recomiendo que consultes Este tutorial.

Como hemos dicho, para contorlar un servomotor necesitamos enviarle un pulso de un ancho determinado, la forma de hacer esto con un microcontrolador (como el que lleva Pinguino) es mediante los PWM. Ya vimos cómo utilizar los PWM de Pinguino y sabemos que las placas pequeñas solo tienen dos pines capaces de hacerlo, por lo que el montaje tendrá que ser muy similar a este:

circuito

En cuanto a la programación, contamos con una librería que va a simplificar muchisimo nuestro trabajo, la librería hasta el punto de que unicamente necesitaremos esto para controlar el servo:

						uchar position=1;
						int i;
						void setup(void)
						{
							servo.attach(0);
						}
						 
						void loop(void)
						{
							//En la variable posicion definimos el a  donde queremos mover el servo

							//Lo centramos
							posicion = 90;
							servo.write(0,position);
							delay(100);
							
							//Lo llevamos a un extremo:
							posicion = 180;
							servo.write(0,position);
							delay(100);

							//Lo movemos al extremo opuesto
							posicion = 0;
							servo.write(0,position);
							delay(100);

						}
						

Si por alguna razón no queremos utilizar la librería, siempre podemos complicar un poco el código y realizar el control nosotros mismos: .

						
						#define RUNLED PORTAbits.RA4
						//Definimos el PIC que lleva nuestro Pinguino
						#define PIC18F4550                

						//Contador de interrupciones
						int counter; 

						//Variable para la posicion del servo               
						int position0;                
						
						int i;
						int pulseWidth = 20;

						void setup(){
							
							//Configuramos el timer1
							T1CON=0x01;  
							
							//Activamos la interrupción           
							PIE1bits.TMR1IE=1;       

							//Activamos el GIE y PEIE
							INTCON|=0xA0;            
							pinMode(0,OUTPUT);
							Serial.begin(9600);
						}

						//Se crea una interrupcion que activara el proceso de mover el servo
						void UserInterrupt(){
							if (PIR1bits.TMR1IF){
								TMR1H=0xFF;                // reload value timer 1
								TMR1L=0x9C;

								//Reseteamos la bandera de interrupción
								PIR1bits.TMR1IF=0; 


								if (counter>position0+51) PORTBbits.RB0=0; // position
								else PORTBbits.RB0=1;
								if (counter==1500) counter=0;    // value for ~20 mS
								counter++;
							}
						}
						 
						void loop()	{
							//Asignamos valores a la variable position0 para mover el servo
							position0 = 0;
							if (position0<1) position0=1; if (position0>151) position0=151;

							//...
							//...
						 
						}
						

Con esto ya podemos incluir servomotores en nuestros proyectos con pinguino. Es importante recordar que cada servo ocupa un pin de PWM, por lo que unicamente podemos conectar dos servos y esto ya nos dejaría sin este recurso para otras aplicaciones. Más adelante explicaré que cómo podemos solventar este problema.

Plantilla Basada en la obra de © 2011 Ansimuz.