Professional Documents
Culture Documents
1
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.
2
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.
///////////////////////////////////////
//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)
int x;
float y;
long z;
void config(void){
set_tris_b(0x02);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
}
#INT_RDA
void RS232_receive(void){
if(kbhit()){
x=getc();
3
}
}
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);
}
4
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.
5
6
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).
///////////////////////////////////////
//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);
}
7
Proyecto#3 Control de 4 servomotores vía RS232
8
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.
///////////////////////////////////////
//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)
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;
9
//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);
}
#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);
10
}
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);
}
11
Proyecto#4 USB + PIC18F4550 (Modo CDC)
12
Programa que contiene el Microcontrolador PIC18F4550
//=================================
//autor:jorge arturo rdz hdz
//titulo:CONEXION ENTRE USB y LAP
//fecha: 30/AGOSTO/2009
//=================================
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,
CPUDIV1,VREGEN,NOPBADEN
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.
}
}while (TRUE); // bucle infinito.
}
13
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.
14
El diagrama del PIC se muestra a continuación se usa el pin de sensibilidad para detectar
la conexión.
15
Al presionar una vez un boton del programita de “USB + 8 LED” encenderá un led
correspondiente al presionado.
//=================================
//autor:jorge arturo rdz hdz
//titulo:CONTROL DE 8 LED
//fecha: 30/AGOSTO/2009
//=================================
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,
CPUDIV1,VREGEN,NOPBADEN
#defineUSB_CON_SENSE_PIN PIN_C0
void main() {
int KEY;
set_tris_b(0x00);
output_b(0x00);
usb_cdc_init(); // Configuramos al puerto virtual.
usb_init(); // Inicializamos el stack USB.
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;
16
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.
}
17
Proyecto#6 Control de LCD (USB + PIC18F2550)
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.
18
El software es el siguiente:
19
Programa que contiene el PIC18F2550;
//===============================
//AUTOR:JORGE ARTURO RDZ HDZ
//TITULO: USB + LCD
//FECHA: 30/AGOSTO/2009
//===============================
#fuses
HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPB
ADEN
// 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
*/
char LETRA[];
void config(void){
setup_comparator(NC_NC_NC_NC);
setup_adc(ADC_OFF);
}
void main() {
config();
20
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.
}
21
05/12/2009 21:09
Vol. 1.1
22