Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Departamento de Electricidad-Electrnica
Profesores: Pedro Alonso Sanz Alfonso Garca Gallego Juan Dongil Garca Instituto: I.E.S. Joan Mir Localidad: San Sebastin de los Reyes Curso: 2007/2008
ndice:
Pgina
4 5 6
1.- Introduccin. .................................................................................................. 2.- Diagrama en Bloques del Robot Minisumo. ................................................ 2.1.- Esquema electrnico Robot Minisumo. ....
3.1.- Alimentacin del Circuito. .................................................................... 7 3.2.- Cargador del Programa... ............................................................... 8 3.3.- Etapa de Potencia. ................................................................................. 9 3.4.- Sensores de distancia GP2D12............. .................................................. 11 3.5.- Sensores infrarrojos CNY70. .................................................................. 12 3.6.- Acondicionador de seal. ........................................................................ 13 3.7.- Control. Microcontrolador PIC PIC16F876A. ........................................ 13 3.8.- Receptor de Radiofrecuencia. ................................................................. 14 3.11.- Mando. .................................................................................................. 15 4.-Esquema elctrico de simulacin con Proteus. ............................................... 4.1.- Simulacin del Robot Minisumo. ............................................................ 16 16
5.- Diseo de Placas de Circuitos Impresos. .......................................................... 17 5.1.- Fuente de Alimentacin y Cargador del Programa MAX232 .................... 17 5.1.1.- Esquema Elctrico. ................................................................. 17 5.1.2.- Cara de Componentes y de pistas Top Copper. ..................... 18 5.1.3.- Cara de pistas Bottom Copper. .............................................. 18 5.2.- Control de Potencia. ................................................................................... 19 5.2.1.- Esquema Elctrico. ................................................................ 19 5.2.2.- Cara de Componentes y de pistas Top Copper. .................... 20 5.2.3.- Cara de pistas Bottom Copper. ............................................. 20 5.3.- Control. ...................................................................................................... 21 5.3.1.- Esquema Elctrico. ................................................................ 21 5.3.2.- Cara de Componentes y de pistas Top Copper. .................... 22 5.2.3.- Cara de pistas Bottom Copper. ............................................. 22
ndice:
Pgina
5.3.- Mando. ..................................................................................................... 23 5.4.1.- Esquema Elctrico. ................................................................... 23 5.4.2.- Cara de Componentes y de pistas Top Copper. ........................ 23 5.4.3.- Cara de pistas Bottom Copper. ................................................. 23 6.- Lista de Componentes. ........................................................................................... 24 6.1.- Listado General.............................................................................. 24 6.3.- Mando. .......................................................................................... 25 7.- Coste Econmico. ................................................................................................... 27 7.1.- Desarrollo del Proyecto. ................................................................ 27 7.2.- Material. ....................................................................................... 27 8.- Referencias. ........................................................................................................... 27
9.- Programas Robot Minisumo (Programas de Prueba) 9.1.- CONTROL DE MOTORES (simulacin).. 9.2.- SIMULACIN SENSORES... 9.3.- SIMULACIN SERVO UA 9.4.- PRUEBA GP2D12.. 9.5.- SIMULACIN SENSORES CNY70 (PATILLAS RB5 Y RB6)... 9.6.- SIMULACIN SENSORES CNY70 (PATILLAS RB4 Y RB7)... 9.7.- CONTROL DE MOTORES CON GP2D12 Y CNY70.. 10.- Libreras. 10.1.- Servo Futaba 10bit. 10.2.- LCD1..... 10.3.- KBD1. 10.4.- 16F876..
1.- Introduccin
Este proyecto consiste en realizar un robot que sea capaz de localizar, seguir, empujar y tirar a otro robot de similares condiciones, de un tatami. Este Robot tiene la misin, como su nombre lo indica, de luchar con otros robots similares en peso y tamao, para ello se han utilizado dos motores, controlados mediante cuatro sensores pticos CNY70, y el inversor de giro L293 para que de esta manera pueda realizar giros de derecha a izquierda y de izquierda a derecha. Para el control del robot se han empleado tcnicas digitales que tiene como ncleo principal el PIC 16F876A. Para poder localizar al contrincante hemos empleado los Sensores Infrarrojos GP2D12 que miden la distancia a la que se encuentra su oponente, as podremos atacar y tirar al otro robot del tatami. Adems, el robot fue diseado para poder ser controlado como coche teledirigido. En todo momento el control del robot puede hacerse manualmente. Existe una comunicacin entre el robot y un mando en radio frecuencia con los mdulos de CEBECK C-0503 y C-0504. Que son un transmisor y receptor de datos en modulacin AM que trabajan a una frecuencia portadora 433,92 MHz y tienen un Ancho de Banda de 4 KHz. El diseo del proyecto lo hacemos mediante una herramienta llamada Proteus, que permite simular el hardware y el software a la vez, pudiendo ejecutarse paso a paso cada programa. Se puede trabajar con ficheros .ASM y C. Para la programacin del PIC 16F876A hemos utilizado una herramienta llamada PIC C Compiler. El software se puede ser grabado en el robot directamente sin necesidad de extraer el microcontrolador, para ello se ha utilizado el grabador PICdownloader.exe. Los microcontroladores tienen que tener cargado previamente un programa de comunicaciones para comunicarnos con un Ordenador Personal.
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 3.2.- Cargador del Programa. El circuito integrado MAX232 lleva internamente 2 conversores de nivel de TTL a RS232 y otros 2 de RS232 a TTL con lo que en total podremos manejar 4 seales, por lo general las ms usadas son; TX, RX, RTS, CTS, estas dos ltimas son las usadas para el protocolo handshaking (Protocolo de comienzo de comunicacin entre dos mquinas o sistemas) pero no es imprescindible su uso. Para que el MAX232 funcione correctamente deberemos de poner unos condensadores externos de 1F.
Pin 1 2 3 4 5 6 7 8 9 Seal DCD RxD (RD) TxD (TD) DTR GND DSR RTS CTS RI In / Out In In Out Out In Out In In Descripcin Detector de Portadora de Datos Recepcin de Datos Transmisin Datos Terminal Listo de de Datos
Masa Dispositivo de Datos Listo Peticin de envo Dispuesto para enviar Indicador de llamada
El funcionamiento del MAX232 consiste en intercambiar niveles TTL a RS232, donde un 0 en TTL equivale a 0V y en RS232 equivale a una tensin comprendida entre 3 y 15V. Un 1 en TTL equivale a 5V en RS232 equivalente a una tensin comprendida entre -3 y -15V. El Circuito Integrado MAX 232 se encarga de convertir los niveles de TTL a RS232.
3.3.- Etapa de Potencia. (Control de potencia mediante integrado L293B.) La intensidad de salida de las patillas del PIC no es suficiente para poner en marcha los motores, as que es necesario recurrir al integrado L293B, controlador de motores, formado por un doble puente H, y que es capaz de dar 1 A por canal.
OUTn 1 0 Z Z
As podemos ver que poniendo a nivel alto la entrada de habilitacin "EN", la salida de este "OUT" pasa de alta impedancia al mismo nivel que se encuentre la entrada "IN" pero amplificado en tensin y en corriente, siendo esta de 1A mximo. En este diseo colocamos optoacopladores en la salida de cada una de las entradas del L293B porque al inicio del arranque del motor, este demanda ms voltaje y corriente que la nominal, por lo que requiere que aislemos las salidas del puerto del microcontrolador, ya que una demanda excesiva de estos parmetros, pueden llegar a daar su estructura y funcionalidad.
10
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 3.4.- Sensores de Distancia GP2D12. Sensor que mide distancia mediante triangulacin con PSD (Detector Sensible a la Posicin), Led infrarrojo y circuito de procesado de seal, valor nominal entre 0 y 3V dependiendo de la distancia. La informacin de la distancia se extrae midiendo el ngulo recibido. Si el ngulo es grande, el objeto esta cerca, porque el triangulo es ancho. Si el ngulo es pequeo, el objeto est lejos, por lo que el tringulo formado es estrecho.
El LED infrarrojo emite el haz de luz a travs de una pequea lente convergente que hace que el haz emisor llegue de forma paralela al objeto. Cuando la luz choca con un obstculo, una cierta cantidad de luz se refleja, casi todas las sustancias tienen un grado bastante grande de rugosidad de la superficie que produce una dispersin hemisfrica de la luz (la llamada reflexin no terica). Alguno de estos haces de esta luz rebota hacia el sensor que es recibido por la lente. La lente receptora tambin es una lente convexa. Acta para convertir el ngulo de posicin. Si un objeto se pone en el plano focal de una lente convexa y los otros rayos de luz paralelos en otro lado, el rayo que pasa por el centro de la lente atraviesa inalterado o marca el lugar focal. Los rayos restantes tambin enfocan a este punto.
Caractersticas: 1. Menos influencia del color de los objetos reflexivos 2. Lnea indicadora de distancia output/distance : Tipo de salida indicadora de la distancia analgica (tensin analgica) para el GP2D12. Distancia del detector de 10 a 80 cm.
11
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 3.5.- Sensores infrarrojos CNY70. Los sensores que utilizamos son CNY70. Son sensores infrarrojos formados por un fotodiodo y un transistor. Estos sensores son pticos y funcionan mediante reflexin, el fotodiodo emite luz infrarroja cuando se refleja en el borde blando, formndose as la reflexin con una distancia de 2.8 mm entre ellos. .
Funcionamiento del sensor: El principio en el que se basa el funcionamiento del sensor CNY70 es en la emisin de un haz de luz infrarroja por medio del diodo emisor. Dicho haz de luz se refleja sobre una superficie llegando as a la base del fototransistor. De esta manera a medida que la superficie reflejante sea ms clara, mayor corriente se producir a travs del fototransistor y as se obtendr mayor voltaje a la salida y mientras ms oscura sea la superficie, menor ser la intensidad de rayo infrarrojo reflejado por lo que el voltaje de salida en el fototransistor ser menor. Cuando el sensor este sobre blanco tenemos un 1 porque refleja. El transistor se satura y a la salida del 74HC14 tenemos 0. Cuando el sensor este sobre negro tenemos un 0 porque no refleja. El transistor no se satura y a la salida del 74HC14 tenemos 1.
12
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 3.6.- Acondicionador de seal El acondicionador de seal est compuesto por un conector (a su vez conectado con los sensores), dos resistencias y una Trigger Smith. El encapsulado que usamos es un 74HC14. El cual posee seis Trigger Schmitt. Un Trigger Schmitt cambia su estado de salida cuando la tensin en su entrada sobrepasa un determinado nivel. La salida vuelve a cambiar a otro voltaje distinto, suele ser a un voltaje menor que el primero. A este ciclo se le conoce como histresis.
3.7.- Control. Microcontrolador PIC PIC16F876A. En la arquitectura del Hardware del robot el componente principal es el MICROCONTROLADOR PIC16F876A.
Se ha utilizado este microcontrolador, ya que el robot est diseado para controlar varios perifricos (motores, servomotores, sensores infrarrojos y sensores pticos, radio frecuencia, cargador del programa controlador, etc) y es necesario muchas lneas de entrada y salida. Este microcontrolador dispone de los elementos necesarios para controlar los sensores y motores como los Timers, convertidores de analgica a digital, salidas de control por PWM. El microcontrolador PIC 16F876A trabaja a una frecuencia de 1 MHz y ejecuta una instruccin en 1s. Tiene un Jumper JUMPER que nos sirve para cargar el programa procedente del Ordenador Personal en el microcontrolador o recibir los datos del receptor de RF.
13
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica Un pulsador de Inicio nos servir para activar el robot Minisumo. Cuando el robot est situado en la posicin indicada el robot empezar a funcionar segn el programa introducido en el microcontrolador.
3.8.- Receptor de Radiofrecuencia. La Tarjeta Receptora de Datos CEBEK C-0504 es un circuito hbrido encargado de recibir, va radiofrecuencia, los datos digitales procedentes del Mando. La seal digital tiene que tener una frecuencia entre 20 Hz < fo < 4 KHz. y una portadora de 433,92 MHz. Este circuito demodula la seal de AM obteniendo los datos transmitidos.
14
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 3.9.- Mando. El mando tiene la misin de transmitir un cdigo asociado a cada pulsador, para poder controlar el robot. El microcontrolador PIC 16F876a lee los pulsadores y transmite los cdigos va serie a la tarjeta transmisora de radiofrecuencia a una velocidad de 1562,5 baudios por segundo. Es una transmisin asncrona (1bit de comienzo, 8bit de Datos, 1 bit de parada sin bit de paridad). La Alimentacin procede de un regulador 7805 que suministra 5V a todos los circuitos. El TRT Q1E tiene la misin de deshabilitar la tarjeta de radiofrecuencia cuando esta no transmite datos. La Tarjeta Emisora SAW para Datos 433,92 MHz. CEBEK C-0503 es un circuito hbrido encargado de transmitir va radiofrecuencia, los datos digitales procedentes del microprocesador (TX). La seal digital tiene que tener una 20 Hz < fo < 4 KHz. Se modula en AM cuya frecuencia portadora es de 433,92 MHz. El microcontrolador PIC 16F876aA trabaja a una frecuencia de 4 MHz y ejecuta una instruccin en 1s. El Led D7E nos indica que el mando est encendido, est limitada su corriente en 20 mA. El resto de los LED se iluminan cuando activamos el Pulsador correspondiente. El diodo D7E tiene la misin de proteger el circuito en cado de invertir la Batera. Los condensadores C1 y C2 son filtros.
Mando
VDD
D6E
A
1
SW6E
1
U2E
7805_JOAN VI
GND
Q1E
VO 3 BD136_JOAN
E_RF1E
1 2 K INTERRUPTOR_JOAN 1N4007_JOAN
VSS
2.2k
A 15 13 11 4 3
220uF
R7E D7E
LED-RED_JOAN
K
Vcc
9V
220uF
CON1E
1 BORNIER1_JOAN
C3E
15pF
U1E R1E
220
R2E
220
R3E
220
R4E
220
R5E
220
D1E
LED-YELLOW_JOAN
K K
D2E
LED-GREEN_JOAN
K
D3E
LED-RED_JOAN
K
D4E
LED-RED_JOAN
K
D5E
LED-RED_JOAN
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
9 10 1 2 3 4 5 6 7
VDD
X1E
4MHz
RB1E
1 1
RB3E
1
RB0E
1
RB2E
1
RB4E
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RC0/T1OSO/T1CKI RA5/AN4/SS RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT PIC16F876_JOAN
C4E
15pF
SW1E
SW2E
SW3E
SW4E
SW5E
Izquierda
Atras
Adelante
Parar
Derecha
GND1
C1E
BAT1E
C2E
R6E
220
15
16
17
18
19
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 5.2.2.- Cara de Componentes y de pistas Top Copper.
20
5.3.- Control.
5.3.1.- Esquema Elctrico.
21
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 5.3.2.- Cara de Componentes y de pistas Top Copper.
22
5.4.- Mando.
5.4.1.- Esquema Elctrico.
Mando
VDD
D6E
A
SW6E
1
U2E
7805_JOAN VI VO 3
Q1E
BD136_JOAN
E_RF1E
GND
1 2 K INTERRUPTOR_JOAN 1N4007_JOAN
VSS
2.2k
15
13
11
220uF
R7E D7E
LED-RED_JOAN
Vcc
9V
220uF
CON1E
1 BORNIER1_JOAN
C3E
U1E R1E
220
R2E
220
R3E
220
R4E
220
R5E
220
D1E
LED-YELLOW_JOAN
D2E
LED-GREEN_JOAN
D3E
LED-RED_JOAN
D4E
LED-RED_JOAN
D5E
LED-RED_JOAN
21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18
9 10 1 2 3 4 5 6 7
VDD
X1E
4MHz
RB1E
RB3E
RB0E
RB2E
RB4E
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RC0/T1OSO/T1CKI RA5/AN4/SS RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT PIC16F876_JOAN
C4E
SW1E
SW2E
SW3E
SW4E
SW5E
Izquierda
Atras
Adelante
Parar
Derecha
GND1
C1E
BAT1E
C2E
R6E
220
23
Valor 4.7k R2, R4, R6, R8, R18, R21 10k R24, R25 100 R6, R7, R9, R10 330 R1, R3, R5, R7, R9, R10, R12, R14, R16 220 R38 240 R11, R13, R15, R17 18k
C13-C16 C15
10 Circuitos Integrados. Cantidad: 1 2 4 1 1 1 13 Diodos. Cantidad: 11 2 Referencia D1, D2, D4, D5, D6, D7, D8, D9, D10, D11, D12 D3 Valor LED-RED_JOAN LED-GREEN_JOAN Coste Unitario 0.20 0.20 Coste 2.20 0.20 Referencia U1 U2 U3, U4, U5, U6 U7 U9 U10 Valor
LM350K_JOAN MAX232 OPTOCOUPLER-NPN 74HC14 L293 PIC16F876_JOAN
24
Valor
GP2D12 INTERRUPTOR_JOAN CNY70
MASAS
BATERIA
BORNIER 1 9V PULSADOR_JOAN
CONN-H10
Coste Unitario 16 0.2 0.5 0.15 10 0.20 0.15 0.15 0.10 0.30 10 5 0.05 0.0 0.5 7 0.30 1 5.5 0.5 0.5 0.5 0.1 0.1 0.1 0.5
Coste 32 0.20 2 1.20 10 0.40 0.60 0.30 1 0.60 20 10 0.4 0.0 0.50 7 0.30 1 16.5 0.50 1 7 0.80 0.60 0.40 1
Arandela Plstico RF1 Conector de RF2 RF2 RV1 CRISTAL Placa de C.I. Zcalo de C.I. Zcalo de C.I. Separadores metlicos Macho-Hembra Tuercas Tornillos Tornillos Rueda Madera
Mtrica 3 ANTENA_JOAN CONN-SIL15 CEBEK-C-0504_JOAN 5k CRYSTAL_JOAN (1 MHz) 70 x 75 cm. 28 patillas 6 patillas Mtrica 3 Mtrica 3 Mtrica 3 Mtrica 3 Dimetro 6.4cm
Listado General
132,70
7 Resistencias. Cantidad: 6 Referencia R1E-R6E Valor 220 Coste Unitario 0.05 Coste 0.30
25
4 Condensadores. Cantidad: 2 2 Referencia C1E, C2E C3E, C4E Valor 220uF 15pF Coste Unitario 0.30 0.05 Coste 0.60 0.10
2 Circuitos Integrados. Cantidad: 1 1 1 Transistor. Cantidad: 1 7 Diodos. Cantidad: 1 1 4 1 Referencia D1E D2E D3E-D5E, D7E D6E Valor LED-YELLOW_JOAN LED-GREEN_JOAN LED-RED_JOAN 1N4007_JOAN Coste Unitario 0.20 0.20 0.20 0.20 Coste 0.20 0.20 0.80 0.20 Referencia Q1E Valor BD136_JOAN Coste Unitario 1 Coste 1 Referencia U1E U2E Valor PIC16F876_JOAN 7805_JOAN Coste Unitario 5 1 Coste 5 1
28 Componentes diversos. Cantidad: 1 1 1 1 5 1 1 1 1 1 4 4 4 1 1 Referencia Conector de BAT1E CON1E Conector de E_RF1E E_RF1E SW1E-SW5E SW6E X1E Placa de C.I. Zcalo de C.I. Batera de petaca Separadores metlicos Macho-Hembra Tuercas Tornillos Porta Bateras Soporte de plstico Valor Bornier 2 BORNIER1_JOAN CONN-SIL15 CEBEK-C-0503_JOAN PULSADOR_JOAN INTERRUPTOR_JOAN CRYSTAL_JOAN (4 MHz) 50 x 110 cm. 28 patillas 9V Mtrica 3 Mtrica 3 Mtrica 3 x 10 mm. 50 x 110 cm. Coste Unitario 0.30 0.00 0.15 7 0.20 1 1 6 0.5 1 0.5 0.1 0.1 0.5 1 Coste 0.30 0.00 0.15 7 1 1 1 6 0.5 1 2 0.4 0.4 0.5 1
Coste total 2
Mando
31,75
26
7.2.- Material.
Listado General. ............................................................................................ 132,70 Mando. .......................................................................................................... 31,75 _______ 164,45
8.- Referencias.
[1] Libro: Ttulo: Microcontroladores PIC16F84. Desarrollo de proyectos (2 Edicin) Autores: Enrique Palacios, Fernando Remiro, Lucas J. Lpez. Editorial: Ra_Ma Ttulo: Compilador C CCS y Simulador Proteus para Microcontroladores PICC Autor: Eduardo Garca Breijo Editorial: marcombo Ttulo: Tecnologa de Circuitos Impresos Autores: Claudio Fernndez Gonzlez, Jos Luis Lzaro Galilea, Ignacio Fernndez Lorenzo, Jess Urea Urea, Felipe Espinoza Zapata.
[2] Libro:
[3] Libro:
[4] Empresa suministradora de materiales: Diotronic S.A. C/Juan Bravo 58. Ingeniera de Sistemas Programados. Pagina Web: www.ditronic.com Pagina Web: www.microcontroladores.com
www.microchip.com www.datasheetcatalog.com
27
// ************************** Funcin principal o programa principal ************************ void main() { TRISA = 0B11101111; TRISB = 0B11100011; TRISC = 0B11111110; while (true) { RB2 = 0; RB3 = 0; RA4 = 0; RC0 = 0; delay_ms(500); RB2 = 1; RB3 = 0; RA4 = 1; RC0 = 0; delay_ms(500); } }
// Motor parado.
28
// ************************* Funcin principal o programa principal ***************************** void main() { TRISA = 0B11101111; TRISB = 0B11110011; TRISC = 0B11111110; RB3 = 0; RB2 = 0; RA4 = 0; RC0 = 0; RB4 = 0; RB5 = 0; RB6 = 0; RB7 = 0; while(1) { if(RB4==1){ RB2 = 0; RB3 = 1; RA4 = 1; RC0 = 0; } if(RB5==1){ RB2 = 1; RB3 = 0; RA4 = 0; RC0 = 1; } if(RB6==1){ RB2 = 0; RB3 = 1; RA4 = 0; RC0 = 1; }
// Giro Derecha.
// Giro Izquierda.
// Giro adelante.
29
9.3.- SIMULACIN SERVO UA. //**************************SIMULACIN SERVO UA ****************************** #include <16F876A.h> #device adc=10 // Conversor Analgico Digital de 10 bit el // PIC 16F876A puede trabajar con 8 o 10 bit de resolucin. #FUSES XT,NOWDT #use delay(clock=1000000)
#include <Servo_Futaba_10bit.c> // Incluimos el driver que contiene las //funciones de control de los Servos de Futaba.
// ************************ Funcin principal o programa principal *********************** void main() { int16 TH; Inicializacion_Futaba_RC2(); // Inicializacin del Servo en RC2 while (true) { TH = 25; Futaba_RC2(TH); delay_ms(1000); TH = 41; Futaba_RC2(TH); delay_ms(1000); TH = 57; Futaba_RC2(TH); delay_ms(1000); TH = 73; Futaba_RC2(TH); delay_ms(1000); TH = 100; Futaba_RC2(TH); delay_ms(2000); TH = 41; Futaba_RC2(TH); delay_ms(1000); TH = 25; Futaba_RC2(TH); delay_ms(1000); } } // Bucle infinito.
30
setup_adc(ADC_CLOCK_INTERNAL); // Fuente de reloj RC interno. lcd_init(); for (;;) { set_adc_channel(0); delay_us(20); q = read_adc(); v = (5.0 * q) / 1024.0; d=Gp2d12_v_d(v); // Inicializamos el LCD. // Bucle infinito. // Habilitacin canal 0 "AN0" // Retardo de 20uS necesaria para respetar el tiempo de Adquisicion Tad. // Lectura canal 0 "AN0" // Conversion a tension del codigo digital "q".
lcd_gotoxy(1,1); // Posicionamos el Cursor en la posicion 1, linea 1. printf(lcd_putc, "voltios = %01.3fV", v); // Saltamos de linea y escribimos en el //LCD "VOLTAJE =" y 4 digitos de "P" // en formato truncado de 4 digitos con 3 decimales y el caracter "V". lcd_gotoxy(1,2); printf(lcd_putc, "d = %01.3fcm",d ); // Saltamos de linea y escribimos en el //LCD "VOLTAJE =" y 4 digitos de "P" // en formato truncado de 4 digitos con 3 decimales y el caracter "V". } }
// Conversor Analogico Digital de 10 bit el //PIC 16F876A puede trabajar con 8 o 10 bit de resolucion.
31
// ********************************* Funcin principal o programa principal ************************** void main() { TRISA = 0B11101111; TRISB = 0B11110011; TRISC = 0B11111110; while (1) { if(RB5==1|RB6==1){ RB2 = 1; RB3 = 0; RA4 = 1; RC0 = 0; } else{ RB2 = 0; RB3 = 1; RA4 = 0; RC0 = 1; } } }
32
#BYTE TRISB = 0x86 #BYTE portB = 0x06 #BYTE TRISC = 0x87 #BYTE portC = 0x07 #BIT RB3 = 0x06.3 #BIT RB2 = 0x06.2 #BIT RA4 = 0x05.4 #BIT RC0 = 0x07.0 #BIT RB4 = 0x06.4 #BIT RB5 = 0x06.5 #BIT RB6 = 0x06.6 #BIT RB7 = 0x06.7
// TRISB en 86h. // PORTB en 06h. // TRISC en 87h. // PORTC en 07h. // RB1 en 0x06 patilla 3. // RB0 en 0x06 patilla 2. // RA4 en 0X05 patilla 4. // RC0 en 0x07 patilla 0. // RB4 en 0x06 patilla 4. // RB5 en 0x06 patilla 5. // RB6 en 0x06 patilla 6. // RB7 en 0x06 patilla 7.
// *************************** Funcin principal o programa principal ************************** void main() { TRISA = 0B11101111; TRISB = 0B11110011; TRISC = 0B11111110; while (1) { if(RB4==1||RB7==1){ //Si RB4 = 1 o RB7 = 1 motores atrs RB2 = 1; RB3 = 0; RA4 = 1; RC0 = 0; } else{ // Sino motores adelante RB2 = 0; RB3 = 1; RA4 = 0; RC0 = 1; } } } }
33
#BYTE TRISC = 0x87 #BYTE portC = 0x07 #BIT TA4 = 0x85.4 #BIT RB3 = 0x06.3 #BIT RB2 = 0x06.2 #BIT RA4 = 0x05.4 #BIT RC0 = 0x07.0 #BIT RB4 = 0x06.4 #BIT RB5 = 0x06.5 #BIT RB6 = 0x06.6 #BIT RB7 = 0x06.7 #BIT RBIF = 0x0B.0
// TRISC en 87h. // PORTC en 07h. // TRISA en 85h. // RB1 en 0x06 patilla 3. // RB0 en 0x06 patilla 2. // RA4 en 0X05 patilla 4. // RC0 en 0x07 patilla 0.
// ************************ Declaracin de funciones ******************************* void cny70(void); void gp2d12(void); // ******************* Funcin principal o programa principal ********************** void main() { int n; // Necesario para borrar el flag en el Proteus TRISA = 0B11101111; TRISB = 0B11110011; TRISC = 0B11111110; port_b_pullups(TRUE); n = portB; RBIF = 0; enable_interrupts(int_rb); enable_interrupts(int_ext); ext_int_edge(L_TO_H); enable_interrupts(GLOBAL); while (TRUE) { gp2d12(); } // Habilitamos resistencias pullup. // Necesario para borrar el flag en el Proteus // Necesario para borrar el flag en el Proteus // Habilitamos la interrupcin por cambio de nivel de RB4, RB5, RB6, RB7. // Habilitamos la interrupcin INT de la patilla RB0. // Que la interrupcin de INT sea por flanco de subida. // Habilitamos la Interrupcin General. // Bucle infinito de espera
} // ****** Atencin a la interrupcin por cambio en RB4,RB5,RB6 y RB7. *************** #INT_RB void cny70 (void) { int i; while(RB5==1|RB6==1){ RB2 = 1; RB3 = 0; RA4 = 1; // Interrupcin por patillas RB5 y RB6. // Motor gira en sentido contrario.
34
setup_adc(ADC_CLOCK_INTERNAL); // Fuente de reloj RC interno. TA4 = 0; set_adc_channel(0); set_adc_channel(1); for (;;) { delay_ms(20); q = read_adc(); v = (5.0 * q) / 1024.0; d=Gp2d12_v_d(v); if (d>=8&&d<=30){ RB3 = 1; RB2 = 0; RA4 = 0; RC0 = 1; } else{ RB3 = 0; RB2 = 0; RA4 = 0; RC0 = 0; } } } // Si la distancia esta comprendida entre 8 cm // y 30 cm el motor gira hacia adelante. // HabilitaciOn canal 0 "AN0" // HabilitaciOn canal 1 "AN1" // Bucle infinito. // Retardo de 20uS necesaria para respetar el tiempo de Adquisicion Tad. // Lectura canal 0 "AN0" // Conversion a tension del codigo digital "q".
35
I.E.S. Joan Mir (S.S. de los Reyes) / Dpto. Electrnica 10.- Libreras. 10.1.- Servo Futaba 10bit.
//CONTROL DE UN SERVOMOTOR DE POSICION DE FUTABA CON PWM UTILIZANDO 10 BIT DE RESOLUCION ; Con TH=0 corresponde a -90 grados de Posicion del servo ; Con TH=57 corresponde a 0 grados de Posicion del servo ; Con TH=113 corresponde a 90 grados de Posicion del servo ;El microcontrolador PIC 16f876a tiene un harware integrado que puede generar 2 senales PWM ;por las patillas RC2 y RC1. ;El periodo para ambas senales se fija con la siguiente fornula ;T =[(PR2+1)*4*Tosc]*(TMR2_Valor_preescalar) ;El nivel alto T1H se controla con 10 bit ( Los 8 bit mas significativo con el registro CCPR1L y ;los dos bit menos significativos con CCP1X y CCP1Y que estan en el registro CCP1CON) ;Esta senal sale por la patilla RC2. ;El nivel alto T2H se controla con con 10 bit ( Los 8 bit mas significativo con el registro CCPR2L y ;los dos bit menos significativos con CCP2X y CCP2Y que estan en el registro CCP2CON) ;Esta senal sale por la patilla RC1. ;Para refrescar el nivel alto T1H que haber transcurrido un tiempo superior a un periodo "T". ;El Servomotor de Futaba se controla con una senal cuadrada de periodo "T1". ;La posicion del Servomotor lo determina el nivel alto de la senal "T1H" ;El Servomotor de Futaba necesita un periodo "T1" entre 10ms y 30 ms. ;Cargando los registros de forma correcta sale T1 =[(249+1)*4*1uS](16)=16 mS (Cristal de cuarzo 1 MHz) ;Tiene un control de Posicion de -90 Grados < P (Angular)< +90 Grados controlado con T1H. ;Para -90 Grados corresponde un nivel alto T1H = 0,6 ms ;Para 0 Grados corresponde un nivel alto T1H = 1,2 ms ;Para +90 Grados corresponde un nivel alto T1H = 2,4 ms */
// ******************************** Declaracin de funciones ****************************************** void Inicializacion_Futaba_RC1(); // Inicalizar PWM por RC1 void Inicializacion_Futaba_RC2(); // Inicalizar PWM por RC2 void Futaba_RC1(int16 TH); // Generar PWM por RC1 void Futaba_RC2(int16 TH); // Generar PWM por RC2 //********************************** Igualdades **************************************************** #define THmin 37 // THmin=37 equivale a 600uS a nivel alto a -90 #define THmax 150 // THmax=150 equivale a 2400uS a nivel alto a +90 #define THmed 94 // THmed=94 equivale a 1500uS a nivel alto a 0 // ************************ Funcin principal o programa principal ************************************** void Inicializacion_Futaba_RC1() { int16 TH; setup_timer_2(T2_DIV_BY_16,249,1); // setup_timer(Prescaler,PR2,Postscaler)
36
37
10.2.- LCD1.
/////////////////////////////////////////////////////////////////////////////////////////////////////////// //// LCDD.C //// //// Driver for common LCD modules //// //// //// //// lcd_init() Must be called before any other function. //// //// //// //// lcd_putc(c) Will display c on the next position of the LCD. //// //// The following have special meaning: //// //// \f Clear display //// //// \n Go to start of second line //// //// \b Move back one position //// //// //// //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) //// //// //// //// lcd_getc(x,y) Returns character at position x,y on LCD //// //// //// /////////////////////////////////////////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2003 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS C //// //// compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, reproduction //// //// or distribution is permitted without written permission. //// //// Derivative programs created using this software in object code //// //// form are not restricted in any way. //// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
38
// As defined in the following structure the pin connection is as follows: // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 // // LCD pins D0-D3 are not used and PIC D3 is not used. // Un-comment the following define to use port B #define use_portb_lcd TRUE struct lcd_pin_map { // This structure is overlayed BOOLEAN enable; // on to an I/O port to gain BOOLEAN rs; // access to the LCD pins. BOOLEAN rw; // The bits are allocated from BOOLEAN unused; // low order up. ENABLE will int data : 4; // be pin B0. } lcd; #if defined(__PCH__) #if defined use_portb_lcd #byte lcd = 0xF81 // This puts the entire structure #else #byte lcd = 0xF82 // This puts the entire structure #endif #else #if defined use_portb_lcd #byte lcd = 6 // on to port B (at address 6) #else #byte lcd = 7 // on to port C (at address 7) #endif #endif #if defined use_portb_lcd #define set_tris_lcd(x) set_tris_b(x) #else #define set_tris_lcd(x) set_tris_c(x) #endif #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the second line BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; // These bytes need to be sent to the LCD // to start it up. // The following are used for setting // the I/O port direction register. struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in BYTE lcd_read_byte() { BYTE low,high; set_tris_lcd(LCD_READ); lcd.rw = 1; delay_cycles(1); lcd.enable = 1;
39
40
10.3.- KBD1.
/////////////////////////////////////////////////////////////////////////////////////////////////////////// //// KBDD.C //// //// Generic keypad scan driver //// //// //// //// kbd_init() Must be called before any other function. //// //// //// //// c = kbd_getc(c) Will return a key value if pressed or /0 if not //// //// This function should be called frequently so as //// //// not to miss a key press. //// //// //// /////////////////////////////////////////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2003 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS C //// //// compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, reproduction //// //// or distribution is permitted without written permission. //// //// Derivative programs created using this software in object code //// //// form are not restricted in any way. //// /////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////// The following defines the keypad layout on port D // Un-comment the following define to use port B #define use_portb_kbd TRUE // Make sure the port used has pull-up resistors (or the LCD) on // the column pins #if defined(__PCH__) #if defined use_portb_kbd #byte kbd = 0xF81
41
42
43
10.4.- 16F876.
//////// Standard Header file for the PIC16F876 device //////////////// #device PIC16F876 #nolist //////// Program memory: 8192x14 Data RAM: 367 Stack: 8 //////// I/O: 22 Analog Pins: 5 //////// Data EEPROM: 256 //////// C Scratch area: 77 ID Location: 2000 //////// Fuses: LP,XT,HS,RC,NOWDT,WDT,NOPUT,PUT,PROTECT,PROTECT_5% //////// Fuses: PROTECT_50%,NOPROTECT,NOBROWNOUT,BROWNOUT,LVP,NOLVP,CPD //////// Fuses: NOCPD,WRT,NOWRT,DEBUG,NODEBUG //////// ////////////////////////////////////////////////////////////////// I/O // Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(), // PORT_B_PULLUPS(), INPUT(), // OUTPUT_LOW(), OUTPUT_HIGH(), // OUTPUT_FLOAT(), OUTPUT_BIT() // Constants used to identify pins in the above are: #define PIN_A0 #define PIN_A1 #define PIN_A2 #define PIN_A3 #define PIN_A4 #define PIN_A5 #define PIN_B0 #define PIN_B1 #define PIN_B2 #define PIN_B3 #define PIN_B4 #define PIN_B5 #define PIN_B6 #define PIN_B7 #define PIN_C0 #define PIN_C1 #define PIN_C2 #define PIN_C3 #define PIN_C4 #define PIN_C5 #define PIN_C6 #define PIN_C7 40 41 42 43 44 45 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
////////////////////////////////////////////////////////////////// Useful defines #define FALSE 0 #define TRUE 1 #define BYTE int #define BOOLEAN short int #define getc getch #define fgetc getch #define getchar getch
44
////////////////////////////////////////////////////////////////// Timer 0 // Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(), // SET_TIMER0() or SET_RTCC(), // GET_TIMER0() or GET_RTCC() // Constants used for SETUP_TIMER_0() are: #define RTCC_INTERNAL 0 #define RTCC_EXT_L_TO_H 32 #define RTCC_EXT_H_TO_L 48 #define RTCC_DIV_1 #define RTCC_DIV_2 #define RTCC_DIV_4 #define RTCC_DIV_8 #define RTCC_DIV_16 #define RTCC_DIV_32 #define RTCC_DIV_64 #define RTCC_DIV_128 #define RTCC_DIV_256 8 0 1 2 3 4 5 6 7
#define RTCC_8_BIT
// Constants used for SETUP_COUNTERS() are the above // constants for the 1st param and the following for // the 2nd param: ////////////////////////////////////////////////////////////////// WDT // Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above) // RESTART_WDT() // #define WDT_18MS 8 #define WDT_36MS 9 #define WDT_72MS 10 #define WDT_144MS 11 #define WDT_288MS 12 #define WDT_576MS 13 #define WDT_1152MS 14 #define WDT_2304MS 15 ////////////////////////////////////////////////////////////////// Timer 1 // Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1 // Constants used for SETUP_TIMER_1() are:
45
////////////////////////////////////////////////////////////////// Timer 2 // Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2 // Constants used for SETUP_TIMER_2() are: #define T2_DISABLED 0 #define T2_DIV_BY_1 4 #define T2_DIV_BY_4 5 #define T2_DIV_BY_16 6 ////////////////////////////////////////////////////////////////// CCP // CCP Functions: SETUP_CCPx, SET_PWMx_DUTY // CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH // Constants used for SETUP_CCPx() are: #define CCP_OFF 0 #define CCP_CAPTURE_FE 4 #define CCP_CAPTURE_RE 5 #define CCP_CAPTURE_DIV_4 6 #define CCP_CAPTURE_DIV_16 7 #define CCP_COMPARE_SET_ON_MATCH 8 #define CCP_COMPARE_CLR_ON_MATCH 9 #define CCP_COMPARE_INT 0xA #define CCP_COMPARE_RESET_TIMER 0xB #define CCP_PWM 0xC #define CCP_PWM_PLUS_1 0x1c #define CCP_PWM_PLUS_2 0x2c #define CCP_PWM_PLUS_3 0x3c long CCP_1; #byte CCP_1 = 0x15 #byte CCP_1_LOW= 0x15 #byte CCP_1_HIGH= 0x16 long CCP_2; #byte CCP_2 = 0x1B #byte CCP_2_LOW= 0x1B #byte CCP_2_HIGH= 0x1C ////////////////////////////////////////////////////////////////// SPI // SPI Functions: SETUP_SPI, SPI_WRITE, SPI_READ, SPI_DATA_IN // Constants used in SETUP_SSP() are: #define SPI_MASTER 0x20 #define SPI_SLAVE 0x24 #define SPI_L_TO_H 0 #define SPI_H_TO_L 0x10 #define SPI_CLK_DIV_4 0 #define SPI_CLK_DIV_16 1 #define SPI_CLK_DIV_64 2 #define SPI_CLK_T2 3 #define SPI_SS_DISABLED 1
46
#define SPI_SAMPLE_AT_END 0x8000 #define SPI_XMIT_L_TO_H 0x4000 ////////////////////////////////////////////////////////////////// UART // Constants used in setup_uart() are: // FALSE - Turn UART off // TRUE - Turn UART on #define UART_ADDRESS 2 #define UART_DATA 4
////////////////////////////////////////////////////////////////// ADC // ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A), // SET_ADC_CHANNEL(), READ_ADC() // Constants used for SETUP_ADC() are: #define ADC_OFF 0 // ADC Off #define ADC_CLOCK_DIV_2 0x100 #define ADC_CLOCK_DIV_8 0x40 #define ADC_CLOCK_DIV_32 0x80 #define ADC_CLOCK_INTERNAL 0xc0 // Internal 2-6us
// Constants used in SETUP_ADC_PORTS() are: #define NO_ANALOGS 7 // None #define ALL_ANALOG 0 // A0 A1 A2 A3 A5 #define AN0_AN1_AN2_AN4_VSS_VREF 1 // A0 A1 A2 A5 VRefh=A3 #define AN0_AN1_AN3 4 // A0 A1 A3 #define AN0_AN1_VSS_VREF 5 // A0 A1 VRefh=A3 #define AN0_AN1_AN4_VREF_VREF 0x08 // A0 A1 A5 VRefh=A3 VRefl=A2 #define AN0_AN1_VREF_VREF 0x0D // A0 A1 VRefh=A3 VRefl=A2 #define AN0 0x0E // A0 #define AN0_VREF_VREF 0x0F // A0 VRefh=A3 VRefl=A2 #define ANALOG_RA3_REF 0x1 //!old only provided for compatibility #define RA0_RA1_RA3_ANALOG 0x4 //!old only provided for compatibility #define RA0_RA1_ANALOG_RA3_REF 0x5 //!old only provided for compatibility #define ANALOG_RA3_RA2_REF 0x8 //!old only provided for compatibility #define RA0_RA1_ANALOG_RA3_RA2_REF 0xD //!old only provided for compatibility #define RA0_ANALOG 0xE //!old only provided for compatibility #define RA0_ANALOG_RA3_RA2_REF 0xF //!old only provided for compatibility
// Constants used in READ_ADC() are: #define ADC_START_AND_READ 7 // This is the default if nothing is specified #define ADC_START_ONLY 1 #define ADC_READ_ONLY 6
////////////////////////////////////////////////////////////////// INT // Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(), // EXT_INT_EDGE() // // Constants used in EXT_INT_EDGE() are: #define L_TO_H 0x40 #define H_TO_L 0 // Constants used in ENABLE/DISABLE_INTERRUPTS() are: #define GLOBAL 0x0BC0
47
48
49