Autorizada la entrega del proyecto al alumno - IIT

Anuncio
Autorizada la entrega del
proyecto al alumno:
Jorge Nadal Muñoz
LOS DIRECTORES DEL PROYECTO
José Daniel Muñoz Frías
Guillermo Pallarés Castillo
Fdo:
Fecha:
Vº Bº del coordinador de proyectos
Álvaro Sánchez Miralles
Fdo:
Fecha:
UNIVERSIDAD PONTIFICIA
COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO INDUSTRIAL
PROYECTO FIN DE CARRERA
CUENTAKILÓMETROS CON
MEMORIA
AUTOR: Nadal Muñoz, Jorge
DIRECTORES: Muñoz Frías, José Daniel
Pallarés Castillo, Guillermo
MADRID, septiembre de 2008
Resumen
3
Resumen
En los últimos años, el desarrollo de la electrónica y la tecnología
ha sido enorme permitiendo un gran avance en el campo de la transmisión
inalámbrica. Hoy existen muchos sistemas distintos y muy eficientes de
transmisión inalámbrica, desde infrarrojos hasta bluetooth pasando por
tecnología Zigbee. Estos sistemas se han implantado en toda clase de
aparatos incluyendo, por supuesto, los cuentakilómetros. Hoy en día el
cable está desechándose dando lugar a la conexión inalámbrica. La
comodidad es una prioridad en nuestros días y un cable no lo es, ya que se
puede enredar y dificulta la colocación del cuentakilómetros. Por ese
motivo, un cuentakilómetros inalámbrico gusta y tiene una buena acogida
en el mercado a pesar de que en principio se pueda pensar que no tanto.
El objetivo del proyecto es realizar un cuentakilómetros que
muestre en el display los parámetros calculados a partir de la señal del
sensor, almacene los datos en una memoria EEPROM y tenga capacidad
de descargar los datos al ordenador. Para alcanzar este objetivo, se utilizan
dos tarjetas de desarrollo idénticas que se conectan a los periféricos. Las
tarjetas de desarrollo cuentan con un microcontrolador de ocho bits que
maneja toda la información, un transceiver (dispositivo encargado de
implementar el protocolo de comunicaciones) y una antena impresa por la
cual se realiza la transmisión inalámbrica. El dispositivo cuenta con un
sensor localizado en la rueda delantera de la bicicleta. Cuando la rueda da
una vuelta, el sensor genera una señal que interrumpe el programa
principal de la tarjeta emisora. En la tarjeta emisora, se calculan los
parámetros de distancia y velocidad y se transmiten a la tarjeta receptora a
través de la antena utilizando tecnología Zigbee. La tarjeta receptora,
recibe los datos que se envían a la memoria y al display. La mejor manera
de observar este sistema de transmisión es mediante un diagrama de
Resumen
4
bloques como el que se muestra en la figura 1, para ver como van
conectados todos los dispositivos del proyecto.
PC
Vía serie
Display
Sensor
Bus i2c
Entrada digital
Tarjeta
emisora
Tarjeta
SMAC
receptora
Bus i2c
Memoria
Figura 1: Esquema de conexiones
En primer lugar, se realiza el funcionamiento de la tarjeta
receptora. A ella van conectados el display y la memoria y es esta tarjeta la
que se comunica con el ordenador. La tarjeta receptora no se comunica con
sus periféricos de cualquier manera. Así como el sensor envía la señal a la
tarjeta emisora directamente a través de un par pines de entrada/salida,
con la tarjeta receptora no se pudo actuar de la misma manera debido a
que no se tenían suficientes pines disponibles. Por ello, se decidió adquirir
un display y una memoria que se comunican a través de un bus i2c, como
se puede observar en el diagrama de bloques de la figura 1, que tiene
como ventaja que sólo necesita dos pines para hacer la transmisión. Dicho
bus se configuró por software ya que la tarjeta no contaba con ninguno
libre para su uso. Por otro lado, para que el funcionamiento fuera correcto,
también
se
diseñaron
circuitos
electrónicos
para
establecer
la
Resumen
5
comunicación con el microcontrolador de acuerdo con la documentación
de los dispositivos.
En segundo lugar, se elabora la tarjeta emisora. En la tarjeta
emisora es donde se aloja el sensor. La señal que genera el sensor cuando
el imán pasa por su lado es la que se envía a la tarjeta emisora y se
procesa. Para que la señal generada por el sensor sea útil lo necesario es
realizar un circuito de acondicionamiento del sensor para eliminar los
rebotes y reducir la corriente que atraviesa el sensor. La señal generada
debe interrumpir al programa principal y calcular la distancia recorrida y
la velocidad. La distancia recorrida se calcula de manera muy sencilla,
sumando a una variable global el perímetro, ya que el sensor generará una
interrupción por teclado cada vez que la rueda dé una vuelta. Para
calcular la velocidad, se ha configurado un timer que esté continuamente
corriendo y cada vez que se reciba una interrupción se lea el tiempo
actual. A partir del tiempo actual, restándole el tiempo anterior, se calcula
el tiempo que ha tardado la rueda en dar una vuelta y, dividiendo el
perímetro por dicho tiempo, se obtiene la velocidad.
Una vez que se tienen ambas tarjetas trabajando por separado, se
deben conectar entre sí de forma inalámbrica como se muestra en el
diagrama de bloques de la figura 1 mediante una línea punteada. Para ello
se utiliza la antena que debe ser configurada a partir de un transceiver.
Este transceiver se configura con una segunda herramienta llamada
Freescale Beekit integrada en el entorno de desarrollo cuya función es
desarrollar un código intermedio que configura la transmisión y recepción
a través de la antena. Zigbee es la tecnología de transmisión inalámbrica
que se utiliza en el proyecto. La tecnología Zigbee es muy parecida al
Bluetooth sólo que tiene un menor ancho de banda y consume menos.
Éstos son los motivos principales por los cuales se utiliza esta tecnología
para el cuentakilómetros, ya que no necesita una transmisión muy rápida
Resumen
6
ni compleja y funciona a pilas, por lo que un menor consumo permitirá un
importante ahorro en baterías. El alcance utilizando la tecnología Zigbee
es pequeño, pero para un cuentakilómetros es más que suficiente, al ser la
distancia entre el sensor y la pantalla de tan sólo unos treinta centímetros.
El transceiver implementa la capa física de Zigbee, aunque en este
desarrollo se ha optado por una capa lógica más simple denominada
SMAC.
Como
resultado
del
proyecto,
se
ha
construido
un
cuentakilómetros que cumple todas las funciones anteriormente descritas
excepto la de comunicación con el PC mostrado en el diagrama de bloques
mediante una línea punteada, pero supone una buena base para poder
crear un cuentakilómetros completo para poder ser comercializado. A
través del puerto i2c o utilizando la comunicación inalámbrica se pueden
integrar más componentes, como por ejemplo un pulsómetro, de manera
sencilla. Para terminar, durante la construcción del cuentakilómetros se
hicieron varias pruebas con el sensor y el display resultando satisfactorias.
Las funciones de velocidad media y velocidad máxima no se implantaron,
por lo que el cuentakilómetros sólo mide velocidad instantánea y
distancia. La memoria finalmente tampoco se implantó junto con el resto
del proyecto pero las funciones de manejo de la memoria si se realizaron y
mediante un pequeño programa se comprobó su correcto funcionamiento.
Summary
7
Summary
During the past few years, the developments in electronics and
technology have been huge leading up to the great wireless transmission
field. At the present time, there are many different and very efficient
wireless transmission systems such as infrared, bluetooth or Zigbee
technology. These systems have been installed on every kind of items
including, of course, the speed meter. Nowadays wires are being dropped
to let the wireless connections in. Comfort is a priority in our lives today
and wires do not help, they get tangled up and they make installing a
speed meter harder. This is the reason why a wireless speed meter could
be successful in the market.
The aim of the project is to build a speed meter that shows in a
display the parameters calculated from the signal coming from the sensor,
saves the data in an EEPROM memory and has the capacity of
downloading the data to a computer. For achieving this objective, two
electronic boards are used connected with the devices. The electronic
boards include an eight bit microcontroller that manipulates all the
information, a transceiver (device in charge of implementing the
communications protocol) and a printed antenna by which the wireless
transmission is done. The device has a sensor located at the front wheel of
the bicycle. When the wheel turns once, the sensor generates a signal that
interrupts the main program of the emitter board. In the emitter board, the
distance and speed parameters are calculated and transmitted to the
receiver board with the antenna using Zigbee technology. The receiver
board receives the data that is sent to the memory and the display. The
best way to see the connections is by the diagram shown in figure 1.
Summary
8
PC
Series communication
Display
Sensor
I2c bus
Digital input
Emitter
board
Receiver
SMAC
board
I2c bus
Memory
Figure 1:Scheme of connections
In the first place it is necessary to make the receiver board work.
The display and the memory are both connected to it, and it is this board
that communicates with the computer. The receiver board doesn’t
communicate with the other devices randomly. The sensor sends the
signal to the receiver board through a couple of in and out pins, whilst it
was not possible to do the same with the receiver board since there were
not enough free pins. Because of this reason, the decision was taken to
communicate the memory and the display via an i2c bus, as shown in
figure 1, which only needs two pins to get the transmission done as a
major advantage. This bus was configured by software because the board
did not have a free one for its use. Be that as it may, in order for it to work
correctly electronic circuits were designed to establish the communication
with the microcontroller following the instructions in the devices’
datasheets.
Summary
9
Secondly, the emitter board is built. On the emitter board is where
the sensor is located. The signal generated by the sensor when the magnet
passes by is sent to the emitter board and is processed. It is necessary to
design a conditioning circuit for the sensor in order to make the signal
generated useful, for eliminating rebounds and reducing the current
through the sensor. The generated signal has to interrupt the main
program and calculate both, distance and speed. The distance is calculated
in a very easy way by adding the perimeter to a global variable as the
sensor generates a keyboard interrupt each time the wheel turns. For
calculating the speed, a timer was configured, which is running forever
and the time is read each time an interrupt occurs. The time the wheel
takes to turn once is obtained subtracting the last time to the actual time
and, dividing the perimeter by this time, we obtain the value of the speed.
Once you have both boards working separately, they must be
connected. For this purpose, the antenna which must be configured by a
second microcontroller is used and wireless connection is achieved as
shown with a dotted line in the diagram. This microcontroller is
configured by a second tool called Freescale Beekit, integrated in the
programming tool whose function is to develop an intermediate code
which configures the transmission and reception through the antenna.
Zigbee is the wireless transmission technology used in the project. The
Zigbee technology is very similar to Bluetooth, only that it has a smaller
bandwidth and consumes less. This are the most important reasons for
which this technology is used for the speed meter, given that it doesn’t
need a very quick nor complex transmission and it works with batteries,
which means that a smaller consume will allow an important save in
batteries. The range using the Zigbee technology is not much, but it’s more
than enough for a speed meter, given that the distance between the sensor
and the screen is of only about thirty centimetres. This second
Summary
10
microcontroller implements the physical Zigbee layer, even though in this
development an easier logic layer called SMAC is used.
As a result of the project, a speed meter was built which satisfies all
the functions described before except the communication with the PC, as
shown with a dotted line in the diagram before, but it is a solid basis for
being able to build a speed meter with all the functions and being able to
be commercialized. Also, through the i2c bus or using the wireless
communication, more components can be added to the device like, for
example, a pulse-meter very easily. Finally, during the building of the
speed meter a series of tests were made with the sensor and the display
with satisfactory results. The mean velocity and the maximum velocity
were not implemented in the end, leaving the speed meter measuring only
current speed and distance. The memory wasn’t either finally joined
together with the rest of the project, but the functions for manipulating the
memory were done and using a small program was proofed that it
worked correctly.
DOCUMENTO Nº1: MEMORIA
Índice
13
Resumen ............................................................................................................3
Parte I
Memoria.........................................................................................153
Capítulo 1 Introducción..................................................................................164
1
Estudio de los trabajos existentes / tecnologías existentes ..........175
2
Motivación del proyecto.......................................................................19
3
Objetivos ...............................................................................................220
4
Metodología / Solución desarrollada...............................................220
5
Recursos / herramientas empleadas .................................................231
Capítulo 2 Hardware: Componentes............................................................242
1
Introducción..........................................................................................242
2
Tarjeta de desarrollo ...........................................................................264
3
Display LCD .........................................................................................286
4
Memoria EEPROM ..............................................................................308
5
Sensor.....................................................................................................320
Capítulo 3 Software.........................................................................................353
1
Introducción..........................................................................................353
2
Comunicación inalámbrica ................................................................386
3
La tarjeta emisora.................................................................................408
4
La tarjeta receptora ................................................................................39
5
Programación final ..............................................................................464
Capítulo 4 Resultados/Experimentos...........................................................486
Capítulo 5 Conclusiones...................................................................................49
Índice
14
Capítulo 6 Futuros desarrollos ......................................................................520
Bibliografía .......................................................................................................542
Parte II
Estudio económico.......................................................................553
Parte III
Manual de usuario.......................................................................575
Parte IV
Código fuente ...............................................................................608
Parte V
Anexos............................................................................................708
Anexo A: el bus i2c ............................................................................................69
Parte I MEMORIA
Memoria. Introducción
16
Capítulo 1 INTRODUCCIÓN
“Cuentakilómetros con memoria” es un proyecto que se trata de
elaborar un cuentakilómetros o ciclocomputador de bicicleta sofisticado.
Como indica el título del proyecto, el cuentakilómetros contará con una
memoria no volátil en la que poder almacenar los datos de una jornada.
Además, el cuentakilómetros será inalámbrico (la transmisión se hará a
través de una antena impresa en las tarjetas electrónicas) y se podrá
conectar con el ordenador a través de un puerto serie para poder utilizar
en él los datos almacenados en la memoria.
El cuentakilómetros está formado por dos tarjetas de desarrollo
que cuentan con un micro de ocho bits, un display, una memoria y un
sensor convencional de bicicleta y el objetivo es juntarlo todo y hacer que
funcione como lo que pretende ser.
Este documento desarrolla todos los pasos que se han ido
ejecutando durante el proyecto hasta llegar al resultado final. En este
primer capítulo se introduce el proyecto, donde se explican los principales
aspectos del mismo sin entrar en detalle. En los siguientes capítulos es
donde se detallan los pasos que se han ido dando hasta conseguir el
cuentakilómetros.
El proyecto se ha dividido en dos partes diferentes pero muy
relacionadas entre sí. El capítulo dos trata sobre los distintos componentes
del hardware que se han utilizado para formar el cuentakilómetros. Da
todos los detalles de cada uno de ellos y explica los circuitos electrónicos
que se han tenido que montar para conseguir su correcto funcionamiento,
además de resaltar el porqué de haber escogido esos modelos y no otros.
A medida que los componentes del cuentakilómetros van estando
Memoria. Introducción
17
preparados para funcionar, se tienen que ir programando para comprobar
su funcionamiento, ya que los componentes por sí solos no se puede
utilizar para nada por muy bien que esté realizada la parte hardware. Esto
se explica en el capítulo tres, donde se detallan todos los pasos que ha ido
dando la programación del cuentakilómetros hasta su resultado final. Son
dos partes diferentes que se han tenido que desarrollar paralelamente para
ir dispositivo a dispositivo comprobando su correcto funcionamiento.
1 Estudio de los trabajos existentes / tecnologías existentes
Los cuentakilómetros en bicicletas son aparatos relativamente
nuevos que han aparecido gracias a los avances tecnológicos. Al principio,
hace quince o veinte años, los cuentakilómetros no medían nada más que
distancia y velocidad y el sensor estaba unido a la pantalla con un cable.
Desde casi el principio, todos los cuentakilómetros incluían una pequeña
memoria para almacenar el valor de la distancia total recorrida. El tamaño
nunca se ha excedido demasiado ya que desde un principio se sabía que
tenía que ir alojado en el manillar que es un suporte de tamaño reducido.
El precio era un inconveniente mayor para adquirir uno de éstos, pero la
evolución de la electrónica ha permitido reducir en gran medida los
precios de los cuentakilómetros. Estos cuentakilómetros aún se venden
hoy, pero a precios muy bajos al aparecer otros más sofisticados.
Hoy en día, el mundo de los cuentakilómetros para bicicleta está
muy estudiado y la tecnología existente está muy avanzada. Los
cuentakilómetros de hoy no sólo miden los parámetros relacionados con la
propia acción del ciclismo, como distancia y velocidad, sino que también
son capaces de medir el ritmo cardiaco y la cadencia de pedaleo e incluyen
reloj.
Unos años después aparecieron unos cuentakilómetros un poco
más sofisticados que transmitían la información de manera inalámbrica, lo
Memoria. Introducción
18
que permite evitar el cable que conecta el sensor con el display. Estos
cuentakilómetros son un poco más caros y se han extendido de manera
rápida debido al gran avance de la tecnología digital y la electrónica, que
han permitido poder diseñar estos cuentakilómetros a precios y tamaños
razonables. La mayoría de los cuentakilómetros que cuentan con
transmisión inalámbrica lo hacen de manera 100% digitalizada y
codificada ofreciendo una transmisión muy segura.
Finalmente, aparecieron en el mercado dispositivos aún más
especiales que incluyen la posibilidad de conectarse al ordenador y
utilizar en él los datos almacenados en la memoria del cuentakilómetros.
Hoy en día, hay pocos dispositivos que tengan esta función y los precios
se disparan.
En la tabla 1 se muestran tres modelos de cuentakilómetros, cada
uno con los desarrollos tecnológicos contados con anterioridad:
Marca
Funciones
Precio
Cateye
• Velocidad actual
14,99€
• Velocidad máxima
• Distancia recorrida
• Distancia total
• Reloj
Memoria. Introducción
19
Cateye
• Velocidad actual
45€
• Velocidad máxima
• Dos
velocidades
medias
• Dos
distancias
parciales
• Dos
tiempos
empleados
• Distancia total
• Reloj
• Transmisión
inalámbrica
Garmin
• Cadencia
de
pedaleo
• Ritmo cardiaco
• Velocidad
• Tiempo
• Calorías quemadas
• Altitud
240€
Memoria. Introducción
20
• Transmisión
inalámbrica
• Conexión con el
ordenador
software
con
Taining
Center
Tabla 1: Mercado cuentakilómetros
Otros menos comunes son capaces de medir altitud e inclinación y
tienen brújula y termómetro. Como se puede observar la tecnología de
estos dispositivos es muy sofisticada. Evidentemente, los dos últimos
cuentakilómetros disponibles en el mercado analizados necesitan un
dispositivo conectado al cuerpo del ciclista para medir parámetros como el
ritmo cardiaco. Los últimos cuentakilómetros tienen capacidad de medir
una gran variedad de cosas y almacenar en la memoria una gran cantidad
de parámetros en cada jornada, cuentan con conexión inalámbrica y el
último se puede conectar al ordenador. Existen distintas conexiones
posibles con el ordenador pero, por lo que se ha podido averiguar, los
cuentakilómetros actuales en el mercado se conectan por infrarrojos o a
través de un puerto USB. Sin embargo, seguro que existen hoy en día
cuentakilómetros que se comunican con el PC utilizando tecnología
bluetooth. Por tanto, hoy en día incluso la conexión entre el
cuentakilómetros con el ordenador puede ser inalámbrica. En nuestro
caso, la comunicación se realizará a través de un puerto serie.
El problema más serio que presentan estos dispositivos es el
precio. Como se puede ver en la tabla superior, el cuentakilómetros sin
comunicación con el ordenador cuesta 45€, mientras que el precio del que
cuenta con comunicación con el PC asciende hasta los 240€. Sin embargo,
este
proyecto,
aunque
cuenta
con
menos
funciones
que
los
Memoria. Introducción
21
cuentakilómetros disponibles en el mercado analizados y se comunica con
el ordenador de una manera un poco antigua, se puede llevar a cabo por
un precio menor que ese, consiguiendo cuentakilómetros sofisticados
asequibles para todo el mundo.
2 Motivación del proyecto
El ciclismo es un deporte muy extendido a nivel aficionado. Al
igual que todos los niños juegan al fútbol desde pequeños, también tienen
una bicicleta. Por ello, es un mercado interesante para las empresas el de
los cuentakilómetros para todas esas bicicletas. Además, hay mucha gente
adulta que le gusta practicar este deporte para mantener el estado de
forma y, especialmente a esa gente, le gusta ver sus progresos.
La motivación de este proyecto es poder ofrecer a los usuarios un
cuentakilómetros inalámbrico con una memoria no volátil para guardar
los datos de la jornada. Esto permitirá ahorrarse los cables que siempre
pueden dar problemas y no son nada cómodos. Además, el dispositivo se
podrá conectar al ordenador a través de un puerto serie para poder
descargarse los datos en él y poder hacer gráficas, lo que permitirá
observar los progresos realizados.
Observando el mercado de cuentakilómetros para bicicleta, se
puede ver como existen ya cuentakilómetros muy sofisticados que ofrecen
dispositivos inalámbricos con conexión al ordenador a través de un puerto
USB. Además, estos cuentakilómetros tienen muchas funciones distintas.
Sin embargo, el gran problema del mercado es el precio. Un
cuentakilómetros inalámbrico pero sin posibilidad de conexión al
ordenador cuesta 45€ y uno que incluye todo cuesta 240€. Por tanto una
motivación añadida es conseguir un cuentakilómetros simple y sofisticado
por un precio menor.
Memoria. Introducción
22
3 Objetivos
El objetivo principal del proyecto es diseñar un cuentakilómetros
inalámbrico con memoria. El sistema tendrá que, con un sensor de
bicicleta convencional, procesar la señal que le llegue a la tarjeta y calcular
ciertos parámetros como la velocidad y la distancia recorrida.
Posteriormente, la velocidad se enviará a través de una antena a una
segunda tarjeta donde se mostrará el valor de los parámetros en un
display y se archivará en una memoria EEPROM que es no volátil.
Finalmente, el sistema podrá comunicarse con un PC a través de un puerto
serie y descargar los datos para su posterior uso en el mismo como el
usuario quiera.
4 Metodología / Solución desarrollada
El proyecto se puede separar en dos partes diferentes pero muy
relacionadas entre sí. Estas dos partes son la parte hardware y la parte
software:
•
Hardware:
o
Investigar
el
funcionamiento
de
los
elementos
externos, tales como la memoria EEPROM, el display y el
sensor.
o
Se diseñará un circuito de acondicionamiento para el
sensor que se colocará en la tarjeta emisora.
o
Diseñar los circuitos necesarios para comunicar el
display y la memoria con la tarjeta receptora.
•
Software:
Memoria. Introducción
o
23
Estudiar o analizar toda la documentación de las
tarjetas de desarrollo que viene proporcionada en el CD.
o
Realizar la programación de la tarjeta emisora que
cuenta con una interrupción por teclado generada por la
señal producida por el sensor y todo el procesamiento de
dicha señal para calcular distancia y velocidad.
o
Diseñar la programación de la tarjeta receptora que
debe procesar los datos recibidos mostrándolos en el display
y almacenándolos en la memoria.
o
Realizar
la
programación
de
la
comunicación
inalámbrica utilizando protocolo Zigbee.
5 Recursos / herramientas empleadas
La gran ventaja del proyecto es que los recursos y herramientas
empleadas son sencillos y escasos. Simplemente, se necesitan dos tarjetas
de desarrollo que incluyen un micro de 8 bits, un sensor, un display LCD
y una memoria EEPROM de 64kbit.
En
cuanto
al
software
utilizado
para
elaborar
toda
la
programación, se utilizará el software de Freescale llamado CodeWarrior.
Memoria. Hardware: Componentes
24
Capítulo 2 HARDWARE: COMPONENTES
1 Introducción
Como ya se ha dicho con anterioridad, el proyecto tiene dos partes
diferenciadas pero estrechamente relacionadas. Para poder llevar a cabo la
elaboración del proyecto, primero se debe montar el hardware y luego
desarrollar el software que hará funcionar ese hardware. Este capítulo se
centra en explicar los distintos componentes que se han utilizado para la
elaboración del cuentakilómetros, desde el porqué de escoger ese modelo
y no otro hasta sus características pasando por toda la electrónica que
necesitan para funcionar.
La parte hardware del proyecto está constituida por varios
componentes y la mayoría de ellos se pueden averiguar de manera
intuitiva a partir del título del proyecto. Al ser el proyecto un
cuentakilómetros con memoria, se necesitará, en primer lugar, un display
donde mostrar la velocidad de la bicicleta, en segundo lugar, un sensor
que detecte el paso de la rueda y, en último lugar, una memoria no volátil
EEPROM donde poder guardar los datos de la jornada.
Obviamente, un display, un sensor y una memoria EEPROM por
si solos no pueden funcionar. Son necesarias unas tarjetas de desarrollo
que procesen las señales mediante un microcontrolador de 8 bits que
contienen. Las tarjetas y los microcontroladores son los elementos más
importantes del proyecto. Los componentes del proyecto irán conectados
de la siguiente manera:
•
Por un lado van conectados en la rueda delantera de la
bicicleta el sensor y una tarjeta de desarrollo.
Memoria. Hardware: Componentes
•
25
Por otro lado van conectados en el manillar de la
bicicleta otra tarjeta de desarrollo, el display y la memoria.
La tarjeta de desarrollo localizada en la rueda de la bicicleta
procesará la señal y enviará la información a través de una antena que
tiene impresa en ella a la segunda tarjeta de desarrollo. Ésta se ocupará de
almacenar los datos en la memoria y mostrarlos en el display de la manera
que se explicará más adelante en el capítulo tres. Toda esta disposición se
muestra en el diagrama que bloques de la figura 1 que clarifica mucho de
lo que se ha estado hablando hasta ahora:
PC
Display
Sensor
Entrada digital
Tarjeta
emisora
Bus i2c
Tarjeta
SMAC
receptora
Bus i2c
Memoria
Figura 1: Esquema de conexiones
A continuación, vamos a analizar todos los componentes uno a
uno y el trabajo realizado en cada uno de ellos.
Memoria. Hardware: Componentes
26
2 Tarjeta de desarrollo
La tarjeta de desarrollo utilizada se trata de la denominada
MC13192-SARD
de
Freescale
(Motorola)
que
cuenta
con
un
microcontrolador de 8 bits, el MC9S08GT60. El microcontrolador es la
parte más importante de la tarjeta ya que es el que controla todas las
funciones de la tarjeta electrónica. Aparte del microcontrolador, la tarjeta
cuenta con un transceiver denominado MC13192 que controla la
transmisión y la recepción de datos a través de la antena y los envía al
microcontrolador principal. La tarjeta se alimenta a una tensión de tres
voltios de continua y esos tres voltios se pueden conseguir de dos formas
diferentes: la primera es a través de la red eléctrica, es decir, conectando a
red una fuente de alimentación, y la segunda es a partir de una pila de
nueve voltios.
La tarjeta cuenta con otros elementos que pueden ser de mucha
utilidad. En primer lugar, la tarjeta electrónica cuenta con cuatro
pulsadores y cuatro diodos led. Estos elementos han servido para poder
entender el funcionamiento de la tarjeta ya que han permitido elaborar
pequeños y simples programas para ir dominando la tarjeta. Además,
pueden resultar muy útiles para el proyecto final al ser necesario que el
usuario cambie el dato que se ve en el display, ya que el cuentakilómetros
estará preparado para mostrar tanto distancia recorrida como velocidad
instantánea y esto se hará con los pulsadores. Los diodos se encenderán
intermitentemente para mostrar al usuario que las pilas no están agotadas.
Por ejemplo, esto es útil en el caso de que el display no se encienda, para
que se pueda observar que las pilas no son el problema. En segundo lugar,
la tarjeta de desarrollo cuenta con una salida de puerto serie por la cual se
va a comunicar la tarjeta con el ordenador. Finalmente, la tarjeta cuenta
también con una salida de tres voltios que se utilizará para la alimentación
de la memoria y el display y un puerto de pines por los cuales se van a
Memoria. Hardware: Componentes
27
comunicar los periféricos con el microcontrolador. Todos estos elementos
se pueden observar en la figura 2 y la conexión entre ellos se puede ver en
el esquema de la tarjeta de desarrollo que se muestra en el datasheet de la
tarjeta de desarrollo.
Figura 2: Tarjeta de desarrollo
Así pues, para hacerse una idea de la conexión empleada en el
proyecto de todos sus elementos, se puede observar por un lado el sensor
alimentado a partir de la salida de tres voltios de una de las tarjetas de
desarrollo y la señal que genera conectada a un pin de entrada al micro.
Por otro lado, se tiene una segunda tarjeta de desarrollo cuya salida de tres
voltios sirve para alimentar tanto el display como la memoria y
conectados a distintos pines las líneas SDA y SCL de ambos periféricos por
los cuales se realiza la transmisión de datos a través del bus i2c.
Memoria. Hardware: Componentes
28
3 Display LCD
El display utilizado se trata de un display LCD que se comunica a
través de un bus i2c. El display es de la marca Batron y el modelo es el
COG-BTHQ21605-09.
La elección del display ha sido en el proyecto una de las cosas más
importantes y delicadas. Lo primero que se decidió fue que el
cuentakilómetros tendría un alcance de 99,9km/h con una resolución de
décimas, lo cual es más que suficiente para una bicicleta dirigida por
cualquier ciclista, incluso uno profesional. Por ello, se pensó en un
principio que se podrían utilizar tres displays BCD de 7 segmentos pero
pronto se desechó la idea porque se necesitarían muchos pines y, al no
disponer de tantos, se decidió finalmente utilizar este display.
El problema que tiene este display es que se comunica con el
microcontrolador a través de un bus i2c. El microcontrolador dispone de
una salida con el bus i2c implementada por hardware. Sin embargo, esta
salida se utiliza en la comunicación con el transceiver, así que se tuvo que
recurrir a implantar el bus por software utilizando las entradas y salidas
convencionales disponibles como se cuenta en el próximo capítulo. Éste
fue un inconveniente añadido que hizo perder mucho tiempo ya que no se
contaba con una cosa así.
El display utilizado tiene seis pines: uno para alimentar la pantalla
del display, otro para alimentar la lógica del display, otro para conectar
Tierra, el cuarto es un reset y los dos últimos son las líneas SDA y SCL por
las cuales se realiza la transmisión a través del bus i2c. Estos pines no se
pueden conectar directamente, sino que se tiene que diseñar un circuito
electrónico para que el display funcione correctamente. El circuito a
realizar se muestra en la figura 3 e incluye dos condensadores para fijar las
tensiones de alimentación y dos resistencias conectadas a ambos pines de
Memoria. Hardware: Componentes
29
transmisión. Finalmente, se colocó un circuito RC al pin del reset con una
constante de tiempo lo suficientemente grande como para que no actúe y
resetee el display continuamente.
R1
1
2
10k
3V C3
1
2
Pin 16
100n
C3
1
1
2
0
2
10k
2
C2
1 1u
R1
1u
Pin 14
R1
1
2
10k
VLCD VSS VDD
SDA Reset SCL
Display
Figura 3: Circuito montado para display
El circuito diseñado quedó implementado como se muestra en la
figura 3. Los valores de las dos resistencias conectadas entre los pines SDA
y SCL y los tres voltios se fijaron según la documentación del dispositivo,
al igual que el valor de los condensadores de un micro faradio. El resto de
los componentes, como ya se ha dicho con anterioridad, se hallaron
fijando la constante del circuito RC en un milisegundo. Por tanto, se fijó la
resistencia a 10kΏ y se calculó el condensador necesario que resultó ser de
100nF.
Memoria. Hardware: Componentes
30
4 Memoria EEPROM
La memoria fue el último elemento en desarrollarse en el
ciclocomputador. La memoria tiene el cometido de almacenar los datos de
velocidad, distancia y tiempo de una jornada para su uso posterior. Para
ello, se utiliza una memoria EEPROM, que es no volátil, de manera que si
se apaga el cuentakilómetros los datos seguirán almacenados en la
memoria.
Una decisión que se debía tomar con respecto a la memoria es la
manera en la que se iba a comunicar con el microcontrolador. La decisión
no fue demasiado complicada ya que, como se usó un bus i2c para la
comunicación entre el display y el microcontrolador y se tuvo que invertir
tanto tiempo en la elaboración de este bus por software, se decidió
utilizarlo también para la memoria. Por tanto, la memoria se comunica con
el micro de la misma manera que el display, es decir, a través de un bus
i2c.
Obviamente, existen muchos tipos de memoria distintas y no sólo
varía la conexión o la marca. El parámetro que más hay que tener en
cuenta en la elección de la memoria es la capacidad que tiene dicha
memoria. El cuentakilómetros tiene que medir tanto distancia como
velocidad. Como ya se ha dicho, el cuentakilómetros tendrá un alcance de
99,9km/h en velocidad, pero en distancia el alcance es de 999,99km. Los
envíos se harán cada cierto tiempo que controlaremos con una
interrupción de timer fijada a, por ejemplo, un segundo. Por ello, se sabe
que todos los datos que se vayan archivando serán a intervalos de un
segundo y no se necesitará archivar el tiempo, sino la distancia y la
velocidad. La velocidad se codifica en 10 bits, ya que con 10 bits podemos
llegar hasta 1024 y necesitamos 999, y la distancia en 17 bits, con los que
llegamos hasta 131072 y necesitamos 99999. Otra posibilidad es almacenar
solamente la velocidad al ser la distancia calculable a partir del tiempo y la
Memoria. Hardware: Componentes
31
velocidad ya que la distancia es el área que se encuentra debajo de la
curva velocidad-tiempo. Independientemente de la opción utilizada, se
decidió colocar una memoria de 64kbits de capacidad para poder tener
una gran cantidad de datos en una jornada larga que podría durar en
torno a cinco o seis horas.
La memoria que se escogió finalmente es de la marca ST y se trata
del modelo M24C64. Tiene ocho pines, tres de los cuales son un “enable”
que sirven para direccionar la memoria y que desde el microcontrolador
se pueda referir a esa memoria utilizando ese código. Esto se hace así por
si se van a utilizar varias memorias, para que los distintos datos se
almacenen en las distintas memorias. En nuestro caso, como sólo se tiene
una memoria, se ponen los tres bits a cero sabiendo que la memoria a la
que tenemos que referirnos es la memoria ‘000’. Luego se tienen otros dos
pines para la alimentación, uno se coloca a tres voltios que se obtienen de
la salida de tres voltios de la tarjeta de desarrollo y el otro a Tierra.
Posteriormente, hay un pin que sirve simplemente para impedir la
escritura en la memoria. Como se desea tanto escribir en la memoria como
leer de ella, este bit se pone a cero. Finalmente, se tienen las dos líneas SCL
y SDA correspondientes a la transmisión de datos a través del bus i2c.
Como ya ocurría con el display, todos estos pines van conectados a la
tarjeta de desarrollo, pero no pueden ir conectados directamente a los
pines de entrada/salida y a los de alimentación, sino que tiene que
diseñarse un circuito electrónico a base de condensadores y resistencias.
En concreto, se actúo de manera similar a como se hizo con el display,
colocando condensadores para fijar la tensión de tres voltios y dos
resistencias a la línea de tensión de tres voltios a partir de los pines SCL y
SDA como se muestra en la documentación del dispositivo.
Memoria. Hardware: Componentes
32
3V
C1
1
Pin 8
R2
2
1
1u
2
10k
Pin 6
R1
1
E0
VCC
E1
WC
E2
VSS
Memoria
EEPROM
2
10k
0
SCL
SDA
0
Figura 4: Circuito montado para memoria
Al igual que ocurría con el display, se muestra en la figura 4 el
circuito electrónico diseñado para el funcionamiento de la memoria. De
nuevo, son necesarias dos resistencias de pull-up entre las líneas de
comunicación i2c y la tensión de 3V y un condensador entre la tensión de
3V y Tierra. Los valores se pueden calcular siguiendo el esquema de la
documentación de la memoria, pero finalmente se decidió usar los mismos
valores que se usaron anteriormente en el circuito diseñado para el
display.
5 Sensor
El sensor es un sensor convencional de bicicleta, es decir, un
dispositivo que se activa cuando pasa por su lado un imán. Lo primero
que se hizo fue investigar como funcionaba exactamente este sensor. Para
ello se montó un circuito de acondicionamiento del sensor que no era más
que una resistencia muy elevada en serie con el sensor y todo ello
alimentado a tres voltios. El motivo de colocar una resistencia en serie era
Memoria. Hardware: Componentes
33
para limitar la corriente que atravesara el sensor, ya que no se sabía como
de robusto era y se podía romper. La señal que generaba el sensor se pudo
observar en un osciloscopio. Lo que se observó fue que el sensor no era
más que un interruptor normalmente abierto, de manera que los tres
voltios caían en el sensor cuando no se detectaba el paso del imán y la
tensión caía a cero voltios cuando pasaba el imán, ya que la conexión se
cerraba al atraer el imán el interruptor. Así pues, se observó que la señal
que generaba el sensor era una caída de un uno lógico a un cero lógico
cuando la rueda daba una vuelta y el imán pasaba por encima del sensor.
El circuito del sensor va conectado a una de las tarjetas de
desarrollo. Por un lado está conectada la alimentación que se tiene
disponible de tres voltios y por otro va conectada la tensión que cae en el
sensor a un pin de entrada al micro.
Para comprobar el funcionamiento del sensor se realizó un
pequeño programa que encendía un diodo led cuando pasaba el imán por
encima del sensor, lo apagaba la siguiente vez y así sucesivamente. Dicho
programa no funcionaba como debía y el diodo se encendía y se apagaba
aleatoriamente. Por ello, se conectó de nuevo el osciloscopio a la señal
generada por el sensor y, al hacer zoom, se observó como el interruptor
tenía muchos rebotes y, por tanto, sólo funcionaba correctamente si el
número de rebotes era impar. Por tanto, se procedió a filtrar los rebotes
para
que
el
programa
funcionara
correctamente
colocando
un
condensador formando junto con la resistencia una red RC. El
condensador tenía que ser lo suficientemente grande como para filtrar
completamente los rebotes pero lo suficientemente pequeño para que el
microcontrolador no tardara demasiado en detectar el salto del uno lógico
al cero lógico.
Memoria. Hardware: Componentes
34
SENSOR
R1
1
U1
2
330k
C1
1
2
1n
3V
0
Figura 5: Acondicionamiento sensor
El circuito de acondicionamiento del sensor se muestra en la
figura 5. El valor de la resistencia se calculó de manera que la corriente
que atravesara el sensor fuera muy pequeña cuando se cerrara el circuito.
De esta manera, con una resistencia de 330kΏ, la corriente es de tan sólo
unos 10µA la cual es lo suficientemente baja como para no ser capaz de
afectar a ningún dispositivo por muy sensible que éste sea. El valor del
condensador se decidió mediante prueba y error. Se fue incrementando el
valor del condensador y se comprobaban cada vez los rebotes que tenía el
sensor. Dichos rebotes se iban reduciendo a medida que se iba
incrementando el valor del condensador hasta que se observó que con un
condensador de 1nF los rebotes quedaban totalmente filtrados y el
programa que utilizaba el sensor funcionaba correctamente.
Memoria. Software
35
Capítulo 3 SOFTWARE
1 Introducción
Una vez explicados todos los elementos electrónicos que forman el
hardware, el capítulo 3 de la memoria se centra en el software. Los
distintos dispositivos del cuentakilómetros no pueden funcionar por si
solos, hay que configurarlos y programarlos para que ellos hagan lo que se
quiere que hagan. El microcontrolador por si sólo tampoco sirve para
nada, sin embargo, otorga un gran número de posibilidades ya que se
puede programar para que haga cualquier cosa que se desee. Por ello, esta
parte es igual de importante o más que la parte hardware.
Para la programación se ha utilizado el entorno de desarrollo de
Freescale CodeWarrior. La programación ha sido sin duda ninguna la
parte más complicada del proyecto. Al principio, cuando se reciben los
dispositivos y se tienen que poner a funcionar, es la primera vez que se
ven y se usan. Por tanto, lo primero que hubo que hacer fue leer a
conciencia todas las hojas de datos (datasheets). La programación se trata
de una cosa que requiere paciencia y avanza lentamente.
En este capítulo se explica todo el software que se ha ido
desarrollando para controlar el hardware del cuentakilómetros. El
software tiene que ser capaz de procesar la señal que recibe el
microcontrolador del sensor, calcular los distintos parámetros de distancia
y velocidad, enviar la información a través de la antena y recibirla en la
segunda tarjeta, procesar la información recibida, mostrar los resultados
en el display y guardarlos en la memoria y, finalmente, enviarlos a través
de un puerto serie al PC.
Memoria. Software
36
Para llegar al resultado final se fue avanzando poco a poco
siguiendo un orden lógico de desarrollo. En primer lugar se trató de
entender todas las funciones que disponía la tarjeta de desarrollo. Después
de investigarlas leyendo varias veces la documentación de la tarjeta
MC13192-SARD, se llegó a la conclusión de que de todas las cosas que la
tarjeta disponía sólo se necesitaban: los cuatro diodos led, los cuatro
pulsadores, los timers, la antena, el puerto de pines entrada/salida, la
salida de tres voltios de tensión y el puerto serie. Para empezar a coger
soltura con la tarjeta de desarrollo, la parte principal del cuentakilómetros,
se realizaron una serie de pequeños programas utilizando la mayoría de
estos elementos. Especial mención merece la antena y, por tanto, la
comunicación inalámbrica que causaron muchos problemas y fue la parte
más delicada del proyecto.
Una vez que se había cogido la soltura suficiente con la tarjeta de
desarrollo como para poder trabajar con ella se pasó a configurar la
memoria y el display. Como ya se ha dicho con anterioridad, estos
dispositivos tenían el gran inconveniente de que se comunicaban a través
de un bus i2c y el microcontrolador no disponía ninguno para su uso, ya
que el único se utilizaba en la conexión entre el transceiver y el
microcontrolador. Por tanto, lo primero fue hacer que los pines estándar
de entrada/salida funcionaran como si de un bus i2c se tratara. Para ello,
se tuvo que configurar un programa que manejara los datos de la misma
manera que hace dicho bus, como se verá más adelante. Al mismo tiempo
que se realizaba esta tarea, se configuraban los drivers de control del
display y la memoria, que hacen uso del software que hace que los pines
se comporten como un bus i2c, para ir comprobando que ambos
dispositivos funcionaban correctamente. Por tanto, se realizaron dos
pequeños programas utilizando ambos dispositivos para comprobar que,
efectivamente, todo funcionaba como debiera.
Memoria. Software
Una
37
vez configurada la tarjeta receptora con todo lo
anteriormente explicado, se empezó a trabajar con la tarjeta emisora. La
tarjeta emisora fue mucho más sencilla ya que el único dispositivo
conectado a ella es el sensor que no escondía ninguna sorpresa. Lo único
que se tuvo que hacer fue configurar la tarjeta para que procesara la señal
que se obtenía del sensor.
Por fin, ambas tarjetas estaban preparadas para funcionar, pero
cada una por su lado. Así pues, llegaba el momento de conectarlas entre sí
y hacer que todo funcionara como un conjunto para obtener el
cuentakilómetros deseado. Para ello, se tuvo que realizar toda la
programación de los transceivers y la configuración de las antenas para
conseguir la comunicación inalámbrica.
En la figura 6 se puede observar como las distintas funciones se
relacionan entre sí, es decir, que funciones llaman a que funciones y con
que propósito.
Tarjeta receptora
Tarjeta emisora
init_display.c
Inicialización display
Programa principal
Programa principal
(remote_controller.c)
(lighting_demo_device.c)
Interrupción
sensor
Envío display
i2c_display.c
Figura 6: Diagrama bloques software
Memoria. Software
38
2 Comunicación inalámbrica
La comunicación inalámbrica a través de las dos antenas impresas
en ambas tarjetas electrónicas ha sido una de las cosas más complicadas de
todo el proyecto. Como ya se ha dicho con anterioridad, la antena era uno
de los elementos que interesaban de los que estaban incluidos en la tarjeta
y, por tanto, para dominarla, se quiso hacer un pequeño programa
incluyendo la configuración de la conexión inalámbrica adecuada. En
concreto, se quiso hacer un programa que encendiera y apagara los leds de
una tarjeta alternamente cada vez que se apretaran los pulsadores de la
segunda tarjeta.
Al principio, se pensaba que esta iba a ser una tarea sencilla pero
pronto se observó que no era así. Todo fue mucho más complicado porque
la antena estaba controlada por un transceiver llamado MC13192 que se
conectaba con el microcontrolador principal, el MC9S08GT60. Al contrario
que ocurría con el micro principal, la herramienta CodeWarrior no
generaba los códigos del interfaz MC13192-usuario y, por tanto, no se
podían utilizar las antenas. Este hecho provocó un retraso importante con
respecto al plan de trabajo inicial ya que se reservó muy poco tiempo para
este programa al pensar que era más simple.
Lo imprescindible para poder elaborar este pequeño programa y
conseguir la ansiada comunicación inalámbrica era encontrar los códigos
necesarios para la activación del transceiver. Después de buscar por
Internet, se encontró una segunda herramienta de Freescale, denominada
Beekit. El Beekit funciona de una manera muy sencilla, el tipo de
comunicación inalámbrica es configurable y se escoge una plantilla que la
herramienta sigue para generar los códigos necesarios. En este caso, se
selecciona SMAC ya que es la manera en la que se quiere transmitir y
recibir los datos por las antenas como se verá más adelante. Por ejemplo, si
se selecciona la plantilla acelerómetro, la herramienta creará un programa
Memoria. Software
39
que configure la tarjeta utilizando los acelerómetros pero siempre
incluyendo la configuración de los transceiver y de la comunicación
inalámbrica. Dos de estos códigos eran justamente uno que actuaba sobre
los interruptores de una tarjeta y otro sobre los leds de la segunda, por lo
que, por fin, se consiguió ese pequeño programa que se deseaba. Una vez
que se habían dado todos estos pasos se seleccionaba exportar solución y
los códigos quedaban listos para su uso. Finalmente, en el entorno de
desarrollo se seleccionaba importar proyecto, se buscaba la solución que se
acababa de exportar y aparecía el código que se había generado.
Este código incluía toda la programación relacionada con la
comunicación inalámbrica, por lo que este fue un paso importante de cara
a la consecución de la programación final, ya que toda ella pudo usarse
con pequeñas modificaciones para la transmisión final. La transmisión y
recepción inalámbricas se realizan utilizando el protocolo Zigbee. El
MC13192 se utiliza para implementar la capa física de Zigbee, aunque
luego se utiliza una capa lógica más simple denominada SMAC. El
protocolo Zigbee es parecido al bluetooth sólo que un poco menos
potente. Zigbee es un poco más lento, tiene un menor ancho de banda y
consume menos que bluetooth. Debido a la sencillez de los datos a enviar
a través de las antenas esta tecnología era la más adecuada ya que tiene la
suficiente rapidez y ancho de banda pero permite ahorrar un poco de
batería al consumir muy poco.
Finalmente, una vez conseguido el pequeño programa que
actuaba sobre los leds de una tarjeta a partir de los pulsadores de una
segunda tarjeta, se comprobó el alcance que tenía el dispositivo. Zigbee
tiene un alcance menor que otras tecnologías como por ejemplo la
tecnología bluetooth. Sin embargo, en una bicicleta convencional, el sensor
y la pantalla están relativamente cerca al ser la distancia entre ellos en
torno a los treinta centímetros. El resultado de la prueba no pudo ser más
satisfactorio cuando se comprobó que el dispositivo tenía un alcance de
Memoria. Software
40
unos quince metros, incluso teniendo que atravesar obstáculos, por lo que
la tecnología Zigbee tenía la potencia suficiente y era la más adecuada
para el proyecto.
3 La tarjeta emisora
La tarjeta emisora fue lo último que se desarrolló ya que no tenía
mucha complejidad y se prefirió hacer con antelación la parte más
complicada porque podía dar más problemas y así se tendría más tiempo
para resolverlos.
La tarjeta emisora tiene como único cometido recibir la señal del
sensor
y
procesarla.
El
sensor
con
su
circuito
electrónico
de
acondicionamiento se alimentan a tres voltios con la salida de la tarjeta y
la tensión que cae en el sensor se conecta a un pin de entrada de la tarjeta
de desarrollo. Como ya se pudo ver en el capítulo anterior, la señal que
genera el sensor es una caída de tensión de tres a cero voltios, es decir,
pasa de valer uno a cero cada vez que pasa el imán por su lado.
La programación necesaria para procesar la señal del sensor fue
muy sencilla. Lo único que se tuvo que hacer es configurar el pin al que
estaba conectado el sensor como entrada y hacer que el sensor generara
una interrupción por teclado cada vez que se detectara un flanco de
bajada. Una vez que se detectaba ese flanco, se calculan la distancia y la
velocidad. En primer lugar, la distancia se calcula sumando a una variable
global el perímetro de la rueda cada vez que se generaba la interrupción.
En segundo lugar, se lee el tiempo de un timer configurado con
anterioridad y que está corriendo continuamente cada vez que ocurre una
interrupción y se calcula el tiempo que ha tardado la rueda en dar un giro
completo restando este tiempo al tiempo anteriormente leído. A partir de
ahí, se calcula la velocidad dividiendo el perímetro entre el tiempo,
teniendo mucho cuidado de que no se genere overflow haciendo en todo
Memoria. Software
41
cálculo intermedio que el valor sea siempre representable con 16 bits. El
timer se configuró pensando en poder mostrar la menor velocidad posible
que coincide con el mayor tiempo posible. Por eso, se decidió que el valor
del prescalado fuera siete, el más grande posible. Este timer permite un
tiempo máximo de 2,1s y, por tanto, una velocidad mínima de 3,8km/h ya
que el reloj tiene una velocidad de 4MHz. Al principio, no se logró que la
velocidad se midiera bien ya que se topó con el límite de la tecnología que
provoca que la tarjeta entre en modo de bajo consumo cada vez que se
ejecute el bucle infinito para que el consumo sea mínimo. Esto provocaba
que el timer se parara y arruinaba el cálculo del tiempo transcurrido entre
una interrupción y la siguiente. Finalmente, se quitaron las instrucciones
que provocaban que la tarjeta hiciera un reset, se consiguió la medida de
velocidad y también se implementó la medida de la velocidad máxima. El
trozo de código correspondiente a los cálculos de los parámetros y a la
interrupción se muestra en el apartado código fuente.
Una vez que se tienen los parámetros calculados, se envían a
través de la antena a la segunda tarjeta de desarrollo. El problema que se
encontró en este paso fue que el dispositivo está preparado para enviar
únicamente datos de ocho bits y la distancia y la velocidad se codificaban
en 16 bits. Para resolverlo, se pensó en un principio en dividir ambas
variables en dos de ocho bits para enviar la parte alta y la parte baja por
separado, pero al final se optó por enviar la información separada en los
distintos caracteres en forma decimal.
4 La tarjeta receptora
La tarjeta receptora requirió sin lugar a dudas un trabajo mucho
mayor que el necesario para configurar la tarjeta emisora. A esta tarjeta se
conectan el display y la memoria, siendo el cometido del microcontrolador
de esta segunda tarjeta el enviar la información que recibe a través de la
antena al display y a la memoria y leer los datos almacenados en la
Memoria. Software
42
memoria. Además esta tarjeta se iba a conectar a través del puerto serie
con el PC pero finalmente esto no se llevó a cabo.
El cuentakilómetros debía de ser capaz de desarrollar cuatro
funciones: medir distancia, velocidad, velocidad máxima y velocidad
media. Por tanto, el usuario debía elegir que registro deseaba ver en cada
momento. Por ello, se configuraron los cuatro pulsadores para mostrar
cada uno de los cuatro parámetros. La configuración de los pulsadores ha
quedado implementada, pero de las cuatro funciones del ciclocomputador
sólo se han implantado la distancia y la velocidad instantánea ya que no
tenía ningún sentido implementar la velocidad máxima y la velocidad
media si la velocidad instantánea no se medía correctamente.
Como ya se ha citado un poco antes, el gran problema que
presentan los dispositivos conectados a la tarjeta receptora es que se
comunican a través de un bus i2c y el único con el que cuenta el
microcontrolador se utiliza para su comunicación con el transceiver. Este
problema se resolvió configurando los pines utilizados para comunicarse
con los periféricos para que funcionen como lo hace un bus i2c por
software. De este modo, se programaron unas funciones para enviar y
recibir simulando el comportamiento de un bus i2c. En el anexo A se
puede ver como funciona un bus i2c y, por tanto, como se comportan las
funciones
realizadas
y
algunos
detalles
sobre
las
funciones
implementadas. La recepción de datos y la escritura en el display se
muestra en el apartado código fuente.
Los dispositivos se implementaron por separado; en primer lugar
el display y, posteriormente, la memoria, por lo que lo mejor es que los
analicemos también por separado.
1. Display
Memoria. Software
43
El display necesita una configuración y una serie de funciones
para facilitar la comunicación con el microcontrolador. El objetivo de las
funciones de control del display es conseguir escribir en el display
enviando simplemente una cadena de caracteres desde el programa
principal.
Estas funciones se denominan drivers. Los drivers del display son
mucho más complejos que los drivers de la memoria. Por un lado, el
display necesita una inicialización para, por ejemplo, dar tensión a la
pantalla porque el display recibe tres voltios para alimentar la lógica que
tiene incorporada, pero la tensión que necesita la pantalla se implanta por
software. Por otro lado, se programan unas funciones que reciben una
cadena de caracteres y la codifican para escribir en el display o pasan
directamente a la primera o segunda línea del display. El display tiene que
recibir una serie de parámetros cada vez que se quiere escribir en él o
pasar de una línea del display a otra y se tiene que codificar la información
en código ASCII, por tanto, la idea fue realizar una función que permitiera
poner toda la secuencia de parámetros y codificación una vez y utilizarla
muchas veces. Todas estas funciones (PutsDisplay, DisplayGotoLinea0 y
DisplayGotoLinea1) se pueden observar en el apartado código fuente.
Dichas funciones se encuentran en el fichero init_display.c.
Como se puede observar en el código de las funciones localizado
en el apartado de código fuente, es necesario enviar un 0x76 al display
antes de realizar cualquier operación. Ésta es la dirección del display.
Luego, dependiendo de lo que se va a hacer se envían unos parámetros u
otros, cogidos todos ellos de la documentación del display.
Todo esto es un trabajo muy complicado, sin embargo no lo fue
tanto gracias al dispositivo escogido. La razón por la cual se escogió ese
display LCD fue porque el director del proyecto, Daniel Muñoz, utiliza
este mismo display en la asignatura que el imparte en la universidad y,
Memoria. Software
44
por tanto, se pudo aprovechar el driver que él había realizado permitiendo
un gran ahorro de tiempo. Aún así, se tuvo que modificar el driver para
que utilizara las funciones que se habían elaborado para que los pines
normales de entrada salida funcionaran como un bus i2c.
2. Memoria
Los drivers de la memoria se tuvieron que hacer desde el principio
pero su configuración fue mucho más corta y simple y más aún después
de realizar la configuración del display primero. La memoria no necesita
ningún tipo de inicialización, entonces lo que se hizo fue programar dos
funciones, una para escribir en la memoria y la otra para leer. La manera
que se utilizó para realizar estas dos funciones fue una copia de lo que
hace el display, por lo que la memoria recibe una cadena de caracteres y la
escribe y lee una cadena de caracteres y la transmite. Para clarificar un
poco de lo que se está hablando los códigos de las funciones desarrolladas
para el control de la memoria se muestran en el apartado código fuente.
Como se puede observar en el código de las funciones de control de
la memoria, al principio del envío y la lectura se mandan tres comandos:
0xA0, 0, 0. Estos comandos son el direccionamiento de la memoria
marcado por los pines enable y los dos siguientes son la dirección de
memoria por la cual va a comenzar el proceso de lectura o escritura.
También se puede ver como se ha copiado el paso a ASCII de los
comandos recibidos para simplificar, haciendo que funcione la memoria
de manera exacta al display.
En los códigos mostrados en el capítulo con título código fuente se
puede ver como las funciones de control de la memoria y el display hacen
llamadas a una serie de funciones que tienen que ver con el bus i2c. Éstas
son las funciones que se han tenido que programar para hacer que los
pines de entrada/salida funcionen de la misma manera que lo hace un bus
Memoria. Software
45
i2c. Para el display sólo fue necesaria una función cuyo código se
encuentra en el fichero i2c_display.c y se muestra en el apartado código
fuente. En ese código se muestran todos los pasos que tiene que hacer el
pin para transmitir la información como si se tratara de un bus i2c. Se
puede observar como la función da todos los pasos que se indica que da el
bus i2c en el anexo A. Primero se genera una condición de start, luego se
envían los datos bit a bit empezando por el más significativo y dando
pulsos en la línea SCL en cada envío, posteriormente se genera un pulso
ACK al final de cada byte enviado y, por último, se genera una condición
de stop. Cabe destacar la configuración del bit SDA como entrada después
de cada byte enviado, que es necesario porque el esclavo toma el control
de esa línea hasta que se da el pulso ACK, pero no es nada intuitivo.
En el caso de la memoria no fue tan sencillo y se tuvieron que
programar tres funciones para la comunicación a través del bus i2c. Una
de ellas es la que sirve para almacenar información en la memoria y es
muy similar a la del display. Las otras dos sirven para la lectura, ya que
para leer datos de la memoria, se necesita primero indicar la dirección por
la cual se va a empezar a leer y luego empezar a leer. Para enviar la
dirección de donde se va a empezar a leer no se puede utilizar la misma
función que para el envío normal porque no se puede generar una
condición de stop después de enviar la dirección de lectura. Esta
diferencia se puede observar en las figuras ocho (envío) y diez (lectura) de
la documentación de la memoria. También se pueden ver estas diferencias
en el código de las tres funciones programadas localizadas en el archivo
i2c_memory.c, que se muestran en el apartado código fuente.
Como se puede observar en esos códigos, la función de envío es
muy similar a la función de envío del display ya que el concepto es el
mismo. La función envia_lectura() no es más que la misma función de
envío sin generar una condición de stop. Esta función sirve para informar
Memoria. Software
46
al microcontrolador la dirección por la cual tiene que empezar el proceso
de lectura de la memoria y, por ello, no se puede generar una condición de
stop entre este envío y la lectura como se puede observar en la figura diez
de la documentación de la memoria. La función de lectura cumple todos
los pasos que se dice que tiene que cumplir en el anexo A sobre el bus i2c.
Es muy similar a la de envío con la única diferencia localizada en la
generación del pulso ACK.
5 Programación final
Una vez que se habían configurado todos los elementos del
cuentakilómetros por separado, llegaba el momento de juntar todo para
finalizar el dispositivo. Lo que se hizo fue partir de aquellos programas
que encendían los leds de una tarjeta al apretar los pulsadores de la otra.
El motivo fue que estos programas incluían toda la configuración del
transceiver que controla la antena.
La programación final se puede dividir en dos grandes partes: en
primer lugar, la programación del microcontrolador de la tarjeta emisora
y, en segundo lugar, la programación del microcontrolador de la tarjeta
receptora.
La tarjeta emisora cuenta con sólo un archivo denominado
remote_controller.c. Este archivo tiene por un lado toda la configuración del
transceiver y todas las funciones y variables necesarias para poder enviar
información a través de la antena y, por otro, la interrupción por teclado
que genera la señal del sensor. Ésta interrumpe el curso normal del
programa principal, modifica los valores de velocidad actual y distancia
recorrida y envía la información a través de la antena.
Memoria. Software
47
La tarjeta receptora cuenta con varios archivos distintos
localizados en el mismo proyecto. En primer lugar, la tarjeta tiene un
programa principal localizado en el archivo lighting_demo_device.c que
contiene todo el procesamiento de la información recibida a través de la
antena y la inicialización del microcontrolador y el display. El archivo
incluye todas las funciones y variables necesarias para la recepción de
datos a través de la antena. En segundo lugar, la tarjeta tiene que
comunicarse con el display y la memoria. Para ello, se utiliza la
programación implementada en los ficheros i2c_display.c e i2c_memory.c,
que incluyen las funciones de comunicación entre los periféricos y el
microcontrolador a través del bus i2c configurado por software de la
manera que se cuenta en el apartado cuarto de este mismo capítulo.
Memoria. Resultados/Experimentos
48
Capítulo 4 RESULTADOS/EXPERIMENTOS
Los resultados conseguidos han sido resultados parciales. El
resultado final del proyecto se muestra en las figuras 10 y 11, en las cuales
se puede observar el ciclocomputador funcionando y como ha quedado
montado. En la figura 10 se muestra el cuentakilómetros midiendo
distancia recorrida, en la figura 11 midiendo velocidad y en la figura 11b
midiendo velocidad máxima. En el caso de la velocidad el resultado no ha
sido totalmente satisfactorio ya que, a pesar de que se ha conseguido que
la tarjeta no entre en modo bajo consumo, la medida no es muy
convincente. Cuando va despacio si parece que funcione bien midiendo
velocidades en torno a los diez kilómetros por hora, pero cuando va
rápido la medida no es tan buena. Esto puede ser debido a que la
interrupción es un poco lenta y se pierden datos por el camino.
Figura 10: Demostración medida distancia
Memoria. Resultados/Experimentos
Figura 11: Demostración medida velocidad
Figura 11b: Demostración velocidad máx.
49
Memoria. Resultados/Experimentos
50
Como se puede observar, el display se enciende y muestra los
valores de velocidad y distancia. Estos valores se modifican cada vez que
el imán pasa por encima del sensor.
Memoria. Conclusiones
51
Capítulo 5 CONCLUSIONES
Una vez finalizado el proyecto, se hecha la vista atrás y se
compara lo que se tenía que hacer con lo que se ha hecho. La conclusión
que se obtiene es que el proyecto no ha llegado al punto que se deseaba en
una principio. Por un lado, todo el hardware ha quedado implementado y
funciona correctamente, pero no se ha obtenido el mismo resultado con el
software. El dispositivo mide sin ningún problema la distancia que se ha
recorrido a partir de la señal generada por el sensor y la muestra en el
display, sin embargo, no se ha conseguido lo mismo con la velocidad que
no la mide adecuadamente. El cuentakilómetros mide velocidad una vez
que se eliminó la entrada en modo de bajo consumo, pero los valores
cuando las interrupciones son rápidas no son muy convincentes. Como ya
se ha dicho con anterioridad, este problema puede estar relacionado con la
lentitud de la interrupción, ya que se observan valores muy pequeños de
la velocidad cuando la bicicleta va rápido.
Al igual que ocurre con la medida de velocidad, la implantación
de la memoria EEPROM sólo se ha conseguido a medias. Como se ha
podido ver con antelación, se programaron los drivers de la memoria y
mediante un sencillo programa que guardaba un dato en la memoria, lo
leía y lo mostraba en el display se demostró que funcionaba. Sin embargo,
nunca se llegó a implantar con el resto del cuentakilómetros por los
problemas que el resto de la programación dió y que dejó sin tiempo para
poder completar la implantación de la memoria.
Finalmente, la comunicación con el PC a través del puerto serie,
no se pudo llevar a cabo.
Memoria. Futuros desarrollos
52
Capítulo 6 FUTUROS DESARROLLOS
Con la llegada del siglo XXI, el cliente se ha vuelto mucho más
exigente y experto y a todo el mundo, pequeños y mayores, le gusta que
sus cosas sean lo más sofisticadas posibles. Es por esto que incluso un
elemento tan simple como un cuentakilómetros tenga buena acogida en el
mercado a pesar de su mayor precio si incluye elementos como una
memoria y la capacidad de poder descargarse los datos al ordenador. Esto
era impensable hace unos años pero hoy todo el mundo tiene un PC en
casa y tiene la curiosidad de poder comparar los datos de una jornada con
los del día anterior.
El cuentakilómetros confeccionado se puede desarrollar en el
futuro de muchas maneras distintas y poder llegar a conseguir un
cuentakilómetros realmente sofisticado utilizando la misma base que este,
que es bastante sólida y buena.
Un primer desarrollo posible tiene que ver con la comunicación
con el ordenador, que finalmente no se ha conseguido en este proyecto, y
que podría realizarse de una manera un poco más sofisticada a través de
un puerto USB o de manera inalámbrica utilizando tecnología bluetooth,
en vez de a través de un puerto serie que ya está en desuso.
Uno de los inconvenientes más grandes que tiene este
cuentakilómetros para competir en el mercado es el escaso número de
funciones que tiene. Por ello, se podría hacer que el cuentakilómetros
midiera otros parámetros como hacen los mejores del mercado, como el
ritmo cardiaco, la cadencia de pedaleo o las calorías quemadas. En el caso
del ritmo cardiaco, habría que añadir otro periférico y otra tarjeta de
Memoria. Futuros desarrollos
53
desarrollo que fueran conectados al ciclista. Esta tarjeta se podría
comunicar de la misma manera que las dos con las que ya cuenta el
proyecto. Este camino tendría una gran ventaja ya que la programación
para la comunicación entre las tarjetas está ya hecha y se podría reutilizar.
Finalmente, un último desarrollo que podría ser interesante es
cambiar la tecnología de la comunicación inalámbrica. De esta forma, se
podría utilizar tecnología bluetooth en vez de tecnología Zigbee ya que
ésta es una manera de transmisión mucho más potente. Incluso, se podría
omitir la tarjeta receptora y sustituirla por el teléfono móvil del usuario ya
que en la actualidad todos los teléfonos móviles incluyen tecnología
bluetooth. Se podría vender un CD junto con la tarjeta emisora que
contuviera un programa que configurara el móvil como tarjeta receptora.
La pantalla se usaría para representar los parámetros calculados, los
números podrían utilizarse como pulsadores para cambiar de parámetro
mostrado en la pantalla y los datos se podrían almacenar en la tarjeta de
memoria del móvil, ya que hoy en día todos los teléfonos móviles incluyen
una. Esto simplificaría además la conexión con el ordenador ya que
actualmente todos los móviles se pueden conectar al ordenador por USB y
se pueden descargar todos los datos que contengan. La desventaja más
importante de este sistema es que se requiere un móvil de esas
características, aunque cada vez es más habitual que los móviles incluyan
todas estas tecnologías. Otra desventaja es que se tendría que cambiar toda
la comunicación inalámbrica y pasar de utilizar Zigbee a bluetooth, lo cual
supondría empezar el proyecto casi desde cero ya que la transmisión
inalámbrica es la parte más delicada y complicada y la que más tiempo
requiere.
Memoria. Bibliografía
54
BIBLIOGRAFÍA
[1]
http://www.esacademy.com/faq/i2c/index.htm
[2]
http://www.freescale.com/
[3]
http://www.farnell.com/datasheets/72672.pdf
[4]
http://www.farnell.com/datasheets/76930.pdf
[5]
http://www.nxp.com/acrobat_download/datasheets/PC
F2119X_4.pdf
Parte II ESTUDIO ECONÓMICO
Estudio económico
56
El proyecto que se ha llevado a cabo es un cuentakilómetros de
comunicación inalámbrica y con memoria para almacenar los datos de una
jornada. Económicamente hablando, se trata de un proyecto con dudosa
viabilidad debido al elevado precio, pero tiene un gran interés debido a la
sencillez del manejo de este dispositivo. El diseño del cuentakilómetros es
muy robusto, por lo que la rentabilidad y la fiabilidad del dispositivo no
se pueden poner en duda.
El problema más grande que tiene el cuentakilómetros construido
es el tamaño, lo que puede afectar a la viabilidad de este proyecto. Ya de
por sí, las tarjetas de desarrollo son grandes, pero aún lo son más con los
periféricos conectados. La tarjeta receptora es un poco grande pero, al ir
alojada en el manillar de la bicicleta, se puede permitir. Sin embargo, la
tarjeta emisora que va alojada en la horquilla de la bicicleta es
inadmisiblemente grande. No obstante, no se utilizan muchas de las partes
que incluyen las tarjetas por lo que se podría reducir el tamaño añadiendo
al dispositivo final sólo los componentes estrictamente necesarios para la
elaboración del proyecto.
Parte III MANUAL DE USUARIO
Manual de usuario
58
Para poder utilizar el cuentakilómetros hay que seguir una serie
de pasos que se muestran en este manual. En primer lugar, ambas tarjetas
deben estar alimentadas mediante una pila de nueve voltios. Las tarjetas
de desarrollo cuentan con un interruptor de dos posiciones: en la primera
de ellas se activa la alimentación desde la pila y se desactiva la
alimentación desde red y en la segunda ocurre todo lo contrario. En este
caso, las tarjetas están apagadas cuando estos pulsadores están a la
derecha y encendidas cuando están a la izquierda. Por tanto, lo primero
que hay que hacer es encender ambas tarjetas. A continuación se
observará como se encienden los leds y según la manera en que se
enciendan se sabrá si se trata de la tarjeta emisora o receptora. En la tarjeta
emisora los leds se encienden todos a la vez un tiempo, y en la tarjeta
receptora van rotando uno a uno. Posteriormente, se enciende un led de
seguridad y en la tarjeta emisora se encienden durante un tiempo todos
los leds. En ese momento, la tarjeta está comprobando cual es el mejor
canal de los cuatro que tiene para enviar la información. Cuando acaba, se
muestra el led correspondiente al canal escogido. Ahora se tiene que
apretar el pulsador en la tarjeta receptora que selecciona el mismo canal
que en la tarjeta emisora y se encenderá el led correspondiente. Cabe
recordar que el pulsador S104 enciende el led 1, el S103 enciende el led 2,
el S102 enciende el led 3 y el S101 enciende el led 4 y hay que tener
cuidado de apretar el pulsador que haga que se encienda el mismo led que
se encendió en la tarjeta emisora. Por último, hay que direccionar la tarjeta
receptora que está configurada por defecto la dirección tres. Por tanto, hay
que apretar el pulsador S102 que enciende el tercer led. Este proceso hay
que repetirlo cada vez que se enciende el cuentakilómetros.
Ahora, las tarjetas están configuradas y listas para poder usarse y,
si pasa el imán por encima del sensor, empezarán a verse los valores de los
parámetros en el display. El display tiene tres estados: uno que mide
distancia, otro que mide velocidad y uno tercero en el que está apagado.
Manual de usuario
59
Todo esto se puede ver en el diagrama de estados que se muestra en la
figura 12.
Pulsador S102
Estado 1
Estado 2
Pulsador S101
Dar
alimentación
Mide distancia
Quitar
alimentación
Mide velocidad
Quitar
alimentación
Paro
Figura 12: Diagrama estados del display
Como se puede observar en la figura 12, cuando se da
alimentación se pasa directamente al estado dos donde se mide velocidad.
Una vez ahí, el display espera que el sensor genere una interrupción para
empezar a mostrar el valor de la velocidad instantánea. Para pasar del
estado dos al uno, se debe apretar el pulsador S101 y para pasar del uno al
dos, el pulsador S102. En el estado uno se mide la distancia recorrida.
Desde cualquiera de los dos estados si se quita alimentación, se pasa al
estado de parada.
Parte IV CÓDIGO FUENTE
Código fuente
61
En este apartado se muestra el código de las distintas funciones
programadas al las que se hacen referencia alguna vez en el texto de la
memoria. Son funciones cuyo código puede resultar muy ilustrativo para
saber de lo que se está hablando:
Drivers del display:
void PutsDisplay(byte *pcad)
{
byte i;
/* Initialize TX buffer structure */
i2c_tx_buffer.buf[0] = 0x76;
i2c_tx_buffer.buf[1] = 0x40; /* Primer
datos */
byte
de
control.
Direcciona
i = 2;
/* Copio la cadena en el buffer de TX */
while (*pcad != '\0'){
i2c_tx_buffer.buf[i] = *pcad | 0x80; /* El juego de caracteres
tiene el
ascii con el primer bit a 1 */
pcad++;
i++;
}
i2c_tx_buffer.length = i;
/* Se envían los datos por el I2C*/
envia_i2c_display(i2c_tx_buffer.buf,i2c_tx_buffer.length);
}
void DisplayGotoLinea0(void)
{
/* Se inicializa el buffer de transmisión */
i2c_tx_buffer.buf[0] = 0x76;
i2c_tx_buffer.buf[1] = 0x00; /* Primer byte de control */
i2c_tx_buffer.buf[2] = 0x02; /* Comando Return home */
i2c_tx_buffer.length = 3;
envia_i2c_display(i2c_tx_buffer.buf,i2c_tx_buffer.length);
}
void DisplayGotoLinea1(void)
{
/* Se inicializa el buffer de transmisión */
i2c_tx_buffer.buf[0] = 0x76;
i2c_tx_buffer.buf[1] = 0x00; /* Primer byte de control */
i2c_tx_buffer.buf[2] = 0xA9; /* Cursor a dirección 40 (Línea 1) */
i2c_tx_buffer.buf[3] = 0x14; /* Avanza el cursor 1 posición a
derecha */
i2c_tx_buffer.length = 4;
envia_i2c_display(i2c_tx_buffer.buf,i2c_tx_buffer.length);
}
la
Código fuente
62
Drivers de la memoria:
void PutsMemory(byte *pcad)
{
byte i;
/* Initialize TX buffer structure */
i2c_tx_buffer.buf[0] = 0xA0;
i2c_tx_buffer.buf[1] = 0;
i2c_tx_buffer.buf[2] = 0;
i = 3;
/* Copio la cadena en el buffer de TX */
while (*pcad != '\0'){
i2c_tx_buffer.buf[i] = *pcad;
pcad++;
i++;
}
i2c_tx_buffer.length = i;
/* Se envían los datos por el I2C*/
envia_i2c_memory(i2c_tx_buffer.buf,i2c_tx_buffer.length);
}
void ReadsMemory(void)
{
byte i;
/* Initialize TX buffer structure */
i2c_tx_buffer.buf[0] = 0xA0;
i2c_tx_buffer.buf[1] = 0;
i2c_tx_buffer.buf[2] = 0;
i = 3;
/* Copio la cadena en el buffer de TX */
i2c_tx_buffer.length = i;
/* Se envían los datos por el I2C*/
envia_lectura(i2c_tx_buffer.buf,i2c_tx_buffer.length);
i2c_tx_buffer.buf[0] = 0xA1;
envia_lectura(i2c_tx_buffer.buf,1);
lee_i2c_memory(4);
}
Configuración del envío a través del bus i2c para el display:
#include "MC9S08GT60.h"
#include "i2c_display.h"
#define SDA PTAD_PTAD6
#define SCL PTAD_PTAD7
// Pines del bus i2c por los cuales se
transmite la información al display
Código fuente
63
void envia_i2c_display(byte buff[],byte tam) {
byte
byte
byte
byte
car_env;
var=0;
j=0;
n=0;
SDA=1;
SCL=1;
PTADD=0xC0;
// Configuración de SCL (pin 7 del puerto A)
y SDA (pin 6 del puerto A) como salidas.
SDA=0;
// Start condition
var++;
var--;
// Delay
for(j=0;j<tam;j++) {
car_env=buff[j];
for(n=0;n<8;n++){
SCL = 0;
SDA=(car_env>>7)&1;
// MSB primero
SCL=1;
var++;
// Delay
car_env<<=1;
var--;
// Para evitar overflow
}
SCL = 0;
PTADD_PTADD6=0;
// Configuración de SDA como entrada para
que tome el control el slave.
SCL = 1;
SCL = 0;
// ACK pulse para volver a tomar el control
de la línea SDA.
PTADD_PTADD6=1;
// Configuración de SDA como salida.
}
SCL = 1;
SDA = 1;
// Stop condition
PTADD=0;
evitar cortocircuitos.
}
// Configuro el puerto como salida para
Configuración del envío y lectura a través del bus i2c para la memoria:
#include "MC9S08GT60.h"
#include "i2c_memory.h"
#define SDA PTBD_PTBD3
#define SCL PTBD_PTBD2
extern byte lee_buff[50];
void envia_i2c_memory(byte buff[],byte tam) {
Código fuente
byte
byte
byte
byte
64
car_env;
var=0;
j=0;
n=0;
SDA=1;
SCL=1;
PTBDD_PTBDD3 = 1;
PTBDD_PTBDD2 = 1;
// Configuración de SCL (pin 2 del puerto B)
y SDA (pin 3 del puerto B) como salidas.
SDA=0;
// Start condition
var++;
var--;
// Delay
for(j=0;j<tam;j++) {
car_env=buff[j];
for(n=0;n<8;n++){
SCL = 0;
SDA=(car_env>>7)&1;
// MSB primero
SCL=1;
var++;
// Delay
car_env<<=1;
var--;
// Para evitar overflow
}
SCL = 0;
PTBDD_PTBDD3=0;
// Configuración de SDA como entrada para
que tome el control el slave.
SCL = 1;
SCL = 0;
// ACK pulse para volver a tomar el control
de la línea SDA.
PTBDD_PTBDD3=1;
// Configuración de SDA como salida.
}
SCL = 1;
SDA = 1;
// Stop condition
PTBDD_PTBDD3 = 0;
PTBDD_PTBDD2 = 0;
evitar cortocircuitos.
}
// Configuro el puerto como entrada para
void lee_i2c_memory(byte longitud) {
byte
byte
byte
byte
byte
byte
lee_car=0;
v=0;
j=0;
n=0;
k=7;
copy;
//SDA=1;
//SCL=1;
Código fuente
65
//PTBDD|=0x0C;
//SDA=0;
PTBDD_PTBDD3 = 0;
PTBDD_PTBDD2 = 1;
como salida
// Start condition
// Configuración de SDA como entrada y SCL
v++;
v--;
for(j=0;j<longitud;j++) {
lee_car=0;
for(n=0;n<8;n++){
SCL=1;
copy=SDA;
SCL=0;
lee_car|=copy&1; // MSB first. Or made for
characters that have already been read.
//SCL=1;
v++;
if(n<7){
lee_car<<=1;
// Delay
}
v--;
// Para evitar overflow
}
lee_buff[j]=lee_car;
SCL=0;
PTBDD_PTBDD3 = 1;
SDA=0;
//PTBDD_PTBDD3=0;
if(j<(longitud-1)){
SCL=1;
SCL=0;
PTBDD_PTBDD3 = 0;
}
// ACK pulse
//PTBDD_PTBDD3=0;
}
//PTBDD_PTBDD3 = 1;
SCL=1;
SDA=1;
// Stop condition
//PTBDD_PTBDD3=0;
//PTBDD_PTBDD2=0;
}
void envia_lectura(byte buff[],byte tam) {
byte car_env;
not
errasing
the
Código fuente
66
byte var=0;
byte j=0;
byte n=0;
//SDA=1;
//SCL=1;
PTBDD_PTBDD3 = 1;
PTBDD_PTBDD2 = 1; // Configuración de SCL (pin 2 del puerto B) y SDA
(pin 3 del puerto B) como salidas.
SDA=1;
SCL=1;
SDA=0;
// Start condition
var++;
var--;
// Delay
for(j=0;j<tam;j++) {
car_env=buff[j];
for(n=0;n<8;n++){
SCL = 0;
SDA=(car_env>>7)&1;
// MSB primero
SCL=1;
var++;
// Delay
car_env<<=1;
var--;
// Para evitar overflow
}
SCL = 0;
PTBDD_PTBDD3=0;
// Configuración de SDA como entrada para
que tome el control el slave.
SCL = 1;
SCL = 0;
// ACK pulse para volver a tomar el control
de la línea SDA.
PTBDD_PTBDD3=1;
// Configuración de SDA como salida.
}
//PTBDD_PTBDD3 = 0;
//PTBDD_PTBDD2 = 0;
// Configuro el puerto como entrada para
evitar cortocircuitos.
}
Interrupción del sensor:
interrupt void KBD_ISR()
{
word t2;
word t;
word t1 = 0;
KBI1SC_KBACK = 1;
if(PTDD_PTDD0==0){
PTDD_PTDD0=1;
} else if(PTDD_PTDD0==1){
PTDD_PTDD0=0;
}
bandera = 1;
Código fuente
//
67
DisableInterrupts;
t2 = TPM2CNT;
if (t2>t1){
t = t2 - t1;
} else{
t = (65535 - t1)+t2;
}
t = (t/1000)*32;
//t en milisegundos.
t1 = t2;
vel = (PERIMETRO*10000)/t;
vel = (vel*36)/10;
//Cálculo de la velocidad
metro += PERIMETRO;
if(metro>=10){
metro = 0;
dec_metro++;
}
if(dec_metro>=10){
dec_metro = 0;
km++;
}
if(km>=10){
km = 0;
dec_km++;
}
if(dec_km>=10){
dec_km = 0;
cen_km++;
//Cálculo de la distancia y separación de los
caracteres decimales. Ej: Separar el número 125,73 en
el 1, el 2, el 5, el 7 y el 3.
}
}
Cálculo de velocidad máxima y separación en caracteres decimales de
velocidad y velocidad máxima:
DisableInterrupts;
vel_copy = vel;
EnableInterrupts;
if(vel_copy>vel_max){
vel_max=vel_copy;
vel_max_copy=vel_max;
cen_vel_max=0;
dec_vel_max=0;
un_vel_max=0;
while(vel_max_copy>=100){
vel_max_copy = vel_max_copy-100;
cen_vel_max++;
}
while(vel_max_copy>=10&&vel_max_copy<100){
vel_max_copy = vel_max_copy-10;
dec_vel_max++;
}
while(vel_max_copy>=1&&vel_max_copy<10){
vel_max_copy = vel_max_copy-1;
un_vel_max++;
}
}
Código fuente
68
while(vel_copy>=100){
vel_copy = vel_copy-100;
cen_vel++;
}
while(vel_copy>=10&&vel_copy<100){
vel_copy = vel_copy-10;
dec_vel++;
}
while(vel_copy>=1&&vel_copy<10){
vel_copy = vel_copy-1;
un_vel++;
}
DisableInterrupts;
metro_copy=metro;
dec_metro_copy=dec_metro;
km_copy=km;
dec_km_copy=dec_km;
cen_km_copy=cen_km;
EnableInterrupts;
Envío de los caracteres:
gauTxDataBuffer[0] = 0xE1; /* Code bytes non-ZigBee */
gauTxDataBuffer[1] = 0xCC;
gauTxDataBuffer[2] = SECURITY; /* Generic security number */
guTxDataBuffer[3] = u8DeviceLed; /* Target device */
gauTxDataBuffer[4] = metro_copy;
gauTxDataBuffer[5] = u8Dsn; /* Current data sequence number */
gauTxDataBuffer[6] = 0x00; /* Target device's receive u16Count */
gsTxPacket.u8DataLength = 18;
if (u8AppStatus == 2) /* u8Toggle */
{
gauTxDataBuffer[7] = TOGGLECMD;
u8AppStatus = 4; /* Waiting for the u8Toggle ack */
}
gauTxDataBuffer[8] = dec_metro_copy;
gauTxDataBuffer[9] = km_copy;
gauTxDataBuffer[10] = dec_km_copy;
gauTxDataBuffer[11] = cen_km_copy;
gauTxDataBuffer[12] = cen_vel;
gauTxDataBuffer[13] = dec_vel;
gauTxDataBuffer[14] = un_vel;
gauTxDataBuffer[15] = cen_vel_max;
gauTxDataBuffer[16] = dec_vel_max;
gauTxDataBuffer[17] = un_vel_max;
Se hacen copias de los parámetros para evitar que afecte la
interrupción justo en el momento del envío.
Recepción de datos y escritura en el display
if(estado==1){
DisplayGotoLinea0();
PutsDisplay("Distancia:
DisplayGotoLinea1();
");
cad[0] = (au8RxDataBuffer[11])+48;
cad[1] = (au8RxDataBuffer[10])+48;
cad[2] = ',';
//Se suma 48 para pasar a código
ASCII
Código fuente
cad[3] = (au8RxDataBuffer[9])+48;
cad[4] = (au8RxDataBuffer[8])+48;
cad[5] = (au8RxDataBuffer[4])+48;
cad[16] = '\0';
PutsDisplay(
cad
);
}
if(estado==2){
DisplayGotoLinea0();
PutsDisplay("Velocidad:
");
DisplayGotoLinea1();
cad[0] = (au8RxDataBuffer[12])+48;
cad[1] = (au8RxDataBuffer[13])+48;
cad[2] = ',';
cad[3] = (au8RxDataBuffer[14])+48;
cad[16] = '\0';
PutsDisplay(cad);
}
if(estado==3){
DisplayGotoLinea0();
PutsDisplay("Velocidad Media:");
DisplayGotoLinea1();
PutsDisplay("
");
}
if(estado==4){
DisplayGotoLinea0();
PutsDisplay("Velocidad Max.: ");
DisplayGotoLinea1();
cad[0] = (au8RxDataBuffer[15])+48;
cad[1] = (au8RxDataBuffer[16])+48;
cad[2] = ',';
cad[3] = (au8RxDataBuffer[17])+48;
cad[16] = '\0';
PutsDisplay(cad);
}
69
Parte V ANEXOS
Anexos
71
Anexo A: el bus i2c
El bus i2c es el método de transmisión y recepción de datos
utilizado por el display y la memoria. Como se ha dicho en el texto de la
memoria, se decidió adquirir este modelo de display con este método de
transmisión para utilizar un menor número de pines en la comunicación
entre el microcontrolador y el display, ya que para utilizar tres displays
BCD de siete segmentos se necesitaría hacer uso de doce pines, un número
demasiado elevado con el que el puerto de pines entrada/salida no
cuenta. La memoria EEPROM se decidió que se comunicara del mismo
modo para aprovechar el software programado para el display.
El problema que apareció es que el micro no contaba con ningún
bus de este tipo libre para poder usar. Por ello, se tuvieron que programar
los pines estándar de entrada/salida para que funcionaran como las líneas
de transmisión del bus i2c.
El bus i2c es un bus de comunicaciones serie diseñado por Philips.
Este bus tiene como principal característica que utiliza dos líneas para
transmitir la información: una para los datos (SDA) y otra para la señal de
reloj (SCL). Los dispositivos conectados al bus i2c se direccionan para que
luego desde el microcontrolador se envíe a un periférico determinado
diciéndole al microcontrolador la dirección a la que debe enviar los datos.
Al ser un bus, permite más de un periférico conectado a la misma línea,
por eso se deben direccionar los dispositivos conectados al bus. Sin
embargo, en esta ocasión, como el bus se va a programar, se ha preferido
conectar la memoria y el display a dos líneas diferentes para una mayor
sencillez.
Cuando se quiere transmitir un dato el proceso es similar pero no
es igual que cuando se quiere leer un dato a través de este bus. Sin
Anexos
72
embargo, el funcionamiento de las líneas SDA y SCL si que es igual para
ambas situaciones. Una vez que el periférico ocupa la línea de
transmisión/recepción del bus i2c se opera de la siguiente manera:
1.
Se pone la línea SDA a cero o a uno haciéndola coincidir con
el bit más significativo del dato que se quiere enviar. En caso de
querer leer algún dato, se lee el bit más significativo de dicho dato
poniendo la línea SDA al nivel de dicho bit.
2.
Se da un pulso de reloj poniendo la línea SCL a uno y,
seguidamente, a cero.
3.
El bit más significativo ya se ha enviado o recibido y se
procede a enviar o recibir el siguiente bit de la misma manera.
Como ya se ha comentado arriba, a pesar de que el proceso que
sigue el bus para enviar y recibir datos es el mismo, la manera de actuar es
distinta según si se quieren enviar o recibir datos. Por tanto, cuando se
quiere utilizar el bus para enviar datos se procede de la siguiente manera:
1.
El bus está libre cundo ambas líneas están a nivel alto.
2.
El dispositivo toma el control de las líneas de transmisión y
el maestro genera un “start condition” que no es más que poner
primero la línea SDA a cero y luego hacer lo propio con la línea
SCL.
3.
Se van enviando todos los bytes de los que se compone el
mensaje. El primer byte tiene que ser una dirección que coincida
con la del dispositivo al que se quiere enviar (“device select”),
siendo el último bit el que indica si se va a enviar (‘0’) o a recibir
(‘1’).
Anexos
73
4.
Después de enviar cada byte, el periférico toma el control de
la línea SDA. Por ello, se configura la línea SDA como entrada y se
da un pulso de reloj en la línea SCL. Este pulso se denomina pulso
ACK (“acknowledge”) que sirve para recuperar el control de la
línea de transmisión.
5.
Cuando se hayan enviado todos los bytes, se genera un “stop
condition” que es poner la línea SCL a nivel alto y, acto seguido,
hacer lo propio con la línea SDA, dejando libre el canal.
Un diagrama de tiempos clarifica mucho estos cinco pasos que se
tienen que dar antes cada vez que se envía información a través de un bus
i2c:
Figura 7: Diagrama de tiempos bus i2c
En el diagrama de tiempos que se puede observar en la figura 7,
no se muestra el cuarto paso, que es el de generar un pulso ACK, por
tanto, se muestra un segundo diagrama de tiempos en la figura 8 que hace
un zoom al final del envío y muestra como es este pulso ACK:
Figura 8: Pulso ACK en transmisión
Anexos
74
El diagrama de tiempos para la lectura es prácticamente igual que
para el envío por lo que no se va a añadir otro diagrama para la lectura.
Sin embargo, cuando se quiere utilizar el bus i2c para leer datos existen
algunas diferencias:
1.
El bus está libre cuando ambas líneas están a nivel alto.
2.
El dispositivo toma el control de las líneas de transmisión y
el maestro genera un “start condition”.
3.
Antes de leer todos los bytes de los que está compuesto el
mensaje se debe enviar un byte de dirección que tiene que coincidir
por la del dispositivo del cual se va a leer (“device select”),
poniendo el último bit a uno, indicando proceso de lectura.
4.
Como en el caso de la escritura, después de cada byte hay
que generar un pulso ACK excepto en el último donde no se tiene
que generar dicho pulso antes de realizar un “stop condition”.
El pulso ACK no tiene el mismo principio ahora que en el caso del
envío y esto es de gran importancia para poder programar el software del
bus i2c. Cuando se está utilizando el bus para transmitir, el maestro pone
la línea SCL a cero (1) e, inmediatamente después, hace lo propio el
esclavo con la línea SDA (2). En este momento, el maestro tiene que
generar el pulso ACK en la línea SCL (3) y el maestro recupera el control
sobre la línea SDA que se pone a uno para continuar con la transmisión
(4). Sin embargo, cuando se está utilizando el bus para leer datos, después
de leer el último bit del esclavo (1), el esclavo entrega el control sobre la
línea SDA al maestro que se pone a uno (2). El maestro entonces pone la
línea SDA a cero (3) y genera un pulso ACK en la línea SCL (4). Después
de este proceso, el esclavo recupera el control sobre la línea SDA (5) y
Anexos
75
continúa la lectura (6). El pulso ACK para la transmisión se muestra en la
figura 8 y en la figura 9 se muestra el pulso ACK para la lectura:
Figura 9: Pulso ACK en recepción
Como se puede observar, el bus i2c utiliza una manera de
transmisión y recepción muy simple para comunicar el micro con sus
periféricos enviando la información bit a bit separados por ciclos de reloj.
Sin embargo, la programación y su posterior adaptación a la memoria y al
display no han sido tan sencillas. Además, no se contaba con tener que
elaborar esta programación en el plan inicial de trabajo, por lo que supuso
un retraso importante en el proyecto.
DOCUMENTO Nº2:
PRESUPUESTO
Presupuesto
77
En este documento se va a calcular el presupuesto del
cuentakilómetros que se ha creado. El sistema está compuesto por un
sensor, un display, una memoria y dos tarjetas de desarrollo idénticas.
Todos ellos aportan una parte, ya sea pequeña o grande al presupuesto del
cuentakilómetros. Posteriormente, aparte del coste de los elementos
físicos, habrá que añadir un coste de mano de obra.
Display
El coste del display es directamente el coste del dispositivo cuyo
precio ascendía a los 21€.
Memoria
El coste de la memoria es mucho más reducido que el del display
y también en este caso es directamente el coste del dispositivo. El precio
de la memoria ascendía hasta los 6€.
Sensor
El sensor es muy simple y convencional por lo que su precio es
muy bajo y no se considera dentro del presupuesto.
Tarjetas de desarrollo
Las tarjetas de desarrollo son los dispositivos más caros de todo el
proyecto sin lugar a dudas. Éstas venían además con dos pilas de 9V, dos
fuentes de alimentación, el dispositivo necesario para volcar los
programas al microcontrolador y dos cables de conexión vía serie. El
precio de todo el paquete ascendía hasta los 200€.
Presupuesto
78
Mano de obra
Para realizar el cálculo de la mano de obra, se supondrá que el
coste de la hora de mano de obra de un ingeniero es de 55€/hora. Se
estima que para la elaboración del proyecto se han empleado unas 300
horas. Por tanto, el coste de la mano de obra total asciende hasta los
16.500€.
Es decir, que si se decidiera fabricar un único dispositivo, el precio
del mismo ascendería hasta los 16.727€, cifra absolutamente inaceptable.
Sin embargo, nunca se utilizarían 300 horas de mano de obra de un
ingeniero en fabricar una única unidad. Lo que se hace es llevar a cabo
una producción de muchas unidades, de manera que la mano de obra, que
es el coste más caro, se reparta entre todos ellos.
Por tanto, en esta ocasión se supone una producción de 1000
unidades del cuentakilómetros creado en este proyecto. Ahora se
necesitarían 2000 tarjetas de desarrollo, 1000 memorias, 1000 sensores y
1000 displays. De nuevo, la aportación de los sensores es tan ridícula que
se desprecia. El coste total, una vez sumada ya la aportación de la mano de
obra, es de 443.500€. Por tanto, el coste de una unidad creada a partir de
una serie de 1000 es de 443,5€.
Como se puede observar, el precio es ligeramente alto ya que más
de 400€ por un cuentakilómetros es un precio desorbitado, sobre todo
comparándolo con los de la competencia que cuestan menos de 300€ y son
bastante más sofisticados.
Descargar