0% encontró este documento útil (0 votos)
2 vistas20 páginas

Gab P7 Micros

El documento describe la implementación de un sistema de control angular para un servomotor utilizando un microcontrolador PIC16F877A, que lee la posición de un potenciómetro a través de un ADC y genera una señal PWM mediante el Timer1. Se abordan conceptos clave sobre el funcionamiento de servomotores, sus componentes internos, y se detalla el proceso de programación y configuración del microcontrolador para lograr un control preciso del servomotor. Además, se discuten las características del servomotor MG996R y se enumeran los materiales necesarios para llevar a cabo la práctica.

Cargado por

Alejandro Medina
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas20 páginas

Gab P7 Micros

El documento describe la implementación de un sistema de control angular para un servomotor utilizando un microcontrolador PIC16F877A, que lee la posición de un potenciómetro a través de un ADC y genera una señal PWM mediante el Timer1. Se abordan conceptos clave sobre el funcionamiento de servomotores, sus componentes internos, y se detalla el proceso de programación y configuración del microcontrolador para lograr un control preciso del servomotor. Además, se discuten las características del servomotor MG996R y se enumeran los materiales necesarios para llevar a cabo la práctica.

Cargado por

Alejandro Medina
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Introducción.

En el desarrollo de proyectos de robótica, automatización industrial y control de


mecanismos, resulta muy habitual encontrar aplicaciones que exigen un posicionamiento
angular preciso de ciertos elementos, como pueden ser las articulaciones de un brazo
robótico, los mecanismos de dirección de un vehículo teledirigido, o los soportes móviles
de cámaras de vigilancia. Los servomotores de modelismo constituyen una solución
ampliamente adoptada para este tipo de cometidos, ya que integran en un único módulo
compacto un motor de corriente continua, un tren de engranajes, una tarjeta de control
electrónico y un potenciómetro de realimentación, lo que les permite conocer su propia
posición angular y mantenerse en ella.

El objetivo de esta práctica, denominada "Control Angular de un Servomotor mediante


Potenciómetro y ADC", es implementar un sistema basado en un microcontrolador
PIC16F877A que adquiera la posición de un potenciómetro a través de su convertidor
analógico-digital (ADC) y, en función del valor obtenido, genere la señal adecuada para
posicionar un servomotor en el ángulo correspondiente. Para ello, se utiliza el
temporizador Timer1 del microcontrolador en modo de interrupción, lo que permite
generar la señal de control con gran precisión sin necesidad de emplear retardos que
bloqueen la ejecución del programa.

El código presentado para esta práctica implementa una solución completa donde la
señal de modulación por ancho de pulso (PWM) se genera mediante el manejo explícito
del temporizador y la lógica de interrupciones, en lugar de depender de librerías
predefinidas. Este enfoque permite al estudiante comprender en profundidad los
principios temporales involucrados en el control de un servomotor, así como el
funcionamiento de los temporizadores del PIC16F877A y la gestión de interrupciones. A
lo largo del texto se abordan conceptos como la estructura interna de un servomotor, la
relación entre el ancho del pulso de control y la posición angular, la configuración del
ADC, y la programación del Timer1 en modo de 16 bits.

Marco Teórico.

El servomotor de modelismo: concepto y funcionamiento general.

Un servomotor de modelismo, frecuentemente denominado simplemente "servo", es un


dispositivo electromecánico que permite controlar la posición angular de su eje dentro de
un margen determinado (comúnmente entre 0° y 180° o entre 0° y 270°). A diferencia de
un motor de corriente continua convencional que gira de manera continua mientras se le
aplica tensión, el servomotor está diseñado para alcanzar y mantener una posición
angular concreta mientras recibe la señal de control apropiada.

Componentes internos de un servomotor:

• Motor de corriente continua de imán permanente: Es el elemento encargado de


generar el movimiento giratorio. Se trata de un motor pequeño de CC que puede
rotar en ambos sentidos según la polaridad de la tensión que recibe desde el
circuito de control.
• Caja reductora o tren de engranajes: Conjunto de ruedas dentadas que reducen
la velocidad de salida del motor y aumentan su par motor (capacidad para vencer
resistencias al giro). La caja reductora también transmite el movimiento desde el
rotor del motor hasta el eje de salida del servo.
• Circuito electrónico de control: Es una pequeña placa que contiene un comparador
o un microcontrolador dedicado. Este circuito recibe la señal de control procedente
del exterior (un pulso de anchura variable), la compara con la posición real medida
por el potenciómetro de realimentación, y decide en qué sentido debe girar el motor
para que el eje alcance la posición deseada.
• Potenciómetro de realimentación: Se encuentra acoplado mecánicamente al eje
de salida del servo. Su valor óhmico varía linealmente con la posición angular del
eje. El circuito de control mide este valor (transformado previamente en una
tensión) para conocer en todo instante la posición real del eje. Cuando la posición
real coincide con la posición comandada, el circuito detiene el motor.
• Eje de salida o palanca (horn): Es la parte que sobresale de la carcasa del servo
y a la cual se fijan brazos, palancas o cualquier otro elemento que se desee mover.

