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.
 


