Está en la página 1de 85

INSTITUTO SUPERIOR

PEDRO P. DÍAZ

ELECTRÓNICA INDUSTRIAL

Proyecto:

“ROBOT EN FORMA DE GUSANO”

Presentado por:

Jesús Francisco Arce Moreno

AREQUIPA – PERÚ

2009
1
DEDICATORIA

Dedico el presente trabajo a mí laptop

y a mi gata Minina, por todas aquellas

horas de compañía y de apoyo

brindado.

2
AGRADECIMIENTOS

Agradezco la confianza y apoyo que me brindo el grupo de investigación y

desarrollo “GRID” de la Universidad Alas Peruanas, que fueron los únicos que se

atrevieron a apoyar y financiar el presente trabajo.

3
RESUMEN

Un robot es una entidad virtual o mecánica artificial. En la práctica, esto es por lo general
un sistema electro-mecánico que, por su apariencia o sus movimientos, ofrece la sensación
de tener un propósito propio. La palabra robot puede referirse tanto a mecanismos físicos
como a sistemas virtuales de software, aunque suele aludirse a los segundos con el término
de bots.
No hay un consenso sobre qué máquinas pueden ser consideradas robots, pero sí existe un
acuerdo general entre los expertos y el público sobre que los robots tienden a hacer parte o
todo lo que sigue: moverse, hacer funcionar un brazo mecánico, sentir y manipular su
entorno y mostrar un comportamiento inteligente, especialmente si ése comportamiento
imita al de los humanos o a otros animales.

La idea de la construcción de un robot en forma de gusano, surge al querer investigar y


desarrollar software de inteligencia artificial y aplicarlo en una entidad física.

El robot desarrollado en el presente trabajo está dotado de un grado de inteligencia


artificial, ya que posee en su procesador central una red neuronal Perceptron.

El sentido de aplicar una red neuronal Perceptron es que debido a su sencillez es muy fácil
comprenderlo, y también ya que solo se controla el avance o retroceso de la maquina, y al
ser estas variables independientes, el uso de una red Perceptron es optimo y muy útil.

4
INDICE GENERAL

Pág.
Dedicatoria 2

Agradecimientos 3

Resumen 4

Índice General 5

Índice de Figuras 6

Índice de tablas 7

Índice de Anexos 8

Introducción 9

Capítulo 1 - Planteamiento Teórico 10

Capítulo 2 - Marco de Referencia 19

Capítulo 3 - Planteamiento Operacional 43

Capítulo 4 - Discusión de Resultados 66

Capítulo 5 - Conclusiones y Recomendaciones 67

Bibliografía Consultada 68

Anexos 69

5
ÍNDICE DE FIGURAS

Pág.

Figura 1. Función AND 15

Figura 2. Función OR 15

Figura 3. Función XOR 15

Figura 4. Red Neuronal Perceptron Multicapa 16

Figura 5. Esquema de un microcontrolador 19

Figura 6. Diagrama de bloques 43

Figura 7. Detector infrarrojo de proximidad 44

Figura 8. LM567 44

Figura 9. Diagrama esquemático de los sensores 45

Figura 10. IRF 540n 46

Figura 11. Diagrama esquemático del circuito de potencia 47

Figura 12. PBC de circuito de potencia 47

Figura 13. PCB para el PIC 16f877a 49

Figura 14. Red tipo Perceptron 52

Figura 15. Herramientas e instrumentos 55

Figura 16. Alambre galvanizado 56

Figura 17. Estructura del robot 56

Figura 18. Vectores tomados en consideración 57

Figura 19. Posición de la batería 57

Figura 20. Posición de las placas 58

6
ÍNDICE DE TABLAS

Pág.

Tabla 1. Comportamiento del robot 50

Tabla 2. Comportamiento del robot 2 51

Tabla 3. Valores iniciales de la red 52

Tabla 4. Valores finales de la red 53

Tabla 5. Simulación de la red para los Patrones de Entrenamiento 54

Tabla 6. Simulación de la red para las nuevas combinaciones 54

7
ÍNDICE DE ANEXOS

Pág.

Anexo - PIC 16f877a 70

Anexo - LM567 73

Anexo - PN2N2222 76

Anexo - BC547 79

Anexo - BC556 81

Anexo - IRF 540 83

8
INTRODUCCIÓN

El presente trabajo lo desarrollo en cinco capítulos, los mismos que se detallan a

continuación:

En el Capítulo 1, Planteamiento Teórico, me refiero a la explicación de los sistemas

que utilizan microprocesadores en general.

En el Capítulo 2, Marco de Referencia, realizo una descripción detallada de los

componentes que intervienen en el circuito electrónico, explicando los tipos de dispositivos

y componentes electrónicos, la forma de probarlos, y sus características técnicas más

saltantes.

En el Capítulo 3, Planteamiento Operacional, explico el funcionamiento del circuito,

en una explicación detallada de todas las partes constituyentes del mismo.

En el Capítulo 4, Discusión de Resultados, explico características como montaje y

precauciones ha tener en cuenta por parte de los usuarios y técnicos.

En el Capítulo 5 detallo las Conclusiones y Recomendaciones a las cuales he

llegado después de haber realizado prolongados análisis sobre mi trabajo. Finalmente,

presento la bibliografía consultada, en la cual detallo los textos utilizados y las páginas web

a las cuales he recurrido para la obtención de información técnica, conocida como Data

sheets. Culminando con la presentación con una serie de Anexos principalmente de

carácter técnico informativo para las personas que se dignen investigar en este modesto

trabajo.

Gracias

9
CAPÍTULO 1

PLANTEAMIENTO TEÓRICO

ROBOT

Un robot es una entidad virtual o mecánica artificial. En la práctica, esto es por lo


general un sistema electro-mecánico que, por su apariencia o sus movimientos,
ofrece la sensación de tener un propósito propio. La palabra robot puede referirse
tanto a mecanismos físicos como a sistemas virtuales de software, aunque suele
aludirse a los segundos con el término de bots.[]

No hay un consenso sobre qué máquinas pueden ser consideradas robots, pero sí
existe un acuerdo general entre los expertos y el público sobre que los robots
tienden a hacer parte o todo lo que sigue: moverse, hacer funcionar un brazo
mecánico, sentir y manipular su entorno y mostrar un comportamiento inteligente,
especialmente si ése comportamiento imita al de los humanos o a otros animales.

Aunque las historias sobre ayudantes y acompañantes artificiales, así como los
intentos de crearlos, tienen una larga historia, las máquinas totalmente autónomas
no aparecieron hasta el siglo XX. El primer robot programable y dirigido de forma
digital, el Unimate, fue instalado en 1961 para levantar piezas calientes de matel de
una máquina de tinte y colocarlas.

Por lo general, la gente reacciona de forma positiva ante los robots con los que se
encuentra. Los robots domésticos para la limpieza y mantenimiento del hogar son
cada vez más comunes en los hogares. No obstante, existe una cierta ansiedad sobre
el impacto económico de la automatización y la amenaza del armamento robótico,
una ansiedad que se ve reflejada en el retrato a menudo perverso y malvado de
robots presentes en obras de la cultura popular. Comparados con sus colegas de
ficción, los robots reales siguen siendo torpes y cortos de entendederas.

10
La robótica es la ciencia y la tecnología de los robots. Se ocupa del diseño,
manufactura y aplicaciones de los robots.[][] La robótica combina diversas
disciplinas como son: la mecánica, la electrónica, la informática, la inteligencia
artificial y la ingeniería de control [] Otras áreas importantes en robótica son el
álgebra, los autómatas programables y las máquinas de estados.

Historia de la robótica

La historia de la robótica ha estado unida a la construcción de "artefactos", que


trataban de materializar el deseo humano de crear seres a su semejanza y que lo
descargasen del trabajo. El ingeniero español Leonardo Torres Quevedo (GAP)
(que construyó el primer mando a distancia para su torpedo automóvil mediante
telegrafía sin hilo, el ajedrecista automático, el primer transbordador aéreo y otros
muchos ingenios) acuñó el término "automática" en relación con la teoría de la
automatización de tareas tradicionalmente asociadas a los humanos.

Karel Čapek, un escritor checo, acuñó en 1921 el término "Robot" en su obra


dramática "Rossum's Universal Robots / R.U.R.", a partir de la palabra checa
robota, que significa servidumbre o trabajo forzado. El término robótica es acuñado
por Isaac Asimov, definiendo a la ciencia que estudia a los robots. Asimov creó
también las Tres Leyes de la Robótica. En la ciencia ficción el hombre ha
imaginado a los robots visitando nuevos mundos, haciéndose con el poder, o
simplemente aliviando de las labores caseras.

Nombre del
Fecha Importancia Inventor
robot

Descripciones de más de 100 máquinas y autómatas,


Ctesibius de
Siglo I incluyendo un artefacto con fuego, un órgano de
Alexandria, Filón de
a. C. y viento, una máquina operada mediante una moneda,
Bizancio, Herón de
antes una máquina de vapor, en Pneumatica y Automata de
Alexandria, y otros
Herón de Alexandria

1206 Primer robot humanoide programable Barco con Al-Jazari

11
cuatro músicos
robotizados

Caballero
c. 1495 Diseño de un robot humanoide Leonardo da Vinci
mecánico

Pato mecánico capaz de comer, agitar sus alas y


1738 Digesting Duck Jacques de Vaucanson
excretar.

Juguetes mecánicos japoneses que sirven té, disparan Juguetes


1800s Hisashige Tanaka
flechas y pintan. Karakuri

Rossum's
Aparece el primer autómata de ficción llamado
1921 Universal Karel Čapek
"robot", aparece en R.U.R.
Robots

Se exhibe un robot humanoide en la World's Fairs Westinghouse Electric


1930s Elektro
entre los años 1939 y 1940 Corporation

Exhibición de un robot con comportamiento biológico


1948 Elsie y Elmer William Grey Walter
simple[4]

Primer robot comercial, de la compañía Unimation


1956 fundada por George Devol y Joseph Engelberger, Unimate George Devol
basada en una patente de Devol[5]

1961 Se instala el primer robot industrial Unimate George Devol

1963 Primer robot "palletizing"[6] Palletizer Fuji Yusoki Kogyo

1973 Primer robot con seis ejes electromecánicos Famulus KUKA Robot Group

Brazo manipulador programable universal, un


1975 PUMA Victor Scheinman
producto de Unimation

12
RED NEURONAL PERCEPTRON SIMPLE

El perceptrón es un tipo de red neuronal artificial desarrollado por Frank


Rosenblatt, también puede entenderse como perceptrón la neurona artificial y
unidad básica de inferencia en forma de discriminador lineal, que constituye este
modelo de red neuronal artificial, esto debido a que el perceptrón puede usarse
como neurona dentro de un perceptrón más grande u otro tipo de red neuronal
artificial.
Definición
El perceptrón usa una matriz para representar las redes neuronales y es un
discriminador terciario que traza su entrada x (un vector binario) a un único valor
de salida f(x) (un solo valor binario) a través de dicha matriz.

Donde w es un vector de pesos reales y es el producto punto (que computa


una suma ponderada). u es el 'umbral', el cual representa el grado de inhibición de
la neurona, es un término constante que no depende del valor que tome la entrada.
El valor de f(x) (0 o 1) se usa para clasificar x como un positivo o un caso
negativo, en el caso de un problema de la clasificación binario. El umbral puede
pensarse de cómo compensar la función de activación, o dando un nivel bajo de
actividad a la neurona del rendimiento. La suma ponderada de las entradas debe
producir un valor mayor que u para cambiar la neurona de estado 0 a 1.
Aprendizaje
El algoritmo de aprendizaje es el mismo para todas las neuronas, todo lo que sigue
se aplica a una sola neurona en el aislamiento. Nosotros definimos algunas
variables primero:
el x(j) denota el elemento en la posición j en el vector de la entrada
el w(j) el elemento en la posición j en el vector de peso
el y denota la salida de la neurona
el δ denota la salida esperada
el α es una constante tal que 0 < α < 1

13
Los pesos son actualizados después de cada entrada según la regla de actualización
siguiente:

Por lo cual, el aprendizaje es modelado como la actualización del vector de peso


después de cada iteración, lo cual sólo tendrá lugar si la salida y difiere de la salida
deseada δ. Para considerar una neurona al interactuar en múltiples iteraciones
debemos definir algunas variables más:
xi denota el vector de entrada para la iteración i
wi denota el vector de peso para la iteración i
yi denota la salida para la iteración i

denota un periodo de aprendizaje de m


iteraciones
En cada iteración el vector de peso es actualizado como sigue:

Para cada pareja ordenada (x,y) en


Pasar (xi,yi,wi) a la regla de actualización w(j)' = w(j) + α(δ − y)x(j)
El periodo de aprendizaje Dm se dice que es separable linealmente si existe un

valor positivo γ y un vector de peso w tal que: para


todos los i.
Novikoff (1962) probo que el algoritmo de aprendizaje converge después de un
número finito de iteraciones si los datos son separables linealmente y el número de

errores está limitado a: .


Sin embargo si los datos no son separables linealmente, la línea de algoritmo
anterior no se garantiza que converja.
Ejemplo
Considere las funciones AND y OR, estas funciones son linealmente separables y
por lo tanto pueden ser aprendidas por un perceptrón.

14
Figura 1. Función AND Figura 2. Función OR

La función XOR no puede ser aprendida por un único perceptrón puesto que
requiere al menos de dos líneas para separar las clases (0 y 1). Debe utilizarse al
menos una capa adicional de perceptrones para permitir su aprendizaje.

Figura 3. Función XOR

Perceptrón multicapa
El perceptrón multicapa es una red neuronal artificial (RNA) formada por
múltiples capas, esto le permite resolver problemas que no son linealmente
separables, lo cual es la principal limitación del perceptrón (también llamado
perceptrón simple). El perceptrón multicapa puede ser totalmente o localmente
conectado. En el primer caso cada salida de una neurona de la capa "i" es entrada
de todas las neuronas de la capa "i+1", mientras que el segundo, cada neurona de
la capa "i" es entrada de una serie de neuronas (región) de la capa "i+1".

15
Figura 4. Red Neuronal Perceptron Multicapa

Las capas pueden clasificarse en tres tipos:


Capa de entrada: Constituida por aquellas neuronas que introducen los patrones de
entrada en la red. En estas neuronas no se produce procesamiento.
Capas ocultas: Formada por aquellas neuronas cuyas entradas provienen de capas
anteriores y las salidas pasan a neuronas de capas posteriores.
Capa de salida: Neuronas cuyos valores de salida se corresponden con las salidas
de toda la red.
La propagación hacia atrás (también conocido como retropropagación del error o
regla delta generalizada), es un algoritmo utilizado en el entrenamiento de estas
redes, por ello, el perceptrón multicapa también es conocido como red de
retropropagación (no confundir con la red de contrapropagación).

Características

 Las funciones de transferencia de los elementos de procesado (neuronas) han de


ser derivables.

Limitaciones

 El Perceptrón Multicapa no extrapola bien, es decir, si la red se entrena mal o de


manera insuficiente, las salidas pueden ser imprecisas.

 La existencia de mínimos locales en la función de error dificulta


considerablemente el entrenamiento, pues una vez alcanzado un mínimo el

16
entrenamiento se detiene aunque no se haya alcanzado la tasa de convergencia
fijada.

Cuando caemos en un mínimo local sin satisfacer el porcentaje de error permitido se


puede considerar: cambiar la topología de la red (número de capas y número de
neuronas), comenzar el entrenamiento con unos pesos iniciales diferentes, modificar
los parámetros de aprendizaje, modificar el conjunto de entrenamiento o presentar
los patrones en otro orden.

Aplicaciones

El perceptrón multicapa (de aquí en adelante MLP, MultiLayer Perceptron) se


utiliza para resolver problemas de asociación de patrones, segmentación de
imágenes, compresión de datos, etc.

Compresión de datos

Considerese un MLP de 3 capas, una de entrada, una oculta y la de salida. La capa


de entrada está formada por N neuronas, la capa oculta por M (M < N) neuronas y la
capa de salida posee N neuronas al igual que la capa de entrada. Se entrena dicho
MLP para que cuando se le de como entrada un vector de datos (x 1, x2,..., xN)
devuelva ese mismo vector de datos como salida, con ello estamos aprendiendo al
MLP a transformar un vector de N componentes en uno de M componentes
(recordemos que M < N) y a recuperar el vector original a partir del vector
"comprimido".

Una vez que el MLP esté entrenado se procede de la siguiente forma:

 Compresión: Para comprimir los datos utilizamos un MLP de dos capas, la


de entrada con N neuronas y la de salida con M, los pesos de estas dos capas
son los de la capa de entrada y oculta respectivamente, del MLP que
entrenamos anteriormente.

17
 Descompresión: Para descomprimir los datos utilizamos un MLP de dos capas,
la de entrada con M neuronas y la de salida con N, los pesos de estas dos capas
son los de la capa oculta y la de salida respectivamente, del MLP que
entrenamos anteriormente.

El MLP no conseguirá (al menos normalmente) un error nulo durante el


entrenamiento, por lo que se trata de un sistema de compresión con pérdidas.
Obviamente cuanto mayor queramos que sea el factor de compresión, más error se
cometerá.

18
CAPÍTULO 2

MARCO DE REFERENCIA

MICROCONTROLADOR

Un microcontrolador es un circuito integrado o chip que incluye en su interior las


tres unidades funcionales de una computadora: CPU, Memoria y Unidades de E/S.

Características

Son diseñados para disminuir el costo económico y el consumo de energía de un


sistema en particular. Por eso el tamaño de la CPU, la cantidad de memoria y los
periféricos incluidos dependerán de la aplicación. El control de un electrodoméstico
sencillo como una batidora, utilizará un procesador muy pequeño (4 u 8 bit) por que
sustituirá a un autómata finito. En cambio un reproductor de música y/o vídeo
digital (mp3 o mp4) requerirá de un procesador de 32 bit o de 64 bit y de uno o más
Códec de señal digital (audio y/o vídeo). El control de un sistema de frenos ABS
(Antilock Brake System) se basa normalmente en un microcontrolador de 16 bit, al
igual que el sistema de control electrónico del motor en un automóvil.

Figura 5. Esquema de un microcontrolador

19
Los microcontroladores representan la inmensa mayoría de los chips de
computadoras vendidos, sobre un 50% son controladores "simples" y el restante
corresponde a DSPs más especializados. Mientras se pueden tener uno o dos
microprocesadores de propósito general en casa (Ud. está usando uno para esto),
usted tiene distribuidos seguramente entre los electrodomésticos de su hogar una o
dos docenas de microcontroladores. Pueden encontrarse en casi cualquier
dispositivo electrónico como automóviles, lavadoras, hornos microondas, teléfonos,
etc.

Un microcontrolador difiere de una CPU normal, debido a que es más fácil


convertirla en una computadora en funcionamiento, con un mínimo de chips
externos de apoyo. La idea es que el chip se coloque en el dispositivo, enganchado a
la fuente de energía y de información que necesite, y eso es todo. Un
microprocesador tradicional no le permitirá hacer esto, ya que espera que todas estas
tareas sean manejadas por otros chips. Hay que agregarle los modulos de
entrada/salida (puertos) y la memoria para almacenamiento de información.

Por ejemplo, un microcontrolador típico tendrá un generador de reloj integrado y


una pequeña cantidad de memoria RAM y ROM/EPROM/EEPROM/FLASH,
significando que para hacerlo funcionar, todo lo que se necesita son unos pocos
programas de control y un cristal de sincronización. Los microcontroladores
disponen generalmente también de una gran variedad de dispositivos de
entrada/salida, como convertidores de analógico a digital, temporizadores, UARTs y
buses de interfaz serie especializados, como I 2C y CAN. Frecuentemente, estos
dispositivos integrados pueden ser controlados por instrucciones de procesadores
especializados. Los modernos microcontroladores frecuentemente incluyen un
lenguaje de programación integrado, como el BASIC que se utiliza bastante con este
propósito.

Los microcontroladores negocian la velocidad y la flexibilidad para facilitar su uso.


Debido a que se utiliza bastante sitio en el chip para incluir funcionalidad, como los

20
dispositivos de entrada/salida o la memoria que incluye el microcontrolador, se ha
de prescindir de cualquier otra circuitería.

Núcleo de un microcontrolador

Aún cuando el microcontrolador es una computadora embebida dentro de un


circuito integrado, se compone de un núcleo y un conjunto de circuitos adicionales.
Dentro del núcleo se encuentran el procesador y la memoria, todo ello estructurado
de forma tal que conforme una arquitectura de computadora.

Arquitecturas de computadora

Básicamente existen dos arquitecturas de computadoras, y por supuesto, están


presentes en el mundo de los microcontroladores: Von Neumann y Harvard. Ambas
se diferencian en la forma de conexión de la memoria al procesador y en los buses
que cada una necesita.

La arquitectura Von Neumann es la que se utiliza en las computadoras personales,


para ella existe una sola memoria, donde coexisten las instrucciones de programa y
los datos, accedidos con un bus de dirección, uno de datos y uno de control.

Debemos comprender que en una PC, cuando se carga un programa en memoria, a


éste se le asigna un espacio de direcciones de la memoria que se divide en
segmentos, de los cuales típicamente tenderemos los siguientes: código (programa),
datos y pila. Es por ello que podemos hablar de la memoria como un todo, aunque
existan distintos dispositivos físicos en el sistema (HDD, RAM, CD, FLASH).

En el caso de los microcontroladores, existen dos tipos de memoria bien definidas:


memoria de datos (típicamente algún tipo de SRAM) y memoria de programas
(ROM, PROM, EEPROM, FLASH u de otro tipo no volátil). En este caso la
organización es distinta a las de las PC, porque hay circuitos distintos para cada
memoria y normalmente no se utilizan los registros de segmentos, sino que la
memoria está segregada y el acceso a cada tipo de memoria depende de las
instrucciones del procesador.
21
A pesar de que en los sistemas embebidos con arquitectura Von Neumann la
memoria esté segregada, y existan diferencias con respecto a la definición
tradicional de esta arquitectura; los buses para acceder a ambos tipos de memoria
son los mismos, del procesador solamente salen el bus de datos, el de direcciones, y
el de control. Como conclusión, la arquitectura no ha sido alterada, porque la forma
en que se conecta la memoria al procesador sigue el mismo principio definido en la
arquitectura básica.

Esta arquitectura es la variante adecuada para las PC, porque permite ahorrar una
buena cantidad de líneas de E/S, que son bastante costosas, sobre todo para aquellos
sistemas como las PC, donde el procesador se monta en algún tipo de socket alojado
en una placa madre (motherboard). También esta organización les ahorra a los
diseñadores de motherboards una buena cantidad de problemas y reduce el costo de
este tipo de sistemas.

Algunas familias de microcontroladores como la INTEL-51 y la Z80 implementan


este tipo de arquitectura, fundamentalmente porque era la utilizada cuando
aparecieron los primeros microcontroladores.

La otra variante es la arquitectura Harvard, y por excelencia la utilizada en


supercomputadoras, en los microcontroladores, y sistemas embebidos en general.
En este caso, además de la memoria, el procesador tiene los buses segregados, de
modo que cada tipo de memoria tiene un bus de datos, uno de direcciones y uno de
control.

La ventaja fundamental de esta arquitectura es que permite adecuar el tamaño de los


buses a las características de cada tipo de memoria; además, el procesador puede
acceder a cada una de ellas de forma simultánea, lo que se traduce en un aumento
significativo de la velocidad de procesamiento, típicamente los sistemas con esta
arquitectura pueden ser dos veces más rápidos que sistemas similares con
arquitectura Von Neumann.

22
La desventaja está en que consume muchas líneas de E/S del procesador; por lo que
en sistemas donde el procesador está ubicado en su propio encapsulado, solo se
utiliza en supercomputadoras. Sin embargo, en los microcontroladores y otros
sistemas embebidos, donde usualmente la memoria de datos y programas comparten
el mismo encapsulado que el procesador, este inconveniente deja de ser un
problema serio y es por ello que encontramos la arquitectura Harvard en la mayoría
de los microcontroladores.

Procesador en detalle

Hace algún tiempo alguien me preguntaba cuales eran los dos inventos y los dos
descubrimientos más relevantes en el desarrollo de la humanidad y después de un
poco de reflexión llegamos a la siguiente conclusión; descubrimientos: el fuego, y la
electricidad; inventos: la rueda y el microprocesador. Claro que los más excelsos
eruditos pueden estar en desacuerdo con nosotros, pero no debemos estar lejos de la
verdad.

En los años 70 del siglo XX, la electrónica digital todavía andaba medio que en
pañales, pero dentro de la electrónica ya era una especialidad consagrada. En aquel
entonces las computadoras se diseñaban para que realizaran algunas operaciones
muy simples, y si se quería que estas máquinas pudiesen hacer cosas diferentes, era
necesario realizar cambios bastante significativos al hardware.

A principios de los años 70, una empresa japonesa le encargó a una joven compañía
norteamericana que desarrollara un conjunto de circuitos para producir una
calculadora de bajo costo. INTEL se dedicó de lleno a la tarea y entre los circuitos
encargados desarrolló uno muy especial, algo no creado hasta la fecha: el primer
microprocesador integrado.

El 4004 salió al mercado en 1971, es una máquina digital sincrónica compleja,


como cualquier otro circuito lógico secuencial sincrónico. Sin embargo, la ventaja
de este componente está en que aloja internamente un conjunto de circuitos digitales
que pueden hacer operaciones corrientes para el cálculo y procesamiento de datos,

23
pero desde una óptica diferente: sus entradas son una serie de códigos bien
definidos, que permiten hacer operaciones de carácter específico cuyo resultado está
determinado por el tipo de operación y los operandos involucrados.

Visto así, no hay nada de especial en un microprocesador; la maravilla está en que


la combinación adecuada de los códigos de entrada, su ejecución secuencial, el
poder saltar hacia atrás o adelante en la secuencia de códigos en base a decisiones
lógicas u órdenes específicas, permite que la máquina realice un montón de
operaciones complejas, no contempladas en los simples códigos básicos.

Hoy estamos acostumbrados a los sistemas con microprocesadores, pero en el


“lejano” 1971 esta era una forma de pensar un poco diferente y hasta escandalosa, a
tal punto que Busicom, la empresa que encargó los chips a INTEL, no se mostró
interesada en el invento, así que INTEL puso manos a la obra y lo comercializó para
otros que mostraron interés; y bueno, el resto de la historia: una revolución sin
precedentes en el avance tecnológico de la humanidad.

Es lógico pensar que el invento del microprocesador integrado no fue una


revelación divina para sus creadores, sino que se sustentó en los avances, existentes
hasta el momento, en el campo de la electrónica digital y las teorías sobre
computación. Pero sin lugar a dudas fue la gota que colmó la copa de la revolución
científico-técnica, porque permitió desarrollar aplicaciones impensadas o acelerar
algunas ya encaminadas. La conclusión es simple, el mundo era uno antes del
microprocesador y otro después de su invención, piense en un mundo sin
microprocesadores y se encontrará remontado a los años 70 del siglo XX.

Ahora comenzaremos a ver cómo es que está hecho un procesador, no será una
explicación demasiado detallada porque desde su invención éste ha tenido
importantes revoluciones propias, pero hay aspectos básicos que no han cambiado y
que constituyen la base de cualquier microprocesador. En la Figura 4 podemos ver
la estructura típica de un microprocesador, con sus componentes fundamentales,
claro está que ningún procesador real se ajusta exactamente a esta estructura, pero

24
aún así nos permite conocer cada uno de sus elementos básicos y sus
interrelaciones.

Registros

Son un espacio de memoria muy reducido pero necesario para cualquier


microprocesador, de aquí se toman los datos para varias operaciones que debe
realizar el resto de los circuitos del procesador. Los registros sirven para almacenar
los resultados de la ejecución de instrucciones, cargar datos desde la memoria
externa o almacenarlos en ella.

Aunque la importancia de los registros parezca trivial, no lo es en absoluto. De


hecho una parte de los registros, la destinada a los datos, es la que determina uno de
los parámetros más importantes de cualquier microprocesador. Cuando escuchamos
que un procesador es de 4, 8, 16, 32 ó 64 bits, nos estamos refiriendo a procesadores
que realizan sus operaciones con registros de datos de ese tamaño, y por supuesto,
esto determina muchas de las potencialidades de estas máquinas.

Mientras mayor sea el número de bits de los registros de datos del procesador,
mayores serán sus prestaciones, en cuanto a poder de cómputo y velocidad de
ejecución, ya que este parámetro determina la potencia que se puede incorporar al
resto de los componentes del sistema, por ejemplo, no tiene sentido tener una ALU
de 16 bits en un procesador de 8 bits.

Por otro lado un procesador de 16 bits, puede que haga una suma de 16 bits en un
solo ciclo de máquina, mientras que uno de 8 bits deberá ejecutar varias
instrucciones antes de tener el resultado, aún cuando ambos procesadores tengan la
misma velocidad de ejecución para sus instrucciones. El procesador de 16 bits será
más rápido porque puede hacer el mismo tipo de tareas que uno de 8 bits, en menos
tiempo.

25
Unidad de control

Esta unidad es de las menos importantes en el procesador, en ella recae la lógica


necesaria para la decodificación y ejecución de las instrucciones, el control de los
registros, la ALU, los buses y cuanta cosa más se quiera meter dentro del
procesador.

La unidad de control es uno de los elementos fundamentales que determinan las


prestaciones del procesador, ya que su tipo y estructura, determina parámetros tales
como el tipo de conjunto de instrucciones, velocidad de ejecución, tiempo del ciclo
de máquina, tipo de buses que puede tener el sistema, manejo de interrupciones y un
buen número de cosas más que en cualquier procesador van a parar a este bloque.

Por supuesto, las unidades de control, son el elemento más complejo de un


procesador y normalmente están divididas en unidades más pequeñas trabajando de
conjunto. La unidad de control agrupa componentes tales como la unidad de
decodificación, unidad de ejecución, controladores de memoria cache, controladores
de buses, controladores de interrupción, pipelines, entre otros elementos,
dependiendo siempre del tipo de procesador.

Unidad aritmética y lógica

Como los procesadores son circuitos que hacen básicamente operaciones lógicas y
matemáticas, se le dedica a este proceso una unidad completa, con cierta
independencia. Aquí es donde se realizan las sumas, restas, y operaciones lógicas
típicas del álgebra de Boole.

Actualmente este tipo de unidades ha evolucionado mucho y los procesadores más


modernos tienen varias ALU, especializadas en la realización de operaciones
complejas como las operaciones en coma flotante. De hecho en muchos casos le han
cambiado su nombre por el de “coprocesador matemático”, aunque este es un
término que surgió para dar nombre a un tipo especial de procesador que se conecta
directamente al procesador más tradicional.

26
Su impacto en las prestaciones del procesador es también importante porque,
dependiendo de su potencia, tareas más o menos complejas, pueden hacerse en
tiempos muy cortos, como por ejemplo, los cálculos en coma flotante.

Buses

Son el medio de comunicación que utilizan los diferentes componentes del


procesador para intercambiar información entre sí, eventualmente los buses o una
parte de ellos estarán reflejados en los pines del encapsulado del procesador.

En el caso de los microcontroladores, no es común que los buses estén reflejados en


el encapsulado del circuito, ya que estos se destinan básicamente a las E/S de
propósito general y periféricos del sistema.

Existen tres tipos de buses:

 Dirección: Se utiliza para seleccionar al dispositivo con el cual se quiere


trabajar o en el caso de las memorias, seleccionar el dato que se desea leer o
escribir.
 Datos
 Control: Se utiliza para gestionar los distintos procesos de escritura lectura y
controlar la operación de los dispositivos del sistema.

Conjunto de instrucciones

Aunque no aparezca en el esquema, no podíamos dejar al conjunto o repertorio de


instrucciones fuera de esta fiesta, porque este elemento determina lo que puede
hacer el procesador.

Define las operaciones básicas que puede realizar el procesador, que conjugadas y
organizadas forman lo que conocemos como software. El conjunto de instrucciones
vienen siendo como las letras del alfabeto, el elemento básico del lenguaje, que
organizadas adecuadamente permiten escribir palabras, oraciones y cuanto
programa se le ocurra.

27
Existen dos tipos básicos de repertorios de instrucciones, que determinan la
arquitectura del procesador: CISC y RISC.

CISC, del inglés Complex Instruction Set Computer, Computadora de Conjunto de


Instrucciones Complejo. Los microprocesadores CISC tienen un conjunto de
instrucciones que se caracteriza por ser muy amplio y que permiten realizar
operaciones complejas entre operandos situados en la memoria o en los registros
internos. Este tipo de repertorio dificulta el paralelismo entre instrucciones, por lo
que en la actualidad, la mayoría de los sistemas CISC de alto rendimiento,
convierten las instrucciones complejas en varias instrucciones simples del tipo
RISC, llamadas generalmente microinstrucciones.

Dentro de los microcontroladores CISC podemos encontrar a la popular familia


INTEL -51 y la Z80, aunque actualmente existen versiones CISC-RISC de estos
microcontroladores, que pretenden aprovechar las ventajas de los procesadores
RISC a la vez que se mantiene la compatibilidad hacia atrás con las instrucciones de
tipo CISC.

RISC, del inglés Reduced Instruction Set Computer, Computadora con Conjunto de
Instrucciones Reducido. Se centra en la obtención de procesadores con las
siguientes características fundamentales:

 Instrucciones de tamaño fijo


 Pocas instrucciones
 Sólo las instrucciones de carga y almacenamiento acceden a la memoria de
datos
 Número relativamente elevado de registros de propósito general

Una de las características más destacables de este tipo de procesadores es que


posibilitan el paralelismo en la ejecución, y reducen los accesos a memoria. Es por
eso que los procesadores más modernos, tradicionalmente basados en arquitecturas
CISC implementan mecanismos de traducción de instrucciones CISC a RISC, para
aprovechar las ventajas de este tipo de procesadores.

28
Los procesadores de los microcontroladores PIC, que trataremos en este libro, son
de tipo RISC y veremos su arquitectura y repertorio de instrucciones en detalle.

Memoria

Anteriormente habíamos visto que la memoria en los microcontroladores debe estar


ubicada dentro del mismo encapsulado, esto es así la mayoría de las veces, porque
la idea fundamental es mantener el grueso de los circuitos del sistema dentro de un
solo integrado.

En los microcontroladores la memoria no es abundante, aquí no encontrará


Gigabytes de memoria como en las computadoras personales. Típicamente la
memoria de programas no excederá de 16 K-localizaciones de memoria no volátil
para instrucciones y la memoria RAM ni siquiera llegará a exceder los 5 Kilobytes.

La memoria RAM está destinada al almacenamiento de información temporal que


será utilizada por el procesador para realizar cálculos u otro tipo de operaciones
lógicas. En el espacio de direcciones de memoria RAM se ubican además los
registros de trabajo del procesador y los de configuración y trabajo de los distintos
periféricos del microcontrolador. Es por ello que en la mayoría de los casos, aunque
se tenga un espacio de direcciones de un tamaño determinado, la cantidad de
memoria RAM de que dispone el programador para almacenar sus datos es menor
que la que puede direccionar el procesador.

El tipo de memoria utilizada en las memorias RAM de los microcontroladores es


SRAM, lo que evita tener que implementar sistemas de refrescamiento como en el
caso de las computadoras personales, que utilizan gran cantidad de memoria,
típicamente alguna tecnología DRAM. A pesar de que la memoria SRAM es más
costosa que la DRAM, es el tipo adecuado para los microcontroladores porque éstos
poseen pequeñas cantidades de memoria RAM.

En el caso de la memoria de programas se utilizan diferentes tecnologías, y el uso


de una u otra depende de las características de la aplicación a desarrollar, a

29
continuación se describen las cinco tecnologías existentes, que mayor utilización
tienen o han tenido, hasta el momento de escribir este libro:

 ROM de máscara. En este caso no se “graba” el programa en memoria sino


que el microcontrolador se fabrica con el programa, es un proceso similar al
de producción de los CD comerciales mediante masterización.

El costo inicial de producir un circuito de este tipo es alto, porque el diseño y


producción de la máscara es un proceso costoso, sin embargo, cuando se necesitan
varios miles o incluso cientos de miles de microcontroladores para una aplicación
determinada, como por ejemplo, algún electrodoméstico, el costo inicial de
producción de la máscara y el de fabricación del circuito se distribuye entre todos
los circuitos de la serie y, el costo final de ésta, es bastante menor que el de sus
semejantes con otro tipo de memoria.

 TP One Time Programmable. Este tipo de memoria, también es conocida


como PROM o simplemente ROM.

Los microcontroladores con memoria OTP se pueden programar una sola vez, con
algún tipo de programador. Se utilizan en sistemas donde el programa no requiera
futuras actualizaciones y para series relativamente pequeñas, donde la variante de
máscara sea muy costosa, también para sistemas que requieren serialización de
datos, almacenados como constantes en la memoria de programas.

 EPROM Erasable Programmable Read Only Memory. Los


microcontroladores con este tipo de memoria son muy fáciles de identificar
porque su encapsulado es de cerámica y llevan encima una ventanita de
vidrio desde la cual puede verse la oblea de silicio del microcontrolador.

Se fabrican así porque la memoria EPROM es reprogramable, pero antes debe


borrase, y para ello hay que exponerla a una fuente de luz ultravioleta, el proceso de
grabación es similar al empleado para las memorias OTP. Al aparecer tecnologías
menos costosas y más flexibles, como las memorias EEPROM y FLASH, este tipo

30
de memoria han caído en desuso, se utilizaban en sistemas que requieren
actualizaciones del programa y para los procesos de desarrollo y puesta a punto.

 EEPROM Electrical Erasable Programmable Read Only Memory. Fueron el


sustituto natural de las memorias EPROM, la diferencia fundamental es que
pueden ser borradas eléctricamente, por lo que la ventanilla de cristal de
cuarzo y los encapsulados cerámicos no son necesarios.

Al disminuir los costos de los encapsulados, los microcontroladores con este tipo de
memoria se hicieron más baratos y cómodos para trabajar que sus equivalentes con
memoria EPROM. Otra característica destacable de este tipo de microcontrolador es
que fue en ellos donde comenzaron a utilizarse los sistemas de programación en
circuito o ICSP (In Circuit Serial Progamming) que evitan tener que sacar el
microcontrolador de la tarjeta que lo aloja para hacer actualizaciones al programa.

 FLASH. En el campo de las memorias reprogramables para


microcontroladores, son el último avance tecnológico en uso a gran escala, y
han sustituido a los microcontroladores con memoria EEPROM.

A las ventajas de las memorias FLASH se le adicionan su gran densidad respecto a


sus predecesoras lo que permite incrementar la cantidad de memoria de programas a
un costo muy bajo. Pueden además ser programadas con las mismas tensiones de
alimentación del microcontrolador, el acceso en lectura y la velocidad de
programación es superior, disminución de los costos de producción, entre otras. Lo
más habitual es encontrar que la memoria de programas y datos está ubicada toda
dentro del microcontrolador, de hecho, actualmente son pocos los
microcontroladores que permiten conectar memoria de programas en el exterior del
encapsulado. Las razones para estas “limitaciones” están dadas porque el objetivo
fundamental es obtener la mayor integración posible y conectar memorias externas
consume líneas de E/S que son uno de los recursos más preciados de los
microcontroladores. A pesar de lo anterior existen familias como la INTEL 51
cuyos microcontroladores tienen la capacidad de ser expandidos en una variada
gama de configuraciones para el uso de memoria de programas externa. En el caso
31
de los PIC, estas posibilidades están limitadas sólo a algunos microcontroladores de
la gama alta, la Figura 5 muestra algunas de las configuraciones para memoria de
programa que podemos encontrar en los microcontroladores. La configuración (a) es
la típica y podemos encontrarla casi en el 100% de los microcontroladores. La
configuración (b) es poco frecuente y generalmente se logra configurando al
microcontrolador para sacrificar la memoria de programas interna, sin embargo el
8031 de INTEL es un microcontrolador sin memoria de programas interna. La
configuración (c) es la que se encuentra habitualmente en los microcontroladores
que tienen posibilidades de expandir su memoria de programas como algunos PIC
de gama alta.

Cuando se requiere aumentar la cantidad de memoria de datos, lo más frecuente es


colocar dispositivos de memoria externa en forma de periféricos, de esta forma se
pueden utilizar memorias RAM, FLASH o incluso discos duros como los de las PC,
mientras que para los cálculos y demás operaciones que requieran almacenamiento
temporal de datos se utiliza la memoria RAM interna del microcontrolador. Esta
forma de expandir la memoria de datos está determinada, en la mayoría de lo casos,
por el tipo de repertorio de instrucciones del procesador y porque permite un
elevado número de configuraciones distintas, además del consiguiente ahorro de
líneas de E/S que se logra con el uso de memorias con buses de comunicación serie.

Interrupciones

Imagine que está esperando la visita de un amigo, al que llamaremos Juan. Usted y
Juan han acordado que cuando él llegue a su casa esperará pacientemente a que le
abra la puerta. Juan no debe tocar a la puerta porque alguien en la casa duerme y
no quiere que le despierten.

Ahora usted ha decidido leer un libro mientras espera a que Juan llegue a la casa,
y para comprobar si ha llegado, cada cierto tiempo detiene la lectura, marca la
página donde se quedó, se levanta y va hasta la puerta, abre y comprueba si Juan

32
ha llegado, si éste todavía no está en la puerta, esperará unos minutos, cerrará la
puerta y regresará a su lectura durante algún tiempo.

Como verá este es un método poco eficiente para esperar a Juan porque requiere que
deje la lectura cada cierto tiempo y vaya hasta la puerta a comprobar si él ha
llegado, además debe esperar un rato si todavía no llega. Y por si fuera poco,
imagine que Juan no llega nunca porque se le presentó un problema, tuvo que
cancelar la cita y no pudo avisarle a tiempo, o peor, que Juan ha llegado a la puerta
un instante después que usted la cerraba. Juan, respetando lo acordado, espera un
tiempo, pero se cansa de esperar a que le abran y decide marcharse porque cree que
ya usted no está en la casa o no puede atenderlo. A este método de atender la
llegada de Juan lo llamaremos encuesta.

Veamos ahora otro método. En esta ocasión simplemente se recuesta en el sofá de la


sala y comienza a leer su libro, cuando Juan llegue debe tocar el timbre de la puerta
y esperar unos momentos a que le atiendan. Cuando usted oye sonar el timbre,
interrumpe la lectura, marca la página donde se quedó y va hasta la puerta para
atender a la persona que toca el timbre. Una vez que Juan o la persona que ha
tocado el timbre, se marcha, usted regresa a su asiento y retoma la lectura justo
donde la dejó. Este último es un método más eficiente que el anterior porque le deja
más tiempo para leer y elimina algunos inconvenientes como el de que Juan nunca
llegue o se marche antes de que usted abra la puerta. Es, en principio, un método
simple pero muy eficaz y eficiente, lo llamaremos atención por interrupción.

El primero de ellos, la encuesta, es un método eficaz, pero poco eficiente porque


requiere realizar lecturas constantes y muchas veces innecesarias del estado del
proceso que queremos atender. Sin embargo, es muy utilizado en la programación
de microcontroladores porque resulta fácil de aprender, la implementación de
código con este método es menos compleja y no requiere de hardware especial para
llevarla adelante. Por otra parte, la encuesta, tiene muchas deficiencias que con
frecuencia obligan al diseñador a moverse hacia otros horizontes

33
El mundo está lleno de situaciones; de las cuales no podemos determinar ni cuando,
ni cómo ni por qué se producen, en la mayoría de los casos lo único que podemos
hacer es enterarnos de que determinada situación, asociada a un proceso, ha
ocurrido. Para ello seleccionamos alguna condición o grupo de condiciones que nos
indican que el proceso que nos interesa debe ser atendido, a este fenómeno, en el
cual se dan las condiciones que nos interesa conocer, lo llamaremos evento. En el
segundo ejemplo vemos que para atender a Juan, éste debe tocar el timbre, por
tanto, la llegada de Juan es el proceso que debemos atender y el sonido del timbre es
el evento que nos indica que Juan ha llegado.

El método de atención a procesos por interrupción, visto desde la óptica del ejemplo
que utilicé para mostrarlo, es más simple que el de la encuesta, pero no es cierto, el
método se complica porque requiere que el microprocesador incorpore circuitos
adicionales para registrar los eventos que le indican que debe atender al proceso
asociado y comprender estos circuitos y su dinámica no es una tarea sencilla.

Los circuitos para la atención a las interrupciones y todas las tareas que debe
realizar el procesador para atender al proceso que lo interrumpe son bastante
complejos y requieren una visión diferente de la que estamos acostumbrados a tener
de nuestro mundo.

Los seres humanos no estamos conscientes de las interrupciones, en nuestro


organismo existen mecanismos que nos interrumpen constantemente, para ello
tenemos a nuestro sistema sensorial, pero no somos conscientes del proceso de
interrupción, aunque sí de la atención a las interrupciones. Eso es porque
incorporamos mecanismos que nos sacan rápidamente de la tarea que estemos
haciendo para atender una situación que no puede o no debe esperar mucho tiempo.
Bien, esa misma es la idea que se incorpora en los microprocesadores para atender
procesos que no pueden esperar o que no sabemos cuándo deben ser atendidos
porque ello depende de determinadas condiciones.

La cosa se complica en la secuencia de acciones a realizar desde el momento en que


se desencadena el proceso de interrupción, hasta que se ejecuta el programa que lo
34
atiende, y en la secuencia de acciones posteriores a la atención. Piense en cuantas
cosas debe hacer su organismo ante una interrupción, utilicemos el segundo ejemplo
para atender la llegada de Juan. Piense en cuantas cosas su cerebro hace a espaldas
de su conciencia, desde el momento en que suena el timbre hasta que usted se
encuentra listo (consciente de que es probable que Juan ha llegado) para abrir la
puerta, y todo lo que su cerebro debe trabajar para retomar la lectura después que
Juan se ha marchado. Todo eso, excepto abrir la puerta y atender a Juan, lo hacemos
de forma “inconsciente” porque para ello tenemos sistemas dedicados en nuestro
organismo, pero en el mundo de los microcontroladores debemos conocer todos
esos detalles para poder utilizar los mecanismos de interrupción.

Los procesos de atención a interrupciones tienen la ventaja de que se implementan


por hardware ubicado en el procesador, así que es un método rápido de hacer que el
procesador se dedique a ejecutar un programa especial para atender eventos que no
pueden esperar por mecanismos lentos como el de encuesta.

En términos generales, un proceso de interrupción y su atención por parte del


procesador, tiene la siguiente secuencia de acciones.

1. En el mundo real se produce el evento para el cual queremos que el


procesador ejecute un programa especial, este proceso tiene la característica
de que no puede esperar mucho tiempo antes de ser atendido o no sabemos
en que momento debe ser atendido.
2. El circuito encargado de detectar la ocurrencia del evento se activa, y como
consecuencia, activa la entrada de interrupción del procesador.
3. La unidad de control detecta que se ha producido una interrupción y
“levanta” una bandera para registrar esta situación; de esta forma si las
condiciones que provocaron el evento desaparecen y el circuito encargado
de detectarlo desactiva la entrada de interrupción del procesador, ésta se
producirá de cualquier modo, porque ha sido registrada.

35
4. La unidad de ejecución termina con la instrucción en curso y justo antes de
comenzar a ejecutar la siguiente comprueba que se ha registrado una
interrupción
5. Se desencadena un proceso que permite guardar el estado actual del
programa en ejecución y saltar a una dirección especial de memoria de
programas, donde está la primera instrucción de la subrutina de atención a
interrupción.
6. Se ejecuta el código de atención a interrupción, esta es la parte “consciente”
de todo el proceso porque es donde se realizan las acciones propias de la
atención a la interrupción y el programador juega su papel.
7. Cuando en la subrutina de atención a interrupción se ejecuta la instrucción
de retorno, se desencadena el proceso de restauración del procesador al
estado en que estaba antes de la atención a la interrupción.

Como podemos observar, el mecanismo de interrupción es bastante complicado, sin


embargo tiene dos ventajas que obligan a su implementación: la velocidad y su
capacidad de ser asincrónico. Ambas de conjunto permiten que aprovechemos al
máximo las capacidades de trabajo de nuestro procesador.

Los mecanismos de interrupción no solo se utilizan para atender eventos ligados a


procesos que requieren atención inmediata sino que se utilizan además para atender
eventos de procesos asincrónicos.

Las interrupciones son tan eficaces que permiten que el procesador actúe como si
estuviese haciendo varias cosas a la vez cuando en realidad se dedica a la misma
rutina de siempre, ejecutar instrucciones una detrás de la otra.

Periféricos

Cuando vimos la organización básica de un microcontrolador, señalamos que dentro


de este se ubican un conjunto de periféricos, cuyas salidas están reflejadas en los

36
pines del microcontrolador. A continuación describiremos algunos de los periféricos
que con mayor frecuencia encontraremos en los microcontroladores.

Entradas salidas de propósito general

También conocidos como puertos de E/S, generalmente agrupadas en puertos de 8


bits de longitud, permiten leer datos del exterior o escribir en ellos desde el interior
del microcontrolador, el destino habitual es el trabajo con dispositivos simples como
relés, LED, o cualquier otra cosa que se le ocurra al programador.

Algunos puertos de E/S tienen características especiales que le permiten manejar


salidas con determinados requerimientos de corriente, o incorporan mecanismos
especiales de interrupción para el procesador.

Típicamente cualquier pin de E/S puede ser considerada E/S de propósito general,
pero como los microcontroladores no pueden tener infinitos pines, ni siquiera todos
los pines que queramos, las E/S de propósito general comparten los pines con otros
periféricos. Para usar un pin con cualquiera de las características a él asignadas
debemos configurarlo mediante los registros destinados a ello.

Temporizadores y contadores

Son circuitos sincrónicos para el conteo de los pulsos que llegan a su entrada de
reloj. Si la fuente de conteo es el oscilador interno del microcontrolador es común
que no tengan un pin asociado, y en este caso trabajan como temporizadores. Por
otra parte, cuando la fuente de conteo es externa, entonces tienen asociado un pin
configurado como entrada, este es el modo contador.

Los temporizadores son uno de los periféricos más habituales en los


microcontroladores y se utilizan para muchas tareas, como por ejemplo, la medición
de frecuencia, implementación de relojes, para el trabajo de conjunto con otros
periféricos que requieren una base estable de tiempo entre otras funcionalidades. Es
frecuente que un microcontrolador típico incorpore más de un
temporizador/contador e incluso algunos tienen arreglos de contadores. Como
37
veremos más adelante este periférico es un elemento casi imprescindible y es
habitual que tengan asociada alguna interrupción. Los tamaños típicos de los
registros de conteo son 8 y 16 bits, pudiendo encontrar dispositivos que solo tienen
temporizadores de un tamaño o con más frecuencia con ambos tipos de registro de
conteo.

Conversor A/D

Como es muy frecuente el trabajo con señales analógicas, éstas deben ser
convertidas a digital y por ello muchos microcontroladores incorporan un conversor
A/D, el cual se utiliza para tomar datos de varias entradas diferentes que se
seleccionan mediante un multiplexor.

Las resoluciones más frecuentes son 8 y 10bits, aunque hay microcontroladores con
conversores de 11 y 12 bits, para resoluciones mayores es preciso utilizar
conversores A/D externos. Los conversores A/D son uno de los periféricos más
codiciados en el mundo de los microcontroladores y es por ello que muchísimos PIC
los incorporan, siendo esta una de las características más destacables de los
dispositivos que fabrica Microchip.

Puerto serie

Este periférico está presente en casi cualquier microcontrolador, normalmente en


forma de UART (Universal Asynchronous Receiver Transmitter) o USART
(Universal Synchronous Asynchronous Receiver Transmitter) dependiendo de si
permiten o no el modo sincrónico de comunicación.

El destino común de este periférico es la comunicación con otro microcontrolador o


con una PC y en la mayoría de los casos hay que agregar circuitos externos para
completar la interfaz de comunicación. La forma más común de completar el puerto
serie es para comunicarlo con una PC mediante la interfaz EIA-232 (más conocida
como RS-232), es por ello que muchas personas se refieren a la UART o USART
como puerto serie RS-232, pero esto constituye un error, puesto que este periférico

38
se puede utilizar para interconectar dispositivos mediante otros estándares de
comunicación.

Puerto serie sincrónico

Este tipo de periférico se utiliza para comunicar al microcontrolador con otros


microcontroladores o con periféricos externos conectados a él, mediante las
interfaces SPI (Serial Peripheral Interface) o I2C (Inter-Integrated Circuit).

A pesar de que es también un tipo de puerto serie, es costumbre tratarlo de forma


diferenciada respecto a la UART/USART porque las interfaces SPI e I2C
aparecieron mucho después que la UART/USART, su carácter es únicamente
sincrónico y no están diseñadas para interconectar al sistema con otros dispositivos
independientes como una PC, sino para conectar al microcontrolador dispositivos
tales como memorias, pantallas LCD, conversores A/D o D/A.

Otros puertos de comunicación

En un mundo cada vez más orientado a la interconexión de dispositivos, han


aparecido muchas interfaces de comunicación y los microcontroladores no se han
quedado atrás para incorporarlas, es por ello que podemos encontrar algunos
modelos con puertos USB (Universal Serial Bus), CAN (Controller Area Network),
Ethernet, puerto paralelo entre otros.

Comparadores

Son circuitos analógicos basados en amplificadores operacionales que tienen la


característica de comparar dos señales analógicas y dar como salida los niveles
lógicos ‘0’ o ‘1’ en dependencia del resultado de la comparación. Es un periférico
muy útil para detectar cambios en señales de entrada de las que solamente nos
interesa conocer cuando está en un rango determinado de valores.

39
Modulador de ancho de pulsos

Los PWM (Pulse Width Modulator) son periféricos muy útiles sobre todo para el
control de motores, sin embargo hay un grupo de aplicaciones que pueden realizarse
con este periférico, dentro de las cuales podemos citar: la conversión digital
analógica D/A, el control regulado de luz (dimming) entre otras.

Memoria de datos no volátil

Muchos microcontroladores han incorporado este tipo de memoria como un


periférico más, para el almacenamiento de datos de configuración o de los procesos
que se controlan. Esta memoria es independiente de la memoria de datos tipo RAM
o la memoria de programas, en la que se almacena el código del programa a ejecutar
por el procesador del microcontrolador.

Muchos de los microcontroladores PIC, incluyen este tipo de memoria, típicamente


en forma de memoria EEPROM, incluso algunos de ellos permiten utilizar parte de
la memoria de programas como memoria de datos no volátil, por lo que el
procesador tiene la capacidad de escribir en la memoria de programas como si ésta
fuese un periférico más.

Familias de microcontroladores

Los microcontroladores más comunes en uso son:

12 14 64
Empresa 8 bits bit bit 16 bits 32 bits bit Observaciones
s s s

ATmega8,89Sxxxx
Atmel
familia similar ATmega16
AVR
8051

40
68HC12,
Freescale
68HC05, 68HC08, 68HCS12, 683xx, PowerPC
(antes x x x x
68HC11, HCS08 68HCSX12, Architecture,ColdFire
Motorola)
68HC16

Hitachi, Ltd H8 x x x x x x

Holtek HT8

MCS-48 (familia
8048)
MCS96,
Intel MCS51 (familia x x x x x
MXS296
8051)
8xC251

National
COP8 x x x x x x
Semiconductor

Familia 10f2xx
Familia 12Cxx dsPIC30FXX
Microchip Familia 12Fxx, y dsPIC33F PIC32 x x
16Cxx y 16Fxx de 16 bits
18Cxx y 18Fxx

NEC 78K

Parallax

ST ST 62,ST 7

Texas
TMS370, MSP430
Instruments

41
Zilog Z8, Z86E02

Silabs C8051

Observación: Algunas arquitecturas de microcontrolador están disponibles por tal


cantidad de vendedores y en tantas variedades, que podrían tener, con total
corrección, su propia categoría. Entre ellos encontramos, principalmente, las
variantes de 8051 y Z80.

CAPÍTULO 3

PLANTEAMIENTO OPERACIONAL

Diagrama de bloques

42
Como se observa en la Figura 6, el diagrama de bloques del robot, ayudara a entender como
fue desarrollado y de qué forma.

Sensores PIC Potencia Motores

Figura 6. Diagrama de bloques


Batería

Como se observa en la Figura 6, el PIC es la parte más importante ya que en él se cargara el


programa que hará posible que nuestro robot funcione.
Otra etapa importante es la de los sensores, esta etapa tiene la tarea de recoger los datos del
mundo y entregárselos al PIC para que este los procese y decida qué acción tomar.
El PIC manda el resultado a la etapa de potencia, esta etapa es la que se encarga de
controlar los motores que accionan el mecanismo del robot.
- Sensores.
Los sensores recogen información del mundo para mandarla el PIC, en este caso solo
envían un 1 o 0 dependiendo si encontraron un objeto en frente o no.
Se ha diseñado un total de 3 sensores, que funcionan con un diodo infrarrojo como
emisor y un fototransistor de receptor.
El funcionamiento del circuito se basa en emitir una ráfaga de señales luminosas
infrarrojas las cuales al rebotar contra un objeto cercano se reciben por otro
componente. Al ser recibidas el sistema detecta proximidad con lo que envía un 1 por
el emisor del transistor.

43
Figura 7. Detector infrarrojo de proximidad

El circuito integrado LM567 es un generador/decodificador de tonos que bien cumple


con las necesidades de este diseño. Tanto el fotodiodo como el fototransistor deberán
estar situados con unidades de enfoque adecuadas para mejorar el alcance. Con simples
reflectores de LED's se pueden obtener alcances del orden del metro. Con lentes
convexas se pueden cubrir distancias de cinco metros. Es conveniente sacrificar algo
de rango pero colocar filtros UV y SUNLIGHT los cuales no dejan entrar al
fototransistor (elemento receptor) los rayos del sol.
Como tenemos que usar 3 sensores corremos el riesgo de que por rebote alguna ráfaga
llegue erróneamente a un sensor, para solucionar este problema recurrimos al datasheet
del LM567.

Figura 8. LM567

44
Como se observa en la Figura 8. Entre las patillas 5 y 6 del integrado van el resistor y
el capacitor de timing, esto significa que si variamos los valores de estos componentes,
entonces podemos hacer que emitan ráfagas distintas cada uno de los sensores, y con
esto solucionaríamos el problema de que puedan cruzarse y censar erróneamente.
La patilla 8 del integrado es la que entrega la salida, pero usa lógica inversa, es decir
que cuando no hay objeto cerca, entrega un 1 y cuando si lo hay entrega un 0, de eso la
necesidad de usar un transistor PNP para la interfaz con el PIC, claro que también se
aprovecha su factor de amplificación.

Figura 9. Diagrama esquemático de los sensores

45
En la Figura 9. Tenemos el diagrama esquemático completo de los sensores, pero
observamos un componente más, una compuerta lógica NAND 7402, el uso de esta
compuerta es indispensable, ya que el valor entregado por el transistor PNP de salida
de cada uno de los circuitos no alcanza el 1 lógico (5v.), claro que también podemos
usar un buffer para asegurarnos de que sea entregado un 0 o 1 lógico.

- Potencia.
El circuito de potencia en una primera instancia estuvo conformado por los drivers para
motores PAP L293b, este driver según especificaciones técnicas soporta una intensidad
de 900mA, al momento de realizar la prueba, estos drivers se quemaron, ya que los
motores que se usan consumen un total de 1.2A.
Por tal razón fue necesario pensar en otra forma de controlar esta potencia con solo la
salida de 5v. del PIC; se pensó en usar relés y transistores en configuración Darlington
pero esa idea fue descartada por el consumo de corriente que estos demandan.
Se investigo sobre los llamados MOSFET y fueron la solución óptima al problema, se
decidió usar el MOSFET IRF540n que es según sus especificaciones técnicas soporta
hasta 33A.

Figura 10. IRF 540n

Usar un MOSFET requeriría de un nuevo diseño de la placa de control y del programa


de control de PIC, este problema fue solucionado rápidamente, ya que el IRF 540n no
requiere de más componentes que una resistencia en el Gate.

46
Figura 11. Diagrama esquemático del circuito de potencia

Como se observa en la Figura 11. Se usan un total de 12 MOSFET, 4 para cada motor
PAP, y simplemente una resistencia de 1K en cada Gate de los IRF540n, basta con una
alimentación de 12v. para energizar las bobinas de los motores.
La aplicación de los MOSFET es solo cerrar el circuito de GND cada vez que el PIC le
entregue un bit 1 y abrir el circuito cuando le llegue un 0.

Figura 12. PBC de circuito de potencia

47
En la Figura 12. Claramente se aprecia cómo es que se colocan los MOSFET para
controlar cada uno de los motores, son tres motores ya que el gusano llevara dos en la
cabeza y uno en la cola, eso para poder lograr el movimiento “˄”

- Motores.
En la etapa de los motores no requiere mayor explicación ya que solo se usan motores
PAP unipolares, de 1.2A

- Batería.
Esta etapa está conformada solo de una batería de 12v. y 1.2Ah.
Esta medida expresa cuántos amperes puede entregar una batería en una cantidad de
horas específica (usualmente el ciclo es de 20 horas). Por ejemplo, una batería marcada
como de 100 Ah (Amperes/hora), puede entregar 5 Amperes durante 20 horas (5 x 20
= 100 Ah).
Si se quiere que nuestro robot tenga una autonomía por varias horas, solo será
necesario reemplazar la batería por una de mayor potencia.

- PIC.
Es en esta etapa en la que se colocara el programa y toda la lógica de control, es este el
cerebro del robot.
Se decidió usar un PIC 16f877a debido a su cantidad de patillas ya que para cada motor
usamos 4, también se usan 3 para los sensores de proximidad y 2 más para saber si esta
comprimido o expandido el cuerpo del robot.
El PIC 16f877a es actualmente uno de los más usados, pero, para usarlo como cerebro
de un robot tiene una deficiencia, y es su consumo de potencia, sería ideal usar un PIC
de bajo consumo.
MICROCHIP empresa fabricadora de los PIC, tiene una gama de PIC diseñados para
poco consumo, sería ideal reemplazar el 16f877a por alguno de esta gama, así
estaríamos ahorrando energía.

48
Figura 13. PCB para el PIC 16f877a

Fue necesario diseñar una placa que contenga el circuito mínimo para poder usar el
PIC 16f877a, este circuito solo contiene un regulador 7805, un cristal de cuarzo para el
oscilador que en este caso es de 4Mhz, y un pulsador para el reset.
- Software.
Como se explico en los objetivos de este proyecto, uno de ellos es poder experimentar
en redes neuronales para el control.
Se decidió usar una red neuronal Perceptron, porque es la más simple y además
contamos con variables linealmente independientes.
Primero hay que analizar cada una de las variables a tener en cuenta y también el
movimiento del robot.
Partimos con la definición de que un robot es un dispositivo automático que realiza
acciones especificas, que dependen de las necesidades del proceso en que se encuentre
involucrado, en este caso se tiene un robot que cuenta con tres sensores de proximidad
en distintas ubicaciones que permanentemente detectan si hay objetos que se
encuentren a una distancia superior o inferior a la preestablecida, con base en esto se
decide si dar marcha adelante o atrás a cada uno de los tres motores que posee; en las
lecturas de los sensores podrían darse 8 posibles combinaciones (8=2 3) y para cada
combinación cada uno de los tres motores podría dar marcha adelante o marcha atrás.
El comportamiento del robot lo describe a continuación en la Tabla 1, cuando los
sensores detecten un objeto que se encuentra a una distancia inferior a la
predeterminada se dirá que el objeto se encuentra cerca y esto se representa por medio

49
de un 1 y cuando se detecte un objeto que se encuentra a una distancia mayor que la
predeterminada se dirá que el objeto está lejos lo cual se indica con un 0.
Las variables de entrada son S1, S2, S3, siendo S1 el sensor delantero, S2 el sensor
derecho y S3 el sensor izquierdo.
Separaremos el sentido de giro por dos variables, las llamaremos G1, G2, siendoM1 el
movimiento hacia adelante, G1 el giro a la derecha y G2 el giro a la izquierda.

S1 S2 S3 M1 G1 G2
0 0 0 1 0 0
0 0 1 1 0 0
0 1 0 1 0 0
0 1 1 1 0 0
1 0 0 0 1 0
1 0 1 0 1 0
1 1 0 0 0 1
1 1 1 0 0 0
Tabla 1. Comportamiento del robot

Este tipo de problema generalmente es resuelto suministrándole al robot una base de


datos que contiene todas las posibles situaciones que se podrían presentarse y sus
respectivas soluciones, en este caso se necesitaría almacenar las respuestas para ambos
motores ante las 8 posibles combinaciones en las lecturas de los sensores, cuando el
número de variables de entrada y el número de salidas es mucho mayor, la cantidad de
datos necesarios para especificar cada posible situación crece indefinidamente, debido
a esto se requerirían dispositivos con gran capacidad de almacenamiento; en contraste
una red neuronal puede entrenarse con un número representativo de patrones y
aprender el comportamiento del sistema utilizando dispositivos de menos capacidad de
almacenamiento y costo.
Una red tipo Perceptrón puede ser entrenada con patrones de cualquier dimensión en la
entrada y en la salida con datos binarios, por la simplicidad del problema este tipo de
red es la más adecuada.
Para garantizar que el problema puede ser resuelto por una red neuronal tipo
Perceptrón se debe comprobar que los patrones de entrenamiento son linealmente
separables, para esto se deben plantear las desigualdades generadas por cada patrón de

50
entrenamiento, en este caso cada patrón de cuatro dimensiones generara dos
desigualdades (una por cada salida), estas desigualdades no deben contradecirse, si esto
ocurriera el problema no podría ser resuelto por una red tipo Perceptrón de una sola
capa y deberá buscarse otro tipo de solución.
Debido a la naturaleza de la salida, la función transferencia a utilizar es una hardlim,
pero para nuestro caso de estudio, no sería optima, esto debido a lo que tarda en ser
entrenada, así que se realizara una aproximación a la función hardlims, de este modo
quedaría un 1 para indicar el estado lógico 1 y un -1 para el estado lógico 0 y la tabla
sería la siguiente:

S1 S2 S3 M1 G1 G2
-1 -1 -1 1 -1 -1
-1 -1 1 1 -1 -1
-1 1 -1 1 -1 -1
-1 1 1 1 -1 -1
1 -1 -1 -1 1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 -1 1
1 1 1 -1 -1 -1
Tabla 2. Comportamiento del robot 2

Como ahora usamos una función hardlims, esta se rige por las siguientes condiciones.

La salida de la red está dada por la siguiente ecuación

Aplicando esta ecuación a cada patrón de entrenamiento se tienen las siguientes


desigualdades, las cuales se satisfacen plenamente, lo que implica que el problema es
linealmente separable y puede ser resuelto por una red tipo Perceptron

51
Luego de armar la red, quedaría como lo muestra la Figura 14.

Figura 14. Red tipo Perceptron

Se creará una red de 3 entradas con una neurona tipo Perceptrón para cada salida,
teniendo así una salida bidimensional, los pesos iniciales aleatorios de la red se
muestran en la Tabla 3.
S1 S2 S3
M1 0.8636 -0.1627 0.0503 M1 1
G1 -0.0680 0.1627 -0.5947 G1 1
G2 0.1627 0.1627 0.8636 G2 1
Tabla 3. Valores iniciales de la red

El siguiente código crea una red tipo Perceptrón con función de transferencia hardlims,
dos neuronas en la salida, utiliza como patrones de entrenamiento las lecturas de los

52
cuatro sensores almacenados en p y como patrones objetivo o salidas deseadas las
acciones de ambos motores almacenados en el vector t.

net=newp([-1 1;-1 1;-1 1;-1 1],2,'hardlims');


net.adaptParam.passes=200;
Wi;
[net,a,e]=adapt(net,P,t);
Wf=net.IW{1,1};
bf=net.b{1};

Los pesos finales de la red entrada que satisface todos los patrones de entrada y salida
son:
S1 S2 S3
M1 0.8636 -4.1627 0.0503 M1 1
G1 -4.0680 0.6924 -4.5947 G1 1
G2 0.8636 -4.1627 0.0503 G2 1
Tabla 4. Valores finales de la red

La red fue simulada para la totalidad de combinaciones posibles de entrada para


comprobar que no exista error en el aprendizaje de los patrones de entrenamiento y
para observar su capacidad de generalización en los casos restantes.

S1=[1 -1]; S2=[1 -1]; S3=[1 -1]; S4=[1 -1];


P=combvec(S1,S2,S3,S4)
net=newp([-1 1;-1 1;-1 1;-1 1],2,'hardlims');
Wf;
t=sim(net,P);

La respuesta de la red a todos los patrones de entrenamiento fue exitosa, como puede
observarse en la Tabla 5.
S1 S2 S3 M1 G1 G2
-1 -1 -1 1 -1 -1
-1 -1 1 1 -1 -1
1 1 -1 -1 -1 1
53
1 1 1 -1 -1 -1
Tabla 5. Simulación de la red para los
Patrones de Entrenamiento

La red fue simulada para las posibles combinaciones restantes obteniéndose los
siguientes resultados:
S1 S2 S3 M1 G1 G2
-1 -1 -1 1 -1 -1
-1 -1 1 1 -1 -1
-1 1 -1 1 -1 -1
-1 1 1 1 -1 -1
1 -1 -1 -1 1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 -1 1
1 1 1 -1 -1 -1
Tabla 6. Simulación de la red para las
nuevas combinaciones

Las combinaciones que no hacían parte del set de entrenamiento, al ser presentadas a la
red fueron aproximadas al patrón del set de entrenamiento aprendido con menor
distancia euclidiana.
Una red tipo Perceptrón de una sola capa es una buena solución a un problema que
involucre patrones linealmente separables, en el caso de contar con patrones que no son
linealmente separables se tiene la alternativa de utilizar una red Perceptrón multicapa o
cambiar definitivamente de red, nótese que una red Perceptrón multicapa puede
solucionar el problema de separabilidad lineal a medida que aumenta el número de
capas de la red.
La capacidad de generalización de las redes neuronales juega un papel importante
cuando las posibles combinaciones de patrones de entrada son tantas que resultaría
imposible especificarle a un dispositivo que hacer en cada caso, puesto que la red se
entrena con un número de patrones representativo y no con la totalidad de ellos,
ahorrando tiempo de cómputo en la solución del problema.
En las aplicaciones desarrolladas con redes neuronales juega un papel importante la
tolerancia a fallas que las caracteriza, pues en caso de fallar uno o varios sensores
(como en este caso) la red siempre producirá una salida que en la mayoría de los casos

54
es la más acertada, debido a que la red después de un proceso de aprendizaje exitoso
está en capacidad de generalizar el comportamiento del sistema.

Mecánica del sistema

Como todo sistema, primero se parte de una idea, pero es necesario contar con los
instrumentos y herramientas necesarias para hacerlo posible.

Figura 15. Herramientas e instrumentos

En una primera instancia se pensó en usar como material el alambre de cobre N° 10, pero
esa idea fue descartada debido al elevado costo, entonces se decidió usar alambre
galvanizado y resulto siendo la opción optima debido a su bajo costo y dureza, pero para
unirlo se usara la soldadura de estaño, por ser la más barata y simple.

55
Figura 16. Alambre galvanizado

Para el desarrollo de la mecánica del sistema, se diseño e implemento todo un sistema


mecánico, que consta de 4 eslabones, de los cuales 2 son soporte para placas y batería y los
otros 2 son para ruedas y motores.

Figura 17. Estructura del robot

56
Fue necesario aplicar un poco de física y de algebra de vectores para poder situar
correctamente cada uno de los componentes, de lo que se deducen los siguientes vectores:

Figura 18. Vectores tomados en consideración

De este modo obtenemos la mejor posición para los componentes de mayor peso, que en
este caso sería la batería, por tanto debe ir en la cabeza.

Figura 19. Posición de la batería

La posición de las demás placas esta dependiendo del uso que les daremos, por esa razón se
decidió colocar las placa de los sensores después de la batería, ya que de esta forma se
evitara usar mas cable y así tendremos menos posibilidades de tener lecturas falsas, luego
colocar la placa del PIC por que estaría ubicada justo al medio de todo, después de esta
colocar la placa de los IRF para que controle el motor trasero y por medio de uno cables
controlar a los motores delanteros

57
Figura 20. Posición de las placas

De este modo tenemos terminado el robot y la lógica de control es el siguiente paso en


nuestro desarrollo.

Lógica de control
Antes de aplicar al robot la red neuronal, se aplicara una programación estructurada, con
una tabla en la que se detallara cada uno de los movimientos del robot dependiendo de la
lectura de los sensores, luego de que se haya logrado completar con éxito esta experiencia
recién se aplicara la red neuronal.
El programa para el PIC 16f877a esta desarrollado en lenguaje C.

//******************************************************************
**********
#include <16f877a.h> //llamo a la libreria del pic
#fuses XT,NOWDT,NOPROTECT,PUT //declaro las ocpciones de compilacion
#use delay(clock=4000000) //el reloj que voy a usar
#use standard_io(B) //inicializo los puertos

58
#use standard_io(A)
//******************************************************************
**********
void motor_adelante();
void avanzar();
void bobina_derecha();
void bobina_izquierda();
void freno();
int t_adelante=50; //para darle tiempo en la bobina de adelante
int t_atraz=40; //pata el tiempo en la bobina de atras
int estado=0; //para saber en que esta
void main()
{
while (true)
{
if((input(PIN_E0)==0)&&(input(PIN_E1)==0)&&(input(PIN_E2)==0))
{
avanzar();
//motor_adelante();
}
else
{
freno();

}
}

}
void motor_adelante()
{
output_high(PIN_B4); //pasos para la bobina de la derecha

59
output_high(PIN_C7); //pasos para la bobina de la izquierda

output_high(PIN_B5); //pasos para la bobina de la derecha


output_high(PIN_C6); //pasos para la bobina de la izquierda

output_low(PIN_B6); //pasos para la bobina de la derecha


output_low(PIN_C5); //pasos para la bobina de la izquierda

output_low(PIN_B7); //pasos para la bobina de la derecha


output_low(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas

output_low(PIN_B4); //pasos para la bobina de la derecha


output_low(PIN_C7); //pasos para la bobina de la izquierda

output_high(PIN_B5); //pasos para la bobina de la derecha


output_high(PIN_C6); //pasos para la bobina de la izquierda

output_high(PIN_B6); //pasos para la bobina de la derecha


output_high(PIN_C5); //pasos para la bobina de la izquierda

output_low(PIN_B7); //pasos para la bobina de la derecha


output_low(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas

output_low(PIN_B4); //pasos para la bobina de la derecha


output_low(PIN_C7); //pasos para la bobina de la izquierda

output_low(PIN_B5); //pasos para la bobina de la derecha

60
output_low(PIN_C6); //pasos para la bobina de la izquierda

output_high(PIN_B6); //pasos para la bobina de la derecha


output_high(PIN_C5); //pasos para la bobina de la izquierda

output_high(PIN_B7); //pasos para la bobina de la derecha


output_high(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas

output_high(PIN_B4); //pasos para la bobina de la derecha


output_high(PIN_C7); //pasos para la bobina de la izquierda

output_low(PIN_B5); //pasos para la bobina de la derecha


output_low(PIN_C6); //pasos para la bobina de la izquierda

output_low(PIN_B6); //pasos para la bobina de la derecha


output_low(PIN_C5); //pasos para la bobina de la izquierda

output_high(PIN_B7); //pasos para la bobina de la derecha


output_high(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas


}
void freno()
{
delay_ms(t_adelante);
}
void avanzar()
{
if((input(PIN_A0)==1)&&(input(PIN_A1)==1))

61
{
if(estado==0)
{
bobina_derecha();
}
if(estado==1)
{
bobina_derecha();
}
if(estado==2)
{
bobina_izquierda();
}

}
if((input(PIN_A0)==1)&&(input(PIN_A1)==0))
{
estado=1;
bobina_derecha();
}
if((input(PIN_A0)==0)&&(input(PIN_A1)==1))
{
estado=2;
bobina_izquierda();
}
}

void bobina_derecha()
{
output_high(PIN_C4); //freno para la bobina de la izquierda

62
output_high(PIN_B4); //pasos para la bobina de la derecha
output_high(PIN_B5); //pasos para la bobina de la derecha
output_low(PIN_B6); //pasos para la bobina de la derecha
output_low(PIN_B7); //pasos para la bobina de la derecha

delay_ms(t_adelante); //tiempo para el cambio de bobinas

output_low(PIN_B4); //pasos para la bobina de la derecha


output_high(PIN_B5); //pasos para la bobina de la derecha
output_high(PIN_B6); //pasos para la bobina de la derecha
output_low(PIN_B7); //pasos para la bobina de la derecha

delay_ms(t_adelante); //tiempo para el cambio de bobinas

output_low(PIN_B4); //pasos para la bobina de la derecha


output_low(PIN_B5); //pasos para la bobina de la derecha
output_high(PIN_B6); //pasos para la bobina de la derecha
output_high(PIN_B7); //pasos para la bobina de la derecha

delay_ms(t_adelante); //tiempo para el cambio de bobinas

output_high(PIN_B4); //pasos para la bobina de la derecha


output_low(PIN_B5); //pasos para la bobina de la derecha
output_low(PIN_B6); //pasos para la bobina de la derecha
output_high(PIN_B7); //pasos para la bobina de la derecha

output_low(PIN_C4); //quito el freno para la bobina de la izquierda

delay_ms(t_adelante); //tiempo para el cambio de bobinas

63
void bobina_izquierda()
{
output_high(PIN_B4); //freno para la bobina de la derecha

output_high(PIN_C7); //pasos para la bobina de la izquierda


output_high(PIN_C6); //pasos para la bobina de la izquierda
output_low(PIN_C5); //pasos para la bobina de la izquierda
output_low(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas

output_low(PIN_C7); //pasos para la bobina de la izquierda


output_high(PIN_C6); //pasos para la bobina de la izquierda
output_high(PIN_C5); //pasos para la bobina de la izquierda
output_low(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas

output_low(PIN_C7); //pasos para la bobina de la izquierda


output_low(PIN_C6); //pasos para la bobina de la izquierda
output_high(PIN_C5); //pasos para la bobina de la izquierda
output_high(PIN_C4); //pasos para la bobina de la izquierda

delay_ms(t_atraz); //tiempo para el cambio de bobinas

output_high(PIN_C7); //pasos para la bobina de la izquierda


output_low(PIN_C6); //pasos para la bobina de la izquierda
output_low(PIN_C5); //pasos para la bobina de la izquierda
output_high(PIN_C4); //pasos para la bobina de la izquierda

64
output_low(PIN_B4); //quito el freno para la bobina de la derecha

delay_ms(t_atraz); //tiempo para el cambio de bobinas


}

Y este es el programa que se grabara en el PIC para realizar las primeras pruebas, luego de
que estas sean satisfactorias, recién se le aplicara red neuronal.

CAPÍTULO 4

65
DISCUSIÓN DE RESULTADOS

La teoría de Redes Neuronales Artificiales, presenta grandes ventajas con respecto a otros
modelos típicos de solución de problemas de Ingeniería, una de ellas es su inspiración en
modelos biológicos del funcionamiento del cerebro, lo que facilita su estudio debido a las
analogías que pueden introducirse para su análisis.

Los modelos matemáticos en que han sido desarrollados los algoritmos para todos los tipos
de redes son modelos sencillos, que aunque exigen cierto grado de conocimientos de
cálculo diferencial, pueden ser asimilados y desarrollados en cualquier lenguaje de
programación.

La red tipo Perceptrón es una red que puede implementarse exitosamente para resolver
problemas de clasificación de patrones que sean linealmente separables, la red responderá
mejor entre más sencillos sean los patrones que debe clasificar. A pesar de que cuenta con
serias limitaciones, esta red conserva su importancia ya que sirvió como inspiración para
otros tipos de redes, como por ejemplo las redes multicapa.

En las aplicaciones desarrolladas con redes neuronales juega un papel importante la


tolerancia a fallas que las caracteriza, pues en caso de fallar uno o varios sensores (como en
este caso) la red siempre producirá una salida que en la mayoría de los casos es la más
acertada, debido a que la red después de un proceso de aprendizaje exitoso está en
capacidad de generalizar el comportamiento del sistema.

CAPÍTULO 5
CONCLUSIONES Y RECOMENDACIONES
66
CONCLUSIONES

 La inteligencia artificial y la robótica son ciencias muy interesantes y fascinantes.


 El PIC 16F877 es uno de los más usados en la actualidad.
 Los PICs cada vez se han extendido más en cuanto a su aplicación.
 La red neuronal usada es la más simple y sencilla de implementar.
 El circuito propuesto no requiere calibraciones ni ajustes posteriores a su montaje.
 Es importante utilizar una tensión de alimentación estabilizada.
 Es muy importante considerar los consumos de potencia de los componentes para
poder calcular correctamente la potencia de la fuente de alimentación.

RECOMENDACIONES

 Debe tenerse cuidado al realizarse el montaje de los componentes.


 Se debe tener un profundo conocimiento matemático para poder aplicar
correctamente una red neuronal.
 Debe realizarse una correcta soldadura de los componentes y limpieza final de la
placa impresa.
 Se recomienda realizar primero un modelamiento matemático para diseñar el chasis y
demás mecánica del robot.
 Debe utilizarse una carcasa o chasís convenientes para mayor seguridad.

BIBLIOGRAFÍA CONSULTADA

67
Principios de Electrónica Malvino, Albert Paúl

Saber Electrónica Revista Argentina de Colección

Microcontroladores PICs Angulo Usátegui, José María.

http://es.wikipedia.org/wiki/Perceptr%C3%B3n

http://es.wikipedia.org/wiki/Perceptr%C3%B3n_multicapa

http://es.wikipedia.org/wiki/Microcontrolador

68
ANEXOS

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

También podría gustarte