Principio de control de un servomotor estándar:

La señal de control que debe recibir un servomotor es una señal de modulación por ancho
de pulso (PWM) con una frecuencia fija. Sin embargo, a diferencia del PWM utilizado para
regular la intensidad de un LED (donde lo relevante es el ciclo de trabajo medio), en el
caso del servo lo que determina su posición angular es la duración del pulso en nivel alto,
mientras que el período completo de la señal se mantiene constante (típicamente en 20
milisegundos).

Características habituales de la señal de control para servomotores:


• Período total: Normalmente 20 milisegundos (ms), lo que equivale a una
frecuencia de 50 Hz. La mayoría de los servomotores aceptan períodos
comprendidos entre 10 ms y 30 ms sin que su funcionamiento se vea afectado.
• Anchura del pulso (tiempo en nivel alto): Es el parámetro variable que fija la
posición angular. Los rangos más comunes son:
o Para servos de 180° (como muchos de los empleados en hobby): pulso de
1.0 ms → 0°, 1.5 ms → 90°, 2.0 ms → 180°.
o Para servos de rango extendido (270°): pulso de 0.5 ms → 0°, 1.5 ms →
135°, 2.5 ms → 270°.
• Tiempo en nivel bajo: Durante el resto del período (aproximadamente entre 18 y
19 ms para un período de 20 ms), la señal permanece en nivel bajo. Este tiempo
es necesario para que el circuito interno del servo pueda procesar el pulso recibido
y para evitar el sobrecalentamiento del motor.

El servomotor MG996R (modelo empleado en esta práctica).

El Tower Pro MG996R es un servomotor de modelismo de mayor tamaño y prestaciones


que el popular SG90. Está diseñado para aplicaciones que requieren un torque elevado
y una construcción más robusta, gracias a sus engranajes metálicos.

Características técnicas del MG996R:

• Dimensiones: 40.7 mm × 19.7 mm × 42.9 mm.


• Peso: Aproximadamente 55 gramos.
• Tensión de alimentación: 4.8 V a 7.2 V (típicamente 5 V o 6 V).
• Torque (fuerza de giro): 9.4 kg·cm a 4.8 V; 11 kg·cm a 6 V.
• Velocidad de operación: 0.17 s/60° a 4.8 V; 0.14 s/60° a 6 V.
• Rango angular: 0° a 180° (versión estándar). Existen versiones de rango extendido
que llegan a 270°.
• Tipo de engranajes: Metálicos (principal ventaja frente al SG90).
• Consumo en reposo: ≈ 6-10 mA.
• Consumo en movimiento sin carga: ≈ 150-250 mA.
• Consumo de pico (bajo carga o bloqueado): Hasta 1.5 A o más.

Limitaciones del MG996R identificables durante su uso:

A pesar de ser un servo de gama media con buena relación calidad-precio, presenta
ciertas limitaciones que deben tenerse en cuenta:
• Consumo de corriente elevado: El consumo en pico puede alcanzar o superar 1.5
A, especialmente cuando se le somete a cargas elevadas o cuando se bloquea su
movimiento. Esto exige una fuente de alimentación robusta, con capacidad de
corriente suficiente, y un adecuado dimensionamiento de los conductores.
• Ruido audible: Debido a los engranajes metálicos, el MG996R produce un zumbido
o ruido característico durante su funcionamiento, especialmente cuando está
manteniendo una posición bajo carga.
• Juego mecánico: Aunque los engranajes metálicos son más duraderos que los de
plástico, presentan un cierto juego o "holgura" entre ellos, lo que puede traducirse
en una pequeña imprecisión en el posicionamiento, del orden de 1-2 grados.
• No es completamente estanco: El MG996R no está diseñado para operar en
ambientes húmedos o con polvo sin protección adicional.

Aplicaciones típicas del MG996R:

• Brazos robóticos de tamaño mediano (por ejemplo, robots de 3 a 6 grados de


libertad).
• Plataformas de posicionamiento para cámaras más pesadas.
• Proyectos de aeromodelismo de mayor envergadura (aviones de mayor tamaño,
barcos radiocontrolados).
• Robots con orugas o ruedas que requieren dirección mediante servo.
• Sistemas de apertura de compuertas o válvulas en maquetas funcionales.
• Proyectos educativos de robótica donde se requiere un torque superior al que
puede ofrecer un servo de plástico.

El convertidor analógico-digital (ADC) en el PIC16F877A.

El periférico ADC es el encargado de transformar una magnitud analógica de tensión (en


este caso, la proveniente de un potenciómetro conectado al pin RA0) en un valor
numérico digital que el microcontrolador puede interpretar y procesar.

Propiedades del ADC del PIC16F877A:

• Resolución de 10 bits: Proporciona valores discretos comprendidos entre 0 y 1023.


• Hasta 8 canales de entrada analógica (pines RA0 a RA7 en ciertos encapsulados).
• Tensión de referencia configurable: Puede tomarse como referencia VDD
(normalmente 5 V), una tensión externa aplicada al pin VREF+, o una tensión
interna de 2.56 V.
• Tiempo típico de conversión: Alrededor de 19.5 microsegundos por conversión.

