Está en la página 1de 66

POST#4: Fuente Digital de dos Salidas variables y

una fija a 5v con LCD 40x2, PIC y comunicacin


mediante el protocolo serial RS232

Objetivo:

Al realizar los distintos proyectos con el tiempo llego la necesidad de


tener una fuente confiable que llene las necesidades bsicas de todo
laboratorio electrnico as que me encamine en el diseo y
construccin de una Fuente de laboratorio digital de tres salidas, dos
salidas variables de voltaje de 1.2V a 25V y medidor de corriente y
una salida fija de 5V. La fuente es controlada mediante el uso de un
microcontrolador
PIC
ejecutando
algoritmos en lenguaje C de
control y comunicacin con la PC mediante serial por el puerto RS232 ,
la etapa de potencia de las salidas se basa en el regulador de voltaje Step-Down LM2576 en
su versin de voltaje ajustable como en la de voltaje fijo, con esto se logra una alta eficiencia en
la regulacin de voltaje, un mnimo de desperdicio en perdidas de disipacin de calor as como
una potencia de salidas de 3 Amp en una de las salidas y en las otras dos de solo 2 Amp en
cada
una
de
ellas.
El equipo cuenta con salidas que ademas de ser dos de ellas variables y una fija, estas se
pueden habilitar o inhabilitar para as poder usar solo la que se necesite o en caso de
cortocircuito inhabilitarla rpidamente para evitar daos tambin para controlarla se usan los

pulsadores del frontal del equipo activando o desactivando las


salidas as como tambin es posible por medio de una aplicacin desarrollada
a la medida para el dispositivo en lenguaje C# de .NET, tener un monitoreo en
tiempo real del voltaje y corriente en cada una de las
salidas as como tambin la
temperatura
en
su interior.

Materiales principales utilizados:


1 x PIC16F917. (Microchip)

1 x MAX232 - (Muestra gratis obtenida gracias a Maxim)

1 x LM2576T-5.0P+ (Step-Down Regulador de Voltaje 5v).

1 x LM2576T-ADJ (Step-Down Regulador de Voltaje Variable).

6 x Pulsadores - Para control manual desde el frontal.

1 x Baquelita para el montaje.


1 x LCD 40x2 - Para visualizacin del men, estado del
dispositivo y configuraciones.
2 x Conector banana de chasis dorados dobles polarizados Para las salidas de voltaje.
2 x Conector banana normal dos colores - Para la salida de voltaje de
5V.

3 x Puente rectificador - Para la salida de los transformadores.


2 x Transformador 12v-0-12v a 4A. (Usado en las 3 salidas de
voltaje).
1 x Transformador 12v a 1A. (Lgica y backlight).

1 x LM7805 regulador de voltaje para la lgica de control.

4 x Potencimetro - 2 de 1 K y 2 de 10 K.

Switch grande doble con led para el frontal.

Switch grande simple transero para cortar el cable vivo de la red 110v.

Fusible y porta fusible de chasis europeo.

Caja para prototipos de calidad tamao grande.

4 x Patas de goma.

1 x Conector DB9 (RS232)

Manecillas para los potenciometros con detalle metlico.

Modulo ACS712 sensor de corriente.

Ventilador pequeo para extraccin de calor.

Disipadores de aluminio de fuente de poder de PC antigua.

LM35 - Sensor de temperatura para controlar el ventilador segn se necesite.

PIC16F917

Regulador de Voltaje LM2576-05

Modulo ACS712 sensor de corriente.

Regulador de voltaje LM7805

Regulador de Voltaje LM2576-ADJ.

Sensor de Temperatura LM35.

MAX232 Maxim

Esquemas de Conexin de algunas partes del proyecto:

PIC16F917.

Esquema segn datasheet del regulador


de Voltaje LM2576-05 voltaje fijo a 5V.

Esquema segn datasheet del regulador

de Voltaje Variable LM2576-ADJ.

RS232 Transistorizado.

Libreras y algunas rutinas del cdigo fuente desarrolladas para el proyecto:


Funcin que lee todos las entradas analgicas y aplica sus respectivos clculos.
///////////////////////////////////////////////////////////////

// adc
///////////////////////////////////////////////////////////////
void adc(void)
{
set_adc_channel(1);
//medir tension
delay_us(TIEMPO_DELAY); //Temporiza 20uS
value=READ_ADC();
// read analog value from channel 1
vol1 = (float) (((value*500)/1024)/10);//Escalar Variable
//de 0 a 500
delay_us(TIEMPO_DELAY); //Temporiza 20uS
sprintf(voltage1, "%f", vol1);
voltage1[5] = '\0';
/////////////////////////////////////////////////////////
set_adc_channel(4);
//medir corriente
delay_us(TIEMPO_DELAY); //Temporiza 20uS
value=READ_ADC();
// read analog value from channel 4
AN1 = (float) (value*5.0/1024); //AN1=value*(Vref(+) //Vref(-)/2^n +Vref(-),
//multiplica el numero de
//bits por su equivalente
//en analogico
delay_us(TIEMPO_DELAY); //Temporiza 20uS
sprintf(amperaje1, "%f", AN1);
amperaje1[5] = '\0';
/////////////////////////////////////////////////////////
set_adc_channel(0);
delay_us(TIEMPO_DELAY); //Temporiza 20uS
value = READ_ADC(); // read analog value from channel 0
vol2 = (float) ((value*500)/1024)/10 ;//Escalar Variable
//de 0 a 500
delay_us(TIEMPO_DELAY); //Temporiza 20uS
sprintf(voltage2, "%f", vol2);
voltage2[5] = '\0';
/////////////////////////////////////////////////////////
set_adc_channel(5);
//medir corriente
delay_us(TIEMPO_DELAY); //Temporiza 20uS
value = READ_ADC(); // read analog value from channel 5
AN2 = Filtro_Analog_AN2((float) ((value*5.0)/1024));
delay_us(TIEMPO_DELAY); //Temporiza 20uS
sprintf(amperaje2, "%f", AN2);
amperaje2[5] = '\0';
/////////////////////////////////////////////////////////
set_adc_channel(2);
delay_us(TIEMPO_DELAY); //Temporiza 20uS
value=READ_ADC();
// read analog value from channel 2
vol3 = (float) ((value*500)/1024)/10 ;//Escalar Variable
//de 0 a 500
delay_us(TIEMPO_DELAY); //Temporiza 20uS
sprintf(voltage3, "%f", vol3);
voltage3[4] = '\0';
/////////////////////////////////////////////////////////
set_adc_channel(3);
delay_us(TIEMPO_DELAY); //Temporiza 10uS
value=READ_ADC(); // read analog value from channel 3
delay_us(TIEMPO_DELAY);
temperatura= (float) ((5.00*value*100.00/1024.0)/10);
sprintf(temperatura1, "%f", temperatura);
temperatura1[5] = '\0';
/////////////////////////////////////////////////////////
}

Interior de la fuente digital:

Vista superior en fase de pruebas


donde se uso el LM350, LM317 y un
LM7805 para regular el voltaje.

Frontal en fase de pruebas.

Vista de atrs en fase de pruebas.

Vista de transformadores, ventilador


para control de temperatura y dems
partes que conforman la fuente.

Reguladores LM2576 que se usaron


para sustituir los anteriores mencionados
y ahora estos con disipador de fuente de
poder de PC antigua.

Mdulo interno RS232 y mdulos


de censar corriente.

Modulo USB a Serial.

Modulo USB a Serial Finalizado.

Frontal en fase definitiva.

Imgenes

de la Aplicacin de PC:

Aplicacin desactivada y sin


conexin serial presente.

Aplicacin activa pero con las salidas


desactivas solo varia la temperatura
de la fuente en el momento.

Ventana para salvar la imagen JPG de la


grfica de comportamiento de la fuente en el

tiempo tanto su voltaje como su corriente.

Aplicacin con la grfica de

temperatura activa.

Aplicacin con todas las salidas activas

Imgenes

de la fuente

y graficando en el tiempo la salida de 3A.


digital en funcionamiento:

Vista Frontal Fuente Digital definitiva


con luz de fondo azul y led de estado
en cortocircuito de alguna salida.

Otra vista frontal.

de electrnica.

Vista Frontal Fuente Digital definitiva


sin luz de fondo y led de estado
en cortocircuito de alguna salida.

Vista de la fuente en su estado actual


en el banco de trabajo.

Aplicacin de supervicin de la fuente


donde se visualiza el estado de la salidas.

Vista de la fuente entre otros equipos

Imgenes

de la fuente digital finalizada:

Foto Frontal inclinada.

Foto de atrs inclinado.

Foto de atrs.

Foto Frontal.

Foto de atrs con modulo de USB a Serial.

Conversor RS232 a TTL sin MAX232


Todos sabemos que a la hora de conectar un PIC a la PC utilizar el
MAX232 es el paso mas directo y fcil. Slo cinco capacitores y ste
integrado estar funcionando bien. Pero tomando en cuenta que hoy
por hoy un MAX232 puede salirnos incluso mas caro que el mismsimo
PICmicro decidimos desarrollar una alternativa vlida que lo
reemplace.

El circuito de arriba utiliza la propia corriente del puerto COM de la PC


para generar los smbolos del RS232. Los pines marcados como TxD,
RxD y Gnd corresponden al conector RS232 de la PC (ver
conexionado) mientras que los pines marcados como RD y TD van
directamente a microcontrolador. Podemos observar el pinout de los
transistores.
Este tipo de interface es muy vista en mouses o elementos de control
de punteo en PC. Los puntos de alimentacin son de 5V (los mismos
que del micro).

POST#17: Sistema Integrado de equipos de laboratorio


controlado por PC en base a micro-controladores PIC

Objetivo:

La finalidad para realizar este proyecto no es mas que tratar de solventar el problema de los
equipos electrnicos de calidad y accesibles para los estudiantes universitarios, los estudiantes
tcnicos y entusiasta, por ello se enfoco en el desarrollo de un sistema completo en el cual se
tenga integrado la mayora de los equipos de laboratorios de electrnica a nivel universitario.
Estos equipos deben tener los requerimientos suficientes para poder realizar todas las
practicas a lo largo de la carrera universitaria. Con esto en mente se determino que se
conformara en sistema integrado de equipos los cuales trabajan en una sola interfaz de
computadora, donde todas la variaciones de niveles de salidas y entradas, as como las
lecturas de estados lgicos, voltajes y corrientes, y estas se puedan configurar de manera
digital desde el software de control realizado para el equipo.

Con esto se llego a la conclusin de que se compondra de dos fuentes variables digitales de
0v a 20v con precisin de 0.01V y control de corriente de 0A a 2A con precisin de 0.1A, estas
fuentes puede trabajar en modo serial, paralelo o independiente, ademas cuenta con una
tercera fuente fija a 5V a 5A como mximo en su salida, por otra parte se encuentra el
generador de funciones el cual puede generar seales seno, cuadradas y TTL gracias al
AD9850, donde es posible variar su amplitud de 1Vpp a 7Vpp, frecuencia de 10hz a 1Mhz y
ciclo de trabajo 0% a 100%, tambin una punta lgica la cual mida tanto circuitos TTL como
CMOS y muestre el estado lgico en forma de 7 segmentos en la interfaz o en forma de led
iluminados en la interfaz, por ultimo un multmetro con voltmetro AC y DC de 0v a 600v,
ampermetro AC y DC por efecto hall con el ACS714 de -5A a 5A dependiendo de como se
tome la lectura, lector de ohmios de 1ohm a 10 Mohm y lector de continuidad.

El sistema esta conectado por un bus de datos I2C el cual esta aislado por integrados
especializados ADuM1250, con esto se asegura que cual quier falla no afecte otro de los
equipos y ademas permite el agregar nuevos equipos al bus de datos y con esto complementar
aun mas el sistema como podra ser la adicin de un osciloscopio o de un frecuencmetro.

La alimentacin del equipo es con transformares genricos separados para asegurar el


aislamiento y tambin un remplazo rpido de cualquiera de ellos en caso de fallas ya que son
mas comerciales que el embobinar una transformador con un solo primario y el numero de
secundarios necesarios para alimentar todos los mdulos con sus respectivas potencia
adecuada.

La placas del sistema estas controladas por PIC Microchip de varios modelos segn el mdulos
y familias, pero todos con la caractersticas mnima de que cuente con bus de datos I2C por
hardware, para conectarse a la placa de bus de datos aislada y todo esto ser controlado por la
placa de control principal que esta basada en el PIC18F2550, por su bus I2C y conexin USB
al computador la cual se aisl con el integrado ADuM4160 y el uso de una LCD 20x4 para
visualizar el estado general del equipo ya que el mismo no cuenta con ningn pulsador o
potencometro de configuracin, todo es realizado de manera digital desde la aplicacin de
control en la computadora personal.

La programacin de los microcontroladores, fue realizada en CCS con el uso de interrupciones


en todos los casos necesarios y perifricos de hardware, ningn control ya sea del bus o de

integrados fue realizado por software para no tener retrasos generados al emular algn
protocolo o tarea.

El software de control se realizo en Visual Studio 2013 en lenguaje C# con libreras capaces de
trabajar con el puerto USB del PIC18F2550 en las versiones mas actuales de windows, tanto
en x86 como en x64, as como tambin se usaron libreras para los 7 segmentos en la interfaz
y los led animados.

Materiales principales utilizados:

Modulo DDS AD9850 encargado de generar


las distinta seales de salida del generador
de funciones, este modulo puede ser
controlado de forma serial o de forma
paralela segn sea el diseo.

PIC 18F2550 de Microchip el cual cuenta


con 28 pines de distintos usos pero como
perifricos importantes cuenta con pines
dedicados por hardware para la comunicacin
USB y comunicacin por bus I2C.

ACS714 Pololu modulo sensor de corriente


bidireccional por efecto hall de salida
lineal a la corriente en sus terminales
puede sensar desde -5A a 5A
y su salida es una variacin de voltaje
donde por cada paso se aumenta o disminuye
en 180mV/A segun sea el caso teniendo
como 0A el voltaje de salida fijo de 2.5V

PIC 16F1503 de Microchip usado para la


mayora de los mdulos ya que el mismo
cuenta con un numero de pines suficiente
pero como perifricos importante tiene bus
I2C por hardware, as como varias salidas del
tipo PWM por hardware, necesarias para los
mdulos y su correcto control.

Transformador con tap central 12v-0-12v


4 Amp para salidas de potencias de las
distintas fuentes.

ADuM1250 inteagrado de Analog Devices


que se encarga de aislar el bus de datos I2C
con una tecnologa de aislamiento magnetico
y soportando sobrecargas de hasta 2500V rms
para proteger el circuito que asla.

Transformador con tap central 12v-0-12v


0.5 Amp para alimentar cada uno de los
mdulos en su parte lgica

PIC 18F4610 de Microchip usado para el


multmetro ya que cuenta como gran
cantidad de pines los cuales fueron usados
para las distintas funciones del mismo , as
como tambin por su bus I2C por hardware.

Disipador de aluminio para las distintas


fuentes de poder

LM35 en encapsulado TO92 para colocarlo


cerca fsicamente del disipador de las
fuentes y con esto controlar el encendido y
apagado del ventilador segn sea el caso
de una temperatura alta o baja.

Ventilador para forzar la ventilacin en las


fuentes de poder en caso de ser necesario
por uso prolongando de las mismas con una
carga grande en su salida.

LM2576 en encapsulado TO220 de 5 pines,


regulador altamente eficiente que solo
necesita de 4 componentes externos para
entregar hasta unos 3 Amp con unos 5V
si desperdiciar casi energa en calor al ser
el mismo step-down y tener una eficiencia
muy alta.

Puerto USB tipo B usado para la conexin


del cable USB del sistema con el PC

MCP41010 integrado de Microchipm que


hace la funcin de potenciometro de control
para el contraste de la LCD del sistema

LCD 20X4 luz de fondo azul para los distintos mensajes de estado y control del sistema.

Placas y partes del proyecto:

Placa dedicada al BUS de datos i2c aislado


con tecnologa de transformadores de analog
, la cual cuenta con fuente de alimentacin
propia, que usa para energizar los integrados
ADuM140x y el bus de datos completo.

Placa fuente de poder digital regulable de


0v a 20v, con salida ajustable de corriente
de 0A a 2A, esta placa cuenta con
alimentacin propia para potencia y lgica.
La lgica es basada en el micro-controlador
PIC 16F1503 de Microchip y la potencia
en el regulador LM338 con control mediante
amplificador operacional y seales PWM.

Punta lgica realizada a partir de un


probador de electricista para 110v, el cual
fue modificado para ser usado en el sistema.
Bsicamente se le agrego un par de cables
polarizado para energizarla del circuito en
estudio, as como tambin cuenta con un
cable de varios hilos para la conexin con
el sistema

Placa principal de control micro-controlada


con el PIC 18f2550 de microchip, la cual esta
constituida por conector USB tipo B, fuente
conmutada 5v, LCD 20x4 conectado de forma
serial con registro de desplazamiento, potencimetro digital para control del contraste de
la LCD, conector para el BUS I2C,etc.

Placa selectora de los modos de salida de las


fuentes de poder variable donde se encarga
de colocar las salidas de las fuentes en modo
seria, paralelo o independiente, as como
tambin se encarga de mostrar mediante un
LED en el frontal cual esta activa de ellas y
si alguna esta en proteccin por cortocircuito

Placa multmetro la cual cuenta con, estas


herramientas: ampermetro basado en el chip
ACS712 para corriente tanto AC como DC,
ohmmetro con el uso de un arreglo formado
por resistencia y lectura del ADC del PIC,
el voltmetro AC y DC con el uso de puente
rectificador y divisor resistivo de precisin,
punta lgica para circuitos CMOS y TTL,
finalmente la placa cuenta con LED de estado
del modo en uso, as como tambin con un
buzzer para seales auditivas y una fuente
conmutada LM2576 con un PIC 18F4610.

LCD 20x4 del sistema con faja plana.

Vista del conjunto de placas que conforma el


sistema completo.

Placa encargada de la generacin de seales


elctrica de tipo seno y TTL, la misma esta
basada en el chip AD9850 el cual de manera
serial es controlado por el PIC 16F1503, para
as configurar el modo de salida: frecuencia
y dutty. Y con la ayuda de un juego de OPAM
y potencimetros digital MCP41010 se logra
modifica el off set y la amplitud de las
seales de salida generadas.

Placa fuente de poder digital regulable de


0v a 20v, con salida ajustable de corriente
de 0A a 2A, esta placa cuenta con
alimentacin propia para potencia y lgica.
La lgica es basada en el micro-controlador
PIC 16F1503 de Microchip y la potencia
en el regulador LM338 con control mediante
amplificador operacional y seales PWM.

Placa fuente de poder digital de salida de voltaje fija a 5V, con salida fija de corriente
maxima de 2A, esta placa cuenta con alimentacin propia para potencia y lgica.
La lgica es basada en el micro-controlador PIC 16F1503 de Microchip y la potencia
en el regulador LM338 con control mediante amplificador operacional y seales PWM.

PCB en 3D del proyecto:

PCB para conexin de la entrada de 110V


de los transformadores de entrada de cada
una de las placas del sistema.

PCB de la placa principal de control.

PCB de la placa de multmetro y punta


lgica.

PCB de la placa para seleccin del modo


de salida de las fuentes variables.

PCB de la placa del bus de datos i2c


aislado.

PCB de la placa de generador de funciones.

PCB de la placa para la fuente digital

PCB de la placa para la fuente digital

variable.

fija.

Imgenes del software del sistema:

Ventana de informacin del sistema.

Ventana de ayuda del sistema.

Ventana para la configuracin del sistema


como la luz de fondo y el contraste
de la LCD.

Vista del men de ayuda en la ventana


principal del sistema.

Ventana flotante del sistema cuando es


activado el modo de salida en serie de las
fuentes variables digitales

Ventana flotante del sistema cuando es


activado el modo de salida en paralelo de las
fuentes variables digitales

Ventana donde se observa la pestaa de


multmetro y punta lgica en uso. En la
cual se tiene a la izquierda el multmetro
con cada una de sus funciones como son:
ohmmetro, voltmetro AC, voltmetro

Ventana donde se tiene la pestaa para


las fuentes que conforman el sistema a la
izquierda las dos fuente variables con sus
opciones de configuracin de salida como
el voltaje o la corriente de cada una de

DC, medidor de continuidad y ampermetro


AC y DC. Por otra parte a la derecha se
tiene la punta lgica sus modos de deteccin
de la tecnologa a estudiar, as como tambin
se tiene de un 7 segmentos y 3 seales
visuales para apreciar el estado lgico
presentes en la punta de medicin al
momento de realizar las pruebas en la placa
en estudio.

las fuentes, as como tambin cuenta con


visores del estado de la fuente, voltaje,
corriente, temperatura y ventilacin. A la
derecha se tiene la fuente fija con los
mismos visores pero sin opcin de
configuracin, las 3 fuentes cuentan con un
botn de activacin. finalmente abajo a la
derecha se observa los tipos de configuracin
de salida para las fuentes variables como
son salida en serie, paralelo o independiente.

Ventana donde se tiene la pestaa para el


generador de funciones del sistema en la
cual se aprecia los 7 segmentos para la
visualizar la frecuencia de salida, en la zona
izquierda baja esta para introducir el valor
deseado de frecuencia, as como un botn
para su variacin paso a paso, en la zona
derecha baja esta la configuracin para el
tipo de salida a ser generada ya sea seno
o TTL, as como tambin para variar su
amplitud o ciclo respectivamente.

Vista del men en la ventana


principal del sistema.

Vista de la ventana principal del sistema.

Ventana flotante del sistema al momento de


decidir cerrar el mismo.

Imgenes del prototipo funcional del sistema finalizado:

Vista frontal del sistema en pruebas de sus

Vista frontal del sistema donde se tiene

salidas, entradas y aplicacion

el mismo con la conexin USB a la PC

LCD del sistema mostrando estado de la


aplicacin as como del USB y los modulos
activos

Vista Frontal del sistema integrado

Vista desde arriba parte superior izquierda


en la cual se tiene la placa principal de
control, la placa de bus de datos aislado y
se observa la parte de los transformadores
del sistema.

Vista desde arriba parte superior derecha


donde se ve la fuentes pero se aprecia
mejor los transformadores de potencia del
sistema.

Vista desde arriba parte inferior izquierda


donde se tiene la LCD con su faja de datos
el multmetro digital y el generador de
funciones.

Vista desde arriba parte inferior derecha


se observa la fuente variables y la fija as
como su placa de control de tipo de salida
de las fuentes variables.

Frontal Izquierdo donde se tiene la LCD del


sistema con las entradas del multmetro con
punta lgica y la salidas del generador de

Frontal Derecho donde se aprecia el botn


de encendido con los conectores de las

funciones tipo BNC.

fuentes variables y fija a su lado

Cableado parte trasera USB, alimentacin


y fusible de proteccion.

Vista trasera completa

Caja a medida para poder transporta


el prototipo con mayor facilidad y que
se proteja al ser almacenado para
guardarlo.

Vista frontal con punta lgica del sistema


integrado

Foto del sistema terminado dentro de su caja acrlica donde ya


ajustado y calibrado todas sus salidas, as como tambin sus
mdulos de sensores de las distintas magnitudes fsicas, ac se
aprecia como se organizo las salidas y el cableado del mismo.

Vdeos del prototipo funcional del sistema finalizado:

POST#6: Sensor de gas y temperatura porttil de bajo


costo con LCD 16x2 controlador por PIC16F88 y
batera recargable.

Objetivo:

Al cursar las distintas materias de la universidad me tope con


proyectos electrnicos que fueron asignados como prueba de los
conocimientos adquiridos en el tiempo de estudio, en este caso les traigo uno
de los proyectos el cual tenia la premisa de ser una versin de un producto
funcional,
con
acabado
para
la
venta
y
que
solventara
alguna problemtica existente
en
nuestro
entorno.
As que me encamine en el diseo y construccin de un Sensor de
Gas y Temperatura portable, que sea recargable con facilidad y que el
mismo sea controlado mediante el uso de un microcontrolador PIC
ejecutando algoritmos en lenguaje C de control, en cuanto a la etapa de
potencia de la entrada de alimentacin se basa en el regulador de voltaje LM7805 de voltaje fijo
a 5V, con un LM317 en modo regulador de corriente permitiendo solo el paso suficiente de la
misma para cargar la batera a un 10% de su capacidad de corriente y al mismo tiempo de un
punto anterior al LM317 se toma la alimentacin para el dispositivo sin ninguna restriccin de
corriente. Con esto obtenemos una carga segura que no destruye la integridad de la batera y
alarga su vida til. Cuando se encuentra conectado al cargador se enciende el LED de carga
amarillo ademas de que el dispositivo en modo carga puede ser usado sin problemas mientras
se muestra en todo momento en pantalla el estado de la carga al estar encendido.
El sensor MQ4 al iniciar la lectura de gas necesita de un pre-calentamiento del mismo, esto
para que los componentes internos se calienten y ocurra un proceso qumico que detecte el
gas en el lugar. El dispositivo muestra en pantalla en todo momento el estado del gas y la
temperatura en el lugar, como as tambin la cantidad de carga de la batera.
La carga de la batera en un estado de completa descarga, necesita de al menos de 11 horas
seguidas de alimentacin del toma corrientes de 110V con un transformador de 110v a 12v AC,
o cuando esta la batera a media carga simplemente con observar el estado de la carga en la
pantalla. Todo esto sin tener la preocupacin de estropearla por sobre carga ya que como es
una carga lenta de solo el 10% de la corriente de la batera esta no sufre luego de estar
completamente recargada simplemente pasara a un estado de carga flotante.
Al terminar el proyecto propuesto se cumpli con todas las exigencias del curso logrando
la mxima puntuacin para
el
mismo.

Materiales principales utilizados:


1 x PIC16F88. (Muestra gratis obtenida gracias a Microchip)

2 x Pulsadores - Para control manual desde el frontal.

1 x Baquelita para el montaje.

1 x Sensor MQ4 - Sensor de gas natural.

1 x LCD 16x2 - Para visualizacin del men, estado del dispositivo y


configuraciones.

1 x LM7805 regulador de voltaje para la lgica de control.

1 x LM317 regulador de corriente para la carga de la batera.

Switch pequeo simple color negro.

Caja para prototipos de calidad tamao mediano plstica color negro.

4 x Patas de goma.

LM35 - Sensor de temperatura para controlar el ventilador segn se necesite.

1 x Batera Recargable 8.4v ni-mh 200 mAh.

Microcontrolador PIC16F88.

MQ4 Sensor de Gas

LM7805 Regulador de voltaje

LM317 Regulador

LM35 Sensor de temperatura.

QC1602A LCD 16x2.

74HC164
Esquemas de Conexin de algunas partes del proyecto:

LM317 segn datasheet.

PIC16F88 segn datasheet.

MQ4 segn datasheet.

LM35 segn datasheet.

LCD 3 pines.

74HC164 segn datasheet.

Esquema Completo

Diagrama de proyecto:

PCB de LCD con 3 pines.

PCB de Lgica de control.

PCB de pulsadores de control.

PCB de Sensores de gas y temperatura.

PCB completo.
Libreras y algunas rutinas del cdigo fuente desarrolladas para el proyecto:

LCD con slo 3 pines. WEB de ejemplo.

MQ4 sensor de gas ejemplo. WEB de ejemplo 1.

Lectura del Sensor MQ4 usando una entrada analgica del PIC.

WEB de ejemplo 2.

///////////////////////////////////////////////////////////////
// adc
///////////////////////////////////////////////////////////////
void adc(void)
{
ADC_1_LM35
= 0;
ADC_2_MQ4
= 0;
ADC_3_SUPPLY
= 0;
ADC_4_BATT
= 0;
set_adc_channel(1); //BATT CANAL 1 (LM35)
delay_us(TIEMPO_DELAY);
value = read_adc(); //lee el valor del ADC y lo guarda en
//el registro adc
delay_us(TIEMPO_DELAY);
ADC_1_LM35 = Filtro_Analog_LM35((float) (value*(0.48875)));
//--------------------------------------------------------value = 0;
set_adc_channel(2); //BATT CANAL 2 (Bateria)
delay_us(TIEMPO_DELAY);
value = read_adc(); //lee el valor del ADC y lo guarda en
//el registro adc
delay_us(TIEMPO_DELAY);
ADC_4_BATT = Filtro_Analog_BATT((float)(value*0.048828125));
//---------------------------------------------------------value = 0;
set_adc_channel(3); //BATT CANAL 3 (SUPPLY)
delay_us(TIEMPO_DELAY);
value = read_adc(); //lee el valor del ADC y lo guarda en
//el registro adc
delay_us(TIEMPO_DELAY);
if((float)(value*0.048828125) > 9)
ADC_3_SUPPLY = (float)(value*0.048828125);
else
ADC_3_SUPPLY = 0;
//--------------------------------------------------------value = 0;
set_adc_channel(4); //BATT CANAL 4 (Sensor de Gas)
delay_us(TIEMPO_DELAY);
value = read_adc(); //lee el valor del ADC y lo guarda en

//el registro adc


delay_us(TIEMPO_DELAY);
ADC_2_MQ4 = Filtro_Analog_MQ4((float)(value));
//---------------------------------------------------------

Imgenes

del sensor de gas en fase de construccin:

PCB perforada - Parte lgica.

Sensor de temperatura y gas parte


de atrs.

PCB perforada - LCD 3 pines.

Modulo de pulsadores y LED.

PCB conectadas.

Sensor de temperatura y gas


de frontal.

Sensor de temperatura y gas parte

Sensor de temperatura y gas

de atrs de serca.

de lado.

Sensor de temperatura y gas con cajn

Sensor de temperatura y gas dentro

exterior prototipo.

cajn exterior prototipo.

Caja de prototipo marcada lista para


los cortes con la herramienta dremel.

Caja de prototipo ya trabajada y pulido


los bordes.

Vista de la caja de prototipo frontal.

Vista de la caja de prototipo frontal

Colocando separadores para la cada

del LCD 16x2.

Vista de frente con LCD.

y las dems partes del proyecto.

LCD 16X2 ajustado en la caja de


prototipos.

Colocando modulo de pulsadores y

LED con sus respectivos separadores


metlicos.

Vista de frente con LCD y modulo de


pulsadores y LED.

Vista de atrs con LCD , modulo de


pulsadores y parte lgica como
tambin el control de LCD con 3 pies.

Ajustando los cables en el interior


con la batera a un costado con
sierre mgico.

Interruptor de apagado del dispositivo.

Extensin de modulo sensor de gas


y temperatura con alambre de cobre
interno para brindar rigidez al momento
de direccionarlo al punto a medir.

Ajustando los cables en el interior.

LED de carga, Entrada plug de voltaje


de carga y orificio de salida del modulo
de sensor de gas y temperatura.

Cerrando con todas las partes


acomodadas.

Equipo sin el frontal a un lado.

Imgenes

del sensor de

Etiqueta que disimula defectos y


proporciona indicaciones de cada
parte del frontal.

Dispositivo terminado sin frontal.


gas finalizado:

Foto frontal del equipo con etiqueta.

Foto sensor de gas y temperatura.

LCD con slo 3 pines


30 noviembre, 2009

Esta til librera permite gestionar un LCD 216 compatible


HD44780 con slo 3 pines de tu micro, utilizando un registro de desplazamiento.

Es una modificacin a la conocida Flex_LCD realizada por los amigos Akenafab y


Duende_Azul.
Los pines utilizados son:
LCD_E: seal de control Enable del LCD
LCD_CK: seal de reloj del registro de desplazamiento
LCD_DAT: salida del bit menos signficativo hacia el registro de desplazamiento

// flex_lcd_3_pins.c
//Modificacin de Flex_lcd por Duende_Azul y Akenafab
//Trabaja con 3 pines y 74VHC164
//8-Bit Serial-In, Parallel-Out Shift Register
//La LCD se usa en modo 4bits
//Revisar diagrama de conexion Adjunto
//Se ha utilizado a una velocidad de @40MHz sin ningun problema
//No esta habilitada la lectura del LCD
//RW debe ir a gnd
//Definir pines antes de llamar libreria//
//#define LCD_E
PIN_A0
//#define LCD_CK PIN_A1
//#define LCD_DAT PIN_A2
//========================================
int RS_bit;
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
int8 const LCD_INIT_STRING[4] =
{

0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc,
// Display on
1,
// Clear display
6
// Increment cursor
};
//------------------------------------void lcd_send_nibble(int8 nibble, int rs_bit)
{
int x;
if(RS_bit==1)
nibble=nibble|0x10;
for(x=0;x<5;x++) {
output_bit(LCD_DAT,shift_right(&nibble,1,0));
delay_cycles(1);
output_low(LCD_CK);
delay_us(1);
output_high(LCD_CK);}
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
//----------------------------------//----------------------------------// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
//output_low(LCD_RS);
RS_bit=0;
delay_us(100);
if(address)
//output_high(LCD_RS);
RS_bit=1;
else
//output_low(LCD_RS);
RS_bit=0;
delay_cycles(1);
output_low(LCD_E);
lcd_send_nibble(n >> 4,RS_bit);
lcd_send_nibble(n & 0xf,RS_bit);
}
//---------------------------void lcd_init(void)
{
int8 i;
//output_low(LCD_RS);
RS_bit=0;
output_low(LCD_E);
delay_ms(20);

for(i=0 ;i < 3; i++)


{
lcd_send_nibble(0x03,RS_bit);
delay_ms(5);
}
lcd_send_nibble(0x02,RS_bit);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
delay_ms(5);
}
}
//---------------------------void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
if(y != 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//----------------------------void lcd_putc(char c)
{
switch(c)
{
case '\f':
//limpia pantalla
lcd_send_byte(0,1);
delay_ms(8);
break;
case '\n':
//cambio de linea
lcd_gotoxy(1,2);
break;
case '\b':
//retrocede 1 caracter
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
//-----------------------------void lcd_setcursor_vb(short visible, short blink) {
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}

#include <16F88.h>
#FUSES
INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,CCPB0,N
OFCMEN,NOIESO
#use delay(Internal=8M)
//------------ Pines del LCD ---------------------//
#define LCD_E
PIN_A0
#define LCD_CK PIN_A1
#define LCD_DAT PIN_A2
//--------------------------------------------------//
#include "flex_lcd_3pins.c"
// Cargamos libreria del lcd
void main() {
delay_ms(100);
output_a(0);
output_b(0);
lcd_init();
// inicializamos el LCD
lcd_setcursor_vb(1,1); //cursor visible,papadeo
while(1){
printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");
delay_ms(1000);
printf(lcd_putc,"\f* Duende_Azul *\n * Akenafab *");
delay_ms(1000);
} //end while
} //end main

Analog Gas Sensor(MQ4) (SKU:SEN0129)


Contents
[hide]

1 Introduction
1.1 Specification

2 Pin Definition

3 Potentiometer

3.1 Connection Diagram

3.2 Sample Code

Introduction
The MQ4 is used in gas leakage detecting equipment in consumer and industry markets,this sensor
is suitable for detecting CH4,Natural gas, LNG, avoid exposure to alcohol, cooking fumes, and
cigarette smoke. The sensitivity can be adjusted by the potentiometer.

Specification

Power supply needs: 5V

Interface type: Analog

Pin Definition: 1-Output 2-GND 3-VCC

High sensitivity to CH4Natural gas

Small sensitivity to alcohol, smoke

Fast response

Stable and long life

Simple drive circuit

Size: 40x20mm

Pin Definition
1. Signal Output
2. GND
3. Power

Analog Sensor Pin Definition

Potentiometer
Potentiometer is used to calibrate the readings from this sensor as stated on the datasheet:
SENSITVITY ADJUSTMENT
Resistance value of MQ-4 is difference to various kinds and various concentration gases. So,When
using this components, sensitivity adjustment is very necessary. we recommend that you calibrate
the detector for 5000ppm of CH4 concentration in air and use value of Load resistance ( RL) about
20K(10K to 47K). When accurately measuring, the proper alarm point for the gas detector
should be determined after considering the temperature and humidity influence.

Connection Diagram

Analog sensor connection diagram

Sample Code
?

///Arduino Sample Code

2
3
4

void setup()
{
Serial.begin(9600); //Set serial baud rate to 9600 bps

5
6
7

}
void loop()
{

8
9
10

int val;
val=analogRead(0);Read Gas value from analog 0
Serial.println(val,DEC);//Print the value to serial port

11 delay(100);
12 }

This example is for Wiring version 1.0 build 0100+. If you have a previous version, use the
examples included with your software. If you see any errors or have comments, please let
us know.

Air Quality MQ135 sensor by BARRAGAN http://barraganstudio.com


Reads values from an air quality sensor connected to the analog input pin 0. The value read from
the sensor is proportional to the air quality measured by the sensor. The value read is printed to
the serial monitor

int sensorValue;

void setup()
{
Serial.begin(9600);

// sets the serial port to 9600

void loop()
{

sensorValue = analogRead(0);

// read analog input pin 0

Serial.println(sensorValue, DEC);

// prints the value read

delay(100);

// wait 100ms for next reading

POST#5: Convertidor USB a Serial, que trabaja con


los integrados PL2303 Prolific y el conocido MAX232
de Maxim.

Objetivo:
Diseo y construccin de un convertido USB a Serial para as facilitar la conexin de los
proyectos que se disearon con el antiguo conector DB9 que trabaja sobre la conexin serial
que cada da es mas difcil de conseguir en las PC y laptop actuales imposibilitando el uso de

estos proyectos en los nuevos sistemas de computacin,


sea fcil de armar y con componentes no muy difciles de
ademas que trabaje en la mayora de sistemas
un mnimo de configuracin por el usuario al ser plug and
driver.

este modulo se pens para que


conseguir en las tiendas online y
operativos existentes, usando
play con muy buen soporte para

El modulo se construye con una poca cantidad de componentes de los cuales los mas
importantes es el PL2303 que convierte de USB a Serial pero a niveles TTL de voltaje y luego
se adapta el voltaje con el conocido MAX232 para poder llegar a los valores de voltaje
normales
de
las
comunicaciones
serial
de
las
PC.
Nota: Windows 8 no soporta las versiones del chip HXA/XA (aparece un cdigo de error en
controlador).

Materiales principales utilizados:


1 x PL2303 Prolific.

1 x MAX232 - (Muestra gratis obtenida gracias a Maxim).

1 x Baquelita para el montaje.

4 x Patas de goma.

1 x Lamina de acrlico transparente para la base y tapa superior.

1 x Conector DB9 (RS232)

1 x Conector USB tipo B.

PL2303 de Prolific.

Conector USB tipo B utilizado.

MAX232 de Maxim

Esquemas de Conexin de algunas partes del proyecto:

PL2303 esquema segn datasheet.

MAX232 esquema segn datasheet.

USB tipo B

Esquema PCB:

PCB en negro

PCB en color

Interior del convertidor:

Vista superior.

PCB adaptador SMD a DIP.

Vista inferior con soporte metalico.

Imgenes

del convertidor finalizado:

Vista final superior.

Ejemplo de uso del modulo.

MAX232 product image MAX232 DUAL


ELA-232 DRIVERS/RECEIVERS

The physical communication standard defines the signal voltage of -10V for logic '1', and +10V
for logic '0'. However in practise, the voltage can be ranging from +/-3V to +/-25V. Not to worry if
the measured voltage is not +/-10V. Typical receiver is able detect the incoming signal with
voltage as low as +/-3V.
A microcontroller like PIC16F877a uses USART (5V system). The PC (personal computer) that
we have in the office/home uses the standard RS232. To enable a microcontroller to
communicate with the computer, a RS232 to TTL converter is required.

IC chip maker has come up with the integrated circuit for interfacing RS232 with TTL logic (5V
for logic 1, 0V for logic 0), making the interfacing work very simple. MAX232 is one of the many
IC in the market which helps to convert between RS232 -/+10V and TTL +/- 5V. It is a simple
voltage level converter in short. The charge pump design allows the circuit to generate +/-10V
from a 5V supply, with the help from the four capacitor. With charge pump to double up the
supply voltage for RS232 transmitter, there is no need to design a power supply for +/-10V.
The diagram on the left shows the schematic of the MAX232 IC circuit. It consist of only 4x 1uF

16V electrolytic capacitor, and the MAX232 IC itself. It is that simple. I have include a layout
which I always use for PC to PIC16F877a microcontroller, RS232 interface.

http://www.dfrobot.com/

http://jartur2013.blogspot.com/2013/12/post11-controlador-de-servo-condspic-y.html

POST#11: Controlador de 20 Servomotores con


DSPIC y estabilidad con el modulo GY-80

Objetivo:

Con el fin de realizar futuros proyectos de robtica donde se tengan muchas articulaciones con
lo cual se deba tener estabilidad y movimientos precisos, me di a la tarea de disear y
construir un prototipo de placa controladora de servomotores, con visualizacin LCD,
conectividad Xbee o mediante Bluetooth Bee y que cuente con variedad de sensores, como los
que proporciona el modulo GY-80. Todo esto para facilitar los desarrollos venideros y con esto
solo enfocarme principalmente en la parte mecnica y la programacin de los movimiento, con
sus respectivos sistemas de control.

Materiales principales utilizados:


1 x dsPIC30F4013. (Muestra gratis obtenida gracias a Microchip).

1 x LM2576T-5.0P+ (Step-Down Regulador de Voltaje 5v).

1 x LM1117T regulador 3.3v.(Muestra gratis obtenida gracias a ST).

1 x Xbee Serie 2 o Bluetooth bee

1x Memoria EEPROM 24LC128

2 x Pulsadores

1 x Espadines para placa de sensores con conexin I2C.

GY-80 (L3G4200D + ADXL345 + HMC5883L + BMP085).

Giroscopio de 3 ejes.

Aceleremotro de 3 ejes.

Sensor de campo magenetico de 3 ejes.

Sensor de presin y temperatura.

LCD 2x16 con placa de conexin va I2C.

Placa con todos los sensores incluidos con conexin


por medio de bus I2C.

Modulo de sensores GY-80

PCB del proyecto con varias vistas 2D y 3D:

Vista del PCB generada con Eagle3D


con serigrafia y casi todos los
componentes.

Vista del PCB parte inferior en angulo


con Google SketchUp 8

Vista del PCB parte superior en angulo


con Google SketchUp 8.

Vista del PCB parte inferior


con Google SketchUp 8 con
serigrafia.

Vista del PCB parte superior


con Google SketchUp 8 con
serigrafia.

Vista del PCB que se uso para ser


transferido a la placa.

Vista del PCB en el modo Tarjeta en


Eagle.

Diagrama de proyecto:

Circuito esquemtico en Eagle.

Imgenes en fase de construccin y finalizado:


Ac se logra observa la placa en sus fases de construccin, donde se tiene
un prototipo final para las pruebas de los distintos servomotores, ya sea

solos o conectados varios de ellos a la vez, logrando controlar su posicin


sin problemas mediante conexin encalabrina Xbee con la computadora
personal, mediante comandos por el protocolo serial RS232. Por este mismo
canal se logra obtener y leer en tiempo real los valores de posicin de los
distintos sensores en el modulo GY-80, con los cuales ms adelante se
trabajara en conjunto con los servomotores para proyectos de robtica.

Placa lista para la soldadura


vista desde arriba.

Placa finalizada en pruebas conectada


al programador PICkit 2 clone por medio
del cable de ICSP.

Placa ya perforada con el tner


retirado lista para la soldadura
vista desde abajo.

Placa finalizada, otras imgenes con


la placa de sensores a un lado.

Controlador con 5 modelos de servomotor distintos


de marcas variadas usados en la pruebas.

Bibliografa, Web y Datasheet:


Web:
http://picmania.garcia-cuervo.net/picc_servos_x_8.htm

http://robotypic.blogspot.com/2010/11/control-de-8-servos-con-pic16f876a_13.html
http://blog.oscarliang.net/use-gy80-arduino-adxl345-accelerometer/

http://robotypic.blogspot.com/2010/11/control-de-8-servos-con-pic16f876a_13.html

Control de 8 servos con PIC

Este proyecto consiste en el control de 8 servos por el puerto c del pic. En la


interaccin para el control de los servos se emplea un teclado numrico y un lcd,
ambos controlados por el puero b del PIC.

En su funcionamiento, el pic pide introducir el nmero del servo a controlar.


Posteriormente solicita el ngulo de orientacin deseado para ese servo ( de 0 a
180). El valor se acepta con la tecla * y el programa vuelve a mostrar un
mensaje de presentacin para un nuevo control. Si el ngulo introducido es superior
a 180, el pic toma por defecto 180.

Para la generacin de las seales moduladas de control de los servos (bit_pwmx),


se emplea la subrutina de interrupcin por rebose del timer 0. La orientacin de
cada servo se establece con el valor que se carga en la variable pwmx, donde x es
el nmero de servo correspondiente. Con cada llamada a la subrutina de generacin
de la seal por mediacin de la interrupcin del timer 0, se incrementa la
variable control_pwm que comparandose con el valor en pwmx, decide si debe o
no cortar alguno de los pulsos de modulacin de los servos.
control_pwm++;
if
(control_pwm==0)
if (control_pwm==pwm0) bit_pwm0=0;

bit_pwm0=1;

Cuando la variable control_pwm, incrementandose en cada rebose del timer0,


llega a su mximo valor y pasa a ser 0, todas las seales moduladas comienzan un
nuevo ciclo.

Para interpretar los valores numricos de varias cifras a partir de nmeros simples
introducidos por teclado, primero espera a que se pulse una tecla

x=kbd_getc();

el valor obtenido est en codificacin ASCII por lo que habr que pasarlo a su valor
numrico decimal

tecla=x-48;

si se ha pulsado una tecla se descartan las pulsaciones en # y * puesto que solo se


necesitan nmeros

if (x!=0&&x!='*'&&x!='#'){

y conforme se van pulsando nmeros el ltimo pulsado ser las unidades y los
anteriores van pasando a decenas y centenas

centenas=decenas;
decenas=unidades;
unidades=tecla;

conforme se van introduciendo nmeros simples se va mostrando el nmero


completo por pantalla lcd

printf(lcd_putc,"\f Angulo = %ld%d%d\n", centenas, decenas, unidades);

y finalmente se guarda en una nica variable el nmero completo resultante de


todos los nmeros simples

angulo=(centenas*100)+(decenas*10)+unidades;

[+/-] Ver / Ocultar programa completo en C

En la simulacin bajo proteus se comprueba el cambio en el tiempo de las seales


de control de los servos individualmente en funcin del valor del ngulo introducido.

//////////////////////////////////////////////////////////////////////
//////////
//
//
//
CONTROL
DE
8
SERVOS
CON
PIC
//
//
//
//
(c)
RobotyPic
//
//
//
//////////////////////////////////////////////////////////////////////
//////////
#include <16f876a.h>
//archivo para control del pic
16f876a
#fuses
XT,NOWDT,NOPROTECT,NOLVP
//protecciones
#use delay(clock=4000000)
#byte
#byte

//frecuencia de reloj 4 MHz


trisb=0x86
portb=0x06

#byte
#byte portc=0x07

trisc=0x87

#define
use_portb_lcd
control
#define
use_portb_kbd
control
#include <lcd.c>
#include <kbd.c>
teclado
#bit
Bit_PWM0
modulacin
#bit
Bit_PWM1
modulacin
#bit
Bit_PWM2
modulacin
#bit
Bit_PWM3
modulacin
#bit
Bit_PWM4
modulacin
#bit
Bit_PWM5
modulacin
#bit
Bit_PWM6
modulacin
#bit
Bit_PWM7
modulacin 7

TRUE

b
lcd
//Configuracin
puerto
b
teclado
//archivo para control del lcd
//archivo para control del

TRUE

//Configuracin

puerto

PORTC.0

//Bit

puerto

PORTC.1

//Bit

puerto

PORTC.2

//Bit

puerto

PORTC.3

//Bit

puerto

PORTC.4

//Bit

puerto

PORTC.5

//Bit

puerto

PORTC.6

//Bit

puerto

PORTC.7

//Bit

puerto

/**********************
Prototipos
***************************/
void
main
(void);
void generacion_pwm (void);
de
void presentacion (void);
/**********************
*************************/

de

las

Salida
0
Salida
1
Salida
2
Salida
3
Salida
4
Salida
5
Salida
6
Salida

funciones

//funcin
principal
//genera seales moduladas para control
servos
//mensaje de presentacin
Variables

para

generacin

PWM

int8
PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0;
//Valores
de
las
seales
PWM
int8 control_PWM=0;
/
**********************************************************************
********/
/*******************
FUNCIN
GENERACIN
MODULACIONES
PWM
**********************/
#int_Timer0

void

generacion_pwm(){

control_PWM++;

//Incremento cada rebose del timer0

if (control_PWM==0){
pulsos
pwm

//Finalizar
correspondiente
if
if
if
if
if
if
if
if

el

pulso

//inicio

de

del

modulacin

(control_PWM==PWM0)
(control_PWM==PWM1)
(control_PWM==PWM2)
(control_PWM==PWM3)
(control_PWM==PWM4)
(control_PWM==PWM5)
(control_PWM==PWM6)
(control_PWM==PWM7)

set_timer0(255);

ciclo con todos los


a
1
Bit_PWM0=1;
Bit_PWM1=1;
Bit_PWM2=1;
Bit_PWM3=1;
Bit_PWM4=1;
Bit_PWM5=1;
Bit_PWM6=1;
Bit_PWM7=1;
}
segn
el
valor
del
pwm
Bit_PWM0=0;
Bit_PWM1=0;
Bit_PWM2=0;
Bit_PWM3=0;
Bit_PWM4=0;
Bit_PWM5=0;
Bit_PWM6=0;
Bit_PWM7=0;

//Carga

del

contador

}
/*********************************************************************
*********/
/*************************
PRESENTACIN
LCD
***********************************/
void presentacion (){
lcd_putc("\f
lcd_putc("
}

num.

Introduce
de

servo

\n");
");

/
**********************************************************************
********/
/********************
FUNCIN
PRINCIPAL
***************************************/
void
int x;
int tecla;
int
int16

main(){

servo;
angulo;

//Valor ASCII de la tecla pulsada


//Valor numrico de la tecla pulsada
//Nmero
de
servo
//ngulo
del
servo

int16 centenas;
ngulo
int decenas,unidades;
unidades
int pwm;
trisc=0x00;

//variable

para

las

centenas

del

//Variable para las decenas y


del
ngulo
//valor de la modulacin por teclado
//Puerto

como

salida

de

datos

pwm0=7;

//Impulso de 0,8 msg de pwm0 posicin

pwm1=7;

//Impulso de 0,8 msg de pwm1 posicin

pwm2=7;

//Impulso de 0,8 msg de pwm2 posicin

pwm3=7;

//Impulso de 0,8 msg de pwm3 posicin

pwm4=7;

//Impulso de 0,8 msg de pwm4 posicin

pwm5=7;

//Impulso de 0,8 msg de pwm5 posicin

pwm6=7;

//Impulso de 0,8 msg de pwm6 posicin

pwm7=7;

//Impulso de 0,8 msg de pwm7 posicin

0
0
0
0
0
0
0
0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
//Configuracin
interrupcin generacin PWM
enable_interrupts(INT_TIMER0);
//Habilitacin
interrupcin
generacin
pwm
enable_interrupts(GLOBAL);
//Habilitacin
de
las
interrupciones
port_b_pullups(TRUE);

//Habilitacin resistencias pullups puerto

b
lcd_init();
kbd_init();
presentacion

();

//Inicializacin
//Inicializacin
//Muestra
while

mensaje

de

del
del
inicio

lcd
teclado
en

lcd

(true){

x=kbd_getc();
//En "x" valor ASCII de la
tecla pulsada
if (x!=0&&x!='9'&&x!='8'&&x!='*'&&x!='#'){ //Si se pulsa tecla
numrica
0
a
7
...
servo=x-48;
//Valor ASCII se pasa a valor numerico
de
servo
printf(lcd_putc,"\fServo = %d\n", servo); //...muestra el
valor
pulsado
lcd_putc("Introduce
angulo");

while

(x!='*'){

//Espera
con

aceptar

if (x!=0&&x!='*'&&x!='#'){

introducir

ngulo

y
*
x=kbd_getc();
tecla=x-48;
//Solo se toman los valores

numricos
se

decenas,

del

//A cada tecla pulsada se desplaza posicin decimal y


muestra
centenas=decenas;
decenas=unidades;
unidades=tecla;
printf(lcd_putc,"\f Angulo = %ld%d%d\n", centenas,
unidades);
lcd_putc("
*
para
aceptar");
}
}

angulo=(centenas*100)+(decenas*10)+unidades;
if (angulo>180) angulo=180;
//No acepta valores >180
pwm=(angulo/13)+7;
//Ajuste modulacin en funcin
valor
introducido
centenas=decenas=unidades=0;
//Segn nmero de servo introducido se le aplica el ngulo

elegido
case
case
case
case
case
case
case
case

0:
1:
2:
3:
4:
5:
6:
7:

printf(lcd_putc,"\fServo
printf(lcd_putc,"
Angulo

Comunicacin I2C entre 3 PIC

switch(servo){
pwm0=pwm;
break;
pwm1=pwm;
break;
pwm2=pwm;
break;
pwm3=pwm;
break;
pwm4=pwm;
break;
pwm5=pwm;
break;
pwm6=pwm;
break;
pwm7=pwm;
break;
}
%d\n",
servo);
%ld",
angulo);
delay_ms(200);
presentacion();
}
}

El ejemplo didctico consiste en lo siguiente. El PIC maestro carga en los PIC


esclavos datos aleatorios en 10 posiciones de memoria. Primero con el PIC esclavo
1, direccin I2C en el bus 0xA0. Posteriormente con el PIC esclavo 2, con direccin
I2C 0xB0. Cuando ha cargado los datos en ambos PIC, hace una lectura del dato
que ha guardado en la posicin 5 de ambos PIC y la muestra por el LCD.

Pulsa en la imagen para ampliarla

PIC Maestro

Lo primero de todo ser configurar la comunicacin I2C en la cabecera del


programa. En dicha configuracin vamos a establecer que se trata del PIC maestro
(master), que vamos a usar velocidad rpida (fast), y que los pines del PIC van a
ser C4 para la lnea sda del bus y C3 para scl, propios del mdulo SSP que este PIC
posee.

#use i2c(Master, fast, sda=PIN_C4,scl=PIN_C3)

Si el PIC no posee mdulo SSP o queremos emplear otros pines diferentes, se


puede realizar la comunicacin mediante software forzando esta caracterstica e
indicando los pines que van a ser utilizados.

#use i2c(Master, fast, sda=PIN_B2,scl=PIN_B3, force_sw)

A partir de este momento, para enviar algo por el bus I2C ejecutamos la
funcin Envio_I2C(),en la que deberemos especificar previamente la direccin en
el bus I2C del esclavo con el que se quiere comunicar, la posicin del buffer de
memoria donde se va a guardar en el esclavo el dato enviado y la informacin del
propio dato.
direccion=0xA0;//DireccindelesclavoenelbusI2C
posicion=0x05;//Posicin donde se guardar el dato
dato=0xfb;//Dato

Envio_I2C(direccion, posicion, dato);

transmitir

//Funcin para envio I2C

Dentro ya de la funcin, el envo de cada byte de datos se realizar con las


siguientes sentencias:

i2c_start();//Comienzocomunicacin
i2c_write(direccion);//DireccindelesclavoenelbusI2C
i2c_write(posicion);//Posicindondeseguardareldato
i2c_write(dato);//Datoatransmitir
i2c_stop();//Fincomunicacin

Para la lectura de los esclavos el proceso es similar, pero esta vez ejecutando la
funcin Lectura_I2C(). Tambin previamente deberemos especificar la direccin
del esclavo en el bus I2C, la posicin en el buffer de memoria del PIC esclavo de
donde queremos obtener el byte que contiene y la variable donde lo vamos a
guardar (&dato).

direccion=0xA0;//DireccindelesclavoenelbusI2C
posicion=0x05;//Posicindondeseguardareldato

Lectura_I2C(direccion, posicion, &dato); //Funcin para envo I2C

Dentro ya de la funcin ejecutaremos las sentencias para el envo de cada byte de


datos:

i2c_start();//Comienzodelacomunicacin
i2c_write(direccion);//DireccindelesclavoenelbusI2C

i2c_write(posicion);//Posicindedondeseleereldato
enelesclavo
i2c_start();//Reinicio
i2c_write(direccion+1);//Direccindelesclavoenmodolectura
dato=i2c_read(0);//Lecturadeldato
i2c_stop();//Fincomunicacin

PIC esclavo

Igual que en el PIC master, en cada PIC esclavo se debe configurar la comunicacin
I2C. En este caso vamos a establecer que se trata de un PIC esclavo (slave), que
vamos a usar velocidad rpida (fast), que los pines del PIC van a ser C4 para la
lnea sda y C3 para scl, y cual va a ser su direccin en el bus (address).

#use i2c(slave, fast, sda=PIN_C4, scl=PIN_C3, address=0xA0)

A diferencia del PIC maestro que es quien decide en que momento iniciar la
comunicacin, en los esclavos, la comunicacin se establece cuando, mediante la
interrupcin #INT_SSP se detecta actividad en el bus I2C.

En el caso del PIC esclavo, si que vamos a necesitar del mdulo SSP, por tanto no
se puede forzar una comunicacin por software como en el PIC maestro y los pines
han de ser necesariamente los propios del bus I2C del PIC.

#INT_SSP
void ssp_interupt (){
int incoming;
manda el maestro

//Variable donde se recibe el byte que

fstate = i2c_isr_state();
interrupcin

//Lectura del estado del bus I2c la

/* Solicitud de lectura del esclavo por el master */


if(fstate == 0x80) {

//Manda al maestro la informacin contenida en la posicin de


memoria que le ha solicitado
i2c_write (buffer[posicion]);
SolicitudMaster=1;

//Fin de solicitud del master

}
/* Sino est solicitando lectura es que est enviando algo */
else {
I2C...

//Sino es que hay dato en el bus

incoming = i2c_read();
if (fState == 1) {
la posicion

//... lo lee
//Informacin recibida corresponde a

posicion = incoming;

//Se guarda posicin

}
else if (fState == 2) {

//Informacin recibida corresponde al

dato
buffer[posicion] = incoming; //Se guarda dato
EnvioMaster=1;

//Fin del envo del master

}
}

[+/-] Ver / Ocultar programa en C PIC Maestro


[+/-] Ver / Ocultar programa en C PIC Esclavo 1
[+/-] Ver / Ocultar programa en C PIC Esclavo 2

En esta animacin se ve la demostracin de funcionamiento bajo proteus.

Descarga de los archivos del proyecto.

http://robotypic.blogspot.com/2012/03/comunicacion-i2c-entre-trespics.html
https://www.youtube.com/watch?v=_aTmVS3xGOc