VII. PROGRAMACIÓN DEL MICROCONTROLADOR CON APLICACIONES

 Los microcontroladores pueden ser empleados en diversas aplicaciones para la automatización de procesos, en esta entrada veremos como podremos aplicar lo aprendido hasta este momento en nuestro curso para realizar un tacometro digital con pic y lcd que puede ser muy util para conocer en todo momento la velocidad de un motor DC.

Para poder realizar un contador de RPM con el PIC deberemos recordar lo aprendido en la entrada de interrupciones y la entrada de PWM (modulación por ancho de pulso).

Como deseamos medir las RPM de un motor dc empleando el compilador PIC C (CCS C) vamos a introducir una nueva interrupción del microcontrolador conocida como la interrupción de flanco de subida y flanco de bajada.

Interrupción por Flanco de Subida y Flanco de Bajada

Sabemos que el microcontrolador generalmente trabaja con señales binarias o señales digitales de 0v y 5v (0 lógico y 1 lógico) y por lo general estas señales pueden ser representadas por un tren de pulsos:

Señal Digital

En algunos casos, puede interesarnos leer unicamente los flancos de subida o los flancos de bajada de algún tren de pulsos que esté entrando al microcontrolador como lo vemos en la siguiente imagen

Flancos de Subida y Bajada

Este tipo de señales es bastante común en sensores del tipo encoders, los cuales son muy utilizados para medir posición o velocidad angular, incluso estos eran empleados en los Mouse antiguos de nuestra computadora para poder determinar la posición del cursor.

Un encoder o codificador es un dispositivo de retroalimentación electromecánica empleado para proporcionar información sobre la posición, la velocidad, el conteo o la dirección convirtiendo el movimiento en una señal eléctrica para ser leída por un dispositivo de control como por ejemplo el microcontrolador PIC.

Los encoders generalmente se componen de una carcasa de plástica o de metal para proteger la electrónica, generalmente operando con principios magnéticos u ópticos y una variedad de opciones para su montaje según lo requiera la aplicación.

A continuación vemos un encoder optico donde una rueda plastica con agujeros va interrumpiendo el haz de luz gerado por un led infrarojo, generando asi una señal cuadrada o digital la cual puede ser leida para determinar la posición o velocidad de un elemento específico y la cual es leída empleando la interrupción de flanco de subida o flanco de bajada.

Encoder

Para configurar la lectura de la  INTERRUPCIÓN POR FLANCO DE SUBIDA en el Compilador CCS C Compiler debemos utilizar el siguiente comando:

ext_int_edge(L_TO_H);

Para configurar la lectura del INTERRUPCIÓN POR FLANCO DE BAJADA en el Compilador CCS C Compiler debemos utilizar el siguiente comando:

ext_int_edge(H_TO_L);
Medidor de Velocidad de un Motor DC con PIC

Si dominas este ejemplo, estarás en la capacidad de hacer un control de velocidad de un motor DC con PIC (Tacometro con PIC), dado que uno de los factores más importantes en este tipo de aplicaciones es poder realizar un medidor de RPM con PIC 16F877A, 16F887, 18F4550 o cualquier otro PIC.

Vamos a realizar un medidor de Velocidad de un Motor DC con PIC, utilizando como sensor un Encoder de 10 Pulsos por Revolución. Esta práctica la realizaremos directamente en proteus.

El proteus directamente posee un MOTOR que ya tiene integrado un encoder y puedes buscarlo con el nombre de MOTOR-ENCODER. En nuestro curso gratuito de Arduino empleamos un motor con encoder integrado para realizar la medición de velocidad DC con Arduino.

El diagrama esquemático del sensor de velocidad RPM de un Motor DC con Microcontrolador PIC implementado en Proteus es:

Velocidad de un Motor DC con PIC y Encoder

En el diagrama anterior podemos ver que a través de un potenciometro, regularemos la velocidad del motor 12V DC, utilizando un mosfet en la etapa de potencia.