Registros de control del ADC:

• ADCON0: Permite seleccionar el canal de entrada, encender o apagar el módulo


e iniciar una conversión.
• ADCON1: Define qué pines del puerto A funcionan como analógicos y cuáles como
digitales, y selecciona la fuente de tensión de referencia.
• ADRESH y ADRESL: Registros que contienen el resultado de 10 bits de la
conversión (los 8 bits altos en ADRESH y los 2 bits bajos en ADRESL).

En el código analizado, se utiliza la función ADC_Init() proporcionada por la librería de


MikroC, que simplifica la configuración inicial de este periférico.

El Timer1 del PIC16F877A.

El Timer1 es un temporizador de 16 bits, lo que significa que su registro de cuenta puede


tomar valores desde 0 hasta 65535. Esta característica lo hace especialmente adecuado
para generar retardos largos o señales con períodos relativamente extensos.

Características relevantes del Timer1:

• Tamaño de 16 bits: Permite alcanzar 65535 cuentas antes de desbordarse.


• Prescaler programable: Se pueden elegir divisores de 1:1, 1:2, 1:4 u 1:8.
• Fuente de reloj seleccionable: Puede funcionar con el reloj interno del sistema
(Fosc/4) o con un oscilador externo de baja frecuencia conectado a los pines
T1OSO y T1OSI.
• Interrupción por desbordamiento: Cuando el contador pasa de 65535 a 0, se activa
automáticamente la bandera TMR1IF en el registro PIR1, y si la interrupción está
habilitada, se ejecuta la rutina de servicio correspondiente.

Cálculo de tiempos con Timer1:


Cuando se utiliza el reloj interno, el Timer1 se incrementa una vez por cada ciclo de
instrucción. Con un cristal de 4 MHz:

• Frecuencia del oscilador: 4 MHz → período del oscilador: 0.25 µs.


• Ciclo de instrucción: Fosc/4 = 1 MHz → período de 1 µs.
Por tanto, cada incremento del Timer1 representa 1 microsegundo. Un desbordamiento
completo (desde 0 hasta 65535 y luego a 0) supone un tiempo de 65.536 milisegundos.

Para conseguir un tiempo concreto, se carga el Timer1 con un valor inicial tal que, al
contar hasta el desbordamiento, se alcance la duración deseada. La fórmula es:

Valor de Carga = 65536 - (Tiempo en microsegundos)

Por ejemplo, para un pulso de 1.5 ms (1500 µs): Valor de Carga = 65536 - 1500 = 64036
(en hexadecimal: 0xFA24).

Generación de la señal de control del servo mediante interrupciones del Timer1:

En lugar de emplear retardos que inmovilizan el microcontrolador, el código propuesto


utiliza un enfoque basado en interrupciones. El Timer1 se configura para que genere una
interrupción cada vez que completa el tiempo configurado (ya sea el tiempo
correspondiente al pulso en alto o el correspondiente al tiempo en bajo). Dentro de la
rutina de interrupción se alterna el estado del pin de salida (RC0) y se recarga el Timer1
con el siguiente valor necesario. De esta manera, el microcontrolador puede permanecer
en el bucle principal realizando otras tareas (como leer el ADC) mientras la generación
de la señal PWM ocurre en segundo plano.

Ventajas de este método:

• No se desperdician ciclos de procesador en esperas activas.


• La señal PWM generada es muy estable y precisa.
• La frecuencia de actualización del servo es constante (aproximadamente 50 Hz),
lo que proporciona un movimiento suave.

Objetivo.

Implementar un sistema de control de posición angular para un servomotor de modelismo


basado en la lectura de un potenciómetro mediante el convertidor analógico-digital (ADC)
de un microcontrolador PIC16F877A, utilizando el temporizador Timer1 en modo de
interrupción para generar la señal PWM de control.

• Comprender la estructura interna y el principio de funcionamiento de un


servomotor de modelismo, en particular el modelo SG90.
• Configurar el módulo ADC del PIC16F877A para leer la posición angular de un
potenciómetro conectado al canal AN0.
• Configurar el Timer1 del PIC16F877A en modo de 16 bits con interrupción por
desbordamiento.
• Implementar una rutina de servicio de interrupción (ISR) que genere la señal PWM
necesaria para controlar el servomotor, alternando entre el tiempo de pulso en alto
(determinado por la lectura del potenciómetro) y el tiempo en bajo (complemento
para alcanzar el período de 20 ms).
• Verificar mediante simulación o montaje físico que el servomotor se posicione en
un ángulo proporcional a la posición del potenciómetro.

Materiales y equipo.

• Computadora personal con el compilador MikroC PRO para PIC instalado.


