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

Smartglove

Smartglove és un guant amb un sensor de color al dit. Quan l'usuari assenyala un objecte amb el dit, el guant emet un so d'una freqüència concreta que correspon al color de l'objecte assenyalat. Això permet a les persones daltòniques tenir una manera de conèixer els colors dels objectes.

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

1   Placa Flora

1   Sensor de color

1   NeoPixel

1   Interruptor

1   Resistència de 10 kΩ

1   Brunzidor piezoelèctric

1   Resistència de 100 Ω

1   Portapiles amb piles

El LED NeoPixel serveix per comprovar el funcionament del guant i mostra el color equivalent al que llegeix el sensor. L'interruptor permet desactivar el seu funcionament quan no s'està en mode prova.

La figura següent mostra l'esquema de connexions.

esquema

El prototip va quedar com es mostra a la fotografia següent.

foto

El programa llegeix el color amb el sensor i n'obté el seu codi RGB. A partir d'aquest, calcula el codi HSL. Segons el valor de la tonalitat (H) tocarà una nota diferent. La correspondència que s'ha fet servir es mostra en la taula següent.

taula

A continuació tenim el llistat del programa:

#include <TinyWireM.h>
#include <USI_TWI_Master.h>
#include <Wire.h>
#include <Adafruit_TCS34725.h>
#include <Adafruit_NeoPixel.h>
#include <math.h> 
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, LED, NEO_GRB + NEO_KHZ800);   // Un NeoPixel a la pota 0
Adafruit_TCS34725 tcs = Adafruit_TCS34725();
int Inter = 9; // Definim les entrades de cada element
int LED = 1;
int Brunz = 10;
int lectura;
float Do = 261.63; //Vermell
float DoS = 277.18; //Taronja
float Re = 293.66; //Groc
float ReS = 311.13; //Verd clar
float Mi = 329.63; //Verd fosc
float Fa = 349.23; //Cian
float FaS = 369.99; //Blau
float Sol = 392; //Lila
float SolS = 415.30; //Rosa
float La = 440; //Blanc
float LaS = 466.16; //Gris
float Si = 493.88; //Negre
float Nota;
int n = 0;
int rled = 0;
int gled = 0;
int bled = 0;
void setup() {
	tcs.begin();
	tcs.setInterrupt(false);      // Encén el LED del sensor
	cadena.begin();  // Inicialitza els NeoPixels        
	cadena.show();
	pinMode(LED, OUTPUT); // El LED és una sortida    
	pinMode(Inter, INPUT); // El polsador és una entrada    
	digitalWrite(LED, LOW); // Comencem amb el LED apagat
	pinMode(Brunz, OUTPUT);
	Serial.begin(9600);
}
void loop(){
	//------------------------------------------------------ Sensor de color (rgb)
	uint16_t r, g, b, c,tempColor;
	tcs.getRawData(&r, &g, &b, &c); // Llegeix el sensor  
	//uint32_t color = cadena.Color(r,g,b);
 	//------------------------------------------------------ Conversió de RGB a HSL
	double R = r / 255.0;
	double G = g / 255.0;
	double B = b / 255.0;
	double Max = max(max(R,G),B);
	double Min = min(min(R,G),B);
	double dif = Max - Min;
	double h; //[0,360]
	double s; //[0,1]
	double l; //[0,1]
	l = (Max + Min)/2;
	if (dif == 0) {
		h = 0;
		s = 0;
	} else {
		s = dif/(1- abs(2*l-1)); // l en tant per 1
		if (Max == R) {
			double coe = (G-B)/dif;
			double mod = fmod( coe, 6);
			h = 60*mod;
		}
		if (Max == G) {
			h = 60*(((B-R)/dif)+2);
		}
		if (Max == B) {
			h = 60*(((R-G)/dif)+4);
		}
	}
	l = l*240; //[0,240]
	s = s*240; //[0,240]
	//------------------------------------------------------ Taula Freqüencia 
	if (l >= 200){
		Nota = La;//Blanc
		n = 9;
		rled = 255;
		gled = 255;
		bled = 255;
	} else if (l <= 20){
		Nota = Si; //Negre
		n = 11;
		rled = 0;
		gled = 0;
		bled = 0;
	} else {
		if (s <= 30){
			Nota = LaS; //Gris
			n = 10;
			rled = 128;
			gled = 128;
			bled = 128;
		} else{
			if ((h >= 0 and h <= 10) or (h > 340 and h <= 360) or (h < 0 and h > -5)){
				Nota = Do; //Vermell
				n = 0;
				rled = 255;
				gled = 0;
				bled = 0;
			}
			if (h > 10 and h <= 40){
				Nota = DoS; //Taronja
				n = 1;
				rled = 255;
				gled = 102;
				bled = 0; 
			}
			if (h > 40 and h <= 75){
				Nota = Re; //Groc
				n = 2;
				rled = 255;
				gled = 255;
				bled = 0;
			}
			if (h > 75 and h <= 150){
				if (l >= 75 and l <= 240){
					Nota = ReS; //Verd clar
					n = 3;
					rled = 0;
					gled = 255;
					bled = 0;
				} else {
					Nota = Mi; //Verd fosc
					n = 4;
					rled = 0;
					gled = 102;
					bled = 0;
				}
			}
			if (h > 150 and h <= 210){
				Nota = Fa; //Cian
				n = 5;
				rled = 0;
				gled = 255;
				bled = 255;
			}
			if (h > 210 and h <= 235){
				Nota = FaS; //Blau
				n = 6;
				rled = 0;
				gled = 0;
				bled = 255;
			}
			if (h > 235 and h <= 280){
				Nota = Sol; //Lila
				n = 7;
				rled = 122;
				gled =45;
				bled = 122;
			}
			if ((h > 280 and h <= 340) or(h <= -5 and h >= -20)){
				Nota = SolS;//Rosa
				n = 8;
				rled = 255;
				gled = 0;
				bled = 102;
      		}
    	} 
	}
  	//----------------------------------Serial Plot
	char* PrintNota[]={"Do", "Do#", "Re", "Re#", "Mi", "Fa", "Fa#", "Sol", "Sol#", "La", "La#", "Si"};
	char* PrintColor[]={"Vermell", "Taronja", "Groc", "Verd clar", "Verd fosc", "Cian",
			"Blau", "Lila", "Rosa", "Blanc", "Gris", "Negre"};
	Serial.print("RGB = (");
	Serial.print(r);
	Serial.print(" ,");
	Serial.print(g);
	Serial.print(" ,");
	Serial.print(b);
	Serial.print(")   HSL = (");
	Serial.print(h);
	Serial.print(" ,");
	Serial.print(s);
	Serial.print(" ,");
	Serial.print(l);
	Serial.print(")  Nota: ");
	Serial.print(PrintNota[n]);
	Serial.print(" Color: ");
	Serial.print(PrintColor[n]);
	Serial.print("\n");
	delay(10);
	//----------------------------------Brunzidor
	tone(Brunz, Nota, 1500);  // 1s --> 1000
	//----------------------------------Interuptor-LED
	lectura = digitalRead(Inter); // Llegim l'interruptor
	if (lectura == HIGH){ // Si està premut...  
		cadena.setPixelColor(0,rled,gled,bled);  // Pixel 0 color rgb
		cadena.show(); // Actualitza  
	} else { // Si no ho està
		cadena.setPixelColor(0,0,0,0);  // Pixel 0 color negre (APAGAT)
		cadena.show(); // Actualitza  
	}
	delay(2000);  // Espera t 
}

 

 

 

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.