Tecnologia vestible

Per començar Elements d'entrada Elements de control Programació   Recursos CITCEA
Projectes Elements de sortida Elements no electrònics Dades pràctiques   Inici

Enlighted jacket

Enlighted jacket és una jaqueta pensada per millorar la seguretat dels ciclistes. Incorpora intermitents (amb control manual) i llums de posició i frenada (de funcionament automàtic).

L'encesa dels intermitents es fà amb un parell d'interruptors situats als costats. En canvi, els llums de posició es controlen amb un sensor de lluminositat i els de fre amb un d'acceleració.

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

1   Placa Flora

1   Sensor de llum de precisió

1   Sensor d'acceleració i camp magnètic

18   Neo Pixels

2   Interruptors de pulsació

2   Resistències de 10 kΩ

1   Portapiles amb piles

La figura següent mostra l'esquema del circuit. Els Neo Pixels s'han repartit en dues cadenes, una per a cada costat de la jaqueta. En cada cadena el Neo Pixel 0 és el central, els 1 a 3 corresponen a la resta dels de posició i frenada i els 4 a 8 són els dels intermitents.

esquema

El prototip va quedar com es mostra a les fotografies següents. A la de l'esquerra veiem els dos intermitents encesos, a la del centre els llums de posició i a la de la dreta els llums de frenada.

resultat final           resultat final           resultat final

A continuació tenim el llistat del programa:

#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_TSL2561_U.h>
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(9, 6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel cadena2 = Adafruit_NeoPixel(9, 9, NEO_GRB + NEO_KHZ800);
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
Adafruit_LSM303 lsm;
int pols = 12;
int pols2= 10;
int lectura;
int lectura2;
int start = 0;
int prevZ = 0;
int currentZ = 0;
long brakeTime = 0;
#define BRAKETHRESHOLD        100
#define BRAKETIMETHRESHOLD    100
void setup() {
	cadena.begin();
	cadena2.begin();// Inicialitza els Neo Pixels				
	cadena.show();
	Serial.begin(9600);
	if(!tsl.begin()) {
		Serial.print("Comprova que el sensor està ben connectat");
		while(1);
	}
	if (!lsm.begin()) {
		Serial.println("Oops ... unable to initialize the LSM303. Check your wiring!");
		while (1);
	}
	tsl.enableAutoRange(true);  // Funcionament normal amb guany automàtic
	tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);  // Més velocitat però menys resolució
	pinMode(pols, INPUT); // El polsador és una entrada
	pinMode(pols2, INPUT); // El polsador2 és una entrada
}
void loop() {
	sensors_event_t event;
	tsl.getEvent(&event);
	Serial.print(event.light); Serial.println(" lux");
	lectura = digitalRead(pols); // Llegim el polsador
	lectura2 = digitalRead(pols2); // Llegim el polsador2
	lsm.read();
	currentZ = abs(lsm.accelData.z); // act curren
	if (start == 0){
		prevZ = currentZ;
		start = 1;
	}
	int i = currentZ - prevZ; // current0- prev0
	if (abs(i) > BRAKETHRESHOLD) {
		brakeTime = millis(); //  millis0
		while ((abs(i) > BRAKETHRESHOLD)) {
			lsm.read();
			currentZ = abs(lsm.accelData.z); //current 1
			i = currentZ - prevZ; // current 1- prev0
			// while mentres current - prev0 més gran que el llindar
			if ((millis() - brakeTime) > BRAKETIMETHRESHOLD) {
				for (int k = 0; k < 4; k++){
					cadena.setPixelColor(k, 255,0,0);  // Pixels 0-4 vermell
					cadena2.setPixelColor(k, 255,0,0);  // Pixel 0-4 vermells
				} 
				cadena.show();
				cadena2.show();
					// ENGEGA quan ha passat prou temps al while
					// (que mentres current - prev0 més gran que el llindar)
				break;
			}
		}
	} else { // si no estàs frenant
		for (int k = 0; k < 4; k++){ 
			cadena.setPixelColor(k, 0,0,0);  // Pixel 0-4 apagats
			cadena2.setPixelColor(k, 0,0,0);  // Pixel 0-4 apagats
			if (event.light < 20) { // si hi ha poca llum
				for (int k = 1; k < 4; k++){
					cadena.setPixelColor(k, 255,255,255);  // Pixel 1-4 blancs
					cadena2.setPixelColor(k, 255,255,255);  // Pixel 1-4 blancs
				}
				cadena.setPixelColor(0, 255,0,0);  // Pixel 0 vermell
				cadena2.setPixelColor(0, 255,0,0);  // Pixel 0 vermell
				cadena.show(); // Actualitza
				cadena2.show(); // Actualitza    
			}  
		}
	}    
	prevZ=currentZ; // prev1
	if (lectura == HIGH && lectura2 == LOW){ // Si polsador dret està premut...
		for (int k = 4; k < 9; k++){
			cadena.setPixelColor(k, 255, 125, 0); // intermitent ences 
		}
		cadena.show();
		cadena2.show();
		delay(250); 
		for (int k = 4; k < 9; k++){
			cadena.setPixelColor(k, 0, 0, 0);// intermitent apagat  
		}
		cadena.show(); 
	}
	if (lectura2 == HIGH && lectura == LOW){ // Si polsador esquerre està premut...
		for (int k = 4; k < 9; k++){
			cadena2.setPixelColor(k, 255, 125, 0);// intermitent ences   
		}
		cadena2.show(); 
		cadena.show();
		delay(250);  
		for (int k = 4; k < 9; k++){
			cadena2.setPixelColor(k, 0, 0, 0);  // intermitent apagat 
		}
		cadena2.show();   
	}
	if (lectura2 == HIGH && lectura == HIGH){ // Si els dos posaldors estan premuts...
		for (int k = 4; k < 9; k++){
			cadena.setPixelColor(k, 255, 125, 0);  
			cadena2.setPixelColor(k, 255, 125, 0);
		}
		cadena.show(); 
		cadena2.show(); 
		delay(250);  
		for (int k = 4; k < 9; k++){
			cadena.setPixelColor(k, 0, 0, 0);  
			cadena2.setPixelColor(k, 0, 0, 0);
		}
		cadena.show(); 
		cadena2.show();   
	} else { // Si cap està premut
		for (int k = 4; k < 9; k++){
			cadena.setPixelColor(k, 0, 0, 0);  
			cadena2.setPixelColor(k, 0, 0, 0);
		}  
		cadena.show(); 
		cadena2.show(); 
	}
	delay(250);  
}

 

 

 

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.

 

 

 

 

 

 

 

 

 

 

Licencia de Creative Commons
This obra by Oriol Boix is licensed under a Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported License.