• Microcontrolador PIC16F877A.
• Software Proteus Professional v8 (opcional, para simulación).
• Programador PICSTART Plus, PICKit 3, MASTER PROG o KP150.
• Fuente de alimentación regulada de 5V (debe ser capaz de suministrar al menos
500 mA para el servo).
• 1 servomotor de modelismo SG90 (o equivalente).
• 1 potenciómetro de 10kΩ (lineal o rotatorio).
• 1 resistencia de 10kΩ (para pull-up en MCLR).
• 2 capacitores de 22pF o 33pF.
• 1 cristal oscilador de 4MHz.
• Protoboard (breadboard) para realizar las conexiones.
• Cables de conexión (jumpers) macho-macho.
• Multímetro (opcional, para verificar voltajes).
• Fuente de alimentación externa de 5V para el servo (recomendada si la corriente
del programador o de la placa es insuficiente).

Trabajo previo.

• Conocimientos adquiridos en clase: Fundamentos de sistemas embebidos y


microcontroladores PIC.
• Conocimientos adquiridos en clase: Programación en lenguaje C para
microcontroladores (MikroC PRO).
• Conocimientos adquiridos en clase: Prácticas anteriores sobre configuración de
ADC, temporizadores e interrupciones.
• Conocimientos de asignaturas previas: Electrónica analógica y digital.
• Conocimientos de asignaturas previas: Interpretación de diagramas
esquemáticos.
o Investigar la hoja de especificaciones (datasheet) del servomotor SG90
para conocer sus características eléctricas y mecánicas, así como el rango
de pulsos de control (1.0 ms a 2.0 ms).
o Investigar el funcionamiento del Timer1 del PIC16F877A, incluyendo el
efecto del prescaler y el cálculo de tiempos de desbordamiento.
o Investigar la relación entre la lectura del ADC (0-1023) y el ancho de pulso
correspondiente para el SG90.
o Calcular teóricamente los valores de carga para el Timer1 para los pulsos
mínimo (1.0 ms), central (1.5 ms) y máximo (2.0 ms).
o Investigar el consumo de corriente del SG90 y determinar si la alimentación
del programador o de la protoboard es suficiente o si se requiere una fuente
externa.
o Diseñar el diagrama de conexión completo del circuito.

Desarrollo.

1. Consultar la hoja de especificaciones del PIC16F877A para comprender la


configuración del ADC, el Timer1 y el sistema de interrupciones.
2. Consultar la hoja de especificaciones del servomotor SG90 para confirmar el rango
de pulsos de control (1.0 ms a 2.0 ms) y la alimentación requerida.
3. Calcular la relación entre la lectura del ADC (0 a 1023) y el ancho de pulso
correspondiente (1000 µs a 2000 µs) utilizando una regla de tres o la función
`map()` implícita.
4. Analizar el código proporcionado, identificando las secciones de configuración del
ADC, configuración del Timer1, manejo de interrupciones y lógica principal.
5. Diseñar el esquema completo de conexión que incluya:
o El PIC16F877A con su cristal de 4MHz y capacitores.
o El potenciómetro conectado entre 5V y GND, con el cursor al pin RA0 (canal
AN0).
o El servomotor SG90: cable rojo (VCC) a 5V, cable negro/marrón (GND) a
tierra, cable naranja/amarillo (señal) al pin RC0.
o Resistencia pull-up de 10kΩ en MCLR.
6. Elaborar un informe detallado que explique el flujo de datos desde la lectura del
potenciómetro hasta el posicionamiento del servomotor.
7. Investigar por qué se utiliza el Timer1 de 16 bits en lugar de un Timer de 8 bits
(Timer0 o Timer2) para generar la señal del servo.
8. Investigar por qué la función de interrupción verifica la bandera `PIR1.TMR1IF` y
cómo se alternan los estados del pin de salida.

Procedimiento.

Para la realización de esta práctica, se construyó un sistema de control de posición para


un servomotor MG996R basado en la adquisición de la posición de un potenciómetro
mediante el convertidor ADC del PIC16F877A, empleando el temporizador Timer1 en
modo de interrupción para generar la señal PWM que gobierna el servo.

Análisis pormenorizado del código suministrado:

El código está redactado en lenguaje C para el compilador MikroC PRO para PIC y hace
uso de las interrupciones del Timer1 para generar la señal de control del servomotor sin
necesidad de bloquear la ejecución del programa principal.

Definición del pin conectado al servomotor:

• La línea sbit Servo_Pin at RC0_bit; asigna el pin RC0 como la salida que enviará
la señal de control al servomotor.
• La línea sbit Servo_Pin_Direction at TRISC0_bit; define el registro de dirección
correspondiente, que permitirá configurar el pin RC0 como salida.

Variables de uso global:

• adc_val: Variable de 16 bits que guarda el valor numérico obtenido del


potenciómetro a través del ADC, comprendido entre 0 y 1023.
• tiempo_alto: Variable de 16 bits que almacena el valor de precarga para el Timer1
durante el intervalo en que el pulso debe estar en nivel alto. Este valor determina
la posición angular del servo.
• tiempo_bajo: Variable de 16 bits que guarda el valor de precarga para el Timer1
durante el intervalo en que la señal permanece en nivel bajo, completando así el
período total de 20 ms.
• estado_pulso: Variable de tipo bit que indica si el temporizador se encuentra
actualmente generando el pulso en alto (valor 1) o el tiempo en bajo (valor 0).

