proyectos con micro control adores

22
1 Proyectos con Microcontroladores Por: Jorge Arturo Rodríguez Hernández E-mail: [email protected]

Upload: dracuoji

Post on 22-Oct-2014

154 views

Category:

Documents


12 download

TRANSCRIPT

Page 1: Proyectos Con Micro Control Adores

1

Proyectos con Microcontroladores

Por: Jorge Arturo Rodríguez Hernández E-mail: [email protected]

Page 2: Proyectos Con Micro Control Adores

2

Proyecto#1 Controlador de un servomotor vía RS-323 Al variar la barra del programita de “control de un servo” enviara una cadena de 8 bit, en esos 8 bit estarán un valor de 0 a 255, que será el rango del servomotor osea de 0° a 180°.

La ventaja que tiene este circuito es que esta oscilando a 50 Hz, y es posible colocar en el eje del motor una palanca, y pueda sostenerse en cualquier ángulo puesto por el programita, ya que gracias a que tiene la frecuencia que necesita el servo para poder mantener algo sin que tenga el riesgo de que la palanca se caiga por la culpa de la inercia del peso.

Page 3: Proyectos Con Micro Control Adores

3

Como vemos el programa “Control de un servomotor” esta a 89° y el servomotor esta aproximadamente en la misma posición que es 89.3° Este programa la ventaja que también tiene es que usa la interrupción en recepción en el USART1. Haciendo así mas exacta la frecuencia para mantener la posición del servo con carga. Nota: El programa tiene puesto los baudios a 2400 por default Se usa el MAX232 para la comunicación entre PIC Y PC Programa que esta en el PIC /////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTROL DE SERVO //DATE:26/JUNIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #include<math.h> #fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=20000000) #use rs232(uart1,baud=2400) //VARIABLES QUE SE USAN EN EL PROGRAMA int x; float y; long z; //CONFIGURACION DEL MICROCONTROLADOR void config(void){ set_tris_b(0x02); setup_comparator(NC_NC_NC_NC); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); } //INTERRUPCION POR RECEPCION #INT_RDA void RS232_receive(void){ if (kbhit()){ x=getc();

Page 4: Proyectos Con Micro Control Adores

4

} } //INICIO DEL PROGRAMA PRINCIPAL void main(void){ config(); do{ y=(x*6.6666666e-6)+0.9e-3; z=y*1000000; output_high(PIN_B0); delay_us(z); output_low(PIN_B0); delay_us(20000-z); }while(TRUE); }

Page 5: Proyectos Con Micro Control Adores

5

Proyecto#2 Control de 8 Led’s Este circuito controla 8 Led’s vía RS-232, el programita que a continuación se da, te indica que bit se envió por el puerto serial y se presiona mas de uno estos se suman y te indican que valor decimal es.

He usado un cable USB-SERIAL ya que he usado una laptop y estas ya no tienen puerto serial y por esa solo coloque el COM6 ya que en las laptop empiezan dese COM4 para delante. Para la simulación en proteus del circuito siguiente se usa un programa que simula puertos serial, el “Virtual Serial Port Driver” para hacer el interfaz del pic y del programita.

Page 6: Proyectos Con Micro Control Adores

6

Page 7: Proyectos Con Micro Control Adores

7

Se observa el programa de Virtual Serial Port que simula el COM1 que es la de la simulación en proteus y esta a 2400-N-8-1, mientras el COM6 es del programita de control de 8 Led, se nota también que se envió el decimal 28, por el otro lado en la simulación solo prenden los led que representa en numero binario “00011100” (28). Programa del PIC /////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTROL DE 8 LED //DATE:25/JUNIO/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) #use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1) void main(void){ int x; set_tris_a(0x22); set_tris_b(0x00); setup_comparator(NC_NC_NC_NC); do{ x=getch(); output_b(x); }while(TRUE); }

Page 8: Proyectos Con Micro Control Adores

8

Proyecto#3 Control de 4 servomotores vía RS232 Como vimos en el proyecto #1, un controlador de un servomotor que usaba la interrupción de recepción, y luego volvía a la rutina normal, es prácticamente lo mismo solo que el software fue añadido unas cuantas cosas mas. El programita que a continuación se da funciona de la siguiente manera: Como vemos tiene 4 barras deslizadoras cuando se mueve una de ellas, por ejemplo “A” enviara por el puerto serie la letra “A”, y enseguida se enviara los grados y así sucesivamente.

Page 9: Proyectos Con Micro Control Adores

9

Se da el esquema completo del circuito.

