Crea, comparte, aprende y disfruta
Servomotores con Pingüino
Los servomotores son otro de los elementos más empleados en robótica y en muchas aplicaciones electrónicas. 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.
Simplificándolo 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 pulso que recibe. Si quieres saber más sobre los servomotores te recomiendo que consultes Este tutorial.
Como hemos dicho, para controlar un servomotor necesitamos enviarle un pulso de un ancho determinado, la forma de hacer esto con un microcontrolador (como el que lleva Pingüino) es mediante los PWM. Ya vimos cómo utilizar los PWM de Pingüino 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:
En cuanto a la programación, contamos con una librería que va a simplificar muchísimo nuestro trabajo, la librería hasta el punto de que únicamente necesitaremos esto para controlar el servo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #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 pingüino. Es importante recordar que cada servo ocupa un pin de PWM, por lo que únicamente 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.
Deja una respuesta