Rutina de atención a la interrupción (interrupt()):

Esta función se invoca automáticamente cada vez que se produce una interrupción de
las que han sido habilitadas previamente.

En primer lugar, se comprueba si la interrupción ha sido provocada por el desbordamiento


del Timer1 mediante la condición if (PIR1.TMR1IF).

A continuación, se limpia la bandera de interrupción con PIR1.TMR1IF = 0 para permitir


que futuras interrupciones sean atendidas.

Seguidamente, se examina el estado actual de la señal a través de la variable


estado_pulso:

• Si estado_pulso == 0, significa que acaba de concluir el tiempo en bajo. Por tanto,


se pone la salida en nivel alto (Servo_Pin = 1), se cambia el estado a 1
(estado_pulso = 1), y se carga el Timer1 con el valor almacenado en tiempo_alto,
que determina la duración del pulso.
• Si estado_pulso == 1, significa que acaba de concluir el pulso en alto. Por tanto,
se pone la salida en nivel bajo (Servo_Pin = 0), se cambia el estado a 0
(estado_pulso = 0), y se carga el Timer1 con el valor almacenado en tiempo_bajo.

Función principal main():

Configuración inicial del sistema:

• ADCON1 = 0x0E: Se configura el pin RA0 como entrada analógica y el resto de


los pines del Puerto A como digitales.
• TRISA0_bit = 1: Se establece el pin RA0 como entrada.
• Servo_Pin_Direction = 0: Se configura el pin RC0 como salida.
• Servo_Pin = 0: Se inicializa la salida del servo en nivel bajo.
• ADC_Init(): Se inicializa el módulo convertidor analógico-digital con la
configuración por defecto de la librería.
Configuración del Timer1:

T1CON = 0x00: Se configura el Timer1 con prescaler 1:1, fuente de reloj interna (Fosc/4)
y se mantiene apagado en este momento.

Configuración de las interrupciones:

• [Link] = 1: Se habilitan las interrupciones globales.


• [Link] = 1: Se habilitan las interrupciones de los periféricos (entre ellos el
Timer1).
• PIR1.TMR1IF = 0: Se limpia la bandera de interrupción del Timer1 para asegurar
un estado inicial limpio.
• PIE1.TMR1IE = 1: Se habilita la interrupción por desbordamiento del Timer1.

Puesta en marcha del temporizador:

• estado_pulso = 0: Se establece el estado inicial de la señal como "bajo".


• T1CON.TMR1ON = 1: Se enciende el Timer1 para que comience su conteo.

Bucle infinito principal (while(1)):


Se lee el valor del potenciómetro mediante adc_val = ADC_Read(0).

Se calcula el valor de tiempo_alto aplicando la fórmula: tiempo_alto = 65536 - (1000 +


(unsigned int)((long)adc_val * 1000 / 1023)). Esta expresión transforma el rango de 0-
1023 del ADC en un ancho de pulso comprendido entre 1000 µs (para 0) y 2000 µs (para
1023), que es el rango típico para un servo de 180° como el MG996R.

Se calcula el valor de tiempo_bajo de manera que la suma del tiempo en alto y el tiempo
en bajo totalice un período de 20 ms (20000 µs).

Se incluye un retardo de 20 ms mediante Delay_ms(20) para estabilizar el lazo de control


y dar tiempo a que el servo procese la nueva posición.

Montaje del circuito en la protoboard:

• Conexión del microcontrolador PIC16F877A:


• Se colocó el PIC16F877A sobre la protoboard.
• Se conectó el cristal de 4 MHz entre los pines OSC1 (pin 13) y OSC2 (pin 14),
añadiendo dos capacitores de 22 pF conectados a tierra.
• Se unió el pin MCLR (pin 1) a la alimentación de 5 V a través de una resistencia
de 10 kΩ (configuración pull-up).
• Se alimentaron los pines VDD (pines 11 y 32) con 5 V y los pines VSS (pines 12 y
31) con tierra.

Conexión del potenciómetro:

• Se montó un potenciómetro de 10 kΩ en la protoboard.


• El terminal izquierdo se conectó a la alimentación de 5 V.
• El terminal derecho se conectó a tierra.
• El terminal central (cursor) se conectó al pin RA0 (pin 2) del microcontrolador.

Conexión del servomotor MG996R:

El cable de color rojo (alimentación positiva) se conectó a una fuente externa de 5 V con
capacidad suficiente para suministrar al menos 1.5 A, ya que el MG996R puede consumir
picos de corriente elevados durante los movimientos bruscos o bajo carga.

El cable de color negro o marrón (tierra) se conectó a la tierra común del sistema,
compartiendo así la referencia con el microcontrolador.

El cable de color naranja o amarillo (señal de control) se conectó al pin RC0 (pin 15) del
PIC16F877A.

Advertencia sobre la alimentación del servomotor: Es importante destacar que el