Los 4 Servomotores están siendo controlados mas de 50 Hz, haciendo así, que pueda cada motor quedarse donde se le indique sin que vuelva, por la culpa de la inercia. El programa del PIC se muestra a continuación. /////////////////////////////////////// //AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ //TITLE;CONTROL DE 4 SERVOS //DATE:20/NOVIEMBRE/'09 /////////////////////////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #include<math.h> #fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=20000000) #use rs232(uart1,baud=2400) //VARIABLES QUE SE USAN EN EL PROGRAMA int ELEGIR_MOTOR,POSICION,A=90,B=90,C=90,D=90,A1=90,B1=90,C1=90,D1=90; float y; long zA=1500,zB=1500,zC=1500,zD=1500;

Page 10: Proyectos Con Micro Control Adores

10

//CONFIGURACION DEL MICROCONTROLADOR void config(void){ set_tris_a(0x20); set_tris_b(0x02); setup_comparator(NC_NC_NC_NC); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); } //INTERRUPCION POR RESEPCION #INT_RDA void RS232_receive(void){ if (kbhit()){ ELEGIR_MOTOR=getc(); POSICION=getc(); disable_interrupts(GLOBAL); switch (ELEGIR_MOTOR){ case 'A': A=POSICION; break; case 'B': B=POSICION; break; case 'C': C=POSICION; break; case 'D': D=POSICION; break; } } y=(A*6.6666666e-6)+0.9e-3; zA=y*1000000; y=(B*6.6666666e-6)+0.9e-3; zB=y*1000000; y=(C*6.6666666e-6)+0.9e-3; zC=y*1000000; y=(D*6.6666666e-6)+0.9e-3; zD=y*1000000;

A1=A; B1=B; C1=C; D1=D; enable_interrupts(GLOBAL);

Page 11: Proyectos Con Micro Control Adores

11

} //INICIO DEL PROGRAMA PRINCIPAL void main(void){ config(); do{ output_high(PIN_A0); delay_us(zA); output_low(PIN_A0); output_high(PIN_A1); delay_us(zB); output_low(PIN_A1); output_high(PIN_A2); delay_us(zC); output_low(PIN_A2); output_high(PIN_A3); delay_us(zD); output_low(PIN_A3); delay_us(80000-zA-zB-zC-zD); }while(TRUE); }

Page 12: Proyectos Con Micro Control Adores

12

Proyecto#4 USB + PIC18F4550 (Modo CDC) Este proyecto se necesita hacerlo físicamente, en la simulaciones en proteus se debe de tener la versión 7.4 sp3 para poder simularlo correctamente si no lo contrario se debe hacer fisicamente (este proyectos y los que siguen fueron probados fisicamente).

Al conectar el cable de USB a la computadora, el led que se encuentra conectado al VCC del USB encenderá y también el pin RC0 del PIC detectara la conexión, esto hace que el PIC sepa cuando esta conectado o desconectado de la PC.

Page 13: Proyectos Con Micro Control Adores

13

Programa que contiene el Microcontrolador PIC18F4550 //================================= //autor:jorge arturo rdz hdz //titulo:CONEXION ENTRE USB y LAP //fecha: 30/AGOSTO/2009 //================================= #include <18F2550.h> // Definición de registros internos. #fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5, CPUDIV1,VREGEN,NOPBADEN #use delay(clock=48000000) // Frecuencia máxima de trabajo. #include "usb_cdc.h" // Descripción de funciones del USB. void main() { set_tris_b(0x00); output_b(0x00); delay_ms(300); usb_cdc_init(); // Configuramos al puerto virtual. usb_init(); // Inicializamos el stack USB. output_high(PIN_B0); //LED ROJO ENCENDIDO output_low(PIN_B1); //LED VERDE APAGADO while(!usb_cdc_connected()) {} // espera a ser conectado do{ usb_task(); if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host. output_low(PIN_B0); //LED ROJO APAGADO output_high(PIN_B1); //LED VERDE ENCENDID0 } }while (TRUE); // bucle infinito. }

Page 14: Proyectos Con Micro Control Adores

14

Proyecto#5 Control de 8 LED’s vía USB (Modo CDC) Este proyecto es muy simple controlas ocho led’s vía usb (modo CDC), modo CDC hace del usb una comunicación serial virtual, ósea conectemos el USB a la PC este actuara como un serial. El programa que a continuación se da es un control de 8 led.

Aquí simplemente buscamos el COM disponible para la comunicación, en mi caso era el COM13

Page 15: Proyectos Con Micro Control Adores

15

El diagrama del PIC se muestra a continuación se usa el pin de sensibilidad para detectar la conexión.

Page 16: Proyectos Con Micro Control Adores

16

