Primer Prototipo Funcional de Pulsar Mini

OLYMPUS DIGITAL CAMERAYa 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

conexiones

Carcaza – Modelo 3D

El modelo 3D para su impresión puede ser descargado haciendo click aquí.

Ensamble

OLYMPUS DIGITAL CAMERA

OLYMPUS DIGITAL CAMERA

OLYMPUS DIGITAL CAMERA
Código de Arduino

Se requieren las librerías Servo (descargar) y NewPing (descargar)

 

// 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;
}
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.
admin

Leave a reply