MG996R, debido a su mayor tamaño y torque, consume considerablemente más
corriente que un servo pequeño como el SG90. Los picos de corriente pueden superar
holgadamente los 500 mA, por lo que no es recomendable alimentarlo desde la misma
fuente que el programador o desde los pines de 5 V de una placa de desarrollo de baja
capacidad. Se debe utilizar una fuente de alimentación externa dedicada, preferiblemente
regulada a 5 V con capacidad de al menos 2 A, y asegurarse de que la tierra de esta
fuente esté conectada a la tierra del microcontrolador.

Simulación y comprobación del correcto funcionamiento:

Se compiló el código fuente en el entorno MikroC PRO para PIC, obteniendo el archivo
hexadecimal correspondiente, que fue cargado en el microcontrolador PIC16F877A. Tras
alimentar el circuito, se observó el comportamiento esperado:
Al girar el potenciómetro desde su posición mínima hasta su posición máxima, el
servomotor MG996R se desplazaba de manera progresiva y suave desde un extremo de
su rango angular (0°) hasta el extremo opuesto (180°).

La posición angular del servo seguía fielmente la posición del potenciómetro, existiendo
una correspondencia directa y en tiempo real entre ambas magnitudes.

El movimiento resultaba suave y sin vibraciones apreciables, gracias a que el bucle


principal actualiza continuamente el valor de tiempo_alto y la rutina de interrupción se
encarga de generar la señal PWM con la precisión que proporciona el Timer1 de 16 bits.

Ajuste de la fórmula para el MG996R de 180°: El código presentado utiliza la fórmula


tiempo_alto = 65536 - (1000 + (adc_val * 1000 / 1023)), lo que genera un rango de pulsos
de 1000 µs (ADC = 0) a 2000 µs (ADC = 1023). Este rango es el adecuado para un
servomotor MG996R en su versión estándar de 180° de giro. Si se dispusiera de una
versión de rango extendido (270°), debería ajustarse la fórmula para que el pulso oscilara
entre 500 µs y 2500 µs.

Evidencia.
Imágenes de la simulación.
Imágenes del armado.
Conclusión.

El desarrollo completo de esta práctica ha permitido implementar un sistema funcional de


control de posición para un servomotor de modelismo, empleando un microcontrolador
PIC16F877A como unidad de procesamiento, un potenciómetro como sensor de entrada
analógica, y una estrategia basada en temporizadores e interrupciones para generar con
precisión la señal PWM que comanda el servo. A continuación, se profundiza en los
aspectos más relevantes referidos al modelo de servomotor utilizado, las exigencias para
trasladar el prototipo a una aplicación real, y los posibles campos de aplicación de este
principio.

El modelo de servomotor empleado: MG996R.

En esta práctica se ha utilizado el servomotor Tower Pro MG996R, un componente de


tamaño medio que destaca por su construcción robusta (engranajes metálicos) y su
elevado torque, lo que lo hace adecuado para proyectos más exigentes que aquellos en
los que se emplean servos pequeños de plástico.

Limitaciones del MG996R identificadas durante la práctica:

• Elevado consumo de corriente: Esta es sin duda la limitación más crítica


observada. Durante los movimientos rápidos o cuando el servo se ve forzado a
mantener una posición contra una carga resistente, el consumo puede superar
fácilmente 1.5 A. En las primeras pruebas, al intentar alimentar el servo desde la
misma fuente que el microcontrolador (un programador USB de baja capacidad),
se produjeron reinicios inesperados del PIC debido a las caídas de tensión
provocadas por los picos de corriente. Esta experiencia subraya la necesidad de
una fuente de alimentación externa robusta y bien dimensionada.
• Ruido audible durante el funcionamiento: Los engranajes metálicos del MG996R,
si bien son mucho más duraderos que los de plástico, generan un zumbido o
zumbido característico cuando el servo está en movimiento o incluso cuando está
manteniendo una posición bajo carga. En aplicaciones donde el ruido sea un factor
crítico (por ejemplo, entornos de grabación de audio o laboratorios silenciosos),
puede ser necesario considerar medidas de amortiguación acústica o buscar
alternativas más silenciosas.
• Juego mecánico (backlash): Debido a las holguras inevitables entre los engranajes
metálicos, el MG996R presenta un pequeño juego angular cuando se invierte el
sentido de giro. Este juego puede ser de hasta 1-2 grados, lo que limita la precisión
absoluta del posicionamiento. Para aplicaciones que requieran una precisión muy
alta (por ejemplo, apuntamiento de antenas o sistemas ópticos), puede ser
necesario emplear servos de mayor calidad o incorporar realimentación adicional.
• Dimensiones y peso: Con 55 gramos y unas dimensiones de aproximadamente 40
× 20 × 43 mm, el MG996R es significativamente más grande y pesado que servos
pequeños como el SG90. Esto debe tenerse en cuenta en el diseño mecánico de
la estructura que lo aloja, así como en la estimación de la carga útil total en
aplicaciones móviles (robots, drones, etc.).

Aplicaciones prácticas del MG996R donde sus limitaciones no constituyen un


impedimento:

A pesar de las limitaciones señaladas, el MG996R es un servo muy versátil que se emplea
en una amplia variedad de proyectos:

• Brazos robóticos de tamaño mediano: En robots educativos o de investigación de