Al presionar una vez un boton del programita de “USB + 8 LED” encenderá un led correspondiente al presionado. El PROGRAMA DEL PIC ES EL SIGUIENTE. //================================= //autor:jorge arturo rdz hdz //titulo:CONTROL DE 8 LED //fecha: 30/AGOSTO/2009 //================================= #include <18F2550.h> // Definición de registros internos. #fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5, CPUDIV1,VREGEN,NOPBADEN #use delay(clock=48000000) // Frecuencia máxima de trabajo. #defineUSB_CON_SENSE_PIN PIN_C0 #include "usb_cdc.h" // Descripción de funciones del USB. #include "usb_desc_cdc.h" // Descriptores del dispositivo USB. void main() { int KEY; set_tris_b(0x00); output_b(0x00); usb_cdc_init(); // Configuramos al puerto virtual. usb_init(); // Inicializamos el stack USB. output_high(PIN_C6); //LED ROJO ENCENDIDO output_low(PIN_C7); //LED VERDE APAGADO while(!usb_cdc_connected()) {} // espera a ser conectado do{ usb_task(); if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host. output_low(PIN_C6); //LED ROJO APAGADO output_high(PIN_C7); //LED VERDE ENCENDIDO if (usb_cdc_kbhit()){ KEY=usb_cdc_getc(); switch(KEY){ case '1': output_toggle(PIN_B0); break; case '2': output_toggle(PIN_B1); break;

Page 17: Proyectos Con Micro Control Adores

17

case '3': output_toggle(PIN_B2); break; case '4': output_toggle(PIN_B3); break; case '5': output_toggle(PIN_B4); break; case '6': output_toggle(PIN_B5); break; case '7': output_toggle(PIN_B6); break; case '8': output_toggle(PIN_B7); break; } } } }while (TRUE); // bucle infinito. }

Page 18: Proyectos Con Micro Control Adores

18

Proyecto#6 Control de LCD (USB + PIC18F2550) Este pequeño circuito que controla el texto que se va a mostrar en un LCD16x2, se muestra a continuación el esquema.

El programa que se va utilizar fue hecho en C#, los comandos de borrado y pasar a la segunda fila son, “ * ”, “&”, respectivamente (sin comillas). Por ejemplo si queremos que muestre, en la primera fila “HOLA” y en la segunda “MUNDO”, se debe de escribir en el programita de Control de LCD, “*HOLA&MUNDO”, y así aparecerá como hemos querido.

Page 19: Proyectos Con Micro Control Adores

19

El software es el siguiente:

En mi caso cuando conecto el USB a la PC, se usa el COM13 (en mi compu).

Page 20: Proyectos Con Micro Control Adores

20

Programa que contiene el PIC18F2550; //=============================== //AUTOR:JORGE ARTURO RDZ HDZ //TITULO: USB + LCD //FECHA: 30/AGOSTO/2009 //=============================== #include <18F2550.h> // Definición de registros internos. #fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN // Fuses utilizados: /* HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz. NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital. NOWDT: No utilizamos el perro guardían. NOPROTECT: Desactivamos la protección de código. NOLVP: Desactivamos la programación a bajo voltaje. NODEBUG: No entramos al modo debug. USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz. PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz. CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está. VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB */ #use delay(clock=48000000) // Frecuencia máxima de trabajo. #define LCD_DATA_PORT getenv("SFR:PORTB") #define LCD_ENABLE_PIN PIN_B0 #define LCD_RS_PIN PIN_B1 #define LCD_RW_PIN PIN_B2 #define LCD_DATA0 PIN_B4 #define LCD_DATA1 PIN_B5 #define LCD_DATA2 PIN_B6 #define LCD_DATA3 PIN_B7 #include<LCD.C> #define USB_CON_SENSE_PIN PIN_C0 #include "usb_cdc.h" // Descripción de funciones del USB. #include "usb_desc_cdc.h" // Descriptores del dispositivo USB. char LETRA[]; void config(void){ setup_comparator(NC_NC_NC_NC); setup_adc(ADC_OFF); } void main() { config();

Page 21: Proyectos Con Micro Control Adores

21

lcd_init(); //Configuramos el LCD usb_cdc_init(); // Configuramos al puerto virtual. usb_init(); // Inicializamos el stack USB. while(!usb_cdc_connected()) { output_high(PIN_C6); //LED ROJO ENCENDIDO output_low(PIN_C7); //LED VERDE APAGADO } output_low(PIN_C6); //LED ROJO APAGADO output_high(PIN_C7); //LED VERDE ENCENDIDO // espera a detectar una transmisión de la PC (Set_Line_Coding). do{ usb_task(); if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host. if(usb_cdc_kbhit()){ LETRA=usb_cdc_getc(); switch (LETRA){ case '*': lcd_putc("\f"); break; case '&': lcd_putc("\n"); break; default: lcd_putc(LETRA); break; } } } }while (TRUE); // bucle infinito. }

Page 22: Proyectos Con Micro Control Adores

22

05/12/2009 21:09 Vol. 1.1