Como ya sabemos el motor tiene acoplado un Encoder que entrega un tren de pulsos. Ese tren de pulsos debe ser conectado en el PIN RB0 del PIC y por medio de la interrupción Externa y por lectura bien sea del flanco de subida o flanco de Bajada, se debe calcular la velocidad en RPM (Revoluciones por Minuto) y mostrarlas en una pantalla LCD.

Para eso vamos a necesitar configurar el MOTOR-ENCODER del proteus dando doble click y colocando los 10 pulsos.

La idea general aquí, es que cada vez que se detecte alguno de los flancos (Puedes escoger el que tu desees, subida o bajada) el microcontrolador incremente un contador dentro de la rutina de interrupción.

Pasado 1 segundo, se observa cuantas veces se detectó el flanco seleccionado multiplicamos por 60 para hacer la conversión a minutos y finalmente dividimos por la resolución del encoder que en este caso es 10.

el codigo compilado 








el codigo
#INCLUDE <18f45k50.h>
#DEVICE ADC=10
//#USE DELAY(CLOCK=4000000) //Crystal Interno 4MHz
#use delay(clock=4000000,crystal)//Crystal Externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <LCD.C>
#BYTE PORTA= 5
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTD= 8
long contador=0;
int16 duty=0;
int Timer2,Poscaler;
double RPM;
//Interrubción por cambio en RB0
#INT_EXT
ext_isr()
{
contador++;
}
void main()
{
//Configura los Puertos del PIC
set_tris_a(0x01);
set_tris_b(0x01); //RB0 como entrada
set_tris_d(0);
//Configura la Entrada Analoga
setup_adc_ports(sAN0); //Configurar ADC (Lectura de temperatura)
setup_adc(adc_clock_internal); //Reloj interno para la conversion analoga digital)
//Configura el PWM
// Generemos una Señal cuadrada de 1 Khz
Timer2=249; //Se carga timer 2 con 249 como lo vimos en la pagina
//Preescaler=4; //Preescaler solo puede tomar valores de: 1 - 4 - 16
//Para el preescaler colocamos "t2_div_by_4"
Poscaler=1; //Preescaler solo puede tomar valores de: 1
setup_timer_2(t2_div_by_4,Timer2,Poscaler); //Configuracion de Timer 2 para establecer frec. PWM a 1kHz
setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM
//Habilita las Interrupcciones
enable_interrupts(int_ext); //Activa interrupcion por RB0
ext_int_edge(L_TO_H); //Activa interrupción por flanco de subida
enable_interrupts(global); //Habilita interrupciones de forma global
lcd_init();
lcd_gotoxy(1,1);
LCD_PUTC("VELOCIDAD MOTOR");
//Hace por siempre
while(1)
{
//Lectura del Potenciometro
set_adc_channel(0); //Escoge el canal 0 de los puertos analogos
delay_us(100);
duty=read_adc(); //Almacena en duty el valor del voltaje del pot
set_pwm1_duty(duty);//10 bits= 1023 y 8bit= 255
//Espera por 1 segundo
delay_ms(999);
//Despues de 1 segundo multiplica el valor de los pulsos contados en
//contador y los multiplica por 60 (para pasarlo a minutos) y lo divide
//por el numero de pulsos que tiene el encoder, en este caso el encoder
//da 10 pulsos en 1 giro completo
RPM=contador*60/10;
//Reinicia el contador de Pulsos
contador=0;
//Visualiza la Velocidad
lcd_gotoxy(1,2);
printf(lcd_putc,"RPM: %f ",RPM);
}
}

Evidencias de prácticas realizada en clase

simulacion en proteus 
resultados 





Uso de Driver L298N para motores DC con Arduino

Este módulo basado en el chip L298N te permite controlar dos motores de corriente continua o un motor paso a paso bipolar de hasta 2 amperios.

El módulo cuenta con todos los componentes necesarios para funcionar sin necesidad de elementos adicionales, entre ellos diodos de protección y un regulador LM7805 que suministra 5V a la parte lógica del integrado L298N. Cuenta con jumpers de selección para habilitar cada una de las salidas del módulo (A y B). La salida A esta conformada por OUT1 y OUT2 y la salida B por OUT3 y OUT4. Los pines de habilitación son ENA y ENB respectivamente.


