| 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 é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 NeoPixel
1 Resistència de 10 kΩ
1 Resistència de 100 Ω
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.

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

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.

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.

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