3 a 6 grados de libertad, el MG996R proporciona el torque necesario para levantar
cargas moderadas (por ejemplo, una pinza con un objeto pequeño) sin resultar
excesivamente caro.
• Plataformas de orientación para cámaras de vigilancia: En sistemas PTZ (Pan-Tilt-
Zoom) para cámaras de seguridad, el MG996R puede mover el soporte de la
cámara con suficiente torque y precisión para aplicaciones de videovigilancia.
• Robots móviles con dirección por servo: En robots con tracción diferencial o con
orugas, a menudo se utiliza un servo para accionar un mecanismo de dirección
(por ejemplo, una rueda loca orientable) o para mover un brazo o una herramienta.
• Proyectos de aeromodelismo de tamaño medio: En aviones radiocontrolados de
alas fijas o helicópteros de tamaño medio, el MG996R se utiliza para accionar los
alerones, el timón de profundidad y el timón de dirección, gracias a su torque
suficiente y a la robustez de sus engranajes metálicos.
• Maquetas funcionales y mecanismos didácticos: En exposiciones o museos, se
emplean servos como el MG996R para animar maquetas (puertas que se abren,
grúas que giran, brazos que se mueven, etc.), donde la fiabilidad mecánica es más
importante que la precisión absoluta.

Lo que se necesitaría para llevar este circuito a una aplicación real:

Para convertir el prototipo de laboratorio en un sistema robusto, fiable y listo para ser
desplegado en un entorno real (por ejemplo, un posicionador solar, un brazo robótico
funcional o un sistema de orientación de antena), deben considerarse los siguientes
aspectos:
• Fuente de alimentación dimensionada adecuadamente: El servomotor MG996R
debe ser alimentado desde una fuente de 5 V o 6 V con capacidad de corriente
suficiente (mínimo 2 A, recomendable 3 A o más). Se puede utilizar un regulador
conmutado (step-down) de alta eficiencia o un regulador lineal de 5 V provisto de
un disipador térmico adecuado. Es imprescindible que la tierra de la fuente del
servo esté conectada a la tierra del microcontrolador.
• Condensadores de desacoplo y filtrado: Deben añadirse capacitores de desacoplo
de 100 µF (electrolítico) y 0.1 µF (cerámico) lo más cerca posible de los pines de
alimentación del servomotor. Estos componentes ayudan a absorber los picos de
corriente y evitan que las caídas de tensión instantáneas afecten al
microcontrolador o a otros circuitos sensibles.
• Protección contra sobrecorriente: En aplicaciones donde el servo pueda
bloquearse (por ejemplo, si el mecanismo encuentra un tope físico), es
aconsejable incorporar un fusible rearmeable (PTC) en serie con la alimentación
del servo, con una corriente de disparo ligeramente superior a la máxima esperada
en funcionamiento normal.
• Sujeción mecánica robusta: El servomotor MG996R debe montarse firmemente
sobre una estructura mecánica rígida (por ejemplo, utilizando tornillos a través de
sus orejetas de montaje) para evitar vibraciones o movimientos parásitos. Las
piezas impresas en 3D o los soportes de aluminio son opciones habituales.
• Aislamiento eléctrico y protección contra interferencias: En entornos industriales o
con fuentes de ruido electromagnético, se puede optar por aislar galvánicamente
la señal de control mediante un optoacoplador, y por utilizar cables trenzados o
apantallados para las conexiones de alimentación y señal.
• Filtrado de la lectura del ADC: Para evitar movimientos bruscos o erráticos debidos
al ruido presente en la señal del potenciómetro, puede implementarse un filtrado
digital sencillo (por ejemplo, una media móvil de varias lecturas sucesivas) antes
de calcular el ancho de pulso correspondiente.
• Inicialización segura del sistema: En el código de una aplicación real, debería
incluirse una rutina que lleve el servo a una posición conocida y segura (por
ejemplo, la posición central de 90°) antes de comenzar el bucle principal, y que
gestione adecuadamente los casos en que el ADC devuelva valores fuera del
rango esperado.
• Almacenamiento de la última posición en memoria no volátil: Si la aplicación
requiere que el servo mantenga su posición tras un reinicio o una caída de
alimentación, puede almacenarse la última posición válida en la memoria
EEPROM del PIC y recuperarla al encender.
Aplicaciones reales que pueden implementarse con este principio (control de servo
mediante ADC):

El principio fundamental de esta práctica (leer un sensor analógico y convertir ese valor
en una posición angular de un servo) es extremadamente versátil y puede trasladarse a
numerosos sistemas del mundo real:

• Control remoto de una plataforma de orientación de cámara (sistema PTZ):


