Guant intel·ligent per ajudar a la rehabilitació i a l'entrenament

Dependencies:   BluetoothSoftSerial SoftSerial mbed

Committer:
RogerRF
Date:
Thu Oct 04 21:09:25 2018 +0000
Revision:
0:7db3f15dddd3
Guant intel?ligent per ajudar a la rehabilitaci? i a l'entrenament

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RogerRF 0:7db3f15dddd3 1 #include "mbed.h"
RogerRF 0:7db3f15dddd3 2 #include "BluetoothSerial.h"
RogerRF 0:7db3f15dddd3 3
RogerRF 0:7db3f15dddd3 4 #define TEMPS_L 0.25
RogerRF 0:7db3f15dddd3 5 #define TEMPS_M 0.2
RogerRF 0:7db3f15dddd3 6 #define TEMPS_S 0.1
RogerRF 0:7db3f15dddd3 7 #define LOOP_L 40
RogerRF 0:7db3f15dddd3 8 #define LOOP_M 50
RogerRF 0:7db3f15dddd3 9 #define LOOP_S 100
RogerRF 0:7db3f15dddd3 10
RogerRF 0:7db3f15dddd3 11 const int Vmax = 3.3; //3.3V que pot suportar el pin ADC
RogerRF 0:7db3f15dddd3 12
RogerRF 0:7db3f15dddd3 13 BluetoothSerial bt(D5, D4); // TX, RX
RogerRF 0:7db3f15dddd3 14
RogerRF 0:7db3f15dddd3 15 AnalogIn sensor0(A0); //dit petit
RogerRF 0:7db3f15dddd3 16 AnalogIn sensor1(A1); //dit anular
RogerRF 0:7db3f15dddd3 17 AnalogIn sensor2(A2); //dit mig
RogerRF 0:7db3f15dddd3 18 AnalogIn sensor3(A3); //dit index
RogerRF 0:7db3f15dddd3 19 AnalogIn sensor4(A4); //dit gros
RogerRF 0:7db3f15dddd3 20
RogerRF 0:7db3f15dddd3 21 DigitalOut rLed(LED1, 1); //Vermell
RogerRF 0:7db3f15dddd3 22 DigitalOut gLed(LED2, 1); //Verd
RogerRF 0:7db3f15dddd3 23 DigitalOut bLed(LED3, 1); //Blau R+G+B = White
RogerRF 0:7db3f15dddd3 24
RogerRF 0:7db3f15dddd3 25 float force0[LOOP_M], force1[LOOP_M], force2[LOOP_M], force3[LOOP_M], force4[LOOP_M];
RogerRF 0:7db3f15dddd3 26
RogerRF 0:7db3f15dddd3 27 /*
RogerRF 0:7db3f15dddd3 28 * LEDS
RogerRF 0:7db3f15dddd3 29 */
RogerRF 0:7db3f15dddd3 30 void Apagat() {
RogerRF 0:7db3f15dddd3 31 rLed = 1;
RogerRF 0:7db3f15dddd3 32 gLed = 1;
RogerRF 0:7db3f15dddd3 33 bLed = 1;
RogerRF 0:7db3f15dddd3 34 }
RogerRF 0:7db3f15dddd3 35
RogerRF 0:7db3f15dddd3 36 void Blanc() {
RogerRF 0:7db3f15dddd3 37 rLed = 0;
RogerRF 0:7db3f15dddd3 38 gLed = 0;
RogerRF 0:7db3f15dddd3 39 bLed = 0;
RogerRF 0:7db3f15dddd3 40 }
RogerRF 0:7db3f15dddd3 41
RogerRF 0:7db3f15dddd3 42 void Taronja() {
RogerRF 0:7db3f15dddd3 43 rLed = 0;
RogerRF 0:7db3f15dddd3 44 gLed = 0;
RogerRF 0:7db3f15dddd3 45 bLed = 1;
RogerRF 0:7db3f15dddd3 46 }
RogerRF 0:7db3f15dddd3 47
RogerRF 0:7db3f15dddd3 48 void Vermell() {
RogerRF 0:7db3f15dddd3 49 rLed = 0;
RogerRF 0:7db3f15dddd3 50 gLed = 1;
RogerRF 0:7db3f15dddd3 51 bLed = 1;
RogerRF 0:7db3f15dddd3 52 }
RogerRF 0:7db3f15dddd3 53
RogerRF 0:7db3f15dddd3 54 void Verd() {
RogerRF 0:7db3f15dddd3 55 rLed = 1;
RogerRF 0:7db3f15dddd3 56 gLed = 0;
RogerRF 0:7db3f15dddd3 57 bLed = 1;
RogerRF 0:7db3f15dddd3 58 }
RogerRF 0:7db3f15dddd3 59
RogerRF 0:7db3f15dddd3 60 /*
RogerRF 0:7db3f15dddd3 61 * Funcions que recopila la força de cada dit
RogerRF 0:7db3f15dddd3 62 */
RogerRF 0:7db3f15dddd3 63 float dit_gros()
RogerRF 0:7db3f15dddd3 64 {
RogerRF 0:7db3f15dddd3 65 float f;
RogerRF 0:7db3f15dddd3 66 float Vfsr0 = Vmax * sensor4.read();
RogerRF 0:7db3f15dddd3 67
RogerRF 0:7db3f15dddd3 68 if (Vfsr0 < 0.01)
RogerRF 0:7db3f15dddd3 69 f = 0;
RogerRF 0:7db3f15dddd3 70 else if (Vfsr0 <= 1) {
RogerRF 0:7db3f15dddd3 71 f = 101.01 * Vfsr0;
RogerRF 0:7db3f15dddd3 72 } else {
RogerRF 0:7db3f15dddd3 73 f = 36.508 * Vfsr0;
RogerRF 0:7db3f15dddd3 74 f += 56.473 * Vfsr0 * Vfsr0;
RogerRF 0:7db3f15dddd3 75 }
RogerRF 0:7db3f15dddd3 76
RogerRF 0:7db3f15dddd3 77 return f;
RogerRF 0:7db3f15dddd3 78 }
RogerRF 0:7db3f15dddd3 79
RogerRF 0:7db3f15dddd3 80 float dit_index()
RogerRF 0:7db3f15dddd3 81 {
RogerRF 0:7db3f15dddd3 82 float Vfsr1 = Vmax * sensor3.read();
RogerRF 0:7db3f15dddd3 83 float f;
RogerRF 0:7db3f15dddd3 84
RogerRF 0:7db3f15dddd3 85 if (Vfsr1 < 0.01)
RogerRF 0:7db3f15dddd3 86 f = 0;
RogerRF 0:7db3f15dddd3 87 else if (Vfsr1 <= 1) {
RogerRF 0:7db3f15dddd3 88 f = 101.01 * Vfsr1;
RogerRF 0:7db3f15dddd3 89 } else {
RogerRF 0:7db3f15dddd3 90 f = 36.508 * Vfsr1;
RogerRF 0:7db3f15dddd3 91 f += 56.473 * Vfsr1 * Vfsr1;
RogerRF 0:7db3f15dddd3 92 }
RogerRF 0:7db3f15dddd3 93
RogerRF 0:7db3f15dddd3 94 return f;
RogerRF 0:7db3f15dddd3 95 }
RogerRF 0:7db3f15dddd3 96
RogerRF 0:7db3f15dddd3 97 float dit_mig()
RogerRF 0:7db3f15dddd3 98 {
RogerRF 0:7db3f15dddd3 99 float Vfsr2 = Vmax * sensor2.read();
RogerRF 0:7db3f15dddd3 100 float f;
RogerRF 0:7db3f15dddd3 101
RogerRF 0:7db3f15dddd3 102 if (Vfsr2 < 0.01)
RogerRF 0:7db3f15dddd3 103 f = 0;
RogerRF 0:7db3f15dddd3 104 else if (Vfsr2 <= 1) {
RogerRF 0:7db3f15dddd3 105 f = 101.01 * Vfsr2;
RogerRF 0:7db3f15dddd3 106 }else {
RogerRF 0:7db3f15dddd3 107 f = 36.508 * Vfsr2;
RogerRF 0:7db3f15dddd3 108 f += 56.473 * Vfsr2 * Vfsr2;
RogerRF 0:7db3f15dddd3 109 }
RogerRF 0:7db3f15dddd3 110
RogerRF 0:7db3f15dddd3 111 return f;
RogerRF 0:7db3f15dddd3 112 }
RogerRF 0:7db3f15dddd3 113
RogerRF 0:7db3f15dddd3 114 float dit_anular()
RogerRF 0:7db3f15dddd3 115 {
RogerRF 0:7db3f15dddd3 116 float Vfsr3 = Vmax * sensor1.read();
RogerRF 0:7db3f15dddd3 117 float f;
RogerRF 0:7db3f15dddd3 118
RogerRF 0:7db3f15dddd3 119 if (Vfsr3 < 0.01)
RogerRF 0:7db3f15dddd3 120 f = 0;
RogerRF 0:7db3f15dddd3 121 else if (Vfsr3 <= 1) {
RogerRF 0:7db3f15dddd3 122 f = 101.01 * Vfsr3;
RogerRF 0:7db3f15dddd3 123 } else {
RogerRF 0:7db3f15dddd3 124 f = 36.508 * Vfsr3;
RogerRF 0:7db3f15dddd3 125 f += 56.473 * Vfsr3 * Vfsr3;
RogerRF 0:7db3f15dddd3 126 }
RogerRF 0:7db3f15dddd3 127
RogerRF 0:7db3f15dddd3 128 return f;
RogerRF 0:7db3f15dddd3 129 }
RogerRF 0:7db3f15dddd3 130
RogerRF 0:7db3f15dddd3 131 float dit_petit()
RogerRF 0:7db3f15dddd3 132 {
RogerRF 0:7db3f15dddd3 133 float Vfsr4 = Vmax * sensor0.read();
RogerRF 0:7db3f15dddd3 134 float f;
RogerRF 0:7db3f15dddd3 135
RogerRF 0:7db3f15dddd3 136 if (Vfsr4 < 0.01)
RogerRF 0:7db3f15dddd3 137 f = 0;
RogerRF 0:7db3f15dddd3 138 else if (Vfsr4 <= 1) {
RogerRF 0:7db3f15dddd3 139 f = 101.01 * Vfsr4;
RogerRF 0:7db3f15dddd3 140 } else {
RogerRF 0:7db3f15dddd3 141 f = 36.508 * Vfsr4;
RogerRF 0:7db3f15dddd3 142 f += 56.473 * Vfsr4 * Vfsr4;
RogerRF 0:7db3f15dddd3 143 }
RogerRF 0:7db3f15dddd3 144
RogerRF 0:7db3f15dddd3 145 return f;
RogerRF 0:7db3f15dddd3 146 }
RogerRF 0:7db3f15dddd3 147
RogerRF 0:7db3f15dddd3 148 /*
RogerRF 0:7db3f15dddd3 149 * Llegir anterior: Llegeix i envia els resultats de l'exercici anterior al mobil
RogerRF 0:7db3f15dddd3 150 * - Color Blanc
RogerRF 0:7db3f15dddd3 151 */
RogerRF 0:7db3f15dddd3 152 void llegir_anterior() {
RogerRF 0:7db3f15dddd3 153 int i;
RogerRF 0:7db3f15dddd3 154
RogerRF 0:7db3f15dddd3 155 Blanc();
RogerRF 0:7db3f15dddd3 156
RogerRF 0:7db3f15dddd3 157 bt.puts("\n-------------------------");
RogerRF 0:7db3f15dddd3 158 bt.puts("EXERCICI ANTERIOR: \n");
RogerRF 0:7db3f15dddd3 159
RogerRF 0:7db3f15dddd3 160 for(i=0; i<LOOP_M; i++) {
RogerRF 0:7db3f15dddd3 161 bt.printf("\r\n Dit gros: %.2f g", force4[i]);
RogerRF 0:7db3f15dddd3 162 bt.printf("\r\n Dit index: %.2f g", force3[i]);
RogerRF 0:7db3f15dddd3 163 bt.printf("\r\n Dit mig: %.2f g", force2[i]);
RogerRF 0:7db3f15dddd3 164 bt.printf("\r\n Dit anular: %.2f g", force1[i]);
RogerRF 0:7db3f15dddd3 165 bt.printf("\r\n Dit petit: %.2f g", force0[i]);
RogerRF 0:7db3f15dddd3 166 bt.puts("\n");
RogerRF 0:7db3f15dddd3 167 }
RogerRF 0:7db3f15dddd3 168
RogerRF 0:7db3f15dddd3 169 }
RogerRF 0:7db3f15dddd3 170
RogerRF 0:7db3f15dddd3 171 /*
RogerRF 0:7db3f15dddd3 172 * Actiu: Sistema actiu, llegeix i envia les dades del sensor al mobil
RogerRF 0:7db3f15dddd3 173 * - Led Verd
RogerRF 0:7db3f15dddd3 174 * L: wait(0.25) x 40 = 10 segons --> TEMPS_L i LOOP_L
RogerRF 0:7db3f15dddd3 175 * M: wait(0.2) x 40 = 10 segons --> TEMPS_M i LOOP_M
RogerRF 0:7db3f15dddd3 176 * S: wait(0.1) x 100 = 10 segons --> TEMPS_S i LOOP_S
RogerRF 0:7db3f15dddd3 177 *
RogerRF 0:7db3f15dddd3 178 */
RogerRF 0:7db3f15dddd3 179 void actiu() {
RogerRF 0:7db3f15dddd3 180 int i;
RogerRF 0:7db3f15dddd3 181
RogerRF 0:7db3f15dddd3 182 Verd();
RogerRF 0:7db3f15dddd3 183 bt.puts("\n\n---------------------");
RogerRF 0:7db3f15dddd3 184
RogerRF 0:7db3f15dddd3 185 for(i=0; i<LOOP_M; i++)
RogerRF 0:7db3f15dddd3 186 {
RogerRF 0:7db3f15dddd3 187 force4[i] = dit_gros();
RogerRF 0:7db3f15dddd3 188 force3[i] = dit_index();
RogerRF 0:7db3f15dddd3 189 force2[i] = dit_mig();
RogerRF 0:7db3f15dddd3 190 force1[i] = dit_anular();
RogerRF 0:7db3f15dddd3 191 force0[i] = dit_petit();
RogerRF 0:7db3f15dddd3 192
RogerRF 0:7db3f15dddd3 193 bt.puts("\n");
RogerRF 0:7db3f15dddd3 194 bt.printf("\r\n Dit gros: %.2f g", force4[i]);
RogerRF 0:7db3f15dddd3 195 bt.printf("\r\n Dit index: %.2f g", force3[i]);
RogerRF 0:7db3f15dddd3 196 bt.printf("\r\n Dit mig: %.2f g", force2[i]);
RogerRF 0:7db3f15dddd3 197 bt.printf("\r\n Dit anular: %.2f g", force1[i]);
RogerRF 0:7db3f15dddd3 198 bt.printf("\r\n Dit petit: %.2f g", force0[i]);
RogerRF 0:7db3f15dddd3 199 bt.puts("\n");
RogerRF 0:7db3f15dddd3 200
RogerRF 0:7db3f15dddd3 201 wait(TEMPS_M);
RogerRF 0:7db3f15dddd3 202 }
RogerRF 0:7db3f15dddd3 203 bt.puts("\n\n---------------------");
RogerRF 0:7db3f15dddd3 204 }
RogerRF 0:7db3f15dddd3 205
RogerRF 0:7db3f15dddd3 206 /*
RogerRF 0:7db3f15dddd3 207 * Preparat: Sistema preparat per passar actiu. El sistema ja esta connectat via Bluetooth.
RogerRF 0:7db3f15dddd3 208 * - Led Taronja
RogerRF 0:7db3f15dddd3 209 */
RogerRF 0:7db3f15dddd3 210 void preparat() {
RogerRF 0:7db3f15dddd3 211 for(int i=0; i<3; i++) {
RogerRF 0:7db3f15dddd3 212 Taronja();
RogerRF 0:7db3f15dddd3 213 wait(1);
RogerRF 0:7db3f15dddd3 214 Apagat();
RogerRF 0:7db3f15dddd3 215 wait(1);
RogerRF 0:7db3f15dddd3 216 }
RogerRF 0:7db3f15dddd3 217 }
RogerRF 0:7db3f15dddd3 218
RogerRF 0:7db3f15dddd3 219
RogerRF 0:7db3f15dddd3 220 int main() {
RogerRF 0:7db3f15dddd3 221 // Inicialitzacio variables
RogerRF 0:7db3f15dddd3 222 int estat = 0;
RogerRF 0:7db3f15dddd3 223
RogerRF 0:7db3f15dddd3 224 bt.puts("\r\n________________________________________________________");
RogerRF 0:7db3f15dddd3 225 bt.puts("\r\nSignificat dels colors dels leds de la placa FRDM KL25Z:");
RogerRF 0:7db3f15dddd3 226 bt.puts("\r\n- Color Vermell: Sistema inactiu");
RogerRF 0:7db3f15dddd3 227 bt.puts("\r\n- Color Taronja: Sistema preparat i en espera");
RogerRF 0:7db3f15dddd3 228 bt.puts("\r\n- Color Verd: Sistema actiu, es recopila les dades durant 10 segons");
RogerRF 0:7db3f15dddd3 229 bt.puts("\r\n- Color Blanc: Forces de l'exercici anterior");
RogerRF 0:7db3f15dddd3 230 bt.puts("\r\nEls exercicis s'han de realitzar en color verd.");
RogerRF 0:7db3f15dddd3 231 bt.puts("\r\nSi es desconnecta el Bluetooth, apreta el reset de la placa.");
RogerRF 0:7db3f15dddd3 232
RogerRF 0:7db3f15dddd3 233 while(1) {
RogerRF 0:7db3f15dddd3 234 //Sistema inactiu
RogerRF 0:7db3f15dddd3 235 Vermell();
RogerRF 0:7db3f15dddd3 236 wait(2);
RogerRF 0:7db3f15dddd3 237
RogerRF 0:7db3f15dddd3 238 bt.puts("\n\r\n\r");
RogerRF 0:7db3f15dddd3 239 bt.puts("- Prem '1' per activar el sistema: ");
RogerRF 0:7db3f15dddd3 240 bt.puts("- Prem '2' per veure els resultats de l'exercici anterior: ");
RogerRF 0:7db3f15dddd3 241 bt.scanf("%d", &estat);
RogerRF 0:7db3f15dddd3 242 wait(0.5);
RogerRF 0:7db3f15dddd3 243
RogerRF 0:7db3f15dddd3 244 //Estat del sistema
RogerRF 0:7db3f15dddd3 245 if(estat == 1) {
RogerRF 0:7db3f15dddd3 246 preparat();
RogerRF 0:7db3f15dddd3 247
RogerRF 0:7db3f15dddd3 248 actiu();
RogerRF 0:7db3f15dddd3 249 }
RogerRF 0:7db3f15dddd3 250 else if(estat == 2) {
RogerRF 0:7db3f15dddd3 251 llegir_anterior();
RogerRF 0:7db3f15dddd3 252 }
RogerRF 0:7db3f15dddd3 253
RogerRF 0:7db3f15dddd3 254 estat = 0;
RogerRF 0:7db3f15dddd3 255
RogerRF 0:7db3f15dddd3 256 }//end while(1)
RogerRF 0:7db3f15dddd3 257
RogerRF 0:7db3f15dddd3 258 } //end