1. POST#4: Fuente Digital de dos Salidas variables y
una fija a 5v con LCD 40x2, PIC y comunicación
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 básicas de todo laboratorio electrónico así que me
encamine en el diseño y construcción 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 comunicación 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 versión de voltaje ajustable como en la de voltaje fijo, con
esto se logra una alta eficiencia en la regulación de voltaje, un mínimo de desperdicio en
perdidas de disipación 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 rápidamente para evitar daños también para controlarla se usan los
pulsadores del frontal del equipo activando o desactivando las
salidas así como también es posible por medio de una aplicación 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 también 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.
2. 1 x LCD 40x2 - Para visualización 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. (Lógica y backlight).
1 x LM7805 regulador de voltaje para la lógica de control.
4 x Potenciómetro - 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 tamaño grande.
4 x Patas de goma.
1 x Conector DB9 (RS232)
Manecillas para los potenciometros con detalle metálico.
Modulo ACS712 sensor de corriente.
Ventilador pequeño para extracción de calor.
Disipadores de aluminio de fuente de poder de PC antigua.
LM35 - Sensor de temperatura para controlar el ventilador según se necesite.
PIC16F917 Regulador de Voltaje LM2576-05
Modulo ACS712 sensor de corriente. Regulador de voltaje LM7805
3. Regulador de Voltaje LM2576-ADJ. Sensor de Temperatura LM35.
MAX232 Maxim
Esquemas de Conexión de algunas partes del proyecto:
PIC16F917.
Esquema según datasheet del regulador
de Voltaje Variable LM2576-ADJ.
Esquema según datasheet del regulador
de Voltaje LM2576-05 voltaje fijo a 5V.
RS232 Transistorizado.
Librerías y algunas rutinas del código fuente desarrolladas para el proyecto:
Función que lee todos las entradas analógicas y aplica sus respectivos cálculos.
4. ///////////////////////////////////////////////////////////////
// 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';
/////////////////////////////////////////////////////////
}
5. 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 atrás en fase de pruebas.
Vista de transformadores, ventilador
para control de temperatura y demás
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.
Módulo interno RS232 y módulos
de censar corriente.
Modulo USB a Serial. Modulo USB a Serial Finalizado.
6. Frontal en fase definitiva.
Imágenes de la Aplicación de PC:
Aplicación desactivada y sin
conexión serial presente.
Aplicación activa pero con las salidas
desactivas solo varia la temperatura
de la fuente en el momento.
Ventana para salvar la imagen JPG de la
gráfica de comportamiento de la fuente en el
tiempo tanto su voltaje como su corriente.
Aplicación con la gráfica de
temperatura activa.
Aplicación con todas las salidas activas
y graficando en el tiempo la salida de 3A.
Imágenes de la fuente 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.
7. Vista de la fuente entre otros equipos
de electrónica.
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.
Aplicación de supervición de la fuente
donde se visualiza el estado de la salidas.
Imágenes de la fuente digital finalizada:
Foto Frontal inclinada. Foto de atrás inclinado.
Foto de atrás. Foto Frontal.
10. 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 fácil. Sólo 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 mismísimo
PICmicro decidimos desarrollar una alternativa válida que lo
reemplace.
11. El circuito de arriba utiliza la propia corriente del puerto COM de la PC
para generar los símbolos 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 alimentación 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 electrónicos de calidad y accesibles para los estudiantes universitarios, los estudiantes
técnicos y entusiasta, por ello se enfoco en el desarrollo de un sistema completo en el cual se
tenga integrado la mayoría de los equipos de laboratorios de electrónica 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
conformaría 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 lógicos, 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 conclusión de que se compondría de dos fuentes variables digitales de
0v a 20v con precisión de 0.01V y control de corriente de 0A a 2A con precisión 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 máximo en su salida, por otra parte se encuentra el
generador de funciones el cual puede generar señales 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%, también una punta lógica la cual mida tanto circuitos TTL como
12. CMOS y muestre el estado lógico en forma de 7 segmentos en la interfaz o en forma de led
iluminados en la interfaz, por ultimo un multímetro con voltímetro AC y DC de 0v a 600v,
amperímetro 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 podría ser la adición de un osciloscopio o de un frecuencímetro.
La alimentación del equipo es con transformares genéricos separados para asegurar el
aislamiento y también un remplazo rápido 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 módulos con sus respectivas potencia
adecuada.
La placas del sistema estas controladas por PIC Microchip de varios modelos según el módulos
y familias, pero todos con la características mínima 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 conexión 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 ningún pulsador o
potencíometro de configuración, todo es realizado de manera digital desde la aplicación de
control en la computadora personal.
La programación de los microcontroladores, fue realizada en CCS con el uso de interrupciones
en todos los casos necesarios y periféricos de hardware, ningún control ya sea del bus o de
integrados fue realizado por software para no tener retrasos generados al emular algún
protocolo o tarea.
El software de control se realizo en Visual Studio 2013 en lenguaje C# con librerías capaces de
trabajar con el puerto USB del PIC18F2550 en las versiones mas actuales de windows, tanto
en x86 como en x64, así como también se usaron librerías para los 7 segmentos en la interfaz
y los led animados.
Materialesprincipales utilizados:
13. Modulo DDS AD9850 encargado de generar
las distinta señales de salida del generador
de funciones, este modulo puede ser
controlado de forma serial o de forma
paralela según sea el diseño.
PIC 18F2550 de Microchip el cual cuenta
con 28 pines de distintos usos pero como
periféricos importantes cuenta con pines
dedicados porhardware para la comunicación
USB y comunicación 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 -5Aa 5A
y su salida es una variación de voltaje
donde por cada paso se aumenta o disminuye
en 180mV/A segun sea el caso teniendo
como 0Ael voltaje de salida fijo de 2.5V
PIC 16F1503 de Microchip usado para la
mayoría de los módulos ya que el mismo
cuenta con un numero de pines suficiente
pero como periféricos importante tiene bus
I2C por hardware, asícomo varias salidas del
tipo PWMpor hardware, necesarias para los
módulos 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 tecnología de aislamientomagnetico
14. y soportando sobrecargas dehasta 2500V rms
para proteger el circuito que aísla.
Transformador con tap central 12v-0-12v
0.5 Amp para alimentar cada uno de los
módulos en su parte lógica
PIC 18F4610 de Microchip usado para el
multímetro ya que cuenta como gran
cantidad depines los cuales fueron usados
para las distintas funciones del mismo , así
como también porsubus I2Cpor hardware.
Disipador de aluminio para las distintas
fuentes de poder
LM35 en encapsulado TO92 para colocarlo
cerca físicamente del disipador de las
fuentes y conesto controlar el encendido y
apagado del ventilador según sea el caso
de una temperatura alta o baja.
Ventilador para forzar la ventilación en las
fuentes de poder en caso de ser necesario
por uso prolongando delas 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 energía en calor al ser
15. el mismo step-down y tener una eficiencia
muy alta.
Puerto USB tipo B usado para la conexión
del cable USB del sistema con el PC
MCP41010 integrado de Microchipm que
hace la función depotenciometro 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 tecnología de transformadores deanalog
, la cual cuenta con fuente de alimentación
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 0Aa 2A, esta placa cuenta con
alimentaciónpropia para potencia y lógica.
La lógica es basada en el micro-controlador
PIC 16F1503 de Microchip y la potencia
en el regulador LM338con control mediante
amplificador operacional y señales PWM.
16. Punta lógica realizada a partir de un
probador de electricista para 110v, el cual
fue modificadopara ser usadoen elsistema.
Básicamente se le agrego un par de cables
polarizado para energizarla del circuito en
estudio, así como también cuenta con un
cable de varios hilos para la conexión con
el sistema
Placa principal de control micro-controlada
con el PIC 18f2550de microchip, la cual esta
constituida por conector USB tipo B, fuente
conmutada 5v, LCD 20x4conectado deforma
serialconregistrode desplazamiento,poten-
cimetro digital para controldel contraste de
la LCD, conector para el BUS I2C,etc.
Placa selectora delos modos desalida de las
fuentes depodervariable donde se encarga
de colocar las salidas delas fuentes en modo
seria, paralelo o independiente, así como
tambiénseencarga demostrar mediante un
LED en el frontal cual esta activa de ellas y
si alguna esta en protección por cortocircuito
Placa multímetro la cual cuenta con, estas
herramientas: amperímetro basado en elchip
ACS712 para corriente tanto AC como DC,
ohmímetro coneluso deun arregloformado
por resistencia y lectura del ADC del PIC,
el voltímetro AC y DC con el uso de puente
rectificador y divisor resistivo de precisión,
punta lógica para circuitos CMOS y TTL,
finalmentela placa cuenta con LEDde estado
del modo en uso, así como también con un
buzzer para señales auditivas y una fuente
conmutada LM2576 con un PIC 18F4610.
17. LCD 20x4 del sistema con faja plana.
Vista delconjuntode placas queconforma el
sistema completo.
Placa encargada de la generaciónde señales
eléctrica de tipo seno y TTL, la misma esta
basada en elchip AD9850 el cual de manera
seriales controlado porel PIC 16F1503, para
así configurar elmodo de salida: frecuencia
y dutty. Ycon la ayuda deun juego de OPAM
y potencimetros digital MCP41010 se logra
modifica el offset y la amplitud de las
señales de salida generadas.
Placa fuente de poder digital regulable de
0v a 20v, con salida ajustable de corriente
de 0Aa 2A, esta placa cuenta con
alimentaciónpropia para potencia y lógica.
La lógica es basada en el micro-controlador
PIC 16F1503 de Microchip y la potencia
en el regulador LM338con control mediante
amplificador operacional y señales 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 alimentación propia para potencia y lógica.
La lógica es basada en el micro-controlador PIC 16F1503 de Microchip y la potencia
en el regulador LM338 con control mediante amplificador operacional y señales PWM.
18. PCB en 3D del proyecto:
PCB para conexión 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 multímetro y punta
lógica.
PCB de la placa para selección 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
variable.
PCB de la placa para la fuente digital
fija.
Imágenes del software del sistema:
19. Ventana de información del sistema. Ventana de ayuda del sistema.
Ventana para la configuración 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 elmodo desalida en paralelo de las
fuentes variables digitales
Ventana donde se observa la pestaña de
multímetro y punta lógica en uso. En la
cual se tiene a la izquierda el multímetro
con cada una de sus funciones como son:
ohmímetro, voltímetro AC, voltímetro
DC, medidor de continuidad y amperímetro
AC y DC. Por otra parte a la derecha se
tiene la punta lógica sus modos dedetección
de la tecnología a estudiar, así como también
se tiene de un 7 segmentos y 3 señales
visuales para apreciar el estado lógico
presentes en la punta de medición al
momento derealizar las pruebas en la placa
en estudio.
Ventana donde se tiene la pestaña para
las fuentes que conforman el sistema a la
izquierda las dos fuente variables con sus
opciones de configuración de salida como
el voltaje o la corriente de cada una de
las fuentes, así como también cuenta con
visores del estado de la fuente, voltaje,
corriente, temperatura y ventilación. Ala
derecha se tiene la fuente fija con los
mismos visores pero sin opción de
configuración, las 3 fuentes cuentan con un
botón de activación. finalmente abajo a la
derecha seobserva los tipos de configuración
de salida para las fuentes variables como
son salida en serie, paralelo o independiente.
20. Ventana donde se tiene la pestaña 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 botón
para su variación paso a paso, en la zona
derecha baja esta la configuración para el
tipo de salida a ser generada ya sea seno
o TTL, así como también para variar su
amplitud o ciclo respectivamente.
Vista del menú en la ventana
principal del sistema.
Vista de la ventana principal del sistema.
Ventana flotantedelsistema al momento de
decidir cerrar el mismo.
Imágenes del prototipo funcional del sistema finalizado:
Vista frontaldel sistema en pruebas de sus
salidas, entradas y aplicacion
Vista frontal del sistema donde se tiene
el mismo con la conexión USB a la PC
21. LCD del sistema mostrando estado de la
aplicación 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 multímetro 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 conlas entradas delmultímetro con
Frontal Derecho donde se aprecia el botón
de encendido con los conectores de las
22. punta lógica y la salidas del generador de
funciones tipo BNC.
fuentes variables y fija a su lado
Cableado parte trasera USB, alimentación
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 lógica del sistema
integrado
Foto del sistema terminado dentro de su caja acrílica donde ya
ajustado y calibrado todas sus salidas, así como también sus
módulos de sensores de las distintas magnitudes físicas, acá se
aprecia como se organizo las salidas y el cableado del mismo.
Vídeos del prototipo funcional del sistema finalizado:
23. POST#6: Sensor de gas y temperatura portátil de bajo
costo con LCD 16x2 controlador por PIC16F88 y
batería recargable.
Objetivo:
Al cursar las distintas materias de la universidad me tope con proyectos electrónicos
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 versión de un producto funcional, con acabado para la
venta y que solventara alguna problemática existente en nuestro entorno.
Así que me encamine en el diseño y construcción 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 alimentación 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 batería a un 10% de su capacidad de corriente y al
mismo tiempo de un punto anterior al LM317 se toma la alimentación para el dispositivo sin
ninguna restricción de corriente. Con esto obtenemos una carga segura que no destruye la
integridad de la batería 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 químico 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í también la cantidad de carga de la batería.
La carga de la batería en un estado de completa descarga, necesita de al menos de 11 horas
seguidas de alimentación del toma corrientes de 110V con un transformador de 110v a 12v AC,
o cuando esta la batería a media carga simplemente con observar el estado de la carga en la
pantalla. Todo esto sin tener la preocupación de estropearla por sobre carga ya que como es
una carga lenta de solo el 10% de la corriente de la batería esta no sufre luego de estar
completamente recargada simplemente pasaría a un estado de carga flotante.
24. Al terminar el proyecto propuesto se cumplió con todas las exigencias del curso logrando
la máxima puntuación para el mismo.
Materialesprincipales 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 visualización del menú, estado del dispositivo y configuraciones.
1 x LM7805 regulador de voltaje para la lógica de control.
1 x LM317 regulador de corriente para la carga de la batería.
Switch pequeño simple color negro.
Caja para prototipos de calidad tamaño mediano plástica color negro.
4 x Patas de goma.
LM35 - Sensor de temperatura para controlar el ventilador según se necesite.
1 x Batería Recargable 8.4v ni-mh 200 mAh.
Microcontrolador PIC16F88. MQ4 Sensor de Gas
LM7805 Regulador de voltaje LM317 Regulador
25. LM35 Sensor de temperatura. QC1602A LCD 16x2.
74HC164
Esquemas de Conexión de algunas partes del proyecto:
LM317 según datasheet. PIC16F88 según datasheet.
MQ4 según datasheet. LM35 según datasheet.
26. LCD 3 pines. 74HC164 según datasheet.
Esquema Completo
Diagrama de proyecto:
PCB de LCD con 3 pines. PCB de Lógica de control.
PCB de pulsadores de control. PCB de Sensores de gas y temperatura.
27. PCB completo.
Librerías y algunas rutinas del código fuente desarrolladas para el proyecto:
LCD con sólo 3 pines. WEB de ejemplo.
MQ4 sensor de gas ejemplo. WEB de ejemplo 1. WEB de ejemplo 2.
Lectura del Sensor MQ4 usando una entrada analógica del PIC.
///////////////////////////////////////////////////////////////
// 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
28. //el registro adc
delay_us(TIEMPO_DELAY);
ADC_2_MQ4 = Filtro_Analog_MQ4((float)(value));
//---------------------------------------------------------
}
Imágenes del sensor de gas en fase de construcción:
PCB perforada - Parte lógica. PCB perforada - LCD 3 pines.
Sensor de temperatura y gas parte
de atrás.
Modulo de pulsadores y LED.
PCB conectadas. Sensor de temperatura y gas
de frontal.
29. Sensor de temperatura y gas parte
de atrás de serca.
Sensor de temperatura y gas
de lado.
Sensor de temperatura y gas con cajón
exterior prototipo.
Sensor de temperatura y gas dentro
cajón 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
y las demás partes del proyecto.
Colocando separadores para la caída
del LCD 16x2.
LCD 16X2 ajustado en la caja de
prototipos.
30. Vista de frente con LCD.
Colocando modulo de pulsadores y
LED con sus respectivos separadores
metálicos.
Vista de frente con LCD y modulo de
pulsadores y LED.
Extensión de modulo sensor de gas
y temperatura con alambre de cobre
interno para brindar rigidez al momento
de direccionarlo al punto a medir.
Vista de atrás con LCD , modulo de
pulsadores y parte lógica como
también el control de LCD con 3 pies.
Ajustando los cables en el interior.
Ajustando los cables en el interior
con la batería a un costado con
sierre mágico.
LED de carga, Entrada plug de voltaje
de carga y orificio de salida del modulo
de sensor de gas y temperatura.
Interruptor de apagado del dispositivo.
Cerrando con todas las partes
acomodadas.
31. Equipo sin el frontal a un lado.
Etiqueta que disimula defectos y
proporciona indicaciones de cada
parte del frontal.
Dispositivo terminado sin frontal.
Imágenes del sensor de gas finalizado:
Foto frontal del equipo con etiqueta. Foto sensor de gas y temperatura.
32. LCD con sólo 3 pines
30 noviembre, 2009
Esta útil librería permite gestionar un LCD 2×16 compatible
HD44780 con sólo 3 pines de tu micro, utilizando un registro de desplazamiento.
Es una modificación a la conocida Flex_LCD realizada por los amigos Akenafab y
Duende_Azul.
Los pines utilizados son:
LCD_E: señal de control Enable del LCD
LCD_CK: señal de reloj del registro de desplazamiento
LCD_DAT: salida del bit menos signficativo hacia el registro de desplazamiento
33. // flex_lcd_3_pins.c
//Modificación 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
36. 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
o 1.1 Specification
2 Pin Definition
3 Potentiometer
o 3.1 Connection Diagram
o 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
37. Power supply needs: 5V
Interface type: Analog
Pin Definition: 1-Output 2-GND 3-VCC
High sensitivity to CH4£¬Natural 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
38. 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
39. Sample Code
?
1
2
3
4
5
6
7
8
9
10
11
12
///Arduino Sample Code
void setup()
{
Serial.begin(9600); //Set serial baud rate to 9600 bps
}
void loop()
{
int val;
val=analogRead(0);Read Gas value from analog 0
Serial.println(val,DEC);//Print the value to serial port
delay(100);
}
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
40. 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
}
41.
42. POST#5: Convertidor USB a Serial, que trabaja con
los integrados PL2303 Prolific y el conocido MAX232
de Maxim.
Objetivo:
Diseño y construcción de un convertido USB a Serial para así facilitar la conexión de los
proyectos que se diseñaron con el antiguo conector DB9 que trabaja sobre la conexión serial
que cada día es mas difícil de conseguir en las PC y laptop actuales imposibilitando el uso de
43. estos proyectos en los nuevos sistemas de computación, este modulo se pensó para que
sea fácil de armar y con componentes no muy difíciles de conseguir en las tiendas online y
ademas que trabaje en la mayoría de sistemas operativos existentes, usando
un mínimo de configuración por el usuario al ser plug and play con muy buen soporte para
driver.
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 código de error en
controlador).
Materialesprincipales 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 acrílico 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 Conexión de algunas partes del proyecto:
44. PL2303 esquema según datasheet. MAX232 esquema según datasheet.
USB tipo B
Esquema PCB:
PCB en negro PCB en color
Interior del convertidor:
Vista superior. PCB adaptador SMD a DIP.
45. Vista inferior con soporte metalico.
Imágenes del convertidor finalizado:
Vista final superior. Ejemplo de uso del modulo.
MAX232 product image MAX232 DUAL
ELA-232 DRIVERS/RECEIVERS
46. 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.
47. 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
48. 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-con-dspic-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 robótica donde se tengan muchas articulaciones con
lo cual se deba tener estabilidad y movimientos precisos, me di a la tarea de diseñar y
49. construir un prototipo de placa controladora de servomotores, con visualización 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 mecánica y la programación de los movimiento, con
sus respectivos sistemas de control.
Materialesprincipales 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 conexión I2C.
GY-80 (L3G4200D + ADXL345 + HMC5883L + BMP085).
Giroscopio de 3 ejes.
Aceleremotro de 3 ejes.
Sensor de campo magenetico de 3 ejes.
Sensor de presión y temperatura.
LCD 2x16 con placa de conexión vía I2C.
Placa con todos los sensores incluidos con conexión
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
50. 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 esquemático en Eagle.
Imágenes en fase de construcción y finalizado:
Acá se logra observa la placa en sus fases de construcción, donde se tiene
51. un prototipo final para las pruebas de los distintos servomotores, ya sea
solos o conectados varios de ellos a la vez, logrando controlar su posición
sin problemas mediante conexión 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 posición de los
distintos sensores en el modulo GY-80, con los cuales más adelante se
trabajara en conjunto con los servomotores para proyectos de robótica.
Placa lista para la soldadura
vista desde arriba.
Placa ya perforada con el tóner
retirado lista para la soldadura
vista desde abajo.
Placa finalizada en pruebas conectada
al programador PICkit 2 clone por medio
del cable de ICSP.
Placa finalizada, otras imágenes con
la placa de sensores a un lado.
Controlador con 5 modelos de servomotor distintos
de marcas variadas usados en la pruebas.
Bibliografía, Web y Datasheet:
Web:
53. Este proyecto consiste en el control de 8 servos por el puerto c del pic . En la
interacción para el control de los servos se emplea un teclado numérico y un lcd,
ambos controlados por el puero b del PIC.
En su funcionamiento, el pic pide introducir el número del servo a controlar.
Posteriormente solicita el ángulo de orientación deseado para ese servo ( de 0º a
180º). El valor se acepta con la tecla “*” y el programa vuelve a mostrar un
mensaje de presentación para un nuevo control. Si el ángulo introducido es
superior a 180º, el pic toma por defecto 180º.
Para la generación de las señales moduladas de control de los servos (bit_pwmx),
se emplea la subrutina de interrupción por rebose del timer 0. La orientación de
cada servo se establece con el valor que se carga en la variable pwmx, donde x es
el número de servo correspondiente. Con cada llamada a la subrutina de
generación de la señal por mediación de la interrupción 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 modulación de los servos.
control_pwm++;
if (control_pwm==0) bit_pwm0=1;
if (control_pwm==pwm0) bit_pwm0=0;
54. Cuando la variable control_pwm, incrementandose en cada rebose del timer0,
llega a su máximo valor y pasa a ser 0, todas las señales moduladas comienzan un
nuevo ciclo.
Para interpretar los valores numéricos de varias cifras a partir de números simples
introducidos por teclado, primero espera a que se pulse una tecla
x=kbd_getc();
el valor obtenido está en codificación ASCII por lo que habrá que pasarlo a su valor
numérico decimal
tecla=x-48;
si se ha pulsado una tecla se descartan las pulsaciones en # y * puesto que solo se
necesitan números
if (x!=0&&x!='*'&&x!='#'){
y conforme se van pulsando números el último pulsado será las unidades y los
anteriores van pasando a decenas y centenas
centenas=decenas;
decenas=unidades;
unidades=tecla;
55. conforme se van introduciendo números simples se va mostrando el número
completo por pantalla lcd
printf(lcd_putc,"f Angulo = %ld%d%dn", centenas, decenas, unidades);
y finalmente se guarda en una única variable el número completo resultante de
todos los números simples
angulo=(centenas*100)+(decenas*10)+unidades;
[+/-] Ver / Ocultar programa completo en C
En la simulación bajo proteus se comprueba el cambio en el tiempo de las señales
de control de los servos individualmente en función 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) //frecuencia de reloj 4 MHz
#byte trisb=0x86
#byte portb=0x06
56. #byte trisc=0x87
#byte portc=0x07
#define use_portb_lcd TRUE //Configuración puerto b
control lcd
#define use_portb_kbd TRUE //Configuración puerto b
control teclado
#include <lcd.c> //archivo para control del lcd
#include <kbd.c> //archivo para control del
teclado
#bit Bit_PWM0 = PORTC.0 //Bit 0 puerto C Salida
modulación 0
#bit Bit_PWM1 = PORTC.1 //Bit 1 puerto C Salida
modulación 1
#bit Bit_PWM2 = PORTC.2 //Bit 2 puerto C Salida
modulación 2
#bit Bit_PWM3 = PORTC.3 //Bit 3 puerto C Salida
modulación 3
#bit Bit_PWM4 = PORTC.4 //Bit 4 puerto C Salida
modulación 4
#bit Bit_PWM5 = PORTC.5 //Bit 5 puerto C Salida
modulación 5
#bit Bit_PWM6 = PORTC.6 //Bit 6 puerto C Salida
modulación 6
#bit Bit_PWM7 = PORTC.7 //Bit 7 puerto C Salida
modulación 7
/********************** Prototipos de las funciones
***************************/
void main (void); //función principal
void generacion_pwm (void); //genera señales moduladas para control
de servos
void presentacion (void); //mensaje de presentación
/********************** Variables para generación PWM
*************************/
int8 PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0;
//Valores de las señales PWM
int8 control_PWM=0;
/*********************************************************************
*********/
/******************* FUNCIÓN GENERACIÓN MODULACIONES PWM
**********************/
#int_Timer0
void generacion_pwm(){
57. control_PWM++; //Incremento cada rebose del timer0
if (control_PWM==0){ //inicio del ciclo con todos los
pulsos pwm 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;
}
//Finalizará el pulso de modulación según el valor del
correspondiente pwm
if (control_PWM==PWM0) Bit_PWM0=0;
if (control_PWM==PWM1) Bit_PWM1=0;
if (control_PWM==PWM2) Bit_PWM2=0;
if (control_PWM==PWM3) Bit_PWM3=0;
if (control_PWM==PWM4) Bit_PWM4=0;
if (control_PWM==PWM5) Bit_PWM5=0;
if (control_PWM==PWM6) Bit_PWM6=0;
if (control_PWM==PWM7) Bit_PWM7=0;
set_timer0(255); //Carga del contador
}
/*********************************************************************
*********/
/************************* PRESENTACIÓN LCD
***********************************/
void presentacion (){
lcd_putc("f Introduce n");
lcd_putc(" num. de servo ");
}
/*********************************************************************
*********/
/******************** FUNCIÓN PRINCIPAL
***************************************/
void main(){
int x; //Valor ASCII de la tecla pulsada
int tecla; //Valor numérico de la tecla pulsada
int servo; //Número de servo
int16 angulo; //Ángulo del servo
int16 centenas; //variable para las centenas del
ángulo
int decenas,unidades; //Variable para las decenas y
58. unidades del ángulo
int pwm; //valor de la modulación por teclado
trisc=0x00; //Puerto C como salida de datos
pwm0=7; //Impulso de 0,8 msg de pwm0 posición
0º
pwm1=7; //Impulso de 0,8 msg de pwm1 posición
0º
pwm2=7; //Impulso de 0,8 msg de pwm2 posición
0º
pwm3=7; //Impulso de 0,8 msg de pwm3 posición
0º
pwm4=7; //Impulso de 0,8 msg de pwm4 posición
0º
pwm5=7; //Impulso de 0,8 msg de pwm5 posición
0º
pwm6=7; //Impulso de 0,8 msg de pwm6 posición
0º
pwm7=7; //Impulso de 0,8 msg de pwm7 posición
0º
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); //Configuración
interrupción generación PWM
enable_interrupts(INT_TIMER0); //Habilitación interrupción
generación pwm
enable_interrupts(GLOBAL); //Habilitación de las
interrupciones
port_b_pullups(TRUE); //Habilitación resistencias pullups puerto
b
lcd_init(); //Inicialización del lcd
kbd_init(); //Inicialización del teclado
presentacion (); //Muestra mensaje de inicio en lcd
while (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
numérica 0 a 7 ...
servo=x-48; //Valor ASCII se pasa a valor numerico
de servo
printf(lcd_putc,"fServo = %dn", servo); //...muestra el
valor pulsado
lcd_putc("Introduce angulo");
while (x!='*'){ //Espera a introducir ángulo y
aceptar con *
x=kbd_getc();
59. tecla=x-48;
if (x!=0&&x!='*'&&x!='#'){ //Solo se toman los valores
numéricos
//A cada tecla pulsada se desplaza posición decimal y
se muestra
centenas=decenas;
decenas=unidades;
unidades=tecla;
printf(lcd_putc,"f Angulo = %ld%d%dn", centenas,
decenas, 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 modulación en función
del valor introducido
centenas=decenas=unidades=0;
//Según número de servo introducido se le aplica el ángulo
elegido
switch(servo){
case 0: pwm0=pwm; break;
case 1: pwm1=pwm; break;
case 2: pwm2=pwm; break;
case 3: pwm3=pwm; break;
case 4: pwm4=pwm; break;
case 5: pwm5=pwm; break;
case 6: pwm6=pwm; break;
case 7: pwm7=pwm; break;
}
printf(lcd_putc,"fServo %dn", servo);
printf(lcd_putc," Angulo %ld", angulo);
delay_ms(200);
presentacion();
}
}
}
Comunicación I2C entre 3 PIC
60. El ejemplo didáctico 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, dirección I2C en el bus 0xA0. Posteriormente con el PIC esclavo 2, con dirección
I2C 0xB0. Cuando ha cargado los datos en ambos PIC, hace una lectura del dato
que ha guardado en la posición 5 de ambos PIC y la muestra por el LCD.
61. Pulsa en la imagen para ampliarla
PIC Maestro
Lo primero de todo será configurar la comunicación I2C en la cabecera del
programa. En dicha configuración vamos a establecer que se trata del PIC maestro
(master), que vamos a usar velocidad rápida (fast), y que los pines del PIC van a
ser C4 para la línea sda del bus y C3 para scl, propios del módulo SSP que este PIC
posee.
#use i2c(Master, fast, sda=PIN_C4,scl=PIN_C3)
Si el PIC no posee módulo SSP o queremos emplear otros pines diferentes, se
puede realizar la comunicación mediante software forzando esta característica e
indicando los pines que van a ser utilizados.
#use i2c(Master, fast, sda=PIN_B2,scl=PIN_B3, force_sw)
62. A partir de este momento, para enviar algo por el bus I2C ejecutamos la
función Envio_I2C(),en la que deberemos especificar previamente la dirección en
el bus I2C del esclavo con el que se quiere comunicar, la posición del buffer de
memoria donde se va a guardar en el esclavo el dato enviado y la información del
propio dato.
direccion=0xA0; //Dirección del esclavo en el bus I2C
posicion=0x05; //Posición donde se guardará el dato
dato=0xfb; //Dato a transmitir
Envio_I2C(direccion, posicion, dato); //Función para envio I2C
Dentro ya de la función, el envío de cada byte de datos se realizará con las
siguientes sentencias:
i2c_start(); //Comienzo comunicación
i2c_write(direccion); //Dirección del esclavo en el bus I2C
i2c_write(posicion); //Posición donde se guardará el dato
i2c_write(dato); //Dato a transmitir
i2c_stop(); //Fin comunicación
Para la lectura de los esclavos el proceso es similar, pero esta vez ejecutando la
función Lectura_I2C(). También previamente deberemos especificar la dirección
del esclavo en el bus I2C, la posición 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; //Dirección del esclavo en el bus I2C
posicion=0x05; //Posición donde se guardará el dato
Lectura_I2C(direccion, posicion, &dato); //Función para envío I2C
Dentro ya de la función ejecutaremos las sentencias para el envío de cada byte de
datos:
i2c_start(); //Comienzo de la comunicación
i2c_write(direccion); //Dirección del esclavo en el bus I2C
63. i2c_write(posicion); //Posición de donde se leerá el dato
en el esclavo
i2c_start(); //Reinicio
i2c_write(direccion+1); //Dirección del esclavo en modo lectura
dato=i2c_read(0); //Lectura del dato
i2c_stop(); //Fin comunicación
PIC esclavo
Igual que en el PIC master, en cada PIC esclavo se debe configurar la comunicación
I2C. En este caso vamos a establecer que se trata de un PIC esclavo (slave), que
vamos a usar velocidad rápida (fast), que los pines del PIC van a ser C4 para la
línea sda y C3 para scl, y cual va a ser su dirección 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
comunicación, en los esclavos, la comunicación se establece cuando, mediante la
interrupción #INT_SSP se detecta actividad en el bus I2C.
En el caso del PIC esclavo, si que vamos a necesitar del módulo SSP, por tanto no
se puede forzar una comunicación 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; //Variable donde se recibe el byte que
manda el maestro
fstate = i2c_isr_state(); //Lectura del estado del bus I2c la
interrupción
/* Solicitud de lectura del esclavo por el master */
if(fstate == 0x80) {
64. //Manda al maestro la información contenida en la posición 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 { //Sino es que hay dato en el bus
I2C...
incoming = i2c_read(); //... lo lee
if (fState == 1) { //Información recibida corresponde a
la posicion
posicion = incoming; //Se guarda posición
}
else if (fState == 2) { //Información recibida corresponde al
dato
buffer[posicion] = incoming; //Se guarda dato
EnvioMaster=1; //Fin del envío 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 animación se ve la demostración de funcionamiento bajo proteus.
65. Descarga de los archivos del proyecto.
http://robotypic.blogspot.com/2012/03/comunicacion-i2c-entre-tres-pics.html
https://www.youtube.com/watch?v=_aTmVS3xGOc