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 é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.
La llista de materials principals és la següent:
1 Acceleròmetre i giroscopi MPU6050
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.
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.
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.