Prototipo de Guante para no videntes

Hola buenas tardes de antemano muchas gracias por su atención (Advertencia de texto largo). Estoy realizando un prototipo de un guante para personas no videntes. Que en resumen tiene 2 modos de uso. El primero es la típica función del sensor ultrasónico y una bocina, si un objeto está dentro del rango del sensor (en este caso es de 70cm) se enciende la bocina generando ruido, y si el objeto sale del rango se apaga la bocina de forma inmediata. El segundo modo es similar con la diferencia que este indica de manera exacta la distancia en la que se encuentra el objeto del sensor mediante audios específicos almacenados en una memoria micro sd, este modo se activa mediante la pulsación de un pulsador. Mi problema radica en el momento que conecto mi circuito a mi pc, esta falla reproduciendo de manera desordenada todos los audios que indicaran la distancia (aun cuando no hay nada en el rango del sensor y no se está pulsado el pulsador) Y también el primer modo deja de funcionar. Me gustaría saber cuál es mi error y la manera de corregirlo.

Adjunto fotos del circuito y su diagrama de conexión y mi código

Componentes:

Arduino nano genérico (no original)

Módulo micro SD

Sensor ultra sónico

Bocina genérica de 3 w a 4 ohms

Capacitor electrolítico de 10uf a 200v

Una resistencia de 10k

Una resistencia de 100 ohm

Transistor NPN BC547 Bipolar

Pulsador de 4 pines PCB NA

Cables de jummper hechos con un cable ethernet utp

Nota: Decidí agregarle el transistor como amplificador, también adjunto diagrama el cual me base para hacerlo. Y mi versión de Arduino IDE es la 1.8.19

CODGIO:

#include <SD.h>
#include <SPI.h>
#include <SimpleSDAudio.h>

// Definición de pines
#define ECO_PIN 8    // Pin Eco del sensor ultrasónico
#define TRIGGER_PIN 7 // Pin Trigger del sensor ultrasónico
#define BOTON_PIN 2   // Pin para el botón

// Declaración de variables
const int DISTANCIA_MAXIMA = 300; // Distancia máxima para la reproducción de audio
int estadoBoton = 0;              // Estado del botón
long duracion, distancia;         // Variables para medir la distancia

void setup() {
  Serial.begin(115200); // Inicialización del puerto serial
  SdPlay.init(SSDA_MODE_HALFRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER); // Inicialización de la librería SimpleSDAudio
  pinMode(9, OUTPUT);   // Pin 9 como salida para control de audio
  pinMode(BOTON_PIN, INPUT);     // Pin para el botón como entrada
  pinMode(TRIGGER_PIN, OUTPUT);  // Pin Trigger como salida para el sensor ultrasónico
  pinMode(ECO_PIN, INPUT);       // Pin Eco como entrada para el sensor ultrasónico
  delay(500); // Retardo inicial
}

void loop() {
  estadoBoton = digitalRead(BOTON_PIN); // Lectura del estado del botón

  if (estadoBoton == LOW) {
    calcularDistancia(); // Llama a la función para calcular la distancia
  } else {
    tonoContinuo(); // Llama a la función para reproducir tono continuo
  }
}

void calcularDistancia() {
  digitalWrite(TRIGGER_PIN, LOW);  // Envía un pulso LOW al pin Trigger
  delayMicroseconds(4);            // Pequeño retardo
  digitalWrite(TRIGGER_PIN, HIGH); // Envía un pulso HIGH al pin Trigger
  delayMicroseconds(10);           // Pulso de 10 microsegundos
  digitalWrite(TRIGGER_PIN, LOW);  // Apaga el pulso del pin Trigger

  duracion = pulseIn(ECO_PIN, HIGH); // Mide la duración del eco en HIGH
  distancia = (duracion * 0.0343) / 2; // Calcula la distancia en centímetros

  Serial.println(distancia); // Imprime la distancia en el puerto serial

  // Reproducción de audio basada en la distancia medida
  if (distancia == 300) {
    trescientos(); // Reproduce "300.wav"
    cms(); // Reproduce "cms.wav"
  } else if (distancia > 300) {
    rango(); // Reproduce "rango.wav"
  } else if (distancia >= 200) {
    doscientos(); // Reproduce "200.wav"
    if (distancia > 200) {
      distancia -= 200;
      reproducirDecenas(distancia); // Reproduce las decenas y unidades correspondientes
    }
  } else if (distancia >= 100) {
    ciento(); // Reproduce "100.wav"
    if (distancia == 100) {
      cien(); // Reproduce "cien.wav"
    } else {
      distancia -= 100;
      reproducirDecenas(distancia); // Reproduce las decenas y unidades correspondientes
    }
  } else {
    reproducirDecenas(distancia); // Reproduce las decenas y unidades correspondientes
  }
}

void reproducirDecenas(int distancia) {
  if (distancia >= 90) { noventa(); y(); if (distancia == 90) { cms(); } else { distancia -= 90; reproducirUnidades(distancia); } }
  else if (distancia >= 80) { ochenta(); y(); if (distancia == 80) { cms(); } else { distancia -= 80; reproducirUnidades(distancia); } }
  else if (distancia >= 70) { setenta(); y(); if (distancia == 70) { cms(); } else { distancia -= 70; reproducirUnidades(distancia); } }
  else if (distancia >= 60) { sesenta(); y(); if (distancia == 60) { cms(); } else { distancia -= 60; reproducirUnidades(distancia); } }
  else if (distancia >= 50) { cincuenta(); y(); if (distancia == 50) { cms(); } else { distancia -= 50; reproducirUnidades(distancia); } }
  else if (distancia >= 40) { cuarenta(); y(); if (distancia == 40) { cms(); } else { distancia -= 40; reproducirUnidades(distancia); } }
  else if (distancia >= 30) { treinta(); y(); if (distancia == 30) { cms(); } else { distancia -= 30; reproducirUnidades(distancia); } }
  else if (distancia >= 20) { distancia -= 20; veinti(); reproducirUnidades(distancia); }
  else { reproducirUnidades(distancia); }
}

