| 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 |
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:
2 Sensor de distància per ultrasons
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.

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.

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.

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.

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