Der sprechende Farbdetektor mit DFPlayer und TCS3200 - [Teil 1]

Introducción

En esta serie de blog, me gustaría construir un detector de color simple con ellos. Tales dispositivos son utilizados a menudo por personas con discapacidad visual. Le permitirá ver, por ejemplo, reconocer el color de la ropa en el armario.

Queremos construir un dispositivo que se mantenga en un área de color y luego el color se emite como un texto hablado presionando un botón. En la primera parte, comisamos el reproductor de MP3 para la salida de voz e incluye un botón para el cambio de modo, así como un potenciómetro para el cambio de volumen. Aquí vamos.

Hardware requerido

Número Componente Anotación
1 Módulo de sensor de color TCS3200 (en la segunda parte)
1 DFPlayer Mini Module de reproductor de MP3
1 Tarjeta micro SD
1 Arduino nano
1 Altavoz (max 3w)
1 Botón
Resistencia cambiable (potenciómetro)
Resistencia 1 kohm
cable de conexión
Computadora con IDE Arduino y Conexión a Internet.
Fuente de voltaje externo (recomendado), 7 - 12V


Voz

Con la biblioteca Arduino "Talkie", el Arduino se transforma en un generador de idiomas. Lo intenté. No voy más lejos. Con la calidad de voz no estaba satisfecha con este proyecto.

Otra variante es para reproducir archivos de audio. Para esto uso el Dfplayer por dfrobot. Albert vu y Matthias kammerer Ya se han mostrado en las contribuciones de su blog, ya que este componente se pone en funcionamiento. La desventaja aquí es que necesita un portavoz con el que registre las palabras que se reproducirán más tarde.

Además, los archivos de audio deben ser editados. Usé generadores de idiomas en línea. Estos se pueden encontrar por ejemplo, en VoiceBooking.com o Wideo.com. Recibirá los archivos requeridos de forma gratuita para uso privado. Para editar los archivos de audio, puede, por ejemplo, el editor de audio gratuito. Audacia usar. Necesitaremos un STREUGOT y los siguientes textos:

Archivo de audio texto
0001_startsound.wav [StartSound]
0002_info.wav Mantenga presionado los botones y mantenga el sensor cerca del objeto.
0003_scanne.wav Escanear.
0004_rot.wav Rojo.
0005_gruen.wav Verde.
0006_blau.wav Azul.
0007_schwarz.wav Negro.
0008_weiss.wav Blanco.
0009_gelb.wav Amarillo.
0010_orange.wav Naranja.
0011_pink.wav Rosa.
0012_braun.wav Marrón.
0013_kalibriere.wav Calibración.
0014_deutsch.wav Alemán.


Visite uno de los sitios web y permita que el texto convertir el texto en un archivo de voz completamente en una pieza:

Mantenga presionado los botones y mantenga el sensor cerca del objeto. Escanear. Rojo verde. Azul. Negro. Blanco. Amarillo. Naranja. Marrón. Calibración. Alemán.

Luego edite esto con un editor de audio de su elección para obtener archivos individuales al final. Alternativamente, también puede grabar los textos usted mismo. El nombramiento de los archivos es importante. Al menos los primeros cuatro caracteres.

El DFPlayer Utilizamos búsquedas de archivos con números 0001.MP3 o 0001.WAV en la tarjeta SD. Para obtener una mejor visión general, cualquier texto puede seguir después de los cuatro dígitos. Puedes elegir esta designación libremente. Jugaremos archivos de audio muy específicos en ciertos momentos. No olvides el sonido de inicio. Si tiene sus archivos y se nombra en consecuencia, cópielo uno después del otro en la tarjeta Micro SD. Aquí, el orden es realmente importante en el que se copian los archivos. Los subcarpetas no necesitaremos por el momento.

Primero, cometemos el jugador y nos aseguraremos de que se juegue el sonido de inicio. Los componentes están conectados de la siguiente manera:


Entre el pasador RX del DFPlayer y el pasador TX de los arduinos, se debe conectar una resistencia de 1 kohm. También es recomendable conectar una fuente de alimentación externa que proporciona entre 7 y 12V en el pasador de VIN de los arduinos.