Conexión de alimentación

Este módulo se puede alimentar de 2 maneras gracias al regulador integrado LM7805.


Cuando el jumper de selección de 5V se encuentra activo, el módulo permite una alimentación de entre 6V a 12V DC. Como el regulador se encuentra activo, el pin marcado como +5V tendrá un voltaje de 5V DC. Este voltaje se puede usar para alimentar la parte de control del módulo ya sea un microcontrolador o un Arduino, pero recomendamos que el consumo no sea mayor a 500 mA.

Cuando el jumper de selección de 5V se encuentra inactivo, el módulo permite una alimentación de entre 12V a 35V DC. Como el regulador no esta funcionando, tendremos que conectar el pin de +5V a una tensión de 5V para alimentar la parte lógica del L298N. Usualmente esta tensión es la misma de la parte de control, ya sea un microcontrolador o Arduino.

Recomendamos nunca conectar una tensión de entrada al pin de +5V, cuando el jumper de selección de 5V se encuentre activado. Esto provocaría un corto y podría dañar permanentemente el módulo.

Control de un motor DC

Como demostración, vamos a controlar un motor DC a través de la salida B del módulo. El pin ENB se conectará con el jumper a +5V.

El ejemplo esta desarrollado en Arduino UNO, pero el código es compatible con cualquier Arduino o pinguino.

Esquema de conexión




Código en Arduino

El programa básicamente activa el motor en un sentido por 4 segundos, luego detiene el motor por 0.5 segundos, después activa el motor en sentido inverso por 4 segundos y por último detiene el motor por 5 segundos. Luego repite la acción indefinidamente.

/*
Ejemplo de control de motor DC usando modulo L298
http://electronilab.co/tienda/driver-dual-para-motores-full-bridge-l298n/
El programa activa el motor en un sentido por 4 segundos,
para el motor por 500 ms, activa el motor en sentido inverso por 4 segundos
y se detiene por 5 segundos. Luego repite la acción indefinidamente.
Creado 16/05/14
por Andres Cruz
ELECTRONILAB.CO
*/
int IN3 = 5;
int IN4 = 4;
void setup()
{
pinMode (IN4, OUTPUT); // Input4 conectada al pin 4
pinMode (IN3, OUTPUT); // Input3 conectada al pin 5
}
void loop()
{
// Motor gira en un sentido
digitalWrite (IN4, HIGH);
digitalWrite (IN3, LOW);
delay(4000);
// Motor no gira
digitalWrite (IN4, LOW);
delay(500);
// Motor gira en sentido inverso
digitalWrite (IN3, HIGH);
delay(4000);
// Motor no gira
digitalWrite (IN3, LOW);
delay(5000);
}

compilamos en programa en arduino 


resultados 








Control de un motor DC variando su velocidad

Si queremos controlar la velocidad del motor, tenemos que hacer uso de PWM. Este PWM será aplicado a los pines de activación de cada salida o pines ENA y ENB respectivamente, por tanto los jumper de selección no serán usados.

Esquema de conexión

L298N_1_mot_PWM

Código en Arduino

El programa controla la velocidad de un motor DC aplicando PWM al pin ENB del módulo L298N.