Utilizando dos potenciómetros (uno para el movimiento horizontal "pan" y otro para
el movimiento vertical "tilt") se puede gobernar la orientación de una cámara de
vigilancia o de una cámara web, permitiendo cubrir angularmente una sala o un
área de interés.
• Posicionador solar de un panel fotovoltaico de pequeña potencia: Se pueden
emplear dos servomotores MG996R (uno para el acimut y otro para la elevación)
junto con dos potenciómetros que actúen como interfaz de usuario, o mejor aún,
con sensores de luz (fotodiodos o fotorresistencias) que detecten la dirección de
máxima radiación solar para orientar automáticamente el panel.
• Control manual de una válvula de mariposa en sistemas de riego o climatización:
Un potenciómetro montado en un panel de control permite al operador seleccionar
el grado de apertura de una compuerta o válvula, y un servo MG996R mueve
físicamente la compuerta hasta la posición seleccionada, regulando así el caudal
de agua o de aire.
• Interfaz de control maestro-esclavo para un brazo robótico: Varios potenciómetros
(tantos como articulaciones tenga el brazo) permiten a un operador controlar la
posición de cada servo de forma independiente. Esta configuración puede
utilizarse para enseñar movimientos al robot (grabando las posiciones) o como
interfaz de teleoperación.
• Sistema de inclinación ajustable para placas de cultivo o experimentos: En
laboratorios de biología o química, puede ser necesario inclinar una bandeja o
recipiente en un ángulo preciso. Un servo MG996R, controlado por un
potenciómetro, permite ajustar la inclinación de forma continua y reproducible.
• Control de un exoesqueleto de dedo para rehabilitación (versión de mayor torque):
Para pacientes que requieren una mayor fuerza de asistencia, el MG996R puede
emplearse en dispositivos de rehabilitación de dedos o muñeca, donde su torque
superior al de servos pequeños puede ser necesario para mover articulaciones
con cierta rigidez.
• Posicionamiento de antenas parabólicas portátiles: En sistemas de
comunicaciones móviles, un servo MG996R puede orientar una antena pequeña
en acimut y elevación para seguir la posición de un satélite o de una estación base,
utilizando la señal recibida como referencia (sistema de seguimiento por máxima
potencia).
Reflexión final sobre los principios aprendidos:

Esta práctica ha permitido integrar de manera práctica varios conceptos esenciales de


los sistemas embebidos en una aplicación de control en tiempo real:

• Conversión analógico-digital (ADC): Se ha transformado una magnitud física


continua (la posición de un potenciómetro) en un valor digital que el
microcontrolador puede procesar, comprendiendo la relación entre la resolución
del ADC (10 bits → 0-1023) y la precisión del control resultante.
• Mapeo de rangos: Se ha aplicado una transformación lineal (una simple regla de
tres o una operación aritmética análoga a la función map()) para convertir el valor
del ADC (0-1023) en un ancho de pulso adecuado para el servo (1000-2000 µs
para el MG996R de 180°).
• Generación de señales PWM precisas mediante temporizadores: En lugar de
confiar en funciones de librería que ocultan los detalles de implementación, se ha
configurado explícitamente el Timer1 del PIC en modo de 16 bits y se ha utilizado
su interrupción para generar la señal PWM, comprendiendo así la relación entre el
valor de carga del temporizador y el tiempo resultante.
• Programación orientada a eventos (interrupciones): Se ha comprendido la ventaja
de utilizar interrupciones para tareas que requieren temporización precisa, ya que
el microcontrolador puede dedicar la mayor parte de su tiempo al bucle principal
(en este caso, leer el ADC y calcular el nuevo ancho de pulso) mientras la
generación de la señal PWM ocurre en segundo plano.
• Consideraciones prácticas de diseño de hardware: Se ha evidenciado que un
sistema embebido no es solo código, sino también una interacción cuidadosa entre
el software y los componentes físicos. La elección de una fuente de alimentación
adecuada, la inclusión de condensadores de desacoplo, la conexión correcta de
las tierras, y la selección del servomotor según el torque y la robustez requeridos
son aspectos tan importantes como la corrección del código.

El control de servomotores es una habilidad fundamental en robótica y automatización.


El dominio de las técnicas mostradas en esta práctica, junto con la capacidad de leer
sensores analógicos y tomar decisiones basadas en esas lecturas, permite al ingeniero
abordar proyectos de creciente complejidad, desde simples posicionadores hasta brazos
robóticos multi-articulados y sistemas de control de movimiento en tiempo real. La
elección del servomotor adecuado (en este caso, el MG996R por su torque y engranajes
metálicos) es un paso crítico en el diseño, y debe hacerse considerando las exigencias
mecánicas, eléctricas y presupuestarias de cada aplicación.
Bibliografía.

• Microchip Technology Inc. (2003). *PIC16F87XA Data Sheet: 28/40-Pin 8-Bit


CMOS Flash Microcontrollers*. DS39582B.
• Tower Pro. (s.f.). *SG90 Micro Servo Data Sheet*. Documento técnico del
fabricante.
• MikroElektronika. (2021). *MikroC PRO for PIC User Manual*. Recuperado de
[Link]
• Laboratorio de Electrónica, Instituto Tecnológico de Durango. (2026). *Prácticas de
Microcontroladores*. Material didáctico.
• Banzi, M., & Shiloh, M. (2014). *Getting Started with Arduino: The Open Source
Electronics Prototyping Platform* (3rd ed.). Maker Media. (Para referencia
conceptual sobre servomotores).

También podría gustarte