DFPlayer Mini Pins Arduino Nano Pins
Vcc 5v
Gnd Gnd
Rx Más de 1 Kohm a D11 (TX)
Tx D10 (RX)
vocero
Spk_1 Rojo (más)
Spk_2 Negro (menos)


Después de conectarlo todo, tenemos que escribir un porgrama. Algunas bibliotecas están disponibles en la administración de la biblioteca ARDUINO IDE. Utilizamos la biblioteca proporcionada por el fabricante DFROBOT. Dfrobotdfplayermini.

También tengo la biblioteca Dfplaymini_fast Probado. Ella está bien descrita y algo más delgado. En el punto donde necesitaba la información, ya sea que el jugador solo juegue un archivo de audio, pero no me subí. Si bien es posible consultar esta información, sin embargo, el comando constantemente repetido genera errores en la reproducción. Lo mismo sucede en la biblioteca DfFrobot.

Sin embargo, uno puede consultar adicionalmente si y con qué parámetro ha cambiado el estado. Luego, puede consultar si la reproducción se ha detenido y qué archivo de audio se jugó por última vez. No encontré esta posibilidad en la biblioteca rápida.

Después de instalar la biblioteca, algunos ejemplos están disponibles. Abrir el proyecto Estúpido y transferirlo al arduino.

Por supuesto, no debe olvidarse de insertar la tarjeta SD en la que se encuentran los archivos de audio. Si todo se hace correctamente, el sonido de inicio debe escucharse durante tres segundos. Si no, las diferentes fuentes de error podrían ser la causa.

