Primer Prototipo Funcional de Pulsar Mini
Ya está funcionando el primer prototipo del auxiliar electrónico para discapacitados visuales.
Características:
- Rango de Detección configurado 2m a 10cm (máximo 4m a 2cm).
- Ensamble con bastón o uso en mano.
- La distancia al objeto detectado es proporcional al giro del dial (mircoservo), sobre este dial el usuario apoya el pulgar para conocer su posición.
- La inclinación del sensor puede variarse de tal manera que se dirija hacia el frente o arriba tanto al estar montado en el bastón o al ser usado sin él.
A continuación se compartiremos los datos necesarios para su construcción o mejora.
Lista de Materiales:
1x Arduino
1x Sensor Ultrasónico SRF05
1x MicroServo
1x Tecla ON/OFF pulsador en lo posible.
1x Batería de 9v.
1x Clip para Batería de 9V
La carcaza se puede imprimir en 3D o realizar de otra manera.
Varios cables conextores con pines
Diagrama de Conexiones
Carcaza – Modelo 3D
El modelo 3D para su impresión puede ser descargado haciendo click aquí.
Ensamble
Código de Arduino
Se requieren las librerías Servo (descargar) y NewPing (descargar)
[cpp]
// PATAGONIA LAB
// basado en Tacit Version 12.02.04 de Steve Hoefer at Grathio Labs (http://grathio.com)
// – Utilizando la linbreria NewPing es mucho mas rapido
// – IMPORTANTE TIENE PROBLEMAS CON LA FUNCION TONE existen otras librerias para Tone pero mejor comprar un buzze con oscilador.
#include <Servo.h>
#include <NewPing.h>
// CONFIGURACION ——————————————————————————-
const int BuzzerPin= 9; // Pin del buzzer con resistencia de 220 ohms
const int ServoPins = 7; // Pin Data del Servo
const int EchoPin = 5; // El pin de Echo del sensor
const int TriggerPin= 6; // El pin de disparo del sensor
const int CantLecturas = 2; // El numero de lecturas historicas que se consideran para determinar la posicion
const int TiempoPorGrado = 9; // ms por grado de rotacion del servo para prevenir que su motor interfiera con el sensor. Mas grande, mas lento.
const int DistMinimGiro = 0; // Numero minimo de grados que el servo girara, para que no este moviendose constantemente
int RangoMin = 10; // cm el valor minimo que detectara el sensor
int RangoMax = 200; // cm el valor minimo que detectara el sensor
int ServoMin = 0; // Angulo minimo del servo cuando esta lo mas cerca posible
int ServoMax = 90; // Angulo minimo del servo cuando esta lo mas cerca posible
// Variables ——————————————————————————-
Servo elServo; // Lista de servos, en este caso hay solo uno
int distCalculada; // La distancia calculada
int ultimaLectura = 0; // La posicion en el array de la lectura mas reciente
int servoPos; // Poscion del servo actual
// INICIA SONAR
NewPing sonar(TriggerPin, EchoPin, RangoMax);
// SETUP ——————————————————————————-
void setup() {
Serial.begin(9600); // para testear.
Serial.println("Comienzo…");
// Inicia el servo, y recorre todo el rango para asegurarnos.
elServo.attach(ServoPins);
delay(10);
elServo.write(ServoMin);
delay(500);
elServo.write(ServoMax);
delay(500);
elServo.detach();
delay(100);
elServo.attach(ServoPins);
}
// LOOP ——————————————————————————-
void loop(){
int i, j, posVieja;
unsigned long delayTime;
// Posiciona el servo.
posVieja = servoPos;
servoPos = map(getDistance(), 0, 100, ServoMin, ServoMax);
if (abs(servoPos-posVieja) >= DistMinimGiro){ // Prueba solo si cambio lo suficiente
delay(10);
elServo.write(servoPos);
delayTime = (TiempoPorGrado * (abs(servoPos-posVieja))+20); // Realiza un delay hasta la prox lectura para que el motor del servo no meta ruido en el sensor.
if (abs(delayTime)>500){ // por si el delay calculado es mucho, se deja en en maximo que asegure una rapida respuesta
delayTime=500;
}
delay(delayTime);
servoPos = posVieja; // comentar si se descomenta el mantenimiento de presion en el else que sigue
}
}
// ——————————————————————————-
int getDistance(){
//long duration; // Retardo del eco
int out; // el valor que devuelve la función
delay(50);
distCalculada=sonar.ping_cm();
Serial.print(distCalculada); Serial.println(" – sin promediar");
if (distCalculada==0) { // el sensor tira 0 cuando la distancia est´ fuera de rango, por eso le asigno la m´axima.
distCalculada=RangoMax;
}
if (distCalculada < RangoMin ){ // Activa la alarma sonora sin pasar por el control de errores para que sea mas rapido
//tone(BuzzerPin,800,50);
}
// Trim the data into minimums and maximums and map it to the 0-100 output range.
distCalculada = constrain(distCalculada, RangoMin, RangoMax);
out = map(distCalculada, RangoMin, RangoMax, 0, 100);
return out;
}
[/cpp]
Mejoras a realizar
- El agarre del bastón debería ser más flexible o regulable.
- El cierre de la tapa de la carcaza debe mejorarse
- El dial del servo podría ir más arriba y atrás para mejorar la ergonomía
- Mediante el agregado un booster de 2.4v a 5v debería hacerse funcionar con dos pilas AA recargables.