void reproducirUnidades(int distancia) {
  switch (distancia) {
    case 1: uno(); cms(); break;
    case 2: dos(); cms(); break;
    case 3: tres(); cms(); break;
    case 4: cuatro(); cms(); break;
    case 5: cinco(); cms(); break;
    case 6: seis(); cms(); break;
    case 7: siete(); cms(); break;
    case 8: ocho(); cms(); break;
    case 9: nueve(); cms(); break;
    case 10: diez(); cms(); break;
    case 11: once(); cms(); break;
    case 12: doce(); cms(); break;
    case 13: trece(); cms(); break;
    case 14: catorce(); cms(); break;
    case 15: quince(); cms(); break;
    case 16: dieciseis(); cms(); break;
    case 17: diecisiete(); cms(); break;
    case 18: dieciocho(); cms(); break;
    case 19: diecinueve(); cms(); break;
    case 20: veinte(); cms(); break;
  }
}

// Funciones de reproducción de audio
void reproducirAudio(const char* archivo) {
  SdPlay.setFile(archivo); // Establece el archivo a reproducir
  SdPlay.play(); // Reproduce el archivo
  delay(500); // Pequeño retardo para evitar solapamientos de reproducción
}

// Funciones individuales para reproducir cada archivo de audio
void uno() { reproducirAudio("1.wav"); }
void dos() { reproducirAudio("2.wav"); }
void tres() { reproducirAudio("3.wav"); }
void cuatro() { reproducirAudio("4.wav"); }
void cinco() { reproducirAudio("5.wav"); }
void seis() { reproducirAudio("6.wav"); }
void siete() { reproducirAudio("7.wav"); }
void ocho() { reproducirAudio("8.wav"); }
void nueve() { reproducirAudio("9.wav"); }
void diez() { reproducirAudio("10.wav"); }
void once() { reproducirAudio("11.wav"); }
void doce() { reproducirAudio("12.wav"); }
void trece() { reproducirAudio("13.wav"); }
void catorce() { reproducirAudio("14.wav"); }
void quince() { reproducirAudio("15.wav"); }
void dieciseis() { reproducirAudio("16.wav"); }
void diecisiete() { reproducirAudio("17.wav"); }
void dieciocho() { reproducirAudio("18.wav"); }
void diecinueve() { reproducirAudio("19.wav"); }
void veinte() { reproducirAudio("20.wav"); }
void treinta() { reproducirAudio("30.wav"); }
void cuarenta() { reproducirAudio("40.wav"); }
void cincuenta() { reproducirAudio("50.wav"); }
void sesenta() { reproducirAudio("60.wav"); }
void setenta() { reproducirAudio("70.wav"); }
void ochenta() { reproducirAudio("80.wav"); }
void noventa() { reproducirAudio("90.wav"); }
void cien() { reproducirAudio("cien.wav"); }
void ciento() { reproducirAudio("cien.wav"); }
void doscientos() { reproducirAudio("200.wav"); }
void trescientos() { reproducirAudio("300.wav"); }
void cms() { reproducirAudio("cms.wav"); }
void veinti() { reproducirAudio("veinti.wav"); }
void y() { reproducirAudio("y.wav"); }
void rango() { reproducirAudio("rango.wav"); }

void tonoContinuo() {
   long duration, distance; //Establecemos duration y distance como variables numéricas extensas

  digitalWrite(TRIGGER_PIN, LOW); //Para tener un pulso limpio empezamos con 2 microsegundos en apagado

  delay(2);

  digitalWrite(TRIGGER_PIN, HIGH); //Mandamos un pulso de 5 microsegundos

  delay(5);

  digitalWrite(TRIGGER_PIN, LOW); //Apagamos

  duration = pulseIn(ECO_PIN, HIGH); //Medimos el tiempo que la señal tarda en volver al sensor en microsegundos

  distance = (duration/2)*0.0343; //La distancia es el tiempo por la velocidad del sonido (343 m/s = 0.0343 cm/microseg)

  if (distance < 70) //Si la distancia es menor de un metro y medio
  
{ tone(9,500); //Suena el zumbador con una frecuencia de 1000Hz

  delay(0.5); //durante 5 segundos
}
else //De lo contrario
{
  noTone(9);//no suena
}
}


Título editado por moderador

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @aguilarzzzz.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

En la protoboard no logro apreciarlo, pero en el esquema tienes intercambiados los pines trig y echo, compruebalo.

1 Like

Tal cual, en el esquema están cruzados pero en fisico parecen estar correctos.

El eco es el cable verde que parece estar conectado al pin 8 y el disparo es el naranja que, usando un poco la imaginación, parece estar conectado al pin 7.

1 Like

Los pulsadores están mal conectados en los esquemas y mal conectado para tu configuración en físico.

En físico has conectado el pin 2 a GND a través de la R, por lo que detecta como si siempre estuviese pulsado el botón (LOW).
Lo solucionas fácilmente.

pinMode(BOTON_PIN, INPUT_PULLUP); 

Luego el pulsador, un lado al pin 2 y el otro a GND.

En los esquemas, tal como los has dibujado, los pines siempre leen HIGH.

Era fácil encontrar el problema pero recién presto atención a las imágenes de los pulsadores. :man_facepalming:t2: