Sunteți pe pagina 1din 11

PODÓMETRO:

INFORME FINAL
SISTEMAS EMPOTRADOS

ALEJANDRO BENITO ALONSO


FERNANDO MUÑOZ GARCÍA
TOMÁS SÁNCHEZ CAVIGLIA
ALBA TOBAJAS GUARDIA

PROFESOR: DIEGO GACHET PÁEZ


ESCUELA DE ARQUITECTURA, INGENIERÍA Y DISEÑO
CURSO 2016-2017
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

ÍNDICE

INTRODUCCIÓN Y ESTADO DEL ARTE 3


OBJETIVOS 5
DESARROLLO DEL PODÓMETRO 5
ARDUINO® 101 5
PROGRAMACIÓN 7
NRF TOOLBOX 10
CONCLUSIONES 11
AVANCE DEL PROYECTO 11
PRIMER TRIMESTRE 11
SEGUNDO TRIMESTRE 11
TERCER TRIMESTRE 11

Podómetro 2
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

INTRODUCCIÓN Y ESTADO DEL ARTE


A modo de cierre de asignatura de Sistemas Empotrados, haremos en conjunto
con dos compañeros estudiantes de ingeniería biomédica un podómetro.
Colaboraremos con ellos a partir de un programa para la placa Arduino® 101 que han
desarrollado en el trimestre anterior para recopilar datos importantes.

Un podómetro es un dispositivo electrónico capaz de medir pasos. La


recopilación de pasos tiene una gran importancia dado que a partir de esto podemos
calcular número de pasos en períodos de tiempo, velocidad, cadencia, velocidad
media, velocidad instantánea o calorías quemadas entre otras cosas. Hace un siglo
aparecían los primeros podómetros mecánicos, imprecisos pero robustos.

Imagen de un antiguo podómetro mecánico inglés de la década de los ‘20. 1

Actualmente, los podómetros están ganando peso rápidamente como gadget en


el mundo de la electrónica. Hace unos veinte años aparecían los primeros podómetros
electrónicos comerciales, influenciados enormemente por la aparición del GPS
(Global Position System). Estos podómetros se limitan exclusivamente a la tarea de
contar pasos. El modo de funcionamiento de estos dispositivos cambió drásticamente
con la disminución de tamaño de acelerómetros y baterías y el aumento de capacidad
de proceso por parte de dispositivos de bolsillo y wearables.

1Fuente: http://www.yapo.cl/region_metropolitana/arte_antiguedades_colecciones/
antiguo_podometro_de_bolsillo_ingles_funcionando__39435544.htm

Podómetro 3
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

Hoy en día, los podómetros se encuentran integrados prácticamente a


cualquier reloj o teléfono inteligente. Esta integración permite un rápido intercambio
de datos facilitando el muestreo, cálculo y recopilación de información, haciendo que
el usuario acceda a sus registros desde una interfaz más amigable y cómoda.

Imagen de un Apple Watch®, reloj inteligente de Apple con podómetro incorporado. 2

Como mencionamos anteriormente, los podómetros están cobrando un peso


muy importante en la creciente industria del bienestar físico. El gran interés por el
IoT (Internet of Things) promueve la masificación de este dispositivo, facilitando su
desarrollo y permitiendo que con un simple programa y una placa de Arduino o
acelerómetros integrados se consiga contar pasos.

Es de vital importancia poner a prueba los conocimientos adquiridos en la


asignatura, por lo que este proyecto es perfecto para el fin. Además, nos entrena para
los proyectos en los que trabajaremos en el futuro.

2 Fuente: http://www.todaysiphone.com/2015/03/10-apple-watch-apps-want-see/

Podómetro 4
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

OBJETIVOS
Nuestro objetivo es desarrollar un podómetro con una placa Arduino® 101, que
posee un acelerómetro y un giroscopio integrados. El acelerómetro nos da los
parámetros de movimiento en las tres dimensiones X, Y, Z, mientras que gracias al
giroscopio conocemos el pitch, roll y jaw.

Los datos serán recopilados por la placa de Arduino y transmitidos a un


teléfono inteligente a través de Bluetooth®. Finalmente, los datos serán mostrados
con la aplicación nRF Toolbox disponible tanto para Android como iOS.

DESARROLLO DEL PODÓMETRO


A continuación, contaremos el desarrollo del podómetro en cuanto a la placa, la
programación correspondiente y la aplicación para teléfono inteligente

ARDUINO® 101
El Arduino® 101 es una tarjeta de aprendizaje y desarrollo que ofrece el
rendimiento y el bajo consumo de energía del módulo Intel® Curie™, con la
simplicidad de Arduino a un precio básico. Mantiene el mismo factor de forma
robusto y la lista periférica de la Arduino® UNO con la adición de capacidades
Bluetooth LE integradas y un acelerómetro/giroscopio de 6 ejes para ayudarle a
expandir fácilmente su creatividad al mundo conectado.

El módulo contiene dos núcleos minúsculos, un núcleo x86 (Quark) y un


núcleo de arquitectura ARC de 32 bits, ambos con una frecuencia de reloj de 32MHz.
La cadena de herramientas de Intel compila sus bocetos Arduino de forma óptima en
ambos núcleos para realizar las tareas más exigentes.

Los sistemas operativos en tiempo real (RTOS) y el marco desarrollado por


Intel son de código abierto. El núcleo de Arduino se comunica con el RTOS a través
de buzones estáticos para realizar una lista predefinida de tareas (interfaz con el PC
mediante USB, programa el boceto en flash, exponer la funcionalidad de Bluetooth
LE para dibujar, ejecutar PWM). El RTOS para Intel Curie está todavía en desarrollo y
nuevas funciones y características se dará a conocer en un futuro próximo.

Podómetro 5
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

Placa Arduino® 101.3

Microcontrolador Intel® Curie™


Voltaje operativo DC 3,3V
Voltaje de entrada recomendado 7-12V
Voltaje de entrada límite 7-17V
Pines digitales 14 (7 proveen PWM)
Pines de entrada analógica 6
Corriente máxima por pin DC 20mA
Memoria Flash 196kB
SRAM 24kB
Velocidad de ciclo de reloj 32MHz
LED_BUILTIN 13
Especificaciones Bluetooth, acelerómetro/giroscopio de seis ejes
Largo 68,6 milímetros
Ancho 53,4 milímetros
Peso 34 gramos

Tabla de especificaciones de la Arduino® 101.4

3Fuente: https://www.xataka.com/makers/los-arduino-101-dan-la-bienvenida-a-intel-curie-los-
diminutos-soc-orientados-a-makers
4 Fuente: https://www.arduino.cc/en/Main/ArduinoBoard101#

Podómetro 6
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

PROGRAMACIÓN
A continuación mostramos la fase final del programa desarrollado, capaz de
calcular la cadencia y comunicarse a la aplicación de nRF Toolbox.

/*
This sketch example partially implements the standard Bluetooth Low-Energy Heart Rate service.
For more information: https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
*/

#include "CurieIMU.h"
#include <CurieBLE.h>

BLEPeripheral blePeripheral; // BLE Peripheral Device (the board you're programming)


BLEService RSCService("1814"); // BLE RSC Service

// BLE RSC Measurement Characteristic

BLECharacteristic RSCMeasureChar("2A53", // standard 16-bit characteristic UUID


BLERead | BLENotify | BLEWrite, 10);

// remote clients will be able to get notifications if this characteristic changes

// the characteristic is 10 bytes long as the first field needs to be "Flags" as per BLE
specifications

// https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?
u=org.bluetooth.characteristic.heart_rate_measurement.xml

// BLE RSC Feature Characteristic

BLEUnsignedIntCharacteristic RSCFeatureChar("2A54", // standard 16-bit characteristic UUID


BLERead | BLENotify | BLEWrite);

// remote clients will be able to get notifications if this characteristic changes

// the characteristic is 2 bytes long as the first field needs to be "Flags" as per BLE
specifications

// https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?
u=org.bluetooth.characteristic.heart_rate_measurement.xml

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

long previousMillis = 0; // last time the NUMBER OF STEPS was checked, in ms


long currentMillis = 0; // current time

boolean flag = 0; // total distance computed


unsigned long distancia = 0; // total distance

boolean stepEventsEnabeled = true; // whether you're polling or using events


int stepCount = 0;
long lastStepCount = 0;
int diferenciaPasos = 0;
int numberSteps= 0;

unsigned char cadencia = 0; // instantaneous step cadence


float cadences[11]= {0,0,0,0,0,0,0,0,0,0,0}; //array of the last 11 instantaneous cadences

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

void setup () {

unsigned int feature_conf = 7; // set the feature of the server: (value = 7) Instantaneous stride
length, total distance and walking/running activated

Serial.begin(9600); // initialize serial communication

Podómetro 7
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

/* Set a local name for the BLE device


This name will appear in advertising packets
and can be used by remote devices to identify this BLE device
The name can be changed but maybe be truncated based on space left in advertisement packet */

CurieIMU.begin();
CurieIMU.setStepDetectionMode(CURIE_IMU_STEP_MODE_NORMAL);
CurieIMU.setStepCountEnabled(true);
randomSeed(millis());
if (stepEventsEnabeled) {
CurieIMU.attachInterrupt(eventCallback);
CurieIMU.interrupts(CURIE_IMU_STEP);
Serial.println("IMU initialization complete, waiting for events...");
}

blePeripheral.setLocalName("RSCSexample");
blePeripheral.setAdvertisedServiceUuid(RSCService.uuid()); // add the service UUID
blePeripheral.addAttribute(RSCService); // add the BLE RSC service
blePeripheral.addAttribute(RSCMeasureChar); // RSC Measurement characteristic
blePeripheral.addAttribute(RSCFeatureChar); // RSC Feature characteristic

RSCFeatureChar.setValue(feature_conf);

/* Now activate the BLE device. It will start continuously transmitting BLE
advertising packets and will be visible to remote BLE central devices
until it receives a new connection */

blePeripheral.begin();
Serial.println("Bluetooth device active, waiting for connections...");
}

void loop () {

// listen for BLE peripherals to connect:

BLECentral central = blePeripheral.central();

// if a central is connected to peripheral:

if (central) {
Serial.print("Connected to central: ");

// print the central's MAC address:

Serial.println(central.address());

while (central.connected()) {
updateStepCount();
}

Serial.print("Disconnected from central: ");


Serial.println(central.address());
}

if (!stepEventsEnabeled) {
updateStepCount();
}
}

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

void updateRSC () {

cadencia = calculaCadencia(); // compute cadence


char val = 3;
unsigned short zancada = 73; // 73 cm
unsigned int velocidad = zancada * cadencia/24; // instantaneous speed in m/s
if (flag == 1){
distancia = distancia + (zancada / 10); // total distance
}
unsigned char CP4 = (distancia & 0xff000000) >> 24;
unsigned char CP3 = (distancia & 0x00ff0000) >> 16;
unsigned char CP2 = (distancia & 0x0000ff00) >> 8;
unsigned char CP1 = (distancia & 0x000000ff);
if (cadencia <= 90 ) {
val = 3;
// walking;
}

Podómetro 8
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

else {
val = 7;
// running;
}

//distancia y step se actualizan a una velocidad dependiente de cadencia y speed


// la distancia total se divide por 10

//pasamos flags (1 byte) velocidad (2 bytes) cadencia (1 byte) zancada (2 bytes) y dist total (4
bytes), total 10 bytes

const unsigned char RSCCharArray[10] = { val, lowByte(velocidad), highByte(velocidad), cadencia,


lowByte(zancada), highByte(zancada), CP1, CP2, CP3, CP4};

RSCMeasureChar.setValue(RSCCharArray, 10); // and update the RSC measurement characteristic

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

static void updateStepCount() {


stepCount = CurieIMU.getStepCount(); // get current number of steps
if (stepCount != lastStepCount) {
numberSteps = stepCount - lastStepCount; // number of steps between counts
updateCadences(); // update the array of instantaneous cadences
flag = 1; // allow computing total distance
lastStepCount = stepCount; // update the value a lastStepCount
previousMillis = currentMillis; // and reset time
} else {
flag = 0; // do not compute total distance
}
updateRSC(); //transmit information to the mobile app
}

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

static void eventCallback(void) {


if (CurieIMU.stepsDetected())
updateStepCount(); // update the step count each time the even "step
detected" is activated. Usually is around 1-1.5
seconds.
}

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

static unsigned char calculaCadencia() { // update the transmitted value of cadence


unsigned char output = 0;
currentMillis = millis();
float diff = currentMillis - previousMillis;

if (diff > 2000) { // if 2 seconds without steps


output = 0; // cadence = 0
} else { // if there are steps
int suma = 0;
int index = 0;
for (int i=0;i<10;i++) { // compute the average of instantaneous cadences
if (cadences[i]!=0) {
suma += cadences[i];
index += 1;
}
}
output = suma/index; // Cadencia es el promedio de las cadencias distintas de 0 de entre
las últimas 11 cadencias
//Serial.print("Funciona ");
}
//cadencia = random(0,255);
//Serial.println(output);
return output;
}

/* ———————————————————————————————————————————————————————————————————————————————————————————————*/

static void updateCadences (){ // update the array of 11 instantaneous cadences


for (int i=0;i<10;i++) {
cadences[i] = cadences[i+1];
}
cadences[10] = numberSteps*60000/(currentMillis - previousMillis);
Serial.println(cadences);
}

Podómetro 9
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

NRF TOOLBOX
La aplicación para teléfono inteligente con Android e iOS. Para que muestre los
datos que queremos, debemos pasarle la cadencia de pasos y es la misma aplicación
quien calcula la velocidad relativa, velocidad, distancia y calorías.

Foto de la aplicación nRF Toolbox.5

5 Fuente: https://www.arduino.cc/en/Main/ArduinoBoard101#

Podómetro 10
Universidad Europea de Madrid Benito / Muñoz / Sánchez / Tobajas

CONCLUSIONES
Como dijimos en la introducción, podemos destacar la importancia del
proyecto en cuanto a su interesante aplicación y a la capacidad que tuvimos de
aplicar los conceptos aprendidos en la asignatura para mejorarla.

El tercer trimestre recibirá mejoras muy interesantes y seremos capaces de


hacerlo un producto muy interesante, que atraerá empresas y gente relacionada con
el internet de las cosas. Seguiremos perfeccionando su funcionamiento, intentando
darle una interfaz gráfica amigable al usuario de manera que le proporcione la
información más relevante acerca de su registro.

AVANCE DEL PROYECTO


Para finalizar, mostraremos el avance del proyecto hasta la fecha, cuáles fueron
los avances hasta ahora y cuáles son los avances por hacer en el curso 2016 - 2017.

PRIMER TRIMESTRE
El primer trimestre, Alejandro y Alba desarrollaron el código y la máquina de
estados. Hicieron funcionar el contador de pasos propio, monitorearon valores de
ensayo y valor y filtraron la señal que proporcionaba la placa.

SEGUNDO TRIMESTRE
En el segundo trimestre, trabajamos en conjunto para el CurieIMU y la
conexión Bluetooth®. Se presentaron inconvenientes en cuanto a la conexión, la
cadencia caminando y corriendo y una descalibración entre la aplicación para
Android e iOS.

TERCER TRIMESTRE
El tercer trimestre, mejoraremos el código hecho hasta ahora y se harán
avances en el prototipo del podómetro.

Podómetro 11

S-ar putea să vă placă și