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

VeloDist

El VeloDist és una samarreta per a ciclistes que incorpora uns sensors d'ultrasons que detecten la proximitat d'un vehicle pel darrere o un avançament perillós. També incorpora un sensor de llum que gestionarà l'encesa d'unes tires de LED que actuen com a llums de posició. Té tres modes de funcionament que es controlen amb un polsador. Un parell de LED de la tira informen del mode actual.

Mode Sensors LED
0 Lateral i posterior Esquerre i dret
1 Posterior Dret
2 Cap Cap

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

1   Placa LilyPad Arduino USB

2   Sensor de distància per ultrasons

1   Sensor de llum

1   Tira de LED

1   Brunzidor piezoelèctric

1   Resistència de 100 Ω

1   Polsador

1   Resistència de 10 kΩ

La següent figura mostra la distribució dels elements a la samarreta.

samarreta

Es va fer servir una placa LilyPad Arduino USB perquè la Placa Flora no tenia potes suficients per connectar tots els elements. Després va resultar que la placa LilyPad Arduino USB no té sortida directa de l'alimentació (només dóna 3,3 V i els sensors d'ultrassons requerien 5 V). Es va optar per alimentar la placa amb un cable USB modificat que permetia disposar d'un punt de 5 V on connectar els elements. La figura següent mostra l'esquema de connexions.

esquema

Quan el sensor posterior detecta la proximitat d'un vehicle el brunzidor emet uns polsos de 440 Hz i els LED de la part inferior de l'esquena fan una intermitència. Els intèrvals corresponents són:

Distància (m) Espaiat entre sons (s) Temps d'encesa dels LED (s)
0 - 2 0,15 0,05
2 - 5 0,3 0,1
5 - 10 0,5 0,2
>10 0,8 0,5

Quan el sensor lateral detecta un avançament inapropiat el brunzidor emet uns polsos de 262 Hz. Els intèrvals corresponents són:

Distància (m) Espaiat entre sons (s)
0 - 0,3 0,05
0,3 - 0,8 0,1
0,8 - 1,2 0,2
1,2 - 1,5 0,5

El prototip va quedar com es mostra a les fotografies següents.

Vista anterior           Vista posterior

A continuació tenim el llistat del programa:

#include <Adafruit_NeoPixel.h> // biblioteca per a la tira LED
#define TrigL 3 //Ultrasons Lateral
#define EchoL 2 //Ultrasons Lateral
#define TrigP 10 //Ultrasons Posterior
#define EchoP 9 //Ultrasons Posterior
int ELlum = A4; // Sensor Llum
int brunzi = A3; //Brunzidor
int pols = A2;// pulsador
long distL; //variable distància ultrasons lateral
long tempsL; // variable ultra
long distP; //variable distància ultrasons posterior
long tempsP; // variable ultra
float convers = 0.0; // variable sensor llum 
int ValorLlum = 0; // Valor sensor de llum (0 a 5V)
int m = 0;//mode
int lectura;
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(60, 11, NEO_GRBW + NEO_KHZ800);	//Tira Led a pota 11
void setup(){
	pinMode(pols,INPUT);//entrada polsador
	pinMode(TrigL,OUTPUT);//sortida Ultrasons Lateral
	pinMode(EchoL,INPUT);//entrada Ultrasons Lateral
	pinMode(TrigP,OUTPUT);//sortida Ultrasons Posterior
	pinMode(EchoP,INPUT);//entrada Ultrasons Posterior
	pinMode(ELlum,INPUT);//entrada Sensor Llum
	pinMode(brunzi,OUTPUT);//Sortida Brunzidor
	cadena.begin();  // Inicialitza tira LED's     
	Serial.begin(9600);
}
void loop(){
	//POLSADOR
	lectura = digitalRead(pols); // Llegim el polsador
	if (lectura == HIGH){ // Si està premut...
		m = m + 1;
		if (m == 3){
			m = 0;
			if (m == 0){
				cadena.setPixelColor(13,0,255,0);
				cadena.setPixelColor(46,0,255,0);
				cadena.show();
			}
		}
		delay(1000);  
	}
	//CODI ULTRASONS LATERAL (només trobar dist)
	digitalWrite(TrigL,LOW);   
	delayMicroseconds(5);   
	digitalWrite(TrigL, HIGH); 
	delayMicroseconds(12);    
	digitalWrite(TrigL,LOW);    
	tempsL = pulseIn(EchoL, HIGH);  
	distL = int(340 * tempsL / 10000 /2); 
	delay(1500);
 	//CODI ULTRASONS POSTERIOR (només trobar dist) 
	digitalWrite(TrigP,LOW);    
	delayMicroseconds(5);   
	digitalWrite(TrigP, HIGH); 
	delayMicroseconds(12);    
	digitalWrite(TrigP,LOW);   
	tempsP = pulseIn(EchoP, HIGH);  
	distP = int(340 * tempsP / 10000 /2); 
	//CODI LLUM
	ValorLlum = analogRead(ELlum);
	convers = ValorLlum*(5.0/1023.0);
	//CODI ULTRASONS LATERAL + BRUNZIDOR 
	if (m == 0){
		if ((0.0 < distL) && (distL <= 30.0)){
			tone(brunzi, 262, 250);  // 
			delay(50);  
		} else if ((30.0 < distL) && (distL <= 80.0)){
			tone(brunzi, 262, 250);  // 
			delay(100);  
		} else if ((80.0 < distL) && (distL <= 120.0)){
			tone(brunzi, 262, 250);  // 
			delay(200);  // Espera mig segon
		} else if ((120.0 < distL) && (distL <= 150.0)){
			tone(brunzi, 262, 250);  // 
			delay(500);  
		}
	}
	//CODI ULTRA + LED +BRUNZI
	if (m =! 2){
		if ((0.0 < distP) && (distP <= 200.0) ){ 
			for (int i = 26; i <= 33; i++){
				cadena.setPixelColor(i, 255, 0, 0);  // LED de 26 a 33 vermell
			}
			if (distL > 150.0){ //Donem preferència ultrasons lateral
				tone(brunzi, 440, 50);
			}
			delay(150);
			cadena.setPixelColor(0,0,0,0);//intermitent
			cadena.show();
		} else if ((200.0 < distP) && (distP <= 500.0)){
			for (int i = 26; i <= 33; i++){
				cadena.setPixelColor(i, 255, 0, 0); 
			}
			if (distL > 150.0){
				tone(brunzi, 440, 100); 
			}
			delay(300);
			cadena.setPixelColor(0,0,0,0);
			cadena.show();
	    } else if ((500.0 < distP) && (distP <= 1000.0)){
			for (int i = 26; i <= 33; i++){
				cadena.setPixelColor(i, 255, 0, 0);  
			}
			if (distL > 150.0){
				tone(brunzi, 440, 500);
			}
			delay(200);
			cadena.setPixelColor(0,0,0,0);
			cadena.show();
		} else if (distP > 1000.0){
			for (int i = 26; i <= 33; i++){
				cadena.setPixelColor(i, 255, 0, 0);  
			}
			if (distL > 150.0){
				tone(brunzi, 440, 800);
			}
			delay(500);
			cadena.setPixelColor(0,0,0,0);
			cadena.show();
		}
	}
	//CODI SENSOR LLUM + LED
	if ((0.0 < convers) && (convers <= 1.0)){ 
		for (int i = 0; i <=12; i++){
			cadena.setPixelColor(i, 255,255,255);  // leds 0 a 12 blancs
		}
		for (int i = 47; i <=59; i++){
			cadena.setPixelColor(i, 255,255,255);  // leds 47 a 59 blancs
		}
		for (int i = 14; i <= 25; i++){
			cadena.setPixelColor(i, 255, 0, 0);  // leds 14 a 25 vermells                  
		}
		for (int i = 34; i <= 45; i++){
			cadena.setPixelColor(i, 255, 0, 0);  // leds 34 a 45 vermells              
		} 
		cadena.show(); // Actualitza
	}
	if ((1.0 < convers)&&(convers <= 2.0)){
		for (int i = 0; i <=12; i++){
			cadena.setPixelColor(i, 175,175,175);   
		}
		for (int i = 47; i <=59; i++){
			cadena.setPixelColor(i, 175,175,175);  
		}
		for (int i = 14; i <= 25; i++){
			cadena.setPixelColor(i, 175, 0, 0);                   
		}
		for (int i = 34; i <= 45; i++){
			cadena.setPixelColor(i, 175, 0, 0);          
		} 
		cadena.show(); // Actualitza
	}
	if ((2.0 < convers)&&(convers <= 3.0)){
		for (int i = 0; i <=12; i++){
			cadena.setPixelColor(i, 100,100,100);  
		}
		for (int i = 47; i <=59; i++){
			cadena.setPixelColor(i, 100,100,100);  
		}
		for (int i = 14; i <= 25; i++){
			cadena.setPixelColor(i, 100, 0, 0);                  
		}
		for (int i = 34; i <= 45; i++){
			cadena.setPixelColor(i, 100, 0, 0);              
		} 
		cadena.show(); // Actualitza
	}
	if ((3.0 < convers)&&(convers <= 4.0)){
		for (int i = 0; i <=12; i++){
			cadena.setPixelColor(i, 50,50,50);  
		}
		for (int i = 47; i <=59; i++){
			cadena.setPixelColor(i, 50,50,50);  
		}
		for (int i = 14; i <= 25; i++){
			cadena.setPixelColor(i, 50, 0, 0);                  
		}
		for (int i = 34; i <= 45; i++){
			cadena.setPixelColor(i, 50, 0, 0);              
		} 
		cadena.show(); // Actualitza
	}
	if ((4.0 < convers)&&(convers <= 5.0)){
		for (int i = 0; i <=12; i++){
			cadena.setPixelColor(i, 25,25,25);  
		}
		for (int i = 47; i <=59; i++){
			cadena.setPixelColor(i, 25,25,25);  
		}
		for (int i = 14; i <= 25; i++){
			cadena.setPixelColor(i, 25, 0, 0);                  
		}
		for (int i = 34; i <= 45; i++){
			cadena.setPixelColor(i, 25, 0, 0);              
		} 
		cadena.show(); // Actualitza
	}
}

 

 

 

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.