/*
Ejemplo de control de motor DC usando modulo L298
http://electronilab.co/tienda/driver-dual-para-motores-full-bridge-l298n/
Creado 16/05/14
por Andres Cruz
ELECTRONILAB.CO
*/
int IN3 = 5; // Input3 conectada al pin 5
int IN4 = 4; // Input4 conectada al pin 4
int ENB = 3; // ENB conectada al pin 3 de Arduino
void setup()
{
pinMode (ENB, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
}
void loop()
{
//Preparamos la salida para que el motor gire en un sentido
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
// Aplicamos PWM al pin ENB, haciendo girar el motor, cada 2 seg aumenta la velocidad
analogWrite(ENB,55);
delay(2000);
analogWrite(ENB,105);
delay(2000);
analogWrite(ENB,255);
delay(2000);
// Apagamos el motor y esperamos 5 seg
analogWrite(ENB,0);
delay(5000);
}

compilamos el programa 

resultados 









servomotores 

¿Cómo funciona un servo?

Internamente un servo está constituido por un motor de corriente continua, acoplado a un reductor para reducir la velocidad de giro, junto con la electrónica necesaria para controlar su posición.

arduino-servo-interior

Frecuentemente simplemente se dispone de un potenciómetro unido al eje del servo, que permite al servo para conocer la posición del eje. Esta información es tratada por un controlador integrado que se encarga de ajustar actuar sobre el motor para alcanzar la posición deseada.

La comunicación de la posición deseada se realiza mediante la transmisión de un señal pulsada con periodo de 20ms. El ancho del pulso determina la posición del servo.

arduino-servo-funcionamiento

La relación entre el ancho del pulso y el ángulo depende del modelo del motor. Por ejemplo, algunos modelos responden con 0º a un pulso de 500 ms, y otros a un pulso de 1000 ms

En general, en todos los modelos:

  • Un pulso entre 500-1000 us corresponde con 0º
  • Un pulso de 1500 ms corresponde con 90º (punto neutro)
  • Un pulso entre 2000-2500us corresponde con 180º

Por tanto, variando la señal en microsegundos podemos disponer de una precisión teórica de 0.18-0.36º, siempre que la mecánica del servo acompañe.

Esquema de montaje

Conectar un servo a Arduino es sencillo. El servo dispone de tres cables, dos de alimentación (GND y Vcc) y uno de señal (Sig).

El color de estos cables suele tener dos combinaciones:

  • Marrón (GND), Rojo (Vcc) y Naranja (Sig)

  • Negro (GND), Rojo (Vcc) y Blanco (Sig)

Por un lado, alimentamos el servo mediante el terminal GND ( Marrón / Negro) y Vcc (Rojo).

arduino-servo-montaje

En general, la alimentación a los servos se realizará desde una fuente de tensión externa (una batería o fuente de alimentación) a una tensión de 5V-6.5V, siendo 6V la tensión idónea.

Arduino puede llegar a proporcionar corriente suficiente para encender un servo pequeño (SG90), suficiente para hacer unos cuantos proyectos de prueba.

Sin embargo no dispone de corriente suficiente para actuar un servo grande (MG996R). Incluso varios servos pequeños, o hacer excesiva fuerza con ellos puede exceder la capacidad de corriente de Arduino, provocando su reinicio.

Por otro lado, finalmente, para el control conectamos el cable de señal (naranja / blanco) a cualquier pin digital de Arduino.

arduino-servo-esquema



ejemplos 


A continuación, se muestra los resultados los cuales fueron obtenidos a partir de la realización de la práctica. 

Se muestra una imagen la cual muestra las medidas y datos importantes en nuestro bazo robótico.



Se puede apreciar en la siguiente imagen el brazo robótico previo al ensamblado



Proceso de armado del brazo robótico.



En la siguiente fotografía se puede apreciar el brazo robótico  ya ensamblado. 

 


Durante la realización de la práctica se realizaron múltiples pruebas en las cuales se consideraron distintos aspectos fundamentales para que el brazo robótico funcionara adecuadamente con base en esto se consideraron medidas las cuales nos podrían aportar beneficios para el funcionamiento de nuestro robot.

 


 





Como anteriormente mencionamos para que nuestro brazo robótico funcionara consideramos varias opciones para que asi este pudiera funcionar, con esto en cuenta para que nuestro brazo robótico funcionara debidamente usamos una fuente de alimentación para que la alimentación del brazo robótico fuera la necesaria.



Posteriormente para poder tener el control del brazo y poder mover cada uno de los servos motores que este tiene se realizó una PCB la cual contendría potenciómetros y con estos nos servirían de apoyo para llevar acabo las secuencias.

 

 





Códigos usados dentro de la programación del brazo robótico

Botón y servomotores

6 servomotores 





Uso de potenciómetros



Simulación en LabView




video demostrativo del brazo robotico 















Comentarios