Asegúrese de que las luces LED en el DFPlayer. Si es así, se reproduce el archivo de audio. Luego, el altavoz no pudo estar conectado correctamente. Podría confundir las salidas de los altavoces al DFPlayer. Él no debe ir a SPK1 y GND están conectados, cómo sospechar posiblemente. Es una salida mono y tiene que ir a SPK.1 y spk2 están conectados. Si tiene un amplificador de audio, la señal de audio también se puede aprovechar del convertidor analógico digital, que se encuentra en el módulo. Usa las conexiones DAC para estoL y dacR. El caso es una señal estéreo. Si el LED no se enciende en el módulo DFPlayer, podría ser que la electricidad no sea lo suficientemente fuerte. Abra el monitor en serie y preste atención a la salida de la pantalla. Allí la línea "DFPlayer Mini Online". aparecer. Si no, verá un mensaje de error. Podría ser que las líneas RX y TX se inviertan. Este es un error frecuente. También me pasé. Es un poco confuso si inicializa los pasadores. No se determina qué PIN DE DFPLAYER DEL PIN ARDUINO está conectado, pero se genera propios pines RX y TX. Posteriormente, estos deben estar reticulados entre los dos componentes. Otra posibilidad es que la tarjeta SD no se reconoce. Esto no debe ser mayor que 32GB. Asegúrese de que solo puede formatearse con el sistema de archivos FAT16 o FAT32. Si el LED se ilumina en el módulo DFPlayer y aún no escucha nada, verifique los archivos de audio para el formato de archivo correcto. La [Hoja de datos] (https://cdn.shopify.com/s/files/1/1509/1638/files/mp3JugadormóduloDatasheet.pdf? 10537896017176417241) El DFPlayer se puede encontrar en las especificaciones apropiadas. Tal vez el nivel de audio del archivo es demasiado bajo. De forma predeterminada, el volumen se establece en 10 en el programa Ejemplo. El máximo es el valor 30.

Ahora asumo que se reproduce el archivo de audio. En este punto, me gustaría explicarle cómo funciona el código fuente en el ejemplo para que podamos usarlo mejor para nuestro proyecto:

#include "Softwareserial.H"
#include "DFROBOTDFPLAYERMINI.H"

Para la comunicación en serie, se necesita la biblioteca de softserial. Por lo tanto, es posible recibir simultáneamente una salida en el monitor en serie porque esto utiliza la interfaz de hardware que también se puede utilizar. La biblioteca DFFROBOT nos proporciona las funciones necesarias para operar el reproductor de MP3.

Softwareserial mysoftwareserial (10, 11); // rx, tx
Dfrobotdfplaymini mydfplayer;

La interfaz softserial nos permite asignar tus propios pasadores para la comunicación. Como ya se mencionó, creamos tus propios pasadores RX y TX. El pasador RX de los arduinos (aquí 10) debe conectarse al pasador TX del DFPlayer. El PIN no. 11 de TX de los arduinos sobre la resistencia de 1 kohm con el pin RX del DFPlayer. El objeto mydfplayer Se utilizará más tarde para la reproducción de audio.

en el configurar() Vamos a empezar la comunicación con:

Mysoftwareserial.Begin (9600);
Serial.begin (115200);

De forma predeterminada, el DFPlayer se comunica con una velocidad de transmisión de 9600 a través de la interfaz Softserial. La salida en el monitor en serie está aquí con 115200. Asegúrese de que el mismo valor esté establecido en el monitor en serie.

  SI (! mydfplayer.begin (mysoftwareserial) {}

Este comando en la consulta inicia la comunicación del DFPlayer a través de la interfaz Softserial con el Arduino. Si eso no tuvo éxito, se emite un mensaje de error.

mydfplayer.volume (10);  // Establecer valor de volumen. De 0 a 30
MyDFPlayer.Play (1);     // jugar el primer mp3

Con estas dos llamadas de función, puede configurar el volumen y reproducir una pista de audio específica de la tarjeta SD. Si el sonido es demasiado silencioso, aumente el valor a un máximo de 30. Nuestro sonido de inicio es 0001_startsound.wav. Con Jugar (1) Este archivo se reproduce. Importante es que se copió por primera vez en la tarjeta SD y se encuentra en el directorio raíz. El nombre detrás de 0001 es irrelevante.

En el Lazo ()La función se inicia primero un temporizador. Esto asegura que la reproducción se reinicie cada tres segundos.

MyDFPlayer.Siguiente ();

Con esta función, luego se reproduce el siguiente archivo de audio. Por lo tanto, todos los archivos deben reproducirse en la tarjeta SD durante tres segundos.

SI MyDFPlayer.Available ()) {
PrintDetail (MyDFPlayer.ReadType (), MyDFPlayer.Read ());
}

Con el Disponible ()-Function es posible responder a cambios o errores. El DFPlayer suministra con Readtype () Los tipos de cambio y un parámetro adecuado con la función. Leer ().

Para el tema de la información asociada, el PrintDetail ()Característica escrita a continuación en el código fuente. Si, por ejemplo, detenido la reproducción, es el tipo devuelto. Dfplayerplayfinished Y los parámetros asociados el número del último archivo de audio reproducido.

Por ejemplo, si desea responder a la reproducción, puede consultar. Aquí hay un código de muestra corto:

SI (MyDFPlayer.Available () && mydfplayer.readtype () == dfplayerplayfinished) {
    // Haz algo
}

De esta manera, es posible reaccionar sin ruido para detener la reproducción de audio. Sin la consulta de la Disponible ()La función se interrumpe en ciclos cortos, lo que no suena limpio.

Ahora llegamos a un problema caliente en internet. Los ruidos de cambio que ocurren cuando enciende o apaga el arduino con DFPlayer conectado. En la parte posterior del módulo, se soldaed una resistencia de 0 ohmios. Exactamente opuestos son dos almohadillas de soldadura gratuitas. Una modificación del plano de hardware es quitar la resistencia y abrir el otro lado. en el Foro de Arduino Tiene alguien descrito y realizado. Sin embargo, no trajo el resultado deseado.

La fuente es de aquíPero ya tiene unos años. en el Foro Tonuino Se describe una solución con un circuito antiserial adicional de MOSFET. No perseguí ni cambié esto para este proyecto.

Más perturbador que los ruidos de turno. Encuentro el agrietamiento cuando se inicia o se detiene una canción. Para evitar esto, en el proyecto de muestra. DISTRIBUIDO ADVANCTWITHOUTRESET Se muestra cómo resolverlo. en el configurar() ¿Esta línea tiene que:

SI (! mydfplayer.begin (mysoftwareserial) {

Splemente complementado de la siguiente manera:

SI (! mydfplayer.begin (Mysoftwareserial, cierto, falso)) {

Esta voluntad Reiniciar ()La llamada evita el ruido causando. Todavía escuché un ruido de craqueo al final de mi archivo de audio de sonido inicial. Eso fue en el archivo de audio, que aparentemente terminó con una terminación de la onda de audio. Si presta el sonido, el nivel en el archivo de audio está al final en cero. Después de este cambio, no había ningún ruido de este tipo.

Para conocer más características de la biblioteca, debe ver el proyecto de muestra. Funcionamiento completo mirar.

Nuestro propio programa

Al principio, solo se debe jugar el sonido de inicio. Por esto cambiamos de que Ensayador-Ejemplo.

Necesitamos algunas variables:

En t volumen = 20;
En t Estado = 0;
bota habló = falso;

Para el flujo del programa posterior, desarrollaremos una máquina de estado a través de la cual podemos cambiar el botón. Nos damos cuenta de esto con una declaración de switch Case. Como argumento de los estados que uso la variable. Expresar. La variable gastado Asegura que la salida aparezca solo una vez en el monitor en serie. Porque el bucle principal corre permanentemente a través de la Stemachine ().

Sigue la máquina del estado:

vacío Stemachine () {
  cambiar(Expresar) {
    cubo 0: {
MyDFPlayer.Play (1);                           // Play Start Sound
Serial.println ("El programa se inicia".);
Estado = 1;
    } descanso;
    cubo 1: {                                 // apoyar
      SI (! emitido) {
Serial.println ("Apoyar.");
gastado = cierto;
      }                                     
    } descanso;
    defecto: estado = 1; descanso;
  }
}

Después de encender los arduinos, el estado (caso) 0 se pasa a través. Allí se juega nuestro sonido de inicio y el texto "se inicia el programa". producción. Luego se cambia al estado 1. Hay una vez "en espera". Salidas en la pantalla.

Nada pasa por los otros pases. También podrías en lugar de la SIInstrucciones para la reproducción de una sola vez Inserte otro caso. Sin embargo, dado que nuestro programa se hace más grande y luego tendríamos casos vacíos, lo resolvimos de esta manera.

El texto para la salida de la pantalla en el monitor en serie cambiamos en configurar() De acuerdo a sus propias necesidades:

vacío configuración() {
Mysoftwareserial.Begin (9600);
Serial.begin (115200);
Serial.println (f (f ("El detector de color que habla"));
Serial.println (f (f ("Inicialice DFPlayer ..."));
  SI (! MyDFPlayer.Begin (Mysoftwareserial, cierto, falso)) {
Serial.println (f (f ("DFPlayer no se puede iniciar:"));
Serial.println (f (f ("1. ¡Confirma prüfen!"));
Serial.println (f (f ("2. Tarjeta SD Prüfen!"));
  }
Serial.println (f (f ("DFPlayer Mini en línea".));
Serial.print (f (f (f (f)"Volumen:"));
mydfplayer.volume (volumen);
Serial.println (volumen);
}

En el Lazo () Llamamos al Stemachine () en:

vacío Lazo () {
Estamachine ();
}

Si invitamos al programa al Arduino, se jugará el sonido inicial. Entonces no pasa nada.

Código FUENTE completo: 1.0DfplayerStartsound.ino

Volumen

Para cambiar el volumen de reproducción, hay varias posibilidades. Uno es el amplificador de audio mencionado anteriormente. Otro sería un código turno que se usa a menudo en AUDIORECEIVERN. He optado por la variante más simple de un potenciómetro. Por supuesto, no debemos influir fácilmente en la señal de audio en el PIN del altavoz con una resistencia cambiante. Esta idea podría venir una u otra ahora. Hay potenciómetros con los cuales eso es posible. Cabe señalar que una señal de audio es un voltaje de CA.

Usaré el potenciómetro para el valor en la función. mydfplayer.volume (10) cambiar. Complementamos el circuito de la siguiente manera:


Los dos pasadores exteriores del potenciómetro a GND y 5V. El contacto medio (amoladora) a uno de los pines analógicos de los arduinos, aquí A0.

Complementamos nuestras variables:

En t Volumen_old = 20;

y agregue la siguiente función:

vacío volumen () {
Volumen = analogread (A0);
Volumen = Mapa (Volumen, 0, 1023, 0, 30); 
  SI (Volumen! = Volumen_old) {
Serial.print ("Volumen:");
Serial.println (volumen);
mydfplayer.volume (volumen);
  }
Volumen_old = volumen;
}

Esto leerá el PIN analógico A0. "Fondos de pantalla", los rangos de valor entregados (valores de entrada 0 a 1023 al volumen 0 a 30). El cambio en el volumen que queremos gastar en el monitor. Sin embargo, solo si se ha producido un cambio. Por eso necesitamos el SIConsulta y la variable Volumen_old.

En el Lazo ()Función Ahora contacte con el inicio de la función descrita anteriormente:

vacío Lazo () {
volumen();
Estamachine ();
}

Invitamos al programa al Arduino, escuchamos el STRIGHT, cuyo volumen podemos cambiar directamente. Este cambio se emite en el monitor en serie. Ahora es posible cambiar el volumen de reproducción de audio en cualquier momento.

Código FUENTE completo: 1.1DfplayerStartsound_poti.ino

Operación con botón

Nos gustaría de alguna manera servir a nuestro detector de color. Por el momento, solo usamos un botón para este propósito. Esto nos permite iniciar y detener el proceso de escaneo del escáner de color. Primero, complementamos nuestro circuito por dicho botón:


Usaremos la resistencia interna de pullup. Por lo tanto, conectamos el botón a D12 y GND directamente. Complementamos nuestro código fuente definiendo el botón:

#define taterpin 12

en el configurar() Vamos a inicializarlo como entrada con la resistencia de pullup:

PinMode (Tastonpin, input_pullup);

Ahora complementamos la máquina de estado alrededor de los casos asociados. Quiero que presione el botón, con lo cual se reproduzca una sugerencia para la operación. Tienes que dejar ir al botón de nuevo y mantener el sensor a la superficie que desea escanear. Si vuelve a presionar el botón y lo mantiene presionado, se escanea el color. Si deja el botón, entonces, el último color detectado se emite a través de la reproducción de audio. Luego vuelva a la caja 3 de la máquina de estado, de modo que la instrucción de ayuda no se reproduzca nuevamente, sino que puede escanear un color nuevamente. Ahora implementaremos esta funcionalidad. El botón también debe ser el lado del software demolido.

vacío Stemachine () {
  cambiar(Expresar) {
    cubo 0: {
MyDFPlayer.Play (1);                     // Play Start Sound
Serial.println ("El programa se inicia".);
Estado = 1;
    } descanso;
    cubo 1: {                                 // apoyar
      SI (! emitido) {
Serial.println ("Apoyar.");
gastado = cierto;
      }                                     
    } descanso;
    cubo 2: {                                 // jugar ayuda
MyDFPlayer.Play (2);
Serial.println ("Botón drucked y mantén el sensor cerca del objeto".);
Estado = 3;
gastado = falso;
    } descanso;
    cubo 3: {                                 // listo para escanear
      SI (! emitido) {
Serial.println ("A la espera del botón ...");
gastado = cierto;
      }                                   
    } descanso;   
    cubo 4: {                                 // Iniciar escaneo
MyDFPlayer.Play (3);
Serial.println ("Escanear ...");
gastado = falso;
Estado = 5;
    } descanso;
    cubo 5: {                                 // escanear
Serial.println ("Color: ");
    } descanso;
    cubo 6: {                                 // color de salida
MyDFPlayer.Play (6);
Serial.println ("Color rojo");
Estado = 3;
    } descanso;
    defecto: estado = 1; descanso;
  }
}

La función para el botón se ve así:

vacío Botón () {
Taston_Status_Neu = DigitalRead (TastonPin); // el botón está activo bajo

  // Reconocer el botón soportar y empezar a rebotar temporizadores
  SI (Taston_Status_Neu! = Taston_Status_alt &&! Taston_Change) {
Start_zeit = milis ();
Taston_Change = cierto;
  }
  // si pulsó el botón
  SI (Taston_Status_neu == Low && Taston_Status_alt == Low && Taston_Change) {
    // boton de desmesor
    SI (Millis () - Start_ Time> Prell_Delay) {
Taston_Change = falso;
Estado ++;
      SI (Estado> maxates) {
Estado = 1;
      }
    }
  }
  // si se lanzó el botón
  Demás SI (Button_Status_neu == High && Tatus_alt == High && Tatus_Change) {
    // boton de desmesor
    SI (Millis () - Start_ Time> Prell_Delay) {
Taston_Change = falso;
      SI (Estado == 5) {
Estado = 6;
      }
    }
  }
Taston_status_alt = taston_status_neu;
}

Es un poco más extenso, porque no solo presionamos el botón del botón, sino también para liberar. Debido a que el color debe emitir cuando el botón se haya liberado después de escanear.

Leemos el pulsador. Esto se debe a la resistencia de la pullup activa baja (presionada Bajo y liberado ALTO). Tiene un cambio en el estado clave a tener lugar, se inicia un temporizador. Para que este comando no se ejecute una y otra vez, lo bloqueamos con la variable Taston_Change (He elegido bilingüe bilingüe aquí).

En el siguiente curso, se verifica si se ha presionado el botón si permanece presionado y si se ha alcanzado el intervalo de tiempo que hemos elegido para el desarrollo. Si es así, el cambio del botón se libera de nuevo y la variable para la máquina de estado se incrementa. Debemos asegurarnos de que no excedamos el número máximo de estados para que el programa no entre en el vacío.

En el caso de que el botón ya haya sido presionado, permanece lanzado, permanece liberado y se ha alcanzado la hora del intervalo de la deuda, el bloqueo también se levanta para el botón y, además, configura nuestra máquina de estado al estado que reproduce el color.

Declaramos las siguientes variables para las dos funciones:

En t Maxtates = 6;
bota gastado = falso;
no firmado largo New_zeit = 0;
no firmado largo Start_zeit = 0;
no firmado largo Prell_delay = 80;
bota Taston_status_neu = alto;
bota Taston_status_alt = alto;
bota Taston_Change = falso;  

Si invitamos al programa al Arduino, debería sonar como el sonido de inicio antes. Si presiona el botón, el texto de ayuda se emite. Sueltas el botón y lo presiona de nuevo. La palabra "escanny" se emite. Si deja el botón en algún momento, se emite un color. En este punto, el sensor de color aún no está conectado. Por eso elegí el color rojo. Puedes reiniciar el proceso una y otra vez. El programa funciona ahora funciona y recibimos una salida de voz.

Código FUENTE completo: 1.2DfplayerSonido de inicioPociónTarster.ino

avance

En la segunda parte de esta serie de blog, conectaremos el sensor de color y tomaremos en funcionamiento. Le mostraré qué bibliotecas están disponibles para esto y lo que tiene que considerar al usar el sensor.

Hasta entonces,

Andreas wolter

Para el blog de entrega AZ

Para arduinoProyectos para principiantesSensores

2 comentarios

Heiko Hogg

Heiko Hogg

Aufbau ist nachgebaut und im standby – und wartet ungeduldig auf den nächsten Teil (oder bin ich das, der es kaum erwarten kann?)
Als ein Mensch, der wie 20% der Männer eine Rot-Grün-Farbsehschwäche hat, ist dieses Thema besonders interessant. Als Normal-Farbsichtiger kann man es sicherlich kaum nachvollziehen, welche Einschränkungen man da hat – und das nicht nur als Pilot oder Lokführer. Wie gesagt: ich bin sehr gespannt, auch darauf, was man daraus noch alles entwickeln und einsetzen kann.
Bis dahin: vielen Dank für die super ausführliche und nachvollziehbare Beschreibung und das sehr, sehr interessante Thema!

Lentner Peter

Lentner Peter

Super Beitrag, ganz ausführlich Beschrieben.
Habe diesen nur aufmerksam Gelesen und nicht getestet.
Die Programmteile mit deutschen Bezeichnungen und nicht nur aus englischen Codes heraus kopiert..

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas