Trastejant

Crea, comparte, aprende y disfruta

Servomotores con Pingüino

Tutorial con Pinguno: Control de servomotores con Pinguino

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:

 

Servomotor con Pinguino

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.


También te puede interesar...

No hay temas relacionados

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.