Вы находитесь на странице: 1из 16

.

Universidad Militar Nueva Granada

Proyecto Final Microcontroladores


Christian David Muoz Muoz
E-mail: u1802324@unimilitar.edu.co

Sergio Esteban Garca Mndez


E-mail: u1802321@unimilitar.edu.co

Camilo Roncancio Camargo


E-mail: u1802363@unimilitar.edu.co

Informes de laboratorio, Sensores

RESUMEN: En este proyecto se evidencia cmo es


posible configurar varios elementos por medio de
protocolos de comunicacin, los cuales permitirn el
control de un vehculo pequeo cuyo propsito ser el
de registrar y atravesar satisfactoriamente una pista con
varios obstculos en el menor tiempo posible.
ABSTRACT: This proyect will show how is possible
configure some elements by using communication
protocols, they will allow the control of a small vehicle
whose purpose is to record and cross a track with
obstacles within the shortest time possible.
OBJETIVOS:
1. Usar el protocolo de comunicacin SPI para la
configuracin de un acelermetro.
2.

Usar el protocolo de comunicacin IC para la


configuracin de una brjula digital.

3.

Aplicar el concepto y la configuracin de PWM


para el manejo de velocidad en un motor.

4.

Realizar una comunicacin va Bluetooth o WiFi para interactuar mediante una interfaz grfica
con el envo y recepcin de datos mediante
esta.

Ilustracin 1 Ejemplo de una configuracin IC. [Disponible]:


http://www.comunidadelectronicos.com/articulos/i2c.gif.

Protocolo de comunicacin IC
Al tener uno o ms dispositivos conectados a bus, es
necesario respetar un protocolo, debido a esto se
genera el concepto de MAESTRO y ESCLAVOS. Siendo
los maestros los nicos que pueden iniciar la
comunicacin.

PALABRAS CLAVE
SPI, IC, PWM, tiempo, frecuencia, Bluetooth, Distancia,
transmisor, receptor, acelermetro, brjula.
MATERIALES Y METODOS

Elementos y equipo

Tarjeta de desarrollo STM32F4 Discovery.

Acelermetro (Integrado en STM32f4).

Brjula Digital hmc5883l.

Motorreductores.

Bateras de 12 y 9 voltios.

Piones.

Carro con direccin.

Software Matlab(interfaz) y Keil(Programacin)

Para generar la comunicacin se requiere de una


condicin inicial en donde ambas seales tendrn un
estado lgico alto a la cual se le denomina BUS LIBRE.
En este estado cualquier dispositivo maestro puede
ocuparlo una vez que este ponga en estado lgico bajo
la transmisin de la seal SDA y dejando en alto en
pulso de reloj SCL.

MARCO TEORICO
BUS IC (Inter Integrated Circuit)
Es un estndar que facilita la comunicacin entre
microcontroladores y otros dispositivos que solo requiere
de dos seales. Se caracteriza por ser una
comunicacin de tipo serial y sincrnica en donde una
de sus seales marca el tiempo (SCL) y la otra
intercambia los datos(SDA).

Maestro (Master): Dispositivo que determina


los tiempos y la direccin del trfico en un BUS.
Es el nico que aplica los pulsos de reloj en la
seal SCL.
Esclavo (Slave): Dispositivo que no tiene la
capacidad de generar pulsos de reloj y reciben
todas las seales de comando y de reloj
generadas por los maestros a los que este se
encuentre vinculado.

Los datos se transfieren en secuencias de 8 bits. Estos


bits se colocan en la lnea SDA comenzando por el bit de
ms peso (o ms significativo). Por cada 8 bits que se
transfieren, el dispositivo que recibe el dato enva de
regreso un bit de reconocimiento, de modo que en
realidad por cada byte de datos se producen 9 pulsos en
el SCL. Una vez el bit de reconocimiento este en un
nivel lgico bajo, se indica que se ha recibido el dato y
est listo para recibir un nuevo paquete de informacin.
En los casos ms comunes se encuentran direcciones
de 7 bits, que en realidad utilizan un bit extra (8 bits en

Descripcin de las seales:


SCL (System Clock): es la seal que genera
los pulsos de reloj que sincronizan el sistema.
SDA (System Data): es la seal que enva y
recibe datos entre los dispositivos.

Informes de laboratorio, Sensores

total), para saber si el dispositivo lee o escribe la


informacin (R/W).

Pasos del protocolo:


-

El dispositivo maestro enva una secuencia de


inicio que alertara a los esclavos, ponindolos
en esperar de una instruccin.
El maestro enviara una direccin de dispositivo,
aquel esclavo que posea esta direccin ser el
que reciba la instruccin, y los dems ignoraran
el resto de datos esperando una nueva
secuencia de inicio
Una vez direccionado el dispositivo esclavo, el
maestro enva una ubicacin interna o un
registro que desea leer o escribir.
Una vez enviada la direccin del registro, se
est listo para enviar y recibir bytes de datos.
Finalmente, cuando el maestro termine de
compartir datos, enva una secuencia de
parada que concluye la instruccin.

MOSI (Master Out Slave In): Esta lnea se


encarga de enviar los paquetes desde el
maestro hacia el esclavo.
MISO (Master In Slave Out): Contrario a la
anterior esta lnea se encarga de enviar los
paquetes desde el esclavo hacia el maestro.

BUS SPI (Serial Peripheral Interface)


Es un estndar de comunicacin, usado en
microcontroladores para la transferencia de informacin.
Es usado en cualquier dispositivo que acepte un flujo de
bit en serie regulado por un reloj. Posee un reloj (SCL),
un dato entrante, un dato saliente y un chip select, que
conecta o desconecta la operacin del dispositivo. De
esta manera, este tipo de comunicacin permite
multiplexar lneas de reloj.

Ilustracin 2 Ejemplo de una configuracin SPI. [Disponible]:


http://www.puntoflotante.net/SPI_three_slaves.jpg.
Comunicacin Bluetooth.
El estndar bluetooth, del mismo modo que WiFi, utiliza
el FHSS (Frecuency Hopping Spread Spectrum) en
espaol (Espectro ensanchado por saltos de frecuencia),
el cual consiste en dividir la banda de frecuencia de 2.40
a 2.48GHz en 79 canales (saltos) de 1 MHz de ancho
cada uno, y despus, transmitir la seal utilizando una
secuencia de canales que sea conocida tanto para la
estacin emisora como para la receptora.

Este bus por lo general posee 3 lneas, sobre la cual se


transmiten paquetes de datos de 8 bits. Cada dispositivo
conectado al bus puede actuar como transmisor y
receptor al mismo tiempo, por lo que este tipo de
comunicacin serial se conoce como full dplex. Dos
de estas lneas corresponden a la transmisin y
recepcin de datos (una en cada direccin) y la tercera
en la seal del reloj.

Al igual que lo protocolos anteriormente mencionados


este estndar utiliza las operaciones maestro/esclavo.
Un dispositivo maestro puede tener conexiones con 7
esclavos activos simultneamente (255 si se encuentran
en modo de espera). Aunque la conexin realmente se
hace de uno en uno, la capacidad que tiene para
cambiar rpidamente de un esclavo a otro puede
provocar que se tome como simultanea aquella
conexin.

Teniendo en cuenta las anteriores definiciones de


maestro y esclavo, este protocolo de comunicacin
tambin utiliza esto conceptos para enlazar y operar los
datos. Cada esclavo es controlado por el maestro a
travs de una cuarta lnea conocida como Chip Select o
Select Slave, por lo tanto, un esclavo es activado a
travs de esta lnea solo cuando esta es seleccionada y
cuando corresponde a una direccin dedicada a ese
esclavo en particular. El resto de esclavo enlazados
deben entra en un estado de alta impedancia para ser
ignorados por el maestro.

Dentro de este protocolo nace el trmino Piconet, el


cual hace referencia a la red formada por un dispositivo
y todos los dispositivos que se encuentren dentro de su
rango. Bluetooth permite que dos piconets puedan
conectarse entre s para formar una red ms amplia,
denominada Scatternet.

Lneas del bus SPI:

SCLK (Lnea de reloj): Esta lnea es generada


por el maestro y se encarga de sincronizar la
transferencia de datos.

Arquitectura de Software
Buscando ampliar la compatibilidad de los dispositivos
Bluetooth, los dispositivos que se apegan al estndar
utilizan como interfaz entre el dispositivo anfitrin

Informes de laboratorio, Sensores

.
(laptop, telfono celular, etc) y el dispositivo Bluetooth
como tal (chip Bluetooth) una interfaz denominada HCI
(Host Controller Interface).

desde la direccin MAC, que no es conocida


por
la
unidad
"master".

Ilustracin 3 Arquitectura del HCI manejado por Bluetooth.


[Disponible]:
http://artemisa.unicauca.edu.co/~dabravo/bluetooth/quees_ar
chivos/bluetooth_layers.jpg

Los protocolos de alto nivel como el SDP (Protocolo


utilizado para encontrar otros dispositivos Bluetooth
dentro del rango de comunicacin, encargado, tambin,
de detectar la funcin de los dispositivos en rango),
RFCOMM (Protocolo utilizado para emular conexiones
de puerto serial) y TCS (Protocolo de control de
telefona) interactan con el controlador de banda base
a travs del Protocolo L2CAP (Logical Link Control and
Adaptation Protocol). El protocolo L2CAP se encarga de
la segmentacin y reensamblaje de los paquetes para
poder enviar paquetes de mayor tamao a travs de la
conexin Bluetooth.

Page/Inquiry: Si un dispositivo desea hacer


una conexin con otro dispositivo, ste le enva
un mensaje de tipo page, si la direccin es
conocida; o una peticin a travs de un
mensaje de page, si ste no es conocido. La
unidad "master" enva 16 page message
idnticos, en 16 saltos de frecuencias, a la
unidad "slave". Si no hay respuesta, el "master"
retransmite en los otros 16 saltos de frecuencia.
El mtodo de Peticin (inquiry) requiere una
respuesta extra por parte de la unidad "slave",

Hold: Cuando el "master" o el "slave" desean,


puede ser establecido un modo en el cual no
son transmitidos datos. El objetivo de esto es
conservar
el
poder.

Sniff: El modo sniff, es aplicable solo para las


unidades "slaves", es para conserva el poder.
Durante este modo, el "slave", no toma un rol
activo en la "piconet", pero escucha a un
reducido
nivel.

Park: El modo park es un nivel ms reducido ,


que el modo hold. Durante este, el "slave" es
sincronizado a la "piconet", por eso no requiere
una reactivacin completa, pero no es parte del
trfico. En este estado, ellos no tienen
direcciones MAC y solo escuchan para
mantener su sincronizacin con el "master" y
chequear los mensajes de broadcast.

Ocurre

la

transmisin

de

datos.

La tcnica de PWM consiste en producir un pulso


rectangular con un ciclo de trabajo determinado, este
ciclo de trabajo puede variar de 0 a 100%.
Un ciclo de trabajo del 0% significa que la seal siempre
est nivel bajo; y un ciclo de trabajo del 100% significa la
seal siempre en nivel alto, el nmero de casos
intermedios posibles es un nmero finito llamado
resolucin del PWM.

Las conexiones Bluetooth, son establecidas a travs de


la siguiente tcnica:
Standby: Los dispositivos en un "piconet" que
no estn conectados, estn en modo standby,
ellos escuchan mensajes cada 1,28 segundos,
sobre
32
saltos
de
frecuencias.

Active:

PWM (Pulse-Width Modulation)

Protocolo de Conexin

Informes de laboratorio, Sensores

.
pero no aporta ningn dato sobre
componentes vectoriales de campo.

Ilustracin 4 Distribucin de la seal en porcentaje.


[Disponible]:
http://www.arduino.utfsm.cl/wpcontent/uploads/2014/05/pwm2.jpg.

Acelermetro
Los acelermetros son dispositivos que miden la
aceleracin, que es la tasa de cambio de la velocidad de
un objeto. Esto se mide en metros por segundo al
cuadrado (m/s) o en las fuerzas G (g).

las

Magnetmetros vectoriales: que tienen la


capacidad de medir la intensidad del campo
magntico en una direccin particular,
dependiendo de la colocacin que le demos al
dispositivo.

Los acelermetros son dispositivos electromecnicos


que detectan las fuerzas de aceleracin, ya sea esttica
o dinmica. Las fuerzas estticas incluyen la gravedad,
mientras que las fuerzas dinmicas pueden incluir
vibraciones y movimiento. Los acelermetros pueden
medir la aceleracin en uno, dos o tres ejes.
Generalmente, los acelermetros contienen placas
capacitivas internamente. Algunos de estos son fijos,
mientras que otros estn unidos a resortes minsculos
que se mueven internamente conforme las fuerzas de
aceleracin actan sobre el sensor. Como estas placas
se mueven en relacin el uno al otro, la capacitancia
entre ellos cambia. A partir de estos cambios en la
capacitancia, la aceleracin se puede determinar.

Ilustracin 6 Brjula Digital HMC5883L. [Disponible]:


http://mpe-s2-p.mlstatic.com/brujula-digital-hmc5883l-de-3ejes-arduino-pic-raspberry-pi-571021MPE20701172927_052016-F.jpg.

PROCEDIMIENTO Y ANLISIS DE RESULTADOS


1.
2.
3.

Diseo del Vehculo (SolidWorks).


Diseo de GUI (Matlab).
2.1 Programacin GUI.
Programacin en Keil.
3.1 Programacin Acelermetro.
3.2 Programacin PWM.
3.3 Programacin Brjula.
3.4 Programacin bluetooth.

1. Diseo del vehculo.


Ilustracin 5 Partes de un Acelermetro. [Disponible]:
http://5hertz.com/tutoriales/wpcontent/uploads/2014/02/ac2.p
ng.

Por medio del CAD SolidWorks se realiz un diseo


preliminar de un vehculo de 4 ruedas simple.

Brjula Digital (Magnetmetro)


Un magnetmetro es un sensor capaz de medir el
campo magntico terrestre y mostrrnoslo en 3
componentes cartesianas, es decir, un valor para cada
uno de los ejes X, Y y Z, de esta forma mediante un
magnetmetro y sus datos podemos obtener datos muy
precisos de la orientacin del sensor respecto al polo
Norte
Los magnetmetros pueden ser divididos en dos tipos
bsicos:

Magnetmetros escalares: que miden la


intensidad total del campo magntico resultante
al cual estn siendo sometidos en un punto,

Informes de laboratorio, Sensores

Ilustracin 9 Interfaz de usuario (Run).


Ilustracin 7 Modelo del vehculo Preliminar.

2.1 Programacin de GUI(Matlab).

2. Diseo de GUI(Matlab).

Posteriormente al diseo se procede a programar cada


uno de los elementos con los que se puede interactuar

Usando el software de programacin Matlab se cre una


interfaz de usuario (GUI) con las siguientes
caractersticas:
-

Botn de inicio.

Botn de inicio
Casillas de introduccin de datos:
Velocidad
Posicin.
Casillas de visualizacin de datos:
Velocidad
Posicin
Tiempo.
Botn de aceleracin.
Botn de frenado.
Cuadro para grafica de inclinacin.

Ilustracin 10 configuracin del botn de inicio.


En esta configuracin se configura va bluetooth la
recepcin de los datos enviados por el acelermetro en
forma de variable (A), para luego ser graficado en el
cuadro (axes1) de la parte superior derecha de la
interfaz.
Casillas de introduccin de datos:

Ilustracin 8 Interfaz de usuario preliminar.

Velocidad
Para esta casilla se us una comunicacin bluetooth que
enva los datos ingresados en el cuadro de texto (edit1)
de la velocidad a la cual debe ir el vehculo por medio de
una variable (V)

Informes de laboratorio, Sensores

.
(STM32F4) de la posicin del vehculo mediante una
variable tipo chart (P) y es visualizada en forma de
string en el cuadro de texto(edit6)

Ilustracin 11 configuracin del cuadro de texto para la


velocidad.
Ilustracin 14 configuracin del cuadro de texto para
visualizar la posicin actual.

Posicin.
Para esta casilla se us una comunicacin bluetooth que
enva los datos ingresados en el cuadro de texto (edit2)
de la posicin que debe seguir el vehculo por medio de
una variable (P).

Tiempo
Para esta casilla se us una funcin (Tic - Toc) que
muestra el tiempo transcurrido en el cual el carro
comienza su trayecto y cuando termina mediante el
cuadro de texto (text6). Este cuadro no tiene una funcin
especfica y responde ante los cambios de los botones
de acelerar y frenar.
Botn de aceleracin
Para este botn de estado se configuro una funcin en
la cual, al cambiar a un estado lgico alto (1) se inicializa
la funcin Tic que indica el inicio del conteo del tiempo a
su vez pone un set al botn de frenado en un estado
lgico bajo (0). Como funcin principal este botn indica
el encendido de los motores mediante un (1) enviado por
bluetooth a la tarjeta.

Ilustracin 12 configuracin del cuadro de texto para la


posicin.
Casillas de visualizacin de datos:
Velocidad
Para esta casilla se us una comunicacin bluetooth que
registra los datos enviados por la tarjeta de desarrollo
(STM32F4) de la velocidad a la cual el vehculo se
encuentra mediante una variable tipo chart (V) y es
visualizada en forma de string en el cuadro de
texto(edit5)

Ilustracin 15 configuracin del botn de aceleracin.


Botn de frenado
Para este botn de estado se configuro una funcin en
la cual, al cambiar a un estado lgico alto (0) se inicializa
la funcin Toc que indica el final del conteo del tiempo y
de la funcin Tic a su vez pone un set al botn de
aceleracin en un estado lgico bajo (0). Como funcin
principal este botn indica el apagado de los motores
mediante un (0) enviado por bluetooth a la tarjeta.

Ilustracin 13 configuracin del cuadro de texto para


visualizar la velocidad actual.
Posicin
Para esta casilla se us una comunicacin bluetooth que
registra los datos enviados por la tarjeta de desarrollo

Informes de laboratorio, Sensores

.
3.3 Programacin Brjula.
3.4 Programacin Bluetooth.

Ilustracin 16 configuracin del botn de Frenado.


Cuadro de grafica
Este cuadro no posee un callback (interaccin) como tal,
es utilizado en el botn de inicio para grafica la
inclinacin que tiene el carro a travs del paso del
tiempo.
3. Programacin en Keil.
Ilustracin 18 configuracin de la comunicacin va
bluetooth.

Una vez diseada la interfaz de usuario, se continua con


la programacin de la tarjeta de desarrollo (STM32F4
Discovery), en la cual se instanciar cada mdulo
respectivamente

CONCLUSIONES

3.1 Programacin Acelermetro.

Para el acelermetro fue necesario instanciar varios


aspectos en ellos se encuentra sus registros, la lectura y
escritura de los datos que interactan con l. As como
su funcionalidad al prender y apagar los leds segn
como este su inclinacin.

Cdigo (Ver Anexos)


3.2 Programacin PWM.

La configuracin de Bus SPI para el


acelermetro permiti el uso de sus valores con
fines de registro y almacenamiento.
El protocolo IC tiene a interferir con algunos
protocolos cuando estos se encuentran en un
mismo bloque, debido al tiempo que maneja.
El PWM permite que los motores excedan su
capacidad de giro mediante l envi de pulsos
por lo cual se consigui la velocidad necesaria
para subir los obstculos
La comunicacin va bluetooth puede presentar
problemas al momento de enlazar o de recibir
informacin si se tiene ms de un mdulo en el
permetro, aunque estos errores se presentan
muy poco es importante tener en cuenta con
que dispositivo se est enlazando el programa.
El uso de una interfaz grfica hecha en Matlab
permite un procesamiento de informacin
bastante rpido respecto a otros entornos
grficos, adems de su facilidad de
programacin y enlazamiento con la tarjeta de
desarrollo.

Bibliografa

Ilustracin 17 configuracin del PWM.

[1 E. J. Carletti, ROBOTS, Robots Argentina, 2015.

Informes de laboratorio, Sensores

.
]

[2
]
[3
]
[4
]
[5
]
[6
]
[7
]

[En lnea]. Available: http://robotsargentina.com.ar/Comunicacion_busI2C.htm. [ltimo


acceso: 29 05 2016].
I. E. L. Prez, i-Micro, [En lnea]. Available:
http://www.i-micro.com/pdf/articulos/spi.pdf. [ltimo
acceso: 29 05 2016].
O. S. J. G. Edgar Sevillano, slideshare, 14 03
2011. [En lnea]. Available:
http://es.slideshare.net/OswST/serial-periphericalinterface-spi. [ltimo acceso: 29 05 2016].
CCM, CCM, 2016. [En lnea]. Available:
http://es.ccm.net/contents/69-como-funcionabluetooth. [ltimo acceso: 29 05 2016].
Unicauca, [En lnea]. Available:
http://artemisa.unicauca.edu.co/~dabravo/bluetooth/q
uees.htm. [ltimo acceso: 29 05 2016].
I. J. R. T. Salinas, Tervernet, [En lnea]. Available:
http://www.tervenet.com/itmaz/micros2/PIC32_10_P
WM.pdf. [ltimo acceso: 29 05 2016].
S. G. Garcia, 02 2013. [En lnea]. Available: http://earchivo.uc3m.es/bitstream/handle/10016/17038/pfc_s

ergio_garcia_garcia_2013.pdf?sequence=1. [ltimo
acceso: 29 05 2016].
[8 Ardumania, Ardumania, [En lnea]. Available:
] http://www.ardumania.es/brujula-digital-hmc5883l/.
[ltimo acceso: 29 05 2016].
[9 5. Electronica, 5Hertz Electronica, [En lnea].
] Available: http://5hertz.com/tutoriales/?p=228. [ltimo
acceso: 30 05 2016].

Informes de laboratorio, Sensores

ANEXOS
PROGRAMA ACELERMETRO
#define GPIO_D_ADDress 0x40020C00
#define offset_ODR 0x14
#define GPIO_A_ADDress 0x40020000
#define alias 0x42000000
#define bit_band 0x40000000
#define offset_bit ((GPIO_D_ADDress+offset_ODR)-bit_band)
//Led naranja
#define pin1 13
#define bit_band_adress1 (alias + (offset_bit*0x20) + (pin1*0x4))
#define naranja (*((volatile unsigned long *) bit_band_adress1))
//Led azul
#define pin3 15
#define bit_band_adress3 (alias + (offset_bit*0x20) + (pin3*0x4))
#define azul (*((volatile unsigned long *) bit_band_adress3))
int8_t x_data1,x_data2,y_data1,y_data2;
int16_t x_dat,y_dat,x,y,rcx,rax,rcy,ray;

//Variables de 8 bits que calcula el acelerometro


//Variables de 16 bits que con las que se trabajan

int Contador=0, Step=0, Secu=0;


int t=0,tiempo=0, Vueltas=0;

//Crea las varibles globales que se van a usar

int USART_DIV=0,Mantissa=0,Fraction=0x07;

//Variables para USART2

void Puertos(int Habilitar){


switch(Habilitar){
case 0x00:
case 0x10:
case 0x20:
case 0x30:
case 0x40:
default: break;
}

(1<<0);
(1<<1);
(1<<2);
(1<<3);
(1<<4);

//Funcin encargada de habilitar el puerto deseado por el usuario


RCC->AHB1ENR|=
RCC->AHB1ENR|=
RCC->AHB1ENR|=
RCC->AHB1ENR|=
RCC->AHB1ENR|=

10

break;
break;
break;
break;
break;

//Habilitar puerto A
//Habilitar puerto B
//Habilitar puerto C
//Habilitar puerto D
//Habilitar puerto E

Informes de laboratorio, Sensores

.
}
/*
FUNCIONES ACELEROMETRO
*/
//Tx SPI param: adress, data
void SPI_Tx(uint8_t adress, uint8_t data){
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1,adress);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1,data);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
}
//Rx SPI param: adress, return data
uint8_t SPI_Rx(uint8_t adress){
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
adress=0x80|adress;
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1,adress);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1,0x00);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
GPIO_SetBits(GPIOE,GPIO_Pin_3);
return SPI_I2S_ReceiveData(SPI1);
}
void Acelerometro(void){
asm{
/*A continuacion se realiza la secuencia para que enciandan los respectivos
leds*/
MOV x_dat,x
MOV y_dat,y
bucles:
CMP x,#500
BGE six500
CMP x,#-500
BLE sixno500
CMP y,#500
BGE siy500
CMP y,#-500
BLE siyno500
B sinoxy
six500:
CMP y,#500
BGE sixiy
CMP y,#-500
BLE
sixnoy
B
six

11

Informes de laboratorio, Sensores

sixiy:
MOV
azul,
MOV naranja,#0
B
bucles

#1

MOV
azul,
MOV naranja,#1
B
bucles

#0

MOV
azul,
MOV naranja,#0
B
bucles

#0

sixnoy:

six:

sixno500:
CMP y,#500
BGE sixy500
CMP y,#-500
BLE
sixyno500
B
sinox
sixy500:
MOV
azul,
MOV naranja,#0
B
bucles

#1

sixyno500:
MOV azul,
#0
MOV naranja,#1
B
bucles
sinox:
MOV
azul,
MOV naranja,#0
B
bucles

#0

MOV
azul,
MOV naranja,#0
B
bucles

#1

siy500:

siyno500:
MOV
azul,
MOV naranja,#1
B
bucles

#0

sinoxy:
MOV azul,
#0
MOV naranja,#0
}
}
void Acele_Config(void){
RCC->APB1ENR |=(1<<14);
RCC->APB1ENR |=(1<<15);
RCC->APB2ENR |=(1<<12);

12

Informes de laboratorio, Sensores

.
RCC->APB2ENR |=(1<<13);
RCC->APB2ENR |=(1<<20);
RCC->APB2ENR |=(1<<21);
GPIOD->MODER
= 0x44000000;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft|SPI_NSSInternalSoft_Set;
SPI_Init(SPI1,&SPI_InitStruct);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
SPI_Cmd(SPI1,ENABLE);
//Tx SPI param1, param2, ...
SPI_Tx(0x20,0x63);
SPI_Tx(0x24,0x20);
}
void Acele_Sys(void){
x_data1 = SPI_Rx(0x29);
x_data2 = SPI_Rx(0x28);
y_data1 = SPI_Rx(0x2B);
y_data2 = SPI_Rx(0x2A);
asm{
ADD tiempo, #1
MOV x_dat, x_data1
LSL x_dat, x_dat, #8
ADD x_dat, x_data2

MOV y_dat, y_data1


LSL y_dat, y_dat, #8
ADD y_dat, y_data2
ADD x, x_dat, x_dat
ADD y, y_dat, y_dat

13

Informes de laboratorio, Sensores

.
B SiT20cheeck
/*Se toman valores para la media,
cuando eltiempo sea 20 ya se tomaron los 20 datos
y ya se debio realizar la media
*/
SiT20:
/*Sen inicializan los valores para realizar la division*/
MOV rax, x
MOV rcx, #0
MOV ray, y
MOV rcy, #0
B bucle
bucle:
/*Restas iterativas hasta que se cumpla que rax es menor que el tiempo
con esto la division lleara a su fin sin importarnos mucho el residuo*/
SUB rax, tiempo
ADD rcx, #1
CMP rax, tiempo
BGE bucle
MOV x_dat, rcx
B bucle2
bucle2:
/*Restas iterativas hasta que se cumpla que ray es menor que el tiempo
con esto la division lleara a su fin sin importarnos mucho el residuo*/
SUB ray, tiempo
ADD rcy, #1
CMP ray, tiempo
BGE bucle2
MOV y_dat, rcy
MOV tiempo,#0
SiT20cheeck:
CMP tiempo, #100
IT EQ
BEQ SiT20
}
}
PROGRAMA BRUJULA
int main(void){
int Alto=0;
SystemCoreClockUpdate();
//Inicia el contador de tiempo
SysTick_Config( SystemCoreClock/1000 );

//configura el contador en milisegundos

Puertos(PA);

//Habilitar puerto A

Puertos(PD);

//Habilitar puerto D

14

Informes de laboratorio, Sensores

Puertos(PE);

//Habilitar puerto E

Acele_Config();

//Configurar Acelerometro

Config_EXTI();

//Configuracipon interrupcin

EXTI_Config(10,0);

//Interrupcin en el puerto A0

Baudrate(9600);
USART_Config();
Configuracion_PWM();
GPIOD->MODER|=
GPIOD->MODER|=

(1<<2*12);
(1<<2*14);

while(1){
if(USART2->DR ==
1){
Alto=10;
USART2->SR='10';
}
if(USART2->DR ==
2){
Alto=20;
USART2->SR='20';
}
if(USART2->DR ==
3){
Alto=30;
USART2->SR='30';
}
if(USART2->DR ==
4){
Alto=40;
USART2->SR='40';
}
if(USART2->DR ==
5){
Alto=50;
USART2->SR='50';
}
if(USART2->DR ==
6){
Alto=60;
USART2->SR='60';
}
if(USART2->DR ==
7){
Alto=70;
USART2->SR='70';
}
if(USART2->DR ==
8){
Alto=80;
USART2->SR='80';
}
if(USART2->DR ==
9){
Alto=90;
USART2->SR='90';
}
if(USART2->DR ==
0){
Alto=100;
USART2->SR='100';
}

15

Informes de laboratorio, Sensores

Parametros(0.035,

500,

14,

Alto);

'V'){
|=
=

(1<<12);
'v';

'G'){
&=

~(1<<12);

'R'){
|=

(1<<14);

'D'){
&=

~(1<<14);

'A'){
|=
|=

(1<<12);
(1<<14);

Acelerometro();
if(USART2->DR ==
GPIOD->ODR
USART2->SR
}
if(USART2->DR ==
GPIOD->ODR
}
if(USART2->DR ==
GPIOD->ODR
}
if(USART2->DR ==
GPIOD->ODR
}
if(USART2->DR ==
GPIOD->ODR
GPIOD->ODR
}
}
}

16