Tecnologia vestible

Per començar Elements d'entrada Programació CircuitPython   Recursos CITCEA
Elements no electrònics Elements de sortida Programació Arduino    
Projectes Elements de control Dades pràctiques   Inici

Aide Cooperative

Aide Cooperative és un aparell que permet detectar caigudes, l'activitat física i el ritme cardíac de l'usuari al llarg del dia. El dispositiu és capaç d'interpretar quan les dades registrades siguin anòmales i, si això es produeix, és capaç de donar aquesta informació als serveis mèdics perquè actuïn de la millor forma possible.

logo

foto

La llista de materials principals és la següent:

1   Arduino Nano

1   Acceleròmetre i giroscopi MPU6050

1   Sensor de ritme cardíac

1   Mòdul Bluetooth HC-05

La figura següent mostra l'esquema de connexions. El dispositiu està pensat per anar posat al braç de la persona usuària.

esquema

A continuació tenim el llistat del programa:

// Incluimos las librerias necesarias, en este caso la de MPU6050
#include <MPU6050_tockn.h>
#include <Wire.h>
#include <SoftwareSerial.h>
// Variables pulsometro
#define USE_ARDUINO_INTERRUPTS true   
#include <PulseSensorPlayground.h>   // Llamamos a la biblioteca
const int PulseWire = 6;            // Indicamos en que entrada conectamos
int Threshold = 560;                // Valor medio para detectar latido                                                 
int PPM;
// Definimos las variables globales que vamos a necesitar para calcular los pasos y las caidas
float amax=1;
float amin=1;
float atot=0;
int paso;
int tmin=millis();
int tmax=millis();
bool caida=false;
bool tcaida=true;
int t=0;
int tca=0;
// variables temporales para definir cada cuanto tiempo se produce un bucle.
// No se pueden usar delays porque paran el programa y genera errores al calcular bpm y pasos.
long bpmTiempo = 0;
long mpuTiempo = 0;
long mpuTimer=0;
long serialTiempo=0;
PulseSensorPlayground pulseSensor; 
MPU6050 mpu6050(Wire);
SoftwareSerial mySerial(5, 6); //  RX, TX
// Esta función nos permite calcular la acerelación total
void aceleraciones(){
	// reiniciamos las variables de aceleración para cada componente.
	float ax=0;
	float ay=0;
	float az=0;
	// Tomamos 3 medidas instantaneas de las aceleraciones para hacer el promedio en un
	// diferencial de tiempo.
	for (int i=0; i<=2; i++){
		mpu6050.update();
		ax+=mpu6050.getAccX();
		ay+=mpu6050.getAccY();
		az+=mpu6050.getAccZ();
	}
	// Calculamos la media de las aceleraciones para cada componente
	ax=ax/3;
	ay=ay/3;
	az=az/3;
	// Calculamos el modulo de la aceleracion total que soporta el wearable
	atot=sqrt(ax*ax + ay*ay + az*az); 
}
// Establecemos algunos parametros y iniciamos los sensores y la comunicación Bluetooth
void setup() {
	Serial.begin(9600);
	// Iniciamos la comunicación serial mediante Bluetooth
	mySerial.begin(9600); 
	// Enviamos un mensaje de bienvenida
	mySerial.println("Iniciando AIDE, el wearable que cuida de ti");
	// Iniciamos el acelerometro
	Wire.begin();
	mpu6050.begin();
	mpu6050.calcGyroOffsets(true);
	// Iniciamos el pulsometro
	pulseSensor.analogInput(PulseWire);   
	pulseSensor.setThreshold(Threshold); 
	pulseSensor.begin();
}
// El bucle principal
void loop() {
	// Definimos una variable temporal del tiempo actual des del inicio de ejecución
	unsigned long actualTiempo=millis();
	// Comprobamos si ha pasado el tiempo suficiente para calcular las BPM
	if (actualTiempo - bpmTiempo > 20){
		Serial.println(analogRead(6)); 
		// Asignamos una variable temporal
		bpmTiempo=actualTiempo;
		// Leemos las pulsaciones por minuto
		int myBPM = pulseSensor.getBeatsPerMinute();
		// En caso de lectura, enviamos las BPM
		if (pulseSensor.sawStartOfBeat()) {            
			PPM=myBPM;                  
		} 
	}
	//  Comprobamos si ha pasado el tiempo suficiente para calcular las variables
	// relacionadas con el acelerometro
	if (actualTiempo - mpuTiempo > mpuTimer){
		// Asignamos el timer del acelerometro a 0
		mpuTimer=0;
		// Asignamos una variable temporal
		mpuTiempo=actualTiempo;
		// Ejecutamos la función que nos devuelve la aceleración total
		aceleraciones();
		// Comprovamos si ha habido una diferencia de aceleración negativa
		// respecto a g (g=9.81 m/s^2).
		if ((atot < amin)and(atot < 1.02)){
		// Comprobamos si esta diferencia es muy grande
			if ((atot < 0.3) and (tcaida == true)){
				// Iniciamos contador para despues comprobar si se trata de una caida
				t=millis();
				tcaida=false;
			}
			// Establecemos la nueva aceleración total como aceleración mínima  
			amin=atot;
		}
		// Comprobamos si se parado de caer en caso de detectarse una aceleración mucho más
		// pequeña que g anteriormente.
		else if ((atot > amin) and (tcaida==false)){
			// Reasignamos la variable para poder volver a entrar en la comprobación de
			// caida después
			tcaida=true;
			// Calculamos el tiempo entre el inicio del descenso en caida libre y el que
			// sucede al tocar el suelo.
			tca=millis()-t; 
		}
		// Realizamos el proceso también para las aceleraciones mas grandes que g, pero esta vez
		// no hace falta comprobar si nos estamos cayendo
		if ((atot > amax) and (atot > 1.02)){
			amax=atot;      
		}
		// Comprobamos si la supuesta caída lo es realmente midiendo el tiempo de caida libre y
		// comparandolo con 0.4 segundos. 
		if (tca > 400){
			// Variable caida a verdadero
			caida=true;
			// Reiniciamos la variable del contador de tiempo de caida
			tca=0;
			amax=1.02;
			amin=1.02;
			// Añadimos una pausa de 3 segundos para no contar pasos, ya que el usuario se ha caido.
			mpuTimer=3000;
		}
		// En caso de no caida, miramos si se ha producido un paso
		if (amax-amin > 0.4){  
			// Reiniciamos algunas variables
			amax=1.02;
			amin=1.02;
			// Añadimos un tiempo para volver a medir el siguiente paso de 0,166 segundos
			// para evitar falsos positivos
			mpuTimer=250;
			// Añadimos un paso al contador
			paso++;
		}
	}
	// Otro temporizador, en este caso para el envio de información por el bluetooth de 1 segundo.
	if (actualTiempo - serialTiempo > 1000){
		// Asignamos la variable temporal el tiempo actual
		serialTiempo=millis();
		// Enviamos la información de los pasos y las pulsaciones por minuto
		mySerial.print("PPM: ");mySerial.print(PPM);mySerial.print("  Pasos:");mySerial.println(paso);
	}  
}

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.