Aprenda Electronica Primera Edición
Aprenda Electronica Primera Edición
Aprenda Electronica Primera Edición
Autor:
Carlos Alan González Cortéz
Primera edición
12/11/17
Monterrey, Nuevo León, México.
2
Antes de comenzar, quiero agradecerte por apoyar
mi proyecto y estar interesado en el.
Mi nombre es Carlos Alan González Cortéz y soy el
autor de este libro.
Con este libro comienzo una sección en mi carrera la
cual ha sido mi sueño desde hace muchos años, la
de escritor.
Debido a que soy un escritor independiente y no
pertenezco a ninguna casa editorial, yo soy el
encargado de distribuir este libro.
Por esto te pido, que porfavor NO distribuyas este
libro, si conoces a alguien que esté interesado en
adquirirlo, por favor, indicale como poder comprarlo,
mandando un correo electrónico a:
carlos.xeos@gmail.com con el asunto “Libro
aprende electrónica”.
Si tienes cualquier duda, pregunta o propuesta,
puedes hacerla también a ese correo.
Sin más que decir, espero que este libro te apoye al
máximo en tu aprendizaje en esta bella ciencia.
3
4
Índice
Antes de comenzar……………………………………………………. 9.
Precauciones previas…………………………………………………..12.
Nivel básico
Potenciometro…………………………………………………………..30.
Leds RGB……………………………………………………………….35.
Display de 7 segmentos………………………………………………37.
Capacitores…………………………………………………………….40.
Diodo rectificador……………………………………………………...44.
Regulacion zener…………………………………………………….55.
El transistor……………………………………………………………57.
5
Fuente lineal con lm317 + transistor 2n3055………………………68.
Puente H……………………………………………………………….76.
Relevadores……………………………………………………………78.
Fotoresistencias………………………………………………………..85.
Termistores……………………………………………………………...90.
Nivel intermedio
Timer 555………………………………………………………………...109.
PWM………………………………………………………………………117.
6
Optoaisladores……………………………………………………………130.
Diodos schottky……………………………………………………………134.
Control de SCR…………………………………………………………....137.
Configuración Darlington……………………………………………………..160.
Gatillo Schmitt…………………………………………………………………..186.
Microcontroladores
Intro……………………………………………………………………………….191.
Salida PWM………………………………………………………………………245.
7
Uso de encoders rotatorios………………………………………………………269.
Uso de servomotores……………………………………………………………..276.
Uso de interrupciones…………………………………………………………….300.
Comunicación serial………………………………………………………………310.
Proyectos……………………………………………………………………………325.
Extras
Tipos de encapsulados……………………………………………………………361.
Tipos de transformadores…………………………………………………………373.
Tipos de switches………………………………………………………………….377.
Tipos de baterías………………………………………………………………….389.
Tipos de conectores………………………………………………………………397.
8
Antes de comenzar…
Antes de comenzar a aprender sobre este maravilloso mundo de la electrónica,
debemos de repasar (o aprender) diversos conceptos básicos sobre la
electrónica, es fundamental saber esto para poder comprender que es la
electricidad y que precauciones tener al momento de trabajar con ella.
¿Qué es la electricidad?
¿Qué es el voltaje?
¿Qué es la corriente?
Analogía de
Voltaje y
Corriente:
9
¿Qué es la resistencia?
Ley de ohm
I = V/R
Esto indica que la corriente es igual a la división del voltaje sobre la resistencia.
Esta fórmula nos sirve para encontrar algún valor, siempre y cuando tengamos
los otros 2. Por ejemplo:
10
¿Qué es la potencia?
W = V*I
Ley de watt
La ley de watt, al igual que la ley de ohm, nos permite encontrar la potencia,
corriente, voltaje y resistencia de diversas maneras presentes en un circuito.
11
Precauciones antes de comenzar a
armar los circuitos
La mayoría de los circuitos funcionan con voltajes bajos de corriente directa,
pero, algunos emplearan el uso de corriente alterna a 127 o 220V dependiendo
de tu localidad.
12
Material común que requerirás para realizar los circuitos:
1. Protoboard.
El protoboard es una tarjeta o tablilla hecha para realizar circuitos
experimentales sobre estas. Cuentan con columnas conectadas entre si
de manera vertical, esto significa que cada columna funciona como un
solo conductor, para colocar componentes asegúrate que el seguimiento
sea de manera horizontal y no vertical, como lo muestro en la siguiente
imagen:
2. Multímetro.
El multímetro es una herramienta para medir diferentes cosas, voltaje,
corriente, resistencia, frecuencia, temperatura, continuidad, diodos y un
largo etc. Dependiendo del multímetro. Es esencial contar con uno para
poder hacer mediciones y saber cuándo hay presencia de voltaje y
corriente.
13
No recomiendo comprar un multímetro barato y simple pues estos no
cumplen con normas de seguridad ni de calidad. Aunque pueden ser
algo costosos, mi recomendación es que compres un multímetro marca
steren, owon, fluke, keysight o metrawatt, ya que estos, aunque tienen
un precio algo elevado, tienen un estándar de calidad altísimo y cumplen
con todas las normas de seguridad y calidad necesarias. Es una
inversión que vale la pena realizar.
3. Osciloscopio (opcional)
El osciloscopio, como te podras dar cuenta, es una herramienta casi
fundamental en la electrónica, aunque no tanto como un multímetro.
Sirve para medir y analizar ondas o señales y es muy importante para
diseñar circuitos o repararlos. No es obligatorio tener uno pero, no hay
laboratorio de electrónica completo sin uno. Comprar uno nuevo es caro,
pero en páginas de internet como www.mercadolibre.com o
www.ebay.com puedes encontrar osciloscopios usados por precios
bajos.
14
4. Fuente de poder
Una fuente de poder es un dispositivo que nos entrega un voltaje y una
corriente para alimentar a nuestros circuitos. Puede ser desde una pila
de 9V, hasta un cargador de celular, pero no son muy confiables para
realizar circuitos, es por eso que mas adelante aprenderás a realizar
diferentes fuentes de poder según vayamos requiriendo con los circuitos.
5. Conductores o puentes
Lo necesitaras para realizar las conexiones en la protoboard. Puedes ir a
tu tienda de electrónica y comprar alambre calibre 22 para realizar estas
conexiones. O comprar jumpers especiales para protoboard ya listos
para usarse.
15
Como usar un multímetro
El multímetro es la herramienta que nos
de manera correcta.
16
Como medir corriente con el multímetro
Debes tener en cuenta que para medir la corriente que fluye debes tener una
carga en serie como una resistencia, foco, etc. No midas la corriente sin una
carga presente.
17
Como usar un protoboard.
Estas líneas se suelen usar para tener ahí los voltajes de alimentación para los
circuitos que vayamos a armar.
Dentro del protoboard, tenemos las columnas para las conexiones, estas están
conectadas de manera vertical, es por esto que no debes conectar ambas(o
más partes) de un componente en las columnas.
18
Como interpretar un diagrama.
A lo largo del libro, los diagramas irán incrementando en complejidad, pero no
al punto de ser abrumadores.
Sin embargo, existe una clave muy importante para no cometer errores a la
hora de interpretar un circuito, las conexiones.
A simple vista parece que ambas conexiones son las mismas ¿Pero esto es
verdad? No.
¿Cuál es la diferencia?
19
Habrá ocasiones donde como en el ejemplo anterior, veamos que se cruzan
líneas, pero ¿Cómo sabemos si estas se conectan o no?
Aquí están las 4 líneas cruzando pero no hay un nodo, esto significa que NO
existe una conexión entre ellas.
20
Nivel Básico
21
1. Encendido de led con switch.
Resistencia:
Símbolo:
Apariencia física:
Se miden en ohms.
Switch:
Símbolo:
Apariencia física:
22
Funcionamiento:
El switch es un activador mecánico cuya activación puede variar según
el tipo.
Puede ser al pulsar un botón, al jalar una pequeña palanca, etc.
Estos tienen un rating o especificaciones de voltaje y corriente máximo,
los cuales NO deben ser excedidos.
LED
Simbolo:
Apariencia física
Funcionamiento:
El diodo LED es un semiconductor que emite luz al ser energizado,
siempre y cuando la polaridad sea la correcta.
23
Aquí tenemos el circuito:
Un led convencional funciona con entre 1mA y 10mA, una relación que
debemos recordar es la siguiente, a mayor corriente, mayor luz, pero hay que
tener cuidado de no exceder la corriente pues podemos quemarlo. Pero, entre
mayor sea la corriente que le introducimos, menor será su vida útil.
Estamos alimentando el circuito con 9v, y necesitamos que la corriente del led
sea de 10mA, nos falta conocer que resistencia debemos usar para el led.
24
Ya que has hecho las conexiones y verificado todo, presiona el switch y mira
con asombro al led encender. ¡Felicidades! Acabas de realizar tu primer circuito
y de esta manera, te has introducido al mundo de la electrónica.
25
2. Conexión de leds en serie
Materiales requeridos:
4 diodos led
1 bateria de 9v
1 protoboard
Circuito:
26
¿Cuándo nos conviene conectar en serie?
Es por eso que, por ejemplo, las luces navideñas están conectadas en serie, al
ser 120VCA, y cada led que opera entre 1.5 y 3V, lo ideal es conectar muchos
en serie hasta que el voltaje que recibe cada uno sea el deseado.
27
3. Conexión de leds en paralelo.
Materiales requeridos:
4 diodos led
4 resistencias de 1kohm
Protoboard
Circuito:
Analicemos el circuito:
También podrás ver que usamos una resistencia, como vimos en el primer
circuito, es para limitar la corriente que le entra al led y evitar dañarlo o
quemarlo.
28
Al dividirse la corriente, la corriente total es la suma de cada uno.
29
4. Potenciómetro.
Al usarse como resistencia variable, solo se usan 2 de los 3 pines que tiene el
potenciómetro. De esta manera se comporta como una resistencia variable, y
su valor máximo sería el valor que especifica el potenciómetro, que puede ser
de 100 ohms, 1000, 10,000, 1 millon, etc.
30
Un divisor de voltaje funciona de la siguiente manera:
Analicemos la formula.
Vsalida = 5 * (5000/5000+1000)
Vsalida = 5V * 0.833
Vsalida = 4.165V
Hay que recordar que este arreglo solo debe usarse como voltaje de referencia
y nunca para usarse con cargas mayores a 20mA. Conforme avances en el
libro comprenderás que es el voltaje de referencia y como aplicarlo para
potencia.
Materiales requeridos:
2. Potenciómetro de 1k ohm
3. Diodo LED
4. Resistencia de 220ohms
31
Aquí estamos usando el potenciómetro como resistencia variable.
32
5. Leds ultra brillantes
Los leds ultra brillantes son una versión más potente que los leds
convencionales. Estos emiten un brillo varias veces mayor y son
especialmente usados en equipo de iluminación, como tiras led o focos led.
Usar estos leds es muy sencillo, es el mismo procedimiento que los leds
convencionales, pero estos consumen una corriente de +-40mA aprox.
V = I*R
Despejamos R
R = V/I
R = 9V/0.040A
R = 225 ohms
33
Al encenderlo, podrás notar que su brillo es muy superior al led convencional,
ahora puedes hacer iluminación led para tu hogar y ahorrar energía.
34
6. Led RGB (O multicolor).
35
Materiales necesarios:
Circuito:
Cada potenciómetro controla la corriente que le entra a cada sección del led,
alterando los valores en cada uno dará un color de salida diferente.
36
7. Display de 7 segmentos.
37
Materiales necesarios:
1: B,C
2: A,B,D,E,G
3: A,B,C,D,G
4: B,C,F,G
5: A,C,D,F,G
6: A,C,D,E,F,G
7: A,B,C,G
8: Todos.
38
9:A,B,C,F,G
Cabe recalcar, que para cada combinación, cada puerto mencionado debe
estar encendido, no cometas el error de encender uno por uno.
Aquí usamos los dip switches, los cuales son switches pequeños pero muy
prácticos y estos se ven así:
39
8. Capacitores
Existen diversos tipos de capacitores, pero los más comunes son los
cerámicos (El de la izq. en la imagen) y los electrolíticos (El de la
derecha en la imagen).
40
Veamos cómo se comporta un capacitor en serie en corriente directa y
en corriente alterna.
41
Corriente alterna AC
42
9. Switch + led + capacitor.
Circuito:
43
10. Diodo rectificador.
44
Materiales necesarios:
Circuito
45
Ahora tenemos el diodo polarizado de manera inversa.
Al armar el circuito y energizar te darás cuenta de que el led no
enciende.
Aquí vemos que el diodo cumple una función fundamental, para proteger
circuitos, para polarizar, etc.
46
11. Rectificador de media onda.
Estos tienen una relación de espiras, que puede variar. Esta relación de
espiras determina el voltaje de salida en relación al voltaje de entrada.
V2 = V1/N1/N2
47
Bien, tenemos que ya sabemos cómo reducir el voltaje que tenemos en
casa a uno que podamos usar en nuestros circuitos, pero ¿Con un
transformador es suficiente? No.
48
Veamos este circuito:
49
Como podrás ver, agregamos un capacitor ¿Pero por qué?
Como dijimos en la sección de capacitores, los capacitores se oponen a
los cambios de voltaje, es decir, que evitaran dentro de su capacidad
que el voltaje cambie de valor.
La salida es la siguiente:
50
La línea roja al fondo es 0V, es decir, tierra. La parte seleccionada como
Vr es el voltaje de rizo.
Este es determinado por la siguiente formula:
51
11. Rectificador de onda completa (Puente rectificador).
52
En el ciclo positivo se activan 2 diodos y en el negativo los otros 2 como
se muestra en la siguiente imagen:
Realicemos el circuito:
Material requerido:
1. Puente rectificador de 1 Ampere.
2. Capacitor 1000uF a 16V
3. Resistencia 1kohm.
4. Transformador de 9VCA.
5. Protoboard.
53
Si quieres hacer una fuente de poder, este es el método de rectificación
que debes usar, no el rectificador de media onda.
De esta manera, el problema del voltaje de rizo será menos presente por
el hecho de que la frecuencia de salida es el doble al de la entrada, en
vez de ser 60hz, es de 120hz.
Vrms/0.707
54
12. Regulación zener.
Simbolo:
Aunque los diodos zener tengan una capacidad muy pequeña, son super
importantes en métodos de regulación de voltaje, pues estos sirven
como voltajes de referencia.
55
Veamos este interesante efecto en el protoboard.
Materiales requeridos:
1. Batería de 9V o fuente de poder de 9V.
2. 1 resistencia de 1k ohm.
3. 1 diodo zener 1n4733A.
4. 1 protoboard.
Una vez que hayas realizado las conexiones del circuito, mide con un
multímetro en voltaje, el cátodo con la punta positiva de tu multímetro y
el ánodo con la punta negativa de tu multímetro.
Anota el voltaje que obtuviste de salida y posteriormente mide el voltaje
de tu batería o fuente de voltaje.
¿No son los mismos? Excelente, esto significa que has realizado con
éxito el circuito.
56
13. El transistor
57
Cabe aclarar algo importante, el transistor es un componente controlado
por corriente, no solo por voltaje.
El siguiente circuito es erróneo:
58
Corriente de base (Ib) = Voltaje de base (Vbb) – Voltaje de diodo (Vd) ÷
Resistencia de base (Rb).
Ahora ¿De qué nos sirve el transistor? ¿De qué nos sirve amplificar una
corriente de base?
59
Existen componentes, como los diodos zener, microcontroladores,
arduino, y demas que no pueden entregar mucha corriente, usualmente
no mayor a 20mA.
Los transistores PNP no son tan usados como los npn, debido a su
método de activación contrario, pero aun asi podemos darle muchos
usos útiles, conforme avancemos en el libro te darás cuenta.
60
14. Transistor en función de amplificador de corriente.
Material necesario:
1. Resistencia de 220 ohms.
2. 4 leds
3. Switch.
4. Resistencia de 10k ohm.
5. Batería 9V o fuente de poder.
6. Transistor npn bc547.
7. Protoboard.
61
Materiales necesarios:
Los mismos que en el anterior, solo agregamos el potenciómetro de 5k
ohm en lugar del switch y resistencia.
62
15. Regulacion zener con transistor de paso.
Materiales requeridos:
1. Batería de 9V o fuente de poder equivalente.
2. Resistencia de 1k ohm.
3. Diodo zener 5v 1n4733A
4. Transistor TIP31C NPN
5. Protoboard
63
16. Reguladores de voltaje 78XX
64
Materiales necesarios:
Este regulador te será muy útil para circuitos de electrónica digital. Cosa
que veremos más adelante en el libro.
65
17. Fuente de poder lineal variable con lm317
66
Hagamos una fuente de poder con este integrado.
Materiales requeridos:
1. Batería o fuente de poder de 24V (Este voltaje es opcional, pero debe
ser mayor a 7V)
2. 2 capacitores de 1uF.
3. resistencia de 240 ohm.
4. potenciómetro de 5kohm.
5. lm317
6. protoboard.
Dónde:
Vout : Voltaje de salida.
1.25V : voltaje interno de referencia.
R2: Potenciometro
R1: Resistencia 240 ohm en nuestro circuito.
67
18. Lm317 + transistor 2n3055 (Regulador de potencia de 3 amperes).
Distribución de pines:
68
Veamos el siguiente circuito:
Materiales necesarios:
1. Transformador de 24VCA 3 amperes
2. Puente rectificador de diodos 5 amperes.
3. capacitor de 2200 micro faradios. De 35V en adelante.
4. capacitor 100 micro faradios de 35V en adelante.
5. resistencia de 240 ohms.
6. potenciómetro de 5k ohms.
7. resistencia de 100 ohms.
8. transistor 2n3055.
9. regulador lm317.
10. protoboard.
Con este regulador podrás alimentar circuitos que consuman mucha corriente,
69
19. Fuente de poder lineal dual (voltaje positivo y negativo).
Por ejemplo, si tenemos una salida de 24V y tiene tap central, podemos
obtener 12V y 12V en ambas partes.
70
Hagamos una fuente de poder dual.
Materiales:
1. Transformador de 24V con tap central.
2. Puente rectificador.
3. 2 capacitores de 1000uF
4. Regulador lm317
5. Regulador lm337
6. 2 diodos 1n4007
7. 2 resistencias de 220 ohms.
8. 2 potenciometros de 5k ohms.
9. 2 capacitores de 100uF
10. 2 conectores de bloque de 3 entradas
71
Como podrás ver, la distribución es distinta, aunque sean idénticos en forma.
En la entrada del transformador, las 2 entradas extremas son para los extremos
de la salida y el centro para conectar el cable del tap central, esto no debe
conectarse de otra manera. Los extremos no tienen orden de conectarse, pero
el tap central SIEMPRE debe conectarse en medio, ya que es 0V o tierra.
En la salida de voltaje, tenemos que los extremos son 24V y -24V, el centro es
0V o negativo.
72
20. Motor eléctrico de corriente continua DC.
73
Materiales necesarios
1. Batería 9V.
2. Switch.
3. Motor de DC 9V.
4. Protoboard.
74
21. Control de velocidad de motor DC lineal con transistor
Materiales necesarios:
1. Motor 9V.
2. Batería o fuente de 9V.
3. Potenciómetro de 5k ohm.
4. Transistor tip31c.
5. Protoboard.
Ejemplo:
75
22. Inversor de giro de motor DC con transistores (Puente H).
Materiales necesarios:
1. Bateria 9V o fuente de poder equivalente.
2. 2 botones tipo push button.
3. 4 diodos 1n4007.
4. 2 transistores npn tip31c.
5. 2 transistores pnp tip32c.
6. Motor de 9V.
7. 2 resistencias de 100 ohms.
8. 2 resistencias de 10k ohms.
76
Tenemos 2 botones, giro 1 y giro 2.
77
23. Relevadores.
78
Materiales necesarios:
1.Bateria de 9V
2.Switch
3.relevador de 9V
4.resistencia de 1k ohm.
5.Led
Al ser una bobina un simple conductor, este tiene una resistencia baja,
usualmente de 50 ohms.
79
24. Encendido y apagado de foco 120VCA con transistor y relevador.
Materiales necesarios:
1.bateria de 9V
2.Transistor npn bc547
3.Relevador de 9V.
4.switch.
5.resistencia de 1k ohm.
6.foco de 127VCA
7.protoboard.
80
Al presionar el botón, polarizaremos el transistor y activaremos el
relevador. Al activarse, cierra el switch interno y se encenderá el foco.
81
24.Diodo emisor infrarrojo y diodo receptor infrarrojo.
82
Hagamos un circuito interesante
Materiales necesarios:
1. Bateria 9v
2. Diodo emisor infrarrojo
3. Diodo receptor infrarrojo
4. 2 resistencias de 1k ohm.
5. Protoboard.
83
25. Control remoto de motor de DC
Materiales necesarios:
2.bateria 9V.
3.resistencia de 1k ohm.
84
26. Fotoresistencias.
85
Materiales:
86
Podemos aplicar la logica inversa, que el led se encienda al no haber
luz llegando a la fotoresistencia.
87
27. Amplificador de microfono sencillo.
88
Este circuito funciona como un amplificador de voltaje.
Esto se debe a que solo estamos amplificando la parte positiva de la señal del
micrófono, no la parte negativa del micrófono.
89
28. Termistores.
90
Materiales necesarios:
1. termistor de 100k ohm.
2. batería de 9V o fuente de poder equivalente.
3. resistencia de 1k ohm.
4. resistencia de 10k ohm.
5. led
6. transistor npn bc547
8. protoboard.
91
29. Oscilador con 2 transistores.
Onda cuadrada:
Onda senoidal:
Onda triangular:
92
Materiales necesarios:
1. 2 resistencias de 4.7k ohm.
2. 2 resistencias de 47k ohm.
3. 2 capacitores de 10nF
4. 2 leds
5. Batería de 9V o fuente de poder similar.
6. 2 transistores npn bc547.
7. Protoboard.
93
30. Probador de fases con transistores
Saber esto es “util” hasta cierto punto, pues usualmente los electricistas
se pasan las normas por los h%$!s y instalan las cosas como se les da
la gana.
94
Materiales:
1. Batería de 9V
2. 2 transistores npn bc547
3. Transistor pnp bc557
4. Resistencia de 100k ohm
5. Resistencia de 1k ohm
6. Resistencia de 330 ohms
7. Capacitor de 1nF
95
31. Electroimán con inductor.
96
Materiales:
1. Batería de 9V o fuente de poder equivalente.
2. Switch.
3. Inductor de 100micro henrios de núcleo de hierro.
4. Resistencia de 10 ohm.
5. Protoboard.
97
Nivel
Intermedio
98
32. Amplificador operacional (OPAMP).
99
Existen diversas configuraciones para usar el opamp, como amplificador
no inversor, amplificador inversor, comparador, buffer, etc.
Materiales necesarios:
1. Batería de 9V o fuente de poder equivalente.
2. 3 resistencias de 10k ohm.
3. 1 resistencia de 1k ohm.
4. 1 potenciómetro de 50k ohm.
5. 1 microfono electret.
6. 1 capacitor de 100 nano faradios.
7. 1 capacitor de 1 micro faradio.
8. 1 opamp lm358.
9. 1 bocina pequeña.
10. Protoboard.
100
Veamos cómo funciona este amplificador simple.
La salida del opamp hará todo lo posible para que la entrada inversora
tenga el mismo voltaje que la entrada no inversora.
𝑅𝑓
𝑉𝑠𝑎𝑙𝑖𝑑𝑎 = 𝑉𝑒𝑛𝑡𝑟𝑎𝑑𝑎 𝑥 ( + 1)
𝑅𝑔
Suponiendo que:
Ventrada = 800mV o 0.8V
Rf = 10k ohms o 10,000 ohms
Rg = 1k ohms o 1,000 ohms.
10,000
𝑉𝑠𝑎𝑙𝑖𝑑𝑎 = 0.8𝑉 𝑥 ( 1000 + 1) = 8.8V
101
De esta manera podemos amplificar señales muy pequeñas, como
puede ser la salida de un micrófono.
102
33. Opamp en modo buffer.
Supongamos que tenemos una señal de HDMI que tiene que recorrer
largas distancias. Debido a la impedancia de los cables, la señal puede
que no llegue integra al dispositivo receptor y por lo tanto, se pierdan
datos.
103
Materiales necesarios:
1. Batería de 9V o fuente de poder.
2. Potenciómetro de 1k ohm.
3. Opamp lm358.
4. Resistencia de 100 ohms.
5. Transistor npn tip31c.
6. Motor de 9VDC
104
34. Opamp en modo comparador
Un comparador nos puede ser útil para, por ejemplo, crear un detector
de límite de algún parámetro, como lo puede ser temperatura, luz,
humedad, etc.
Materiales necesarios:
1. Fuente de poder de 12V.
2. Foto resistencia de 100k.
3. Resistencia de 10k ohm.
4. 2 resistencias de 1k ohm.
5. Potenciómetro de 10k ohm.
6. Opamp lm358.
7. Led.
8. Protoboard.
105
Aquí tenemos un detector de oscuridad.
Este circuito, con los cambios necesarios, puede usarse para encendido
automático de focos en una casa al momento de que llegue la noche.
106
35. Amplificador de audio de baja potencia monoaural con LM386.
107
Materiales :
1. Batería de 9V o fuente de poder equivalente.
2. Amplificador lm386
3. Potenciómetro de 100k.
4. Capacitor de 10uF electrolítico
5. Capacitor de 220uF electrolítico
6. Capacitor de 100nF
7. Capacitor de 47nF
8. Resistencia de 10 ohms.
9. Bocina pequeña o audífonos.
108
36. Timer 555
109
Materiales necesarios:
1.44
𝑓=
(𝑅1 + 2𝑅2) ∗ 𝐶
110
Donde en nuestro circuito:
R1 = 1k ohm o 1000 ohms.
R2 = 10k ohm o 10,000 (Variable).
C = 10uF o 0.000010 F.
Sustituyendo obtenemos:
1.44
= 6.85hz.
(1000+2∗10,000)∗0.000010
111
37. Luces secuenciales con timer 555 y CD4017
112
Materiales necesarios:
1. Fuente de poder de 12V.
2. Resistencia de 1k ohm.
3. Potenciómetro de 10k ohm.
4. 8 resistencias de 220 ohms.
5. Capacitor de 10uF.
6. 8 leds.
7. Lm555.
8. CD4017.
9. Protoboard.
113
38. Vúmetro con Lm3914
114
Este circuito integrado es un vúmetro de 10 salidas, el cual soporta una
alimentación de hasta 35V. Y sus salidas configuradas en colector
abierto.
Usar este integrado es muy sencillo, y para darle una aplicación más
notoria, lo usaremos con el amplificador que hicimos previamente, el
lm386.
Materiales necesarios:
1. Protoboard.
2. Batería o fuente de poder de 9V a 12V.
3. Lm386
4. Lm3914
5. Potenciómetro de 1k ohm.
6. Resistencia de 10 ohms.
7. Resistencia de 1.2k ohm.
8. Resistencia de 3.9k ohm.
9. 10 leds.
10. Capacitor de 100nF.
11. Capacitor de 47nF.
12. Capacitor de 10uF.
13. Capacitor de 220uF
14. Bocina.
115
Usando el lm386 para amplificar la señal de audio de entrada,
conectamos la salida a la entrada del lm3914 para que haga la
secuencia según el volumen de la música.
116
39. PWM
117
Esto hace que el transistor se caliente al aumentar su resistencia,
causando pérdidas de energía y sobrecalentamiento del mismo.
118
Supongamos que tenemos esta onda, cuyo voltaje máximo es 5V y su
duty cycle es de 50%
5V x 0.5 = 2.5V
119
En el periodo apagado, el transistor se apaga:
120
Las bobinas almacenan energía en forma de campo magnético
121
Esta es la forma de la onda y como podrás ver, es un problema serio.
122
Ya que tenemos toda esta valiosa información en mente, hagamos un
generador de PWM usando un timer 555
Materiales necesarios:
1. Fuente de poder de 12-15V MAX.
2. Timer 555.
3. Capacitor de 100nF.
4. Capacitor de 10nF.
5. 2 diodos 1n4007.
6. 2 Resistencias de 1k ohm.
7. Potenciómetro de 50k ohm.
8. Transistor tip31C
9. Motor de 9 o 12V.
10. Protoboard.
Es muy importante que entiendas muy bien la función del PWM ya que
será un factor clave en próximos circuitos.
123
40. Oscilador de foco de 110-220VAC con timer 555 y relevador.
Materiales necesarios:
1. Batería de 9V o fuente de poder equivalente.
2. Resistencia de 1k
3. Potenciómetro de 10k
4. Capacitor de 10uF
5. Timer 555
6. Relevador de 9V.
7. Foco de 120VCA o 220VCA
8. Protoboard.
124
El foco tendrá el mismo efecto en que el led en el circuito, irá
parpadeando a una frecuencia.
125
41. Generador de funciones usando el timer 555.
Probar osciloscopios
126
Materiales:
1. Batería de 9V o fuente de poder equivalente.
2. Timer 555
3. Transistor npn bc547
4. 2 Capacitores de 47nF
5. 2 Capacitores de 1nF
6. 2 Resistencias de 1k ohm.
7. Resistencia de 4.7k ohm.
8. 3 resistencias de 10k ohm.
9. Resistencia de 100k ohm.
10. Resistencia de 10M ohm.
Como podrás ver, las distintas salidas señaladas están en los diferentes
nodos a lo largo del filtro.
127
42. Control de encendido y apagado de foco AC mediante aplausos
Materiales necesarios:
1. Batería de 9V o fuente equivalente.
2. CD4017
3. Opamp lm358
4. Relevador de 9V
5. Micrófono tipo electret
6. Transistor npn bc547
7. 2 resistencias de 1k ohm
8. Resistencia de 22k ohm.
9. Resistencia de 10k ohm.
10. Potenciómetro de 1k ohm.
11. Foco de 110 o 220VAC
12. Protoboard
128
El funcionamiento del circuito es el siguiente:
129
43. Optoaisladores
130
Los encontrarás comúnmente en fuentes de poder conmutadas, en PLC
y en sistemas de comunicación.
131
Si tenemos una señal de 24V de DC entrando a la entrada del
microcontrolador ¿Cómo podemos hacer que el ruido presente en los
24V no afecte al microcontrolador?
Y también, nos permite mandar la señal sin tener una fuente de poder en
común, por lo tanto, aislamos el ruido de la señal y no tendremos
problemas con eso.
132
Materiales:
1. Dos baterías de 9V
2. 2 resistencias de 1k ohm.
3. 1 push button o switch.
4. Optoaislador 4n25
5. Led
6. Protoboard
133
44. Diodos schottky
134
Materiales:
1. Bateria de 9V o fuente equivalente.
2. Timer 555
3. 3 resistencias de 10k ohm.
4. Potenciómetro de 1k ohm.
5. Capacitor de 10nF
6. Diodo rectificador 1n4007
7. Diodo schottky 1n5822
8. Osciloscopio
9. protoboard
135
Pero en S2 no observarás nada, pues debido a que estamos excediendo
la frecuencia de operación del diodo, no puede operar.
136
45. Control de SCR
-Fuentes conmutadas.
-desfibriladores
-Rectificadores de alta potencia.
137
Materiales necesarios:
1. Batería o fuente de poder equivalente.
2. 2 resistencias de 1k ohm.
3. 2 botones push button.
4. 1 led
5. 1 scr t106a1 ( o cualquiera que puedas conseguir funciona bien).
6. Protoboard.
138
46. Control de potencia en AC usando SCR
Pero aun con este hecho, puede ser de utilidad para crear un dimmer y
controlar cargas en corriente alterna.
Materiales necesarios:
1.transformador de 24VCA y 1amp de salida
2.switch
3.potenciometro de 10k.
4.capacitor de 100nF
5. diodo 1n4007
6. triac t106a1 ( o cualquier scr de las mismas especificaciones).
7. lampara de AC de 24V
8. protoboard.
139
Mediante este circuito podemos controlar el tiempo de la onda en el cual
está encendido el scr. Este tipo de control es muy parecido al principio
del PWM.
140
47. Control de potencia con DIAC y TRIAC
DIAC Símbolo
141
TRIAC Símbolo
Los TRIAC se pueden usar como switches con latch, igual que el scr o
como controladores de potencia.
ADVERTENCIA
EL siguiente circuito involucra un alto voltaje de corriente alterna. Lo que
significa un peligro para tu integridad física si no se maneja
adecuadamente. Maneja todo con precaución.
142
Materiales requeridos:
1. Conexión a 120VCA
2. Lámpara de 120VCA
3. Resistencia de 100k ohm
4. Resistencia de 68k ohm
5. Resistencia de 47k ohm
6. Resistencia de 100 ohm
7. Potenciómetro de 470k ohm
8. Capacitor de 0.1uF
9. Capacitor de 0.47uF
10. Capacitor de 0.01uF
11. TRIAC BT136
12. DIAC DS32
143
48. Control de potencia DC con PWM usando MOSFET
Se compone de 3 terminales:
Gate (compuerta).
Drain (Drenado).
Source (Fuente o salida).
144
El Drain es por donde entra el voltaje o señal al transistor, algo así como
la equivalencia al “Colector” en el transistor BJT.
El Source es por donde sale el voltaje o señal del transistor, algo así
como la equivalencia al “Emisor” en el transistor BJT.
Bueno, aquí el punto clave es que, los MOSFET NO son controlados por
CORRIENTE, si no por VOLTAJE.
Circuitos atrás, donde hicimos el módulo PWM con el transistor BJT como
amplificador de corriente, mencionamos el motivo por el cual el PWM se usa
para crear una manera más eficiente de controlar la potencia.
145
El problema, es que aunque el transistor BJT esté totalmente excitado, sigue
teniendo una resistencia interna de decenas de ohms, aunque suene como
poco, la verdad es que aun así tenemos perdida de energía en forma de calor.
Para probar esto, hagamos de nuevo el módulo de PWM, pero ahora para
controlar mediante MOSFET
146
Materiales:
1. Fuente de poder de 12V.
2. Integrado 555.
3. Resistencia de 1k ohm.
4. Resistencia de 10k ohm.
5. 2 diodos 1n4007.
6. Potenciómetro de 50k ohm.
7. Capacitor de 100nF.
8. Capacitor de 10nF.
9. Mosfet IRF540.
10. Motor de 12V.
11. Protoboard.
147
Podrás notar que pusimos una resistencia de 10k ohm desde el gate a
0V ¿Pero cuál es su función?
148
49. Regulación conmutada con lm2576.
Este tipo de reguladores son especiales por tener una eficiencia de 80%
o mayor, lo que significa que menor calor y por lo tanto, la disipación
requerida es menor.
149
En esta ocasión, usaremos el regulador conmutado LM 2576.
Este será el regulador que usaremos para crear nuestra fuente conmutada
150
Materiales:
1. Fuente de poder de 18V (se puede obtener poniendo 2 baterias de
9V en serie).
2. Regulador lm2576T-ADJ
3. Inductor de 150uH
4. Potenciómetro de 47k
5. Resistencia de 1.2k
6. Capacitor de 1000uF
7. Protoboard.
151
50. Regulador conmutado tipo BOOST
152
El lm2577 es un regulador de conmutación multipropósito, esto quiere
decir que puede operar como regulador stepdown, step up, negative
output, etc.
153
Materiales:
1. Bateria de 9V o fuente similar.
2. Lm2577
3. Inductor de 100uH
4. Resistencia de 2.2k ohm.
5. Resistencia de 2k ohm.
6. Diodo schottky 1n5822
7. Potenciómetro de 50k
8. Capacitor de 100nF
9. Capacitor de 1000uF
10. Resistencia de 10k ohm
11. Protoboard.
𝑅1
𝑉𝑜𝑢𝑡 = 1.23(1 + ( ))
𝑅2
Donde R1 sería el potenciómetro, R2 seria R3 en nuestro circuito, y 1.23
es el voltaje de referencia interno.
154
51. Reguladores lineales de baja caída (LDO)
Pero qué pasaría si por ejemplo, tenemos una fuente de poder, como lo
sería una batería, de 6V, pero necesitamos una salida de 5V.
Aquí es donde entran los reguladores LDO (low drop out o baja caída).
Así es, en algunos casos es suficiente que la entrada sea 300mV mayor
a la salida para poder funcionar correctamente.
155
Regulador KA378R05
156
Materiales:
1. Fuente de poder de 6V (es necesario que sea este voltaje)
2. Regulador KA378R05
3. Capacitor de 100nF
4. Resistencia de 10k ohm.
5. Protoboard.
Puedes comprobar lo mismo con un 7805 y verás que la salida no será de 5V,
comprobando el voltaje mínimo de funcionamiento.
157
52. Configuración colector abierto y emisor abierto o sink y source
158
La configuración emisor abierto se refiere a cuando el emisor del
transistor está abierto, y el colector está conectado directamente a
positivo.
Lista de componentes:
1. Protoboard.
2. Batería de 9V o fuente de poder equivalente.
3. 2 switches.
4. Resistencia de 10k ohm.
5. 2 resistencias de 1k ohm.
6. 2 leds.
7. Transistor NPN bc547
8. Transistor PNP bc557
159
53. Configuración Darlington.
160
La configuración Darlington consiste en usar un transistor de alta
ganancia y poca potencia, para controlar a un transistor de baja
ganancia y alta potencia.
Materiales necesarios:
1. Protoboard
2. Fuente de poder de 12V
3. Regulador de 5V 7805
4. Switch
5. Transistor npn 2n2222a
6. Transistor npn tip41
7. Motor de DC.
161
Con este circuito podemos comprobar la función de la configuración
Darlington.
162
El ULN2803A es un circuito integrado amplificador con 8 Darlington.
Esto nos es muy útil para ahorrar espacio y dinero en caso de que
tengamos que controlar múltiples cargas, especialmente las inductivas.
163
54. Introducción a la electrónica digital con compuertas lógicas.
Este es, sin duda, uno de los apartados más importantes del nivel
intermedio, por lo que es muy importante que NO te saltes ni un solo
párrafo, para que puedas comprender toda la información. Aparte que en
la sección de microcontroladores será indispensable.
164
Es aquí cuando nace la electrónica digital.
165
Para codificar una señal usamos el sistema binario, es binario porque
solo tenemos 2 estados, 0 y 1.
166
Ya que conocemos qué es el sistema binario, podemos empezar a
conocer los operadores o compuertas lógicas.
Compuerta AND
0x0 = 0
0x1 = 0
1x0 = 0
1x1 = 1
Esta compuerta nos será útil cuando queramos tener una salida solo si
ambas entradas son 1.
167
Compuerta OR
Símbolo
Tabla de verdad.
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 1
168
Compuerta NOT
Símbolo
169
Compuerta NAND
Simbolo
Tabla de verdad
Aquí es cuando nos damos cuenta que las compuertas NOT no son para
nada inútiles.
170
Compuerta NOR
Simbolo
Tabla de verdad
Y por último….
Compuerta XOR
Simbolo
Simbolo
171
Ya que conocemos los operadores lógicos, es hora de llevar la teoría a
la práctica.
172
Compuerta AND
Material:
1. Batería de 9V o fuente de poder similar.
2. Regulador de voltaje 7805.
3. 3 diodos leds.
4. 2 push button.
5. 3 resistencias de 330 ohms.
6. Compuerta AND SN7408
7. protobard
Examinemos el circuito.
Primero, notarás que tenemos 1 led en serie por cada entrada, esto es
para poder tener una referencia de que está fluyendo corriente por el
switch al activarse.
173
Compuerta OR
Material:
8. Batería de 9V o fuente de poder similar.
9. Regulador de voltaje 7805.
10. 3 diodos leds.
11. 2 push button.
12. 3 resistencias de 330 ohms.
13. Compuerta OR SN7432
14. protobard
174
Compuerta NOT
Material:
15. Batería de 9V o fuente de poder similar.
16. Regulador de voltaje 7805.
17. 2 diodos leds.
18. 1 push button.
19. 2 resistencias de 330 ohms.
20. Compuerta NOT SN7404
21. protobard
175
Compuerta NAND
Materiales necesarios:
22. Batería de 9V o fuente de poder similar.
23. Regulador de voltaje 7805.
24. 3 diodos leds.
25. 2 push button.
26. 3 resistencias de 330 ohms.
27. Compuerta NAND SN7400
28. Protobard
176
Compuerta NOR
Materiales:
29. Batería de 9V o fuente de poder similar.
30. Regulador de voltaje 7805.
31. 2 diodos leds.
32. 1 push button.
33. 2 resistencias de 330 ohms.
34. Compuerta NOR SN7402
35. protobard
177
Compuerta XOR
Materiales:
36. Batería de 9V o fuente de poder similar.
37. Regulador de voltaje 7805.
38. 2 diodos leds.
39. 1 push button.
40. 2 resistencias de 330 ohms.
41. Compuerta XOR SN7486
42. protobard
178
55. Conversor analógico a digital con ADC0804.
Las señales de audio, las señales de ciertos sensores, entre otras cosas
más proporcionan una salida de magnitud analógica.
Vref: Voltaje de referencia, este nos indica entre que rango haremos la
lectura, los ADC tienen este pin en el cual debemos aplicar el voltaje de
referencia. Debemos tener muy en cuenta que el voltaje de referencia
AFECTA directamente a la resolución de salida.
𝑉𝑟𝑒𝑓 5𝑉
𝑅𝑒𝑠𝑜𝑙𝑢𝑐𝑖ó𝑛 = = = 0.019V
#𝑏𝑖𝑡𝑠 255
Esto significa que podremos tener precisión para una señal que cambie
cada 0.019V o 19mV.
179
Ya que tenemos conocimiento de cómo funciona un ADC, hagamos uno
con el ADC0804.
180
Materiales:
1. Bateria de 9V o fuente de poder similar.
2. Regulador de 5V 7805.
3. ADC0804.
4. 8 resistencias de 330 ohms.
5. Resistencia de 10k ohm.
6. Potenciómetro de 100k ohm.
7. Capacitor de 150 pico faradios (pF).
8. 8 leds.
9. Protoboard.
181
Si tenemos 2.5V y 0.020V(valor redondeado) por bit, para obtener la
resultante en binario simplemente dividimos el voltaje sobre la resolución
y tendremos como resultado: +/- 125 o 01111101 en binario.
Una vez que anotes el valor en binario que arrojó el ADC, anótalo y te
sugiero que lo conviertas a decimal para que lo puedas visualizar mejor.
182
56. Sistema BCD y conversor BCD a 7 segmentos.
2: 0010
9: 1001
183
El circuito a emplear será el siguiente:
Ahora hagamos una tabla de verdad para ver que segmentos se deben
de activar y por consecuencia que numero se debe de mostrar al tener
cada combinación.
184
Siguiendo esta tabla de verdad puedes verificar el número.
185
57. Gatillo Schmitt.
Termina así:
186
El gatillo Schmitt es un componente electrónico usado principalmente
para tratado de señales digitales.
187
El umbral inferior determina el nivel mínimo de activación y el umbral
superior determina el nivel máximo de activación.
Como el sn7414
Inversores.
Osciladores.
Filtros.
188
En esta ocasión, usaremos uno en modo de inversor/filtro para eliminar
el ruido producido por el botón.
Material necesario:
1. Protoboard.
2. Fuente o batería de 9V.
3. Regulador 7805.
4. Resistencia de 10k ohm.
5. Resistencia de 330 ohm.
6. Sn7414.
7. Push button.
8. Led.
189
Microcontrolador PIC
16f886
190
Antes de comenzar con esto debemos hacernos la siguiente pregunta.
¿Qué es un microprocesador?
Necesita:
191
Esto hace que claramente, usar un procesador sea costoso y espacioso,
pues necesitamos de muchas cosas para hacerlo andar.
Te presento al microcontrolador.
Posee una memoria RAM interna, una memoria FLASH interna, una
memoria EEPROM interna y demás periféricos internos que hacen que
sean muy útiles para proyectos de electrónica.
192
El microcontrolador que usaremos en este libro será el PIC 16f886
hecho por Microchip. Usamos este microcontrolador porque es fácil de
conseguir, barato y tiene una buena cantidad de periféricos, lo cual es
algo útil para nuestros proyectos.
193
El microcontrolador se puede programar en muchos lenguajes de
programación, pero en nuestro caso lo vamos a programar en lenguaje
C.
https://www.mikroe.com/mikroc/#pic
194
¿Cómo cargar programas en un PIC?
195
Existen 2 formas de utilizar el programador: Mediante ICSP y mediante
el zócalo ZIF
196
Como verás, el software ya reconoció el PIC 16f886, entonces sigue
cargar el programa en cuestión.
197
Aparecerá una ventana para seleccionar donde se encuentra el archivo,
una vez que lo encontremos, seleccionamos el archivo y damos clic en
“Abrir”
198
Al haberse programado correctamente mostrará el mensaje
“Programación correcta”.
199
Antes de comenzar a crear nuestro primer código, las funciones
principales importantes para usar el PIC en el compilador MikroC.
Por ejemplo, si queremos que el puerto A del pic sea solo entradas, lo
ponemos de la siguiente manera:
TRISA = 1;
Por ejemplo, el puerto A tiene 8 pines, empezando por RA0 hasta RA7.
TRISA = 0b00011111;
200
Lo siguiente es activar o desactivar los puertos analógicos.
ANSEL = 1;
ANSELH = 1;
ANSEL = 0;
ANSELH = 0;
201
Para crear un nuevo código en mikroC, sigue las siguientes
instrucciones:
202
3. Seleccionamos incluir todas las librerías
203
5. Ahora tenemos la ventana de edit Project. Aquí podemos seleccionar
parámetros como la fuente de oscilador, la frecuencia de oscilador, el
microcontrolador a usar, activar o desactivar la función MCLR, etc.
Aquí hay que explicar cada configuración por si misma ya que es super
importante que conozcas cada función
Tenemos 2 opciones.
El oscilador interno puede ser desde 4 MHz hasta 20MHz, esta velocidad va a
determinar la potencia de procesamiento del PIC.
204
Y se conecta en los pines CLKIN y CLKOUT (9 y 10) del PIC.
El PIC cuenta con un oscilador interno de hasta 8 MHZ, lo cual nos permite
ahorrarnos el uso de un oscilador externo, para seleccionarlo hacemos lo
siguiente:
205
6. Una vez realizado todo esto, tenemos el área de trabajo donde
vamos a realizar nuestro código.
206
1. Encendido y apagado de led usando switch.
TRISA = 1;
TRISB = 0;
PORTA = 0;
PORTB = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
Para que el PIC pueda encender el led, debe haber un código que lea
cuando el switch está siendo presionado y cuando el switch está suelto.
207
Entonces hacemos lo siguiente:
if(RA0_bit == 1){
RB0_bit = 1;
}
En este caso, será encender el bit RB0, por lo que ponemos que RB0 =
1;
La función else puede traducirse a algo asi como “cualquier otra cosa”.
208
if(RA0_bit == 1){
RB0_bit = 1;
}
else{
RB0_bit = 0;
}
Y verás que ahí dentro, la orden a ejecutar, en este caso, cualquier otra
cosa diferente a 1 “un 0 basicamente” tendrá al puerto RB0 apagado.
void main() {
TRISA = 1;
TRISB = 0;
PORTA = 0;
PORTB = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
while(1){
if(RA0_bit == 1){
RB0_bit = 1;
}
else{
RB0_bit = 0;
}
209
La función “while(1)” es una función cíclica, esto quiere decir que se
estará ejecutando “infinitamente” mientras esté encendido el pic o no se
reinicie.
210
Este es el diagrama de conexiones.
Aquí usamos una batería de 9V y un regulador 7805 para dar los 5V,
pero si tienes una fuente que entregue 5V estables, este arreglo no es
necesario.
211
2. Uso de delay o retardo.
Vamos a hacer que el led parpadee a una frecuencia de 1hz o 1 ves por
segundo.
212
void main(){
TRISB = 0;
PORTB = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
while(1){
RB0_bit = 1;
delay_ms(500);
RB0_bit = 0;
delay_ms(500);
}
}
213
Aplicación #2: Transición de eventos
void main(){
TRISC = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
While(1){
PORTC = 0b00000001;
delay_ms(200);
PORTC = 0b00000010;
delay_ms(200);
PORTC = 0b00000100;
delay_ms(200);
PORTC = 0b00001000;
delay_ms(200);
PORTC = 0b00010000;
delay_ms(200);
PORTC = 0b00100000;
delay_ms(200);
PORTC = 0b01000000;
delay_ms(200);
PORTC = 0b10000000;
delay_ms(200);
}
}
214
Tenemos que ocupamos los 8 bits del puerto C por lo tanto necesitarás
8 resistencias de 220 ohms y 8 leds.
Como dijimos anteriormente, tenemos una secuencia donde cada led ira
encendiéndose exclusivamente en el periodo de tiempo que le
corresponda. El mismo funcionamiento que vimos en el circuito donde
empleamos el contador en década “CD4017”.
215
3. Declaración de variables, operaciones matemáticas y operaciones
lógicas básicas.
Una variable es una letra, símbolo u objeto cuyo valor puede variar.
signed int: esta variable se utiliza para almacenar una variable ENTERA
tanto positiva como negativa de 16 bits, es decir, de -32767 a 32767.
signed long: esta variable se utiliza para almacenar una variable entera
tanto positiva como negativa de 32 bits, es decir, de -2147483647 a
2147483647
int var;
216
Las variables se declaran antes del código principal o “void main()”,
quedando como ejemplo de la siguiente manera:
int var;
void main(){
TRISA = 1;
TRISB = 0;
PORTA = 0;
PORTB = 0
ANSEL = 0;
C1ON_bit = 0;
C2ON_bit = 0;
var = 5;
while(1){
código cualquiera
}
}
Esto es porque ahí ponemos el valor inicial, pero que se podrá modificar
según el código.
217
Las operaciones matemáticas disponibles que tenemos en lenguaje C
son la suma, resta, multiplicación y división.
Para incrementar en valor “n” (que en este caso será 10) una variable,
hacemos lo siguiente:
para sustraer en valor n (en este caso 10) a una variable hacemos lo
siguiente:
218
Para multiplicar 2 o más variables hacemos lo siguiente:
var3 = var1/var2;
Ejemplo:
Ejemplo:
If(RA1_bit == 1 || RA2_bit == 1){
RB0_bit = 1;
}
219
“<” se utiliza para “menor que”
Por ejemplo:
Como verás en la condición if, la salida RB0 será 1 solo si la variable var
1 es MAYOR O IGUAL a la variable var2. Esto se usa para negar la
salida SOLO cuando sea menor.
220
Por ultimo tenemos el operador “!=” que significa “diferente a”
Por ejemplo:
If(var1 != var2){
RB0_bit = 1
}
221
4. Sistema anti rebote.
Para esto usamos una variable de tipo bit, para guardar el estado y
haremos una suma para comprobar el funcionamiento de nuestro
sistema anti rebote.
222
Primero haremos el código sin sistema anti rebote para que puedas
visualizar el problema realmente.
223
bit memoria;
short suma;
void main(){
TRISA = 1;
PORTA = 0;
TRISB = 0;
PORTB = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
memoria = 0;
suma = 0;
while(1){
if(RA0_bit == 1){
suma = suma + 1;
}
224
bit memoria;
short suma;
void main(){
TRISA = 1;
PORTA = 0;
TRISB = 0;
PORTB = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
memoria = 0;
suma = 0;
while(1){
225
Para esto usamos un bit de memoria, el cual será 1 al switch pasar de 0
a 1, es decir, cuando se presiona.
Es por esto que ahora tenemos inmunidad ante el rebote generado por
el switch.
226
5. Uso del LCD 16x2.
227
Como podrás ver en la imagen anterior, el LCD cuenta con 16 pines,
cuya función es la siguiente.
1. VSS: negativo
2. VDD: positivo (5V)
3. VE: control de contraste (mediante potenciómetro)
4. Register Select (RS)
5. Read/Write (RW)
6. Enable
7. Data0 (D0)
8. Data1 (D1)
9. Data2 (D2)
10. Data3 (D3)
11. Data4 (D4)
12. Data5 (D5)
13. Data6 (D6)
14. Data7 (D7)
15. Ánodo del led backlight (+)
16. Cátodo del led backlight (-)
Desde el pin #4 hasta el pin# 14 serán los pines utilizados para enviar
datos y controlar el LCD.
El compilador MikroC cuenta con una librería especial para este display
que nos permite usarlo sin problemas.
Iniciemos con las constantes que se deben declarar antes de void main()
y que nos servirán para definir que pines del microcontrolador usaremos
para controlar cada pin del LCD. Veamos un ejemplo
228
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
Siendo:
RS al pin RB4
EN al pin RB5
D7 al pin RB3
D6 al pin RB2
D5 al pin RB1
D4 al pin RB0
No hay una regla establecida para definir estos pines, es decir, que
cualquier pin de cualquier puerto puede usarse para cada pin del lcd,
obviamente declarándose como salida, y tampoco es necesario un
orden, es decir, podemos usar un pin del puerto A para RS, 2 pines del
puerto B para EN y D7, y los pines restantes en el puerto C.
Otra cosa que podrás haber notado es que no se declaran los pines RW
ni los pines D0 a D3 ¿Por qué?
229
Esto para ahorrar pines.
Lcd_init();
Esta instrucción se usa para iniciar el lcd, es indispensable puesto que
sin esta instrucción no se iniciara el lcd.
Lcd_out(#fila,#columna,dato);
Esta instrucción se utiliza para escribir un dato en el lcd.
El # de fila será 1 o 2, puesto que solo tenemos 2 filas. El # de columna
será del 1 al 16 pues tenemos 16 columnas, y el dato pueden ser texto,
números, variables convertidas a str, etc.
Lcd_out_cp(“texto”);
Se usa para mostar solamente texto en la posición actual del cursor,
este comando no es tan relevante puesto que el lcd_out() cumple la
misma función.
Lcd_chr(#fila,#columna,”texto”);
Se usa para mostrar únicamente texto, la diferencia entre este comando
y Lcd_out_cp es que en este comando si podemos modificar el # de fila
y # de columna directamente.
230
_LCD_TURN_OFF : apagar display
_LCD_SHIFT_LEFT: mover a la izquierda
_LCD_SHIFT_RIGHT: mover a la derecha.
que el lcd debe ser alimentado con 5V al igual que el pic, ten mucho
231
sbit LCD_RS at RC7;
sbit LCD_EN at RC6;
sbit LCD_D4 at RC5;
sbit LCD_D5 at RC4;
sbit LCD_D6 at RC3;
sbit LCD_D7 at RC2;
void main(){
TRISC = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
Lcd_init();
Lcd_cmd(_lcd_cursor_off);
while(1){
Lcd_out(1,1,”Hola mundo”);
}
}
232
sbit LCD_RS at RC7;
sbit LCD_EN at RC6;
sbit LCD_D4 at RC5;
sbit LCD_D5 at RC4;
sbit LCD_D6 at RC3;
sbit LCD_D7 at RC2;
short contador;
char numero [6];
void main(){
TRISC = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
Lcd_init();
Lcd_cmd(_lcd_cursor_off);
short = 0;
while(1){
contador = contador + 1;
delay_ms(200);
ShortToStr(contador,numero);
Lcd_out(1,1,numero);
}
}
233
Para hacer la conversión, primero ponemos el tipo de variable, seguido
de ToStr(variable,variable char). Dentro del paréntesis primero ponemos
el nombre de la variable, después de la coma, ponemos el nombre de la
variable char donde será almacenada.
IntToStr(contador,numero)
FloatToStr(contador, numero)
234
Generar caracteres personalizados en para LCD
235
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;
void main(){
TRISC = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
Lcd_init();
Lcd_cmd(_lcd_cursor_off);
while(1){
customchar(1,1);
}
}
236
Imagen resultante:
237
6. Conversor analógico digital
“ANSEL” : sirve para declarar los primeros 8 puertos del ADC, es decir,
del 0 al 7.
238
“ADC_read(#de canal);” : sirve para hacer la lectura del canal deseado,
dentro del paréntesis se coloca el número del canal que deseamos usar.
Si queremos usar el canal 0, escribimos “ADC_read(0);”
Antes de empezar, recuerda que ningún pin del pic soporta más de
5VDC.
239
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D7 at RB0_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D4 at RB3_bit;
TRISA = 1;
PORTA = 0;
TRISB = 0;
PORTB = 0;
ANSEL = 0b00000001;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ADC_Init();
LCD_init();
LCD_cmd(_lcd_clear);
LCD_cmd(_cursor_off);
while(1){
lcd_out(1,1,”V:”);
medicion = adc_read(0);
resultante = medicion * 4.88;
intToSTR(resultante,voltaje);
Lcd_out(1,4,voltaje);
delay_ms(100);
}
}
240
Notarás varias cosas en el código, te explicaré paso a paso cada una de
ellas.
Despues, esta variable se multiplica por 4.88 para convertir este valor a
milivolts. ¿Pero de donde salio este 4.88?
241
El LM35 es un sensor de temperatura, el cual consta solamente de 3
terminales y se puede alimentar desde 4 a 20V.
Este sensor nos entrega una lectura de 10mV/ºC. es decir, que por cada
grado centígrado tendremos 10mV. Para una temperatura de 30ºC
obtendremos una salida de 300mV.
242
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D7 at RB0_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D4 at RB3_bit;
TRISA = 1;
PORTA = 0;
TRISB = 0;
PORTB = 0;
ANSEL = 0b00000001;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ADC_Init();
LCD_init();
LCD_cmd(_lcd_clear);
LCD_cmd(_cursor_off);
while(1){
lcd_out(1,1,”ºC:”);
medicion = adc_read(0);
resultante = (medicion / 2.05);
intToSTR(resultante,temperatura);
Lcd_out(1,4,temperatura);
delay_ms(100);
}
}
243
De esta manera podemos obtener la lectura en grados centígrados.
2.05 sale de dividir los 10mV por grado centígrado sobre los 4.88mV por
bit de resolución.
244
7. Salida de PWM
El pic 16f886 tiene 2 salidas de pwm, las cuales son ccp1 y ccp2.
245
Como es de 8 bits recuerda que será desde 0 a 255. Siendo 0 un duty
cycle de 0% y 255 un duty cycle de 100%
246
short duty;
void main(){
TRISA = 1;
PORTA = 0;
TRISC = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0b00000001;
ANSELH = 0;
duty = 0;
PWM1_init(2000);
PWM1_start();
while(1){
}
}
Del código notaras que la lectura del adc la dividimos entre 4 ¿Pero
porque?
247
Ya que sabemos cómo usar un la salida de pwm, hagamos un
controlador de motores de DC usándolo.
248
8. Multiplexación de displays de 7 segmentos.
El pic 16f886 solo cuenta con 24 pines disponibles para ser utilizados.
Nos encontramos el problema de que NO tenemos los pines suficientes
para controlarlos.
249
Es decir, que en lugar de controlar cada digito a la vez, lo que hacemos
es controlar uno por uno pero a una velocidad muy alta que nuestros
ojos lo perciben como si todos estuvieran siendo controlados al mismo
tiempo.
250
Esta técnica es tan importante porque nos permite ahorrar demasiados
pines y poder hacer nuestro código mucho más eficiente.
251
Hagamos un código contador de pulsos, en el cual tendremos 3 botones,
uno para incrementos de 1, otro para incrementos de 10 y otro más para
incrementos de 100.
Antes de comenzar, debes de saber que MikroC cuenta con una función
para generar el codigo los dígitos en forma decimal o hexadecimal
252
Aparecerá la siguiente ventana donde podremos generar el código:
Verás que salen 2 códigos, tanto para cátodo común y ánodo común,
solo deberás copiar el código correspondiente al tipo de display que
estés usando, no uses el contrario pues no funcionará
253
Ahora… hagamos el código…
bit mem1;
bit mem2;
bit mem3;
bit mem4;
short contador;
short var;
short unidad;
short decena;
short centena;
short millar;
int numero;
void main() {
TRISA = 1;
PORTA = 0;
TRISB = 0;
PORTB = 0;
TRISC = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
mem1 = 0;
mem2 = 0;
mem3 = 0;
mem4 = 0;
contador = 0;
var = 0;
numero = 0;
while(1){
contador = contador + 1;
delay_ms(1);
254
if(RA1_bit == 1 && mem2 == 0){
mem2 = 1;
}
if(RA1_bit == 0 && mem2 == 1){
numero = numero + 10;
mem2 = 0;
}
if(contador == 2){
RB0_bit = 0;
RB1_bit = 1;
RB2_bit = 0;
RB3_bit = 0;
var = centena;
}
if(contador == 3){
RB0_bit = 0;
RB1_bit = 0;
RB2_bit = 1;
RB3_bit = 0;
var = decena;
}
if(contador == 4){
RB0_bit = 0;
RB1_bit = 0;
RB2_bit = 0;
RB3_bit = 1;
var = unidad;
255
}
switch(var){
case 0 : PORTC = 63;break;
case 1 : PORTC = 6;break;
case 2 : PORTC = 91;break;
case 3 : PORTC = 79;break;
case 4 : PORTC = 102;break;
case 5 : PORTC = 109;break;
case 6 : PORTC = 125;break;
case 7 : PORTC = 7;break;
case 8 : PORTC = 127;break;
case 9 : PORTC = 111;break;
}
}
}
256
La variable “var” se utiliza para darle el valor exacto en el digito
correspondiente. Siendo el primero digito que se enciende el de millar,
entonces se le da el valor de millar a var, en el siguiente que es
centenas, se le da el valor de centenas para que sea mostrado en ese
instante, y así sucesivamente.
257
short contador;
short var;
short unidad;
short decena;
short centena;
short millar;
int numero;
void main() {
TRISA = 1;
PORTA = 0;
TRISB = 0;
PORTB = 0;
TRISC = 0;
PORTC = 0;
ANSEL = 0b00000001;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
contador = 0;
var = 0;
numero = 0;
while(1){
contador = contador + 1;
delay_ms(1);
if(contador == 1){
RB0_bit = 1;
RB1_bit = 0;
RB2_bit = 0;
RB3_bit = 0;
var = millar;
}
if(contador == 2){
RB0_bit = 0;
RB1_bit = 1;
RB2_bit = 0;
RB3_bit = 0;
var = centena;
}
if(contador == 3){
RB0_bit = 0;
RB1_bit = 0;
258
RB2_bit = 1;
RB3_bit = 0;
var = decena;
}
if(contador == 4){
RB0_bit = 0;
RB1_bit = 0;
RB2_bit = 0;
RB3_bit = 1;
var = unidad;
}
switch(var){
case 0 : PORTC = 63;break;
case 1 : PORTC = 6;break;
case 2 : PORTC = 91;break;
case 3 : PORTC = 79;break;
case 4 : PORTC = 102;break;
case 5 : PORTC = 109;break;
case 6 : PORTC = 125;break;
case 7 : PORTC = 7;break;
case 8 : PORTC = 127;break;
case 9 : PORTC = 111;break;
}
}
}
259
Como verás, el código es casi el mismo, con excepción de que
eliminamos los botones y los reemplazamos por un potenciómetro, y la
variable número ahora depende de la lectura analógica.
Recuerda que la parte del código que se encarga del reset de la variable
es:
if(contador > 4){
contador = 0;
}
260
9. Uso de teclado matricial por método de multiplexación.
Cada entrada del teclado forma parte de las filas y cada salida del
teclado forma parte de las columnas.
261
Entonces, si la entrada 1 del teclado está en 1 y la salida 1 del teclado
está en 1. Significa que hemos presionado la siguiente tecla:
262
Ya que hemos visto el funcionamiento del teclado, hagamos un código
para mostrar los números y caracteres presentes del teclado en un
lcd16x2.
Solo usamos resistencias para la parte de salidas del teclado, pues solo
esas serán leídas como entradas por parte del pic.
263
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC3_bit;
sbit LCD_D6 at RC4_bit;
sbit LCD_D7 at RC5_bit;
short contador1;
short contador2;
short tecla;
short var;
int duty;
bit mem1;
bit mem2;
bit mem3;
bit mem4;
bit mem5;
bit mem6;
bit mem7;
bit mem8;
bit mem9;
bit mem0;
char teclas [6];
void main() {
TRISA = 0;
TRISB = 1;
TRISC = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
lcd_init();
lcd_cmd(_lcd_cursor_off);
264
lcd_cmd(_lcd_clear);
contador1 = 0;
contador2 = 0;
mem1 = 0;
mem2 = 0;
mem3 = 0;
mem4 = 0;
mem5 = 0;
mem6 = 0;
mem7 = 0;
mem9 = 0;
mem0 = 0;
tecla = 0;
while(1){
contador1 = contador1 + 1;
delay_us(800);
if(contador1 == 1){
ra0_bit = 1;
ra1_bit = 0;
ra2_bit = 0;
ra3_bit = 0;
}
if(contador1 == 2){
ra0_bit = 0;
ra1_bit = 1;
ra2_bit = 0;
ra3_bit = 0;
}
if(contador1 == 3){
ra0_bit = 0;
ra1_bit = 0;
ra2_bit = 1;
ra3_bit = 0;
}
if(contador1 == 4){
ra0_bit = 0;
ra1_bit = 0;
ra2_bit = 0;
ra3_bit = 1;
265
}
if(PORTA == 0b00000001){
if(rb0_bit == 1 && mem1 == 0){
mem1 = 1;
}
if(rb3_bit == 1){
tecla = 10;
}
}
if(PORTA == 0b00000010){
if(rb0_bit == 1 && mem4 == 0){
mem4 = 1;
}
266
if(rb0_bit == 0 && mem4 == 1){
tecla = 4;
mem4 = 0;
}
if(rb1_bit == 1 && mem5 == 0){
mem5 = 1;
}
if(rb1_bit == 0 && mem5 == 1){
tecla = 5;
mem5 = 0;
}
if(rb2_bit == 1 && mem6 == 0){
mem6 = 1;
}
if(rb2_bit == 0 && mem6 == 1){
tecla = 6;
mem6 = 0;
}
if(rb3_bit == 1){
tecla = 11;
}
}
if(PORTA == 0b00000100){
if(rb0_bit == 1 && mem7 == 0){
mem7 = 1;
}
if(rb0_bit == 0 && mem7 == 1){
tecla = 7;
mem7 = 0;
}
if(rb1_bit == 1 && mem8 == 0){
mem8 = 1;
}
if(rb1_bit == 0 && mem8 == 1){
tecla = 8;
mem8 = 0;
}
if(rb2_bit == 1 && mem9 == 0){
mem9 = 1;
}
if(rb2_bit == 0 && mem9 == 1){
tecla = 9;
mem9 = 0;
}
267
if(rb3_bit == 1){
tecla = 12;
}
}
if(PORTA == 0b00001000){
if(rb1_bit == 1 && mem0 == 0){
mem0 = 1;
}
if(rc1_bit == 0 && mem0 == 1){
tecla = 0;
mem0 = 0;
}
}
switch(tecla){
case 0 : lcd_out(1,1,"0");break;
case 1 : lcd_out(1,1,"1");break;
case 2 : lcd_out(1,1,"2");break;
case 3 : lcd_out(1,1,"3");break;
case 4 : lcd_out(1,1,"4");break;
case 5 : lcd_out(1,1,"5");break;
case 6 : lcd_out(1,1,"6");break;
case 7 : lcd_out(1,1,"7");break;
case 8 : lcd_out(1,1,"8");break;
case 9 : lcd_out(1,1,"9");break;
}
}
}
Como podrás notar el código quedó un poco largo (o más bien muy
largo) pero esta es la manera correcta de implementar un teclado
matricial, ya que usamos sistema anti rebote para cada tecla que
usamos.
268
10. Uso de encoders rotatorios.
Todo esto está bien hasta que nos topamos con estos 2 problemas:
269
Básicamente esta es la estructura interna del encoder rotatorio.
270
Para probar esto, haremos un código para controlar el duty cycle de un
motor con la salida pwm usando el encoder rotatorio.
271
short duty;
void main(){
TRISA = 1;
TRISC = 0;
PORTA = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
PWM1_init(2000);
PWM1_start();
while(1){
if(RA1_bit == 1){
delay_us(500);
if(RA0_bit == 1){
duty = duty + 10;
}
}
if(RA0_bit == 1){
delay_us(500);
if(RA1_bit == 1){
duty = duty - 10;
}
}
if(duty >255){
duty = 255;
}
PWM1_set_duty(duty);
}
}
272
11. Conversor Digital a analógico usando PWM
273
short duty;
bit mem1;
bit mem2;
bit mem3;
bit mem4;
void main(){
TRISA = 1;
TRISC = 0;
PORTA = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
duty = 0;
mem1 = 0;
mem2 = 0;
mem3 = 0;
mem4 = 0;
PWM1_init(2000);
PWM1_start();
while(1){
if(RA0_bit == 1 && mem1 == 0){
mem1 = 1;
}
if(RA0_bit == 0 && mem1 == 1){
duty = duty + 10;
mem1 = 0;
}
274
if(RA2_bit == 0 && mem3 == 1){
duty = duty + 1;
mem3 = 0;
}
PWM1_set_duty(duty);
}
}
275
12. Uso de servomotores
Tenemos que generar una onda cuadrada cuyo ancho total sea de
20ms, pero el rango de funcionamiento será desde 0.5ms a 1.5ms, como
vemos en la siguiente imagen:
276
Cabe aclarar que este es un “estándar” que NO siempre se sigue, habrá
servomotores cuyo rango sea distinto, ya sea ligeramente o totalmente a
lo que se presenta en esa imagen.
277
int pos1;
int pos2;
bit mem1;
bit mem2;
void main(){
TRISA = 1;
TRISC = 0;
PORTA = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
pos1 = 0;
pos2 = 0;
while(1){
pos2 = pos2 + 1;
delay_us(8);
if(RA0_bit == 1 && mem1 == 0){
mem1 = 1;
}
if(RA0_bit == 0 && mem1 == 1){
pos1 = pos1 + 5;
mem1 = 0;
}
if(RA1_bit == 1 && mem2 == 0){
mem2 = 1;
}
if(RA1_bit == 0 && mem2 == 1){
pos1 = pos1 – 5;
mem2 = 0;
}
if(pos1>pos2){
RC0_bit = 1;
}
if(pos1<pos2){
RC0_bit = 0;
}
278
13. Uso de motores paso a paso.
Los motores paso a paso (o step motor en inglés) son una clase de
motor que se caracteriza por darnos la posibilidad de controlar tanto la
velocidad como el grado de avance. Así es, el grado de avance.
279
Existen 2 tipos de motores a pasos: los unipolares y los bipolares.
280
Para controlar el motor a pasos unipolar, solo necesitamos hacer la
secuencia mandando a negativo cada extremo de cada bobinado,
podemos usar un amplificador Darlington como el uln2003A, el cual es
de colector abierto y cuenta con diodos anti flyback internos.
Los cables rojo, azul, verde y negro serán los extremos de las bobinas y
debemos de seguir las siguientes secuencias para hacer los giros.
281
Para controlar el motor bipolar, necesitamos de 2 puentes H, pero por
fortuna tenemos una solución mejor, el integrado l293D, el cual es un
puente H doble integrado en un solo chip.
282
Así es como se ve el driver Darlington uln2003A :
283
El circuito a usar para el motor a pasos unipolar será el siguiente:
short velocidad;
284
Código para motor unipolar.
void main(){
TRISA = 1;
TRISC =0;
PORTA = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
while(1){
if(RA0_bit == 1){
PORTC = 0b00001100;
delay_ms(20);
PORTC = 0b00000110;
delay_ms(20);
PORTC = 0b00000011;
delay_ms(20);
PORTC = 0b00001001;
delay_ms(20);
}
if(RA1_bit == 1){
PORTC = 0b00001001;
delay_ms(20);
PORTC = 0b00000011;
delay_ms(20);
PORTC = 0b00000110;
delay_ms(20);
PORTC = 0b00001100;
delay_ms(20);
}
}
}
285
Código para motor bipolar
void main(){
TRISA = 1;
TRISC =0;
PORTA = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
while(1){
if(RA0_bit == 1){
PORTC = 0b00000110;
delay_ms(20);
PORTC = 0b00001010;
delay_ms(20);
PORTC = 0b00001001;
delay_ms(20);
PORTC = 0b00000101;
delay_ms(20);
}
if(RA1_bit == 1){
PORTC = 0b00000101;
delay_ms(20);
PORTC = 0b00001001;
delay_ms(20);
PORTC = 0b00001010;
delay_ms(20);
PORTC = 0b00000110;
delay_ms(20);
}
}
}
286
En ambos códigos el principio de funcionamiento es el mismo.
287
14. Uso de memoria eeprom interna.
El pic 16f886 tiene una eeprom interna de 256 bytes o 2048 bits.
EEPROM_Read(dirección);
EEPROM_Read(0);
Siendo la dirección desde 0 hasta 255, por ser 256 bytes o 256
conjuntos de 8 bits.
288
La siguiente instrucción es:
EEPROM_Write(dirección,dato);
EEPROM_Write(1,temp);
289
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC3_bit;
sbit LCD_D6 at RC4_bit;
sbit LCD_D7 at RC5_bit;
short contador;
char numero [6];
bit mem1;
bit mem2;
void main(){
TRISA = 1;
TRISC = 0;
PORTA = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
contador = EEPROM_Read(0);
mem1 = 0;
mem2 = 0;
while(1){
if(RA0_bit == 1 && mem1 == 0){
mem1 = 1;
}
if(RA0_bit == 0 && mem1 == 1){
contador = contador + 1;
EEPROM_Write(0,contador);
mem1 = 0;
}
290
if(RA1_bit == 1 && mem2 == 0){
mem2 = 1;
}
if(RA1_bit == 0 && mem2 == 1){
contador = contador - 1;
EEPROM_Write(0,contador);
mem2 = 0;
}
ShortToStr(contador,numero);
Lcd_out(1,1,numero);
}
}
291
15. Uso del Timer/counter 0.
P= 256x(preescaler)(4xTosc).
292
Ahora si podemos usarlo en la formula.
Con un preescalador de 16 obtenemos lo siguiente:
P = 256x(16)x(4x0.000000125)
P = 0.002048s o 2.048ms.
Bit 5 T0CS: bit usado para indicar la fuente de reloj que usara el timer0,
siendo 1 para usarse el clk exterior y funcionar como contador y 0 para
usar el clk interno y funcionar como temporizador.
293
Estos 3 últimos bits se configuran con esta tabla, ignorando la sección
de WDT que es para el watchdog.
Bien, ahora cabe aclarar algo muy importante antes de hacer el código.
Por ejemplo.
294
Si iniciamos el Timer0 en 60, significa que en lugar de contar 255, le
restamos 60 y tenemos un conteo final de: 195. Al ser un conteo menor,
significa que el tiempo de salida es menor también.
El preescaler de 16 = 011.
295
Ahora sí, vayamos al código.
void main() {
TRISB = 0;
PORTB = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
OPTION_REG = 0b00000011;
TMR0 = 0;
while(1){
if(TMR0 == 255){
RB5_bit = 1;
TMR0 = 0;
}
if(TMR0 >= 128 && TMR0 <255){
RB5_bit = 0;
}
}
}
296
Ahora veamos el Timer0 en función de contador.
Bit 5 T0CS: debemos ponerlo como 1 para que leer el reloj externo
mediante T0CKI
Bit 4 T0SE: este bit se usa especificar la transición leida, siendo 1 para
flanco de bajada y 0 para flanco de subida
297
Quedando así: OPTION_REG = 0b00100000;
298
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC3_bit;
sbit LCD_D6 at RC4_bit;
sbit LCD_D7 at RC5_bit;
short contador;
char numero[6];
void main() {
TRISB = 0;
PORTB = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
OPTION_REG = 0b00100000;
contador = 0;
lcd_init();
lcd_cmd(_lcd_cursor_off);
lcd_cmd(_lcd_clear);
TMR0 = 0;
while(1){
contador = TMR0;
shorttostr(contador,numero);
lcd_out(1,1,numero);
}
}
299
16. Uso de interrupciones.
Ya sea porque tiene que procesar una cantidad de código muy grande,
porque tenemos muchos periféricos actuando al mismo tiempo, etc.
Esto porque el pic ejecuta las instrucciones en serie, es decir, una tras
otra.
Las interrupciones son una herramienta muy útil en estos casos, pues
como su nombre lo indica, es una instrucción especial que hace que se
DETENGA todas las demás instrucciones que esté ejecutando el pic
para hacer esa instrucción.
Como podrás ver, es útil, sobre todo para situaciones críticas ¿Cómo
cuáles?
300
¿Pero cómo fue capaz de hacer esto si el procesador se cuelga?
Gracias a las interrupciones.
Interrupción externa.
La interrupción externa es activada por un factor externo, el cual puede
ser un botón, un encoder, un sensor, etc.
301
Como dijimos anteriormente, esta interrupción puede ocurrir por 2
situaciones:
302
T0IE: Timer0 interrupt enabler: Este bit habilita las interrupciones
por el timer0.
INTE: Interrupt enabler: este bit habilita las interrupciones
externas.
RBIE: PORTB change interrupt enabler: habilita las interrupciones
por cambio de estado en el puerto B.
Circuito a utilizar:
303
void main() {
TRISB = 1;
PORTB = 0;
TRISC = 0;
OPTION_REG = 0b01000000;
INTCON = 0b10010000;
ANSEL = 0;
ANSELH = 0;
while(1){
RC0_bit = 1;
delay_ms(500);
RC0_bit = 0;
delay_ms(500);
void interrupt(){
if(INTF == 1){
RC1_bit = 1;
delay_ms(200);
RC1_bit = 0;
delay_ms(200);
INTCON.INTF = 0;
304
Las interrupciones debes hacerlas mediante un void distinto, esto porque
se deben ejecutar fuera del bucle principal.
OPTION_REG = 0b00000111;
305
Para activar las interrupciones por desborde del timer0 necesitamos
configurar INTCON de la siguiente manera:
INTCON = 0b10100100;
306
short contador;
short var;
short unidad;
short decena;
short centena;
short millar;
int numero;
void main() {
TRISB = 0;
PORTB = 0;
TRISC = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
contador = 0;
OPTION_REG = 0b00000111;
INTCON = 0b10100100;
TMR0 = 0;
var = 0;
numero = 0;
while(1){
contador = contador + 1;
delay_ms(1);
if(contador == 1){
RB0_bit = 1;
RB1_bit = 0;
RB2_bit = 0;
RB3_bit = 0;
var = millar;
}
if(contador == 2){
RB0_bit = 0;
RB1_bit = 1;
RB2_bit = 0;
RB3_bit = 0;
var = centena;
}
if(contador == 3){
RB0_bit = 0;
307
RB1_bit = 0;
RB2_bit = 1;
RB3_bit = 0;
var = decena;
}
if(contador == 4){
RB0_bit = 0;
RB1_bit = 0;
RB2_bit = 0;
RB3_bit = 1;
var = unidad;
}
switch(var){
case 0 : PORTC = 63;break;
case 1 : PORTC = 6;break;
case 2 : PORTC = 91;break;
case 3 : PORTC = 79;break;
case 4 : PORTC = 102;break;
case 5 : PORTC = 109;break;
case 6 : PORTC = 125;break;
case 7 : PORTC = 7;break;
case 8 : PORTC = 127;break;
case 9 : PORTC = 111;break;
}
}
}
void interrupt(){
if(T0IF == 1){
numero = numero + 1;
TMR0 = 0;
INTCON.T0IF = 0;
}
}
308
¿Cuál es el punto de usar el TMR0 y la interrupción en esta aplicación?
309
17. Comunicación serial.
310
Como puedes ver, necesitamos un puerto ENTERO del PIC para poder
comunicar el ADC con el PIC.
Esto nos hace perder muchos pines que podríamos necesitar para otras
funciones.
Es decir, que cada bit se transmite en serie para formar un dato de 8 bits
o cualquier otra magnitud.
USART
I2C
USB
311
Comunicación I2C
312
Sabiendo los pines presentes en el microcontrolador, toca hacer el
código.
MikroC cuenta con una librería para comunicación I2C que nos facilita
mucho el trabajo. Y consta de las siguientes instrucciones:
313
Como ejemplo, usaremos el multiplexor de entradas/salidas PCF8574
El datasheet del fabricante nos ofrece una tabla para asignarle las
direcciones.
314
L = bajo o 0V
H = Alto o 5V.
Como le quiero dar la dirección 79, tenemos que poner los 3 bits A2, 1 y
0 en H.
315
Como verás, los pines de SCL y SDA están conectados mediante
resistencias de 1k a 5V. Esto se llama configuración PULL-UP.
316
short entradas;
void main() {
TRISA = 0;
PORTA = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
I2C1_Init(100000);
while(1){
I2C1_Start();
I2C1_Wr(79);
entradas = I2C1_Rd(0);
I2C1_Stop();
PORTA = entradas;
317
Comunicación UART.
318
MikroC cuenta con una librería especial para este protocolo de
comunicación. El cual consta de las siguientes instrucciones:
319
Como ejemplo, haremos lo siguiente:
También recuerda que vamos a hacer un código para cada PIC, uno
para el transmisor y otro para el receptor.
320
Código del PIC transmisor.
void main() {
TRISA = 1;
PORTA = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
UART1_Init(9600);
while(1){
if(RA0_bit == 1){
UART1_Write(97);
if(RA1_bit == 1){
UART1_Write(98);
if(RA2_bit == 1){
UART1_Write(99);
if(RA3_bit == 1){
UART1_Write(100);
321
Código del PIC receptor.
char dato;
void main() {
TRISA = 0;
PORTA = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
Lcd_Init();
Lcd_cmd(_lcd_clear);
Lcd_cmd(_lcd_cursor_off);
322
UART1_Init(9600);
while(1){
if(UART1_Data_Ready()==1){
dato = UART1_Read();
Lcd_out(1,1,"Recepcion:");
if(dato == 97){
lcd_out(2,1,"a");
if(dato == 98){
lcd_out(2,1,"b");
if(dato == 99){
lcd_out(2,1,"c");
if(dato == 100){
lcd_out(2,1,"d");
Muestra de LCD:
323
Proyectos
324
Proyecto #1 : Semaforo en pic16f886
325
int contador;
void main() {
TRISC = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
ANSEL = 0;
ANSELH = 0;
contador = 0;
while(1){
contador = contador + 1;
delay_ms(100);
if(contador <= 300){
PORTC = 0b00100001;
}
if(contador > 300 && contador < 500){
PORTC = 0b00100010;
}
if(contador > 500 && contador < 800){
PORTC = 0b00001100;
}
if(contador > 800 && contador < 1000){
PORTC = 0b00010100;
}
if(contador >= 1000){
contador = 0;
}
}
}
326
Proyecto#2: Termometro de control.
Circuito:
327
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC1_bit;
sbit LCD_D7 at RC5_bit;
sbit LCD_D6 at RC4_bit;
sbit LCD_D5 at RC3_bit;
sbit LCD_D4 at RC2_bit;
bit mem1;
bit mem2;
void main(){
ANSEL = 0b00000001;
ANSELH = 0;
TRISA = 1;
TRISC = 0;
TRISB = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
C1ON_bit = 0;
C2ON_bit = 0;
i = 30;
mem1 = 0;
mem2 = 0;
ADC_Init();
PORTA = 0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
328
while(1){
if(RA1_bit == 1 && mem1 == 0){
mem1 = 1;;
}
if(RA1_bit == 0 && mem1 == 1){
i = i + 1;
mem1 = 0;
}
if(RA2_bit == 1 && mem2 == 0){
mem2 = 1;
}
if(RA2_bit == 0 && mem2 == 1){
i = i - 1;
mem2 = 0;
}
if(Tem > i ){
RB0_bit = 1;
Lcd_Out(2,13,"ON ");
}
if(Tem <= i-10){
RB0_bit = 0;
Lcd_Out(2,13,"OFF");
}
Tem = (adc_read(0)/2.05);
ShortToStr(Tem,temperatura);
ShortToStr(i,configuracion);
Lcd_Out(1,1,"temp.:");
Lcd_out(1,8,temperatura);
lcd_chr(1,13,223);
lcd_out(1,14,"C");
lcd_out(2,1,"act:");
lcd_out(2,5,configuracion);
lcd_chr(2,9,223);
}
}
329
El display resultante será así:
330
Proyecto #3 voltimetro con pic16f886 y lcd 16x2
.
El circuito a utilizar es el siguiente:
331
El código a emplear será el siguiente:
float volts;
char voltaje[8];
void main() {
TRISA = 1;
PORTA = 0;
ANSEL = 0b00000001;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
lcd_init();
lcd_cmd(_lcd_cursor_off);
lcd_cmd(_lcd_clear);
while(1){
volts = adc_read(0)/9.66;
FloatToStr(volts,voltaje);
lcd_out(1,1,"V:");
lcd_out(1,4,voltaje);
delay_ms(200);
332
¿Cómo hemos logrado medir 100V si el adc del pic es de 5V?
333
Proyecto #4: Controlador digital de sentido y velocidad de motor
con puente H y muestreo en lcd.
Este será el circuito a utilizar. Es algo largo así que ten cuidado con las
conexiones.
334
sbit LCD_RS at RA0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D7 at RA5_bit;
sbit LCD_D6 at RA4_bit;
sbit LCD_D5 at RA3_bit;
sbit LCD_D4 at RA2_bit;
short duty;
short vel;
bit cw;
bit ccw;
bit mem1;
bit mem2;
char velocidad [6];
void main() {
TRISA = 0;
TRISB = 1;
TRISC = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
cw = 0;
ccw = 0;
mem1 = 0;
mem2 = 0;
duty = 0;
vel;
lcd_init();
lcd_cmd(_lcd_cursor_off);
lcd_cmd(_lcd_clear);
PWM1_Init(2000);
335
PWM2_Init(2000);
PWM2_stop();
PWM1_stop();
while(1){
if(RB0_bit == 1 && mem1 == 0){
mem1 = 1;
}
if(RB0_bit == 0 && mem1 == 1){
duty = duty + 10;
mem1 = 1;
}
if(RB2_bit == 1){
cw = 1;
ccw = 0;
lcd_out(2,10,"CW ");
}
if(RB3_bit == 1){
cw = 0;
ccw = 1;
lcd_out(2,10,"CCW");
}
if(cw == 1){
PWM2_stop();
PWM1_start();
PWM1_set_duty(duty);
}
336
if(ccw == 1){
PWM1_stop();
PWM2_start();
PWM2_set_duty(duty);
}
lcd_out(1,1,"velocidad:");
lcd_out(1,12,velocidad);
lcd_out(1,16,"%");
lcd_out(2,1,"sentido:");
}
if(cw == 1){
PWM2_stop();
PWM1_start();
PWM1_set_duty(duty);
}
if(ccw == 1){
PWM1_stop();
PWM2_start();
PWM2_set_duty(duty);
}
Esto para evitar que ambas estén encendidas al mismo tiempo y que no
ocurra un corto circuito.
337
Proyecto #5: Fuente de poder lineal con control digital en pic16f886
y display lcd 16x2
338
sbit LCD_RS at RB7_bit;
sbit LCD_EN at RB6_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D4 at RB2_bit;
short duty;
float medicion;
char resultado[8];
bit mem1;
bit mem2;
bit mem3;
bit mem4;
void main() {
TRISA = 1;
TRISB = 0;
TRISC = 0;
ANSEL = 0b00000001;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
duty = 0;
mem1 = 0;
mem2 = 0;
mem3 = 0;
mem4 = 0;
LCD_Init();
LCD_cmd(_lcd_cursor_off);
LCD_cmd(_lcd_clear);
PWM1_init(2000);
PWM1_start();
while(1){
if(RA1_bit == 1 && mem1 == 0){
mem1 = 1;
}
339
if(RA1_bit == 0 && mem1 == 1){
duty = duty + 10;
mem1 = 0;
}
if(RA2_bit == 1 && mem2 == 0){
mem2 = 1;
}
if(RA2_bit == 0 && mem2 == 1){
duty = duty - 10;
mem2 = 0;
}
if(RA3_bit == 1 && mem3 == 0){
mem3 = 1;
}
if(RA3_bit == 0 && mem3 == 1){
duty = duty + 1;
mem3 = 0;
}
if(RA4_bit == 1 && mem4 == 0){
mem4 = 1;
}
if(RA4_bit == 0 && mem4 == 1){
duty = duty - 10;
mem4 = 0;
}
if(duty < 0 ){
duty = 0;
}
if(duty > 255){
duty = 255;
}
PWM1_set_duty(duty);
medicion = adc_read(0) * 0.0098;
floattostr(medicion,resultado);
lcd_out(1,1,"V:");
lcd_out(1,4,resultado);
}
}
340
Proyecto #6: Generador de voltaje de referencia de 8 bits de
precisión controlado por un teclado matriz y mostrado en lcd 16x2.
341
Código:
short h;
short contador1;
short contador2;
short tecla;
short var;
short dig1;
short dig2;
short dig3;
short dig4;
int duty;
bit mem1;
bit mem2;
bit mem3;
bit mem4;
bit mem5;
bit mem6;
bit mem7;
bit mem8;
bit mem9;
bit mem0;
char teclas [6];
void main() {
TRISA = 0;
TRISB = 0;
TRISC0_bit = 1;
TRISC1_bit = 1;
TRISC6_bit = 1;
342
TRISC7_bit = 1;
TRISC2_bit = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
lcd_init();
lcd_cmd(_lcd_cursor_off);
lcd_cmd(_lcd_clear);
pwm1_init(2000);
pwm1_start();
lcd_out(1,6,"mV");
lcd_out(2,1,"Res: 8 bits");
contador1 = 0;
contador2 = 0;
mem1 = 0;
mem2 = 0;
mem3 = 0;
mem4 = 0;
mem5 = 0;
mem6 = 0;
mem7 = 0;
mem9 = 0;
mem0 = 0;
dig1 = 0;
dig2 = 0;
dig3 = 0;
dig4 = 0;
h = 0;
tecla = 0;
var = 0;
while(1){
contador1 = contador1 + 1;
contador2 = contador2 + 1;
delay_us(800);
if(contador1 == 1){
ra0_bit = 1;
ra1_bit = 0;
ra2_bit = 0;
ra3_bit = 0;
}
343
if(contador1 == 2){
ra0_bit = 0;
ra1_bit = 1;
ra2_bit = 0;
ra3_bit = 0;
}
if(contador1 == 3){
ra0_bit = 0;
ra1_bit = 0;
ra2_bit = 1;
ra3_bit = 0;
}
if(contador1 == 4){
ra0_bit = 0;
ra1_bit = 0;
ra2_bit = 0;
ra3_bit = 1;
}
if(contador1 > 4){
contador1 = 0;
}
if(PORTA == 0b00000001){
if(rc0_bit == 1 && mem1 == 0){
mem1 = 1;
}
if(rc0_bit == 0 && mem1 == 1){
tecla = 1;
h = h + 1;
mem1 = 0;
}
if(rc1_bit == 1 && mem2 == 0){
mem2 = 1;
}
if(rc1_bit == 0 && mem2 == 1){
tecla = 2;
h = h + 1;
mem2 = 0;
}
if(rc7_bit == 1 && mem3 == 0){
mem3 = 1;
}
if(rc7_bit == 0 && mem3 == 1){
tecla = 3;
h = h + 1;
344
mem3 = 0;
}
if(rc6_bit == 1){
tecla = 10;
h = h + 1;
}
}
if(PORTA == 0b00000010){
if(rc0_bit == 1 && mem4 == 0){
mem4 = 1;
}
if(rc0_bit == 0 && mem4 == 1){
tecla = 4;
h = h + 1;
mem4 = 0;
}
if(rc1_bit == 1 && mem5 == 0){
mem5 = 1;
}
if(rc1_bit == 0 && mem5 == 1){
tecla = 5;
h = h + 1;
mem5 = 0;
}
if(rc7_bit == 1 && mem6 == 0){
mem6 = 1;
}
if(rc7_bit == 0 && mem6 == 1){
tecla = 6;
h = h + 1;
mem6 = 0;
}
if(rc6_bit == 1){
tecla = 11;
h = h + 1;
}
}
if(PORTA == 0b00000100){
if(rc0_bit == 1 && mem7 == 0){
mem7 = 1;
}
if(rc0_bit == 0 && mem7 == 1){
tecla = 7;
h = h + 1;
345
mem7 = 0;
}
if(rc1_bit == 1 && mem8 == 0){
mem8 = 1;
}
if(rc1_bit == 0 && mem8 == 1){
tecla = 8;
h = h + 1;
mem8 = 0;
}
if(rc7_bit == 1 && mem9 == 0){
mem9 = 1;
}
if(rc7_bit == 0 && mem9 == 1){
tecla = 9;
h = h + 1;
mem9 = 0;
}
if(rc6_bit == 1){
tecla = 12;
h = h + 1;
}
}
if(PORTA == 0b00001000){
if(rc0_bit == 1){
tecla = 13;
h = h + 1;
}
if(rc1_bit == 1 && mem0 == 0){
mem0 = 1;
}
if(rc1_bit == 0 && mem0 == 1){
tecla = 0;
h = h + 1;
mem0 = 0;
}
if(rc7_bit == 1){
tecla = 15;
h = h + 1;
}
if(rc6_bit == 1){
tecla = 16;
h = h + 1;
}
346
}
switch(tecla){
case 0 : lcd_out(1,h,"0");break;
case 1 : lcd_out(1,h,"1");break;
case 2 : lcd_out(1,h,"2");break;
case 3 : lcd_out(1,h,"3");break;
case 4 : lcd_out(1,h,"4");break;
case 5 : lcd_out(1,h,"5");break;
case 6 : lcd_out(1,h,"6");break;
case 7 : lcd_out(1,h,"7");break;
case 8 : lcd_out(1,h,"8");break;
case 9 : lcd_out(1,h,"9");break;
}
if(h > 4){
h = 1;
}
if(h == 1){
dig1 = tecla;
}
if(h == 2){
dig2 = tecla;
}
if(h == 3){
dig3 = tecla;
}
if(h == 4){
dig4 = tecla;
}
duty = ((dig1 * 1000) + (dig2 * 100) + (dig3*10)+(dig4))/19.4;
pwm1_set_duty(duty);
if(tecla == 16){
lcd_out(1,1," ");
h = 0;
duty = 0;
}
}
}
347
Proyecto #7: Carga variable digital.
348
Código:
int A;
char corriente [15];
int duty;
int contador;
bit guardar;
bit guardar2;
bit lock;
bit seguro1;
bit seguro2;
void main() {
TRISA = 1;
TRISB = 0;
TRISC = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
ANSEL = 0b0000001;
ANSELH = 0;
C1on_bit = 0;
C2on_bit = 0;
duty = 90;
lock = 0;
A = 0;
seguro1 = 0;
seguro2 = 0;
PWM1_start();
PWM1_init(2000);
349
lcd_init();
adc_init();
lcd_cmd(_lcd_clear);
lcd_cmd(_lcd_cursor_off);
lcd_out(1,1,"carga variable");
lcd_out(2,1,"digital Ver:1.0");
delay_ms(1000);
lcd_cmd(_lcd_clear);
while(1){
delay_ms(1);
contador = contador + 1;
if(ra2_bit == 1){
delay_ms(100);
duty = duty + 10;
}
if(ra3_bit == 1){
delay_ms(100);
duty = duty - 10;
}
if(duty > 255){
duty = 255;
}
if(duty < 0){
duty = 0;
}
pwm1_set_duty(duty);
350
Proyecto #8: Juego invasión alienígena.
351
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;
352
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 0);
}
void CustomChar1(char pos_row, char pos_char) {
char i;
Lcd_Cmd(72);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character2[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 1);
}
void main() {
Customchar;
Customchar1;
Customchar3;
Customchar4;
trisb = 0;
trisa = 1;
porta = 0;
353
ansel = 0;
anselh = 0;
c1on_bit = 0;
c2on_bit = 0;
lcd_init();
lcd_cmd(_lcd_cursor_off);
pos1 = 1;
m = 0;
n = 0;
o = 0;
u = 0;
pos2 = 4;
pos3 = 1;
pos4 = 1;
pos6 = 9;
pos7 = 3;
per = 0;
retardo = 100;
record = 0;
posdisp = 0;
posdisp2 = 0;
lcd_out(1,1,"invasion");
lcd_out(2,1,"alienigena");
delay_ms(1000);
lcd_cmd(_lcd_clear);
lcd_out(1,1,"hecho por:");
lcd_out(2,1,"Carlos Gonzalez");
delay_ms(1000);
lcd_cmd(_lcd_clear);
CustomChar1(1,16);
row1 = 1;
row2 = 2;
row3 = 1;
row4 = 2;
l = 0;
disparo1 = 0;
disparo2 = 0;
while(1){
if(per == 0){
Vdelay_ms(retardo);
m = m + 1;
n = n +1 ;
354
o = o + 1;
k = k + 1;
u = u + 1;
retardo = retardo - 1;
if(m == 1){
lcd_out(row1,pos2," ");
pos2 = pos2 + 1;
m = 0;
Customchar(1,pos2);
}
if(n == 1){
lcd_out(row2,pos3," ");
pos3 = pos3 + 1;
n = 0;
Customchar(2,pos3);
}
if(retardo < 200){
lcd_out(row2,pos6," ");
pos6 = pos6 + 1;
Customchar(2,pos6);
355
}
if(ra0_bit == 1){
pos4 = 16;
row3 = 1;
lcd_out(2,16," ");
customchar1(row3,pos4);
pos5 = 0;
}
if(ra1_bit == 1){
pos4 = 0;
row3 = 2;
lcd_out(1,16," ");
pos5 = 16;
customchar1(row3,pos5);
}
if(ra2_bit == 1 && row3 == 1){
disparo1 = 1;
posdisp = 15;
posdisp2 = 0;
}
if(ra2_bit == 1 && row3 == 2){
disparo2 = 1;
posdisp = 0;
posdisp2 = 15;
}
lcd_out(row3,posdisp," ");
posdisp = posdisp - 1;
lcd_out(row3,posdisp,"=");
if(posdisp < 1){
posdisp = 0;
disparo1 = 0;
}
}
if (disparo2 == 1 && disparo1 == 0 && row3 == 2 && row3 != 1){
lcd_out(row3,posdisp2," ");
posdisp2 = posdisp2 - 1;
lcd_out(row3,posdisp2,"=");
if(disparo2 < 1){
disparo2 = 0;
356
}
}
if(posdisp == pos2){
CustomChar3(1,posdisp);
delay_ms(100);
Customchar4(1,posdisp);
delay_ms(100);
lcd_out(1,posdisp," ");
pos2 = 2;
posdisp = 0;
disparo1 = 0;
record = record + 10;
}
if(posdisp2 == pos3){
CustomChar3(2,posdisp2);
delay_ms(100);
Customchar4(2,posdisp2);
delay_ms(100);
lcd_out(2,posdisp2," ");
pos3 = 2;
posdisp2 = 0;
disparo2 = 0;
record = record + 10;
}
if(posdisp == pos7){
CustomChar3(1,posdisp);
delay_ms(100);
Customchar4(1,posdisp);
delay_ms(100);
lcd_out(1,posdisp," ");
pos7 = 0;
posdisp = 0;
disparo1 = 0;
record = record + 10;
}
if(posdisp2 == pos6){
CustomChar3(2,posdisp2);
delay_ms(100);
Customchar4(2,posdisp2);
delay_ms(100);
lcd_out(2,posdisp2," ");
pos6 = 3;
posdisp2 = 0;
357
disparo2 = 0;
record = record + 10;
}
if(pos4 == pos2){
per = 1;
}
if(pos5 == pos3){
per = 1;
}
if(pos4 == pos7){
per = 1;
}
if(pos5 == pos6){
per = 1;
}
record = record + 1;
}
inttostr(record,rec);
if(per == 1){
lcd_out(1,1,"puntos:");
lcd_out(1,9,rec);
lcd_out(2,1,"press restart");
if(ra3_bit == 1){
delay_ms(50);
lcd_cmd(_lcd_clear);
per = 0;
CustomChar1(1,16);
retardo = 250;
record = 0;
pos2 = 4;
pos3 = 1;
pos4 = 1;
pos6 = 9;
pos7 = 3;
row3 = 1;
}
}
}
}
358
359
Extras
En esta sección encontraras informacion adicional util referente a todo lo
visto en el libro.
360
Tipos de encapsulados
Los encapsulados son muy importantes al momento de elegir un
componente electronico.
TO-92 A, B y C
361
TO-126
TO-220
362
TO-03P
T0-03
363
En circuitos integrados puedes encontrar los siguientes encapsulados:
364
Encapsulado DIP (Dual in-line
package).
365
Encapsulado QIP(Quadruple
in-line package).
El encapsulado QIP o encapsulado de linea cuadruple, es un
encapsulado en el cual se tiene 4 lineas de pines.
Tambien cabe remarcar que este tipo de encapsulados solo son vistos
en tecnología SMD (montaje superficial). Esto para ahorrar espacio y
reducir el tamaño de las PCB.
366
Encapsulado LGA.
El encapsulado LGA tiene la caracteristica de poseer los pines por
debajo del cuerpo. Teniendo forma de pads y los cuales solo pueden ser
soldados usando reflow o hot oven.
367
Lectura y comprensión de datasheets.
Los datasheets o hojas de datos, son documentos realizados por los
fabricantes de componentes donde se especifican:
Caracteristicas electricas
Capacidades termicas
Dimensiones
Etc.
Estos son muy útiles para poder verificar si un componente cumple con
las características necesarias para nuestra aplicación
http://www.alldatasheet.es/
368
Usaremos más en específico al fabricante ON semiconductor.
369
Total power dissipation: Este es el valor de potencia máximo que
puede disipar. Aquí hay que tener mucho cuidado pues muchos
principiantes caen en una trampa mortal.
Es por eso que ahí mismo dice “Derate above 25º C” lo cual significa
que el valor DISMINUYE pasando los 25ºC. ¿Cuánto? 0.32W/ºC
Si el valor del HFE es muy bajo, al igual que nuestra corriente de base,
podría hacer que no sea útil para nuestra aplicación.
370
Ahora veamos el datasheet del regulador 7805.
371
En esta tabla tenemos diversos valores de funcionamiento más
detallados, verás que en la tabla se divide tanto para el lm7805l como
para el lm7805, a continuación solo haremos referencia al lm7805.
Output voltage: Voltaje de salida, el cual puede ser desde 4.75V hasta
5.25V.
372
Tipos de transformadores.
Transformador de línea
373
Transformador de aislamiento
374
Transformadores toroidales.
375
Transformadores de alta frecuencia.
376
Tipos de switches.
Existen diversos tipos de switches que puedes usar para proyectos, los
que mencionaremos a continuación son los mas populares.
Push button
Los push button son botones de acción momentánea, es decir, que solo
cierran al momento en el que tú los presionas.
377
Switch
Switch SPDT
378
Switch DPDT
Los switches DPDT o dos polos dos tiros, son switches que cuentan con
2 entradas y 4 salidas, o lo opuesto, 2 salidas y 4 entradas.
Switch rotatorio
379
Tipos de capacitores y valores
comerciales.
Capacitores cerámicos.
Por ejemplo:
104 = 100,000 pF
380
Capacitores de poliéster.
381
Capacitores de tantalio.
382
Capacitores electrolíticos.
Los capacitores electrolíticos son los capacitores que más carga pueden
retener. La relación de carga que pueden retener y el voltaje máximo
serán directamente proporcionales al tamaño del capacitor.
383
Valores comerciales de capacitores.
Aplicando los valores más chicos (pF y nF) a los capacitores cerámicos
y de poliéster.
384
Tipos de resistencias y valores
comerciales
Resistencias de carbón
Resistencia de 0.1W
Solo presente en SMD
Resistencia de 1/8 W
Resistencia de ¼ W
Resistencia de 1/2W
385
Resistencia de 1W
Resistencia de 2W
386
10 * 100 = 1000 ohms.
Resistencias de cerámica.
Resistencia de 5W
Resistencia de 10W
Resistencia de 20W
387
La resistencia y potencia están marcados con numero en el frente.
Valores comerciales.
388
Tipos de baterías
Existen diferentes tipos de baterías, cada una con diferentes
características para cada tipo de aplicación, veamos a continuación los
tipos de baterías más comunes.
389
Batería AAA
Batería AA
390
Batería C
Batería D
391
Batería de 9V
Baterías de bajo voltaje pero con alta corriente de salida. Usadas para
circuitos que consumen mucha corriente. Suelen tener la capacidad de
6V y 48Wh.
392
Batería de 12V
Batería Li-ion
393
También tenemos la batería de 7.4V de li-ion. Este tipo de baterías se
usa para proyectos de mayor requerimiento de voltaje, como los drones,
robots, carros RC, etc. Su capacidad suele ser de 7.4V y 16.8Wh.
394
¿Cómo se mide la capacidad de
baterías y energía consumida?
Y así sucesivamente.
También se usa el termino mWh, el cual se refiere a mili watts por hora.
Recuerda que 1000mW = 1W.
395
Por ejemplo:
396
Tipos de conectores.
Conector molex.
397
Conector de bloque
398
Conectores header.
Los header son un tipo de conectores usados para diversos fines, pero
principalmente para placas de prototipo, conectar componentes a una
pcb o unir placas entre sí, aquí algunos ejemplos.
399
Conector BNC
400
Conector Banana
401
Conectores de audio
Conector 3.5mm
Conector 6.35mm
402