hace 3 años
Darle voz a un juguete siempre fue un sueño de niño. No existían juguetes parlantes y el sueño estaba destinado a quedarse como tal. Con la potencia de los microcontroladores modernos, como Arduino, tener un robot que hable es algo que siempre deseé hacer. Puedes construir un robot parlante de dos maneras:

- Usando texto a voz (TTS): Escribes un texto que el robot dice. Esta es la forma más rápida, pero necesitas un chip que implemente TTS. Es fácil si tu idioma es inglés, no tanto si es diferente. Para italiano, por ejemplo, no hay muchos chips baratos.
- Grabando archivos de audio: Grabas frases con la voz que el robot repetirá. Este método es más complejo, pero el resultado es el mismo.
Construí un robot simple, apto para principiantes, que hace dos cosas:
- Se mueve evitando obstáculos con un sensor de ultrasonido.
- Habla gracias a un chip de audio.
Esencialmente, es un juguete que fascina a mi hijo pequeño. Él disfruta viendo al robot moverse y hablar con voz robótica. Lo hice solo por eso. Les presento a Geronimo 2, el pequeño robot parlante:
Geronimo en acción
El robot se basa en dos proyectos anteriores. Utiliza un sensor de ultrasonido DFRobot URM37 y un chip de audio SOMO-14D, de bajo coste (20 euros), que funciona con pocos componentes (solo un condensador de 220 µF) y se configura con Arduino. El SOMO-14D reproduce archivos codificados en un formato propietario (AD4), pero existe un software que convierte MP3 a AD
Para que el robot hable en italiano, usé un software de síntesis de voz (Er Finestra), pero puedes usar el que quieras. Er Finestra solo puede decir algo, no grabar simultáneamente. Así que usé Audacity, un editor de audio gratuito, para grabar las frases que Er Finestra lee. Luego, convertí las frases de MP3 a ADGrabando 40 frases y convirtiéndolas, el robot puede decirlas aleatoriamente.
Se puede usar un algoritmo inteligente para que el robot diga algo en respuesta a estímulos externos. Por ejemplo, "gira a la derecha", "gira a la izquierda", etc. El chip de audio también reproduce música, ¡así que el robot puede moverse cantando!
El código Arduino es simple y se divide en dos partes:
- Navegación del robot
- Reproducción de audio
El código está comentado:
//Semplice robot autonomo con sensore ad ultrasuoni per evitare gli ostacoli e chip audio per parlare o suonare una canzone. //Simple autonomous robot with ultrasonic sensor for obstacles avoidance and audio player chip. It can speak or play a song.// written by alegiaco // Creative Commons Attribution-NonCommercial-ShareAlike 0 Unported License //include URM Library - Includi la libreria URM # include " URMSerial.h " # include //include servo library - includi la libreria del servo Servo sservo ; Servo dservo ; Servo uservo ; int ang = 0 ; int angolomax = 0 ; int distmax = 0 ; int value = 100 ; int ind = 0 ; int rotazione = 0 ; // Definizione delle misure per il sensore ad ultrasuoni URM37 // Measures definition for ultrasound URM37 # define DISTANCE 1 # define TEMPERATURE 2 # define ERROR 3 # define NOTREADY 4 # define TIMEOUT 5 //angolo di riposo dei servi delle ruote // standing angle for servos # define RIPOSOS 93 # define RIPOSOD 93 // inizializza l'oggetto della libreria urm del sensore ultrasuoni // initialize object for urm library URMSerial urm ; //parte relativa al SOMO-14D - Chip Audio - SOMO-14D initial variables assegnation const unsigned int minVol = 0xfff0 ; // Minimum volume - Volume minimo const unsigned int maxVol = 0xfff7 ; // Max Volume - Volume massimo const unsigned int PlyPse = 0xfffe ; // Play or Pause const unsigned int Stop = 0xFFFF ; // Stop const int pinClock = 4 ; // clock sul pin dell'arduino - Clock on Arduino pin const int pinData = 5 ; // data sul pin dell'arduino - Data on arduino pin const int pinBusy = 8 ; // busy sul pin dell'arduino - Byte on Arduino pin const int pinReset = 12 ; // reset sul pin dell'arduino - Reset on arduino pin unsigned int volLevel = 0x0005 ; // imposta massimo livello volume - volume max level int Song ; // current Song - canzone attuale unsigned int vol ; // volume int secondi = 0 , ultimotempo = 0 ; // varibili per durata brani - variables for songs time int brano = 0 ; // brano riprodotto - song played int durata [ 40 ] = { 7 , 8 , 14 , 19 , 5 , 8 , 33 , 28 , 5 , 5 , 5 , 5 , 6 , 5 , 5 , 5 , 5 , 6 , 6 , 7 , 6 , 5 , 7 , 8 , 8 , 10 , 4 , 6 , 5 , 6 , 5 , 10 , 5 , 6 , 7 , 6 , 4 , 5 , 6 , 5 } ; // durata singoli brani - single songs time // fine variabili iniziali // end initial variables void setup ( ) { Serial . begin ( 9600 ) ; // baud rate - 9600 urm . begin ( 6 , 7 , 9600 ) ; // RX Pin, TX Pin, Baud Rate sservo . attach ( 10 ) ; // Attacca il servo sinistro al pin 10 - servo left to pin 10 dservo . attach ( 9 ) ; // Attacca il servo destro al pin 9 - - servo right to pin 9 uservo . attach ( 3 ) ; // Attacca il servo degli ultrasuoni al pin 3 - ultrasonic sensor servo to pin 3 delay ( 100 ) ; uservo . write ( 90 ) ; // metti il servo degli ultrasuoni dritto - ultrasonic servo straight pinMode ( pinData , OUTPUT ) ; // set pin 4 to output for Data - pinMode ( pinClock , OUTPUT ) ; // set pin 3 to output for clock pinMode ( pinReset , OUTPUT ) ; // set pin 7 to allow software reset - imposta pin 7 per il sw reset pinMode ( pinBusy , INPUT ) ; // set pin 6 to monitor while Song is playing - pin 6 di monitoraggio mentre il brano è suonato Reset ( ) ; // resetta il somo-14D chip audio - somo-14d chip audio reset } void loop ( ) { playSOMO14D ( ) ; // suona un brano con chip audio - play song with chip audio delay ( 30 ) ; // attendi allineamento dei servi - wait for servo alignement sempreDritto ( ) ; // fai andare il robot sempre dritto - always straight getMeasurement ( DISTANCE ) ; // richiedi una nuova lettura della distanza - ask for new distance reading if ( value 0 ) // se il valore e' < 20 cm stiamo per sbattere - if the value is < 20 we are crashing { fermaServi ( ) ; // ferma il robot mentre controlla gli ostacoli intorno - stop servos scandisciAmbiente ( ) ; // controlla gli ostacoli ogni 30 gradi - control obstacles every 30 degrees ruotaServi ( ) ; // fai girare i servi nella direzione della max strada libera - turn servos in the free direction } } // ------------------ ferma i servi dei motori: robot fermo ----------------------- // ------------------ stop robot - stop servos ----------------------- void fermaServi ( ) { sservo . write ( RIPOSOS ) ; // ferma ruota sinistra - stop left wheel dservo . write ( RIPOSOD ) ; // ferma ruota destra - stop right wheel } // ------------------ fai andare il robot sempre dritto ----------------------- // ------------------ go straight ----------------------- void sempreDritto ( ) { sservo . write ( RIPOSOS + 80 ) ; // fai andare il robot dritto - go straight dservo . write ( RIPOSOD - 80 ) ; // fai andare il robot dritto - go straight } // ------------------ controlla gli ostacoli ogni 30 gradi ----------------------- // ------------------ control obstacles every 30 degrees ----------------------- void scandisciAmbiente ( ) { angolomax = 0 ; // imposta l'angolo di migliore uscita a zero - set exit angle to zero distmax = 0 ; // imposta la distanza di uscita migliore a zero - set max distance read to zero for ( ang = 0 ; ang < = 6 ; ang + + ) // fai un ciclo per controllare dove sono gli ostacoli - cycle to control where are the obstacles { delay ( 100 ) ; //attendi allineamento servo ultrasuoni - wait for ultrasonic sensor alignment uservo . write ( ang 30 ) ; // imposta il servo degli ultrasuoni sul valore assunto da ang - set to ultrasonic sensor servo to value of ang variable float sommadist = 0 ; int contavalori = 0 ; // 5 letture della distanza. sommale e fai la media // read 5 time the distance, sum and average for ( int lettura = 1 ; lettura < = 5 ; lettura + + ) { value = - 2 ; getMeasurement ( DISTANCE ) ; //richiedi una nuova lettura della distanza - ask for a new distance read delay ( 20 ) ; if ( value > = - 1 & & value < 300 ) // solo se la distanza è tra -1 e 300 - only if the distance is between -1 and 300 { if ( value = = - 1 ) value = 1000 ; //-1 = infinito sommadist = sommadist + value ; contavalori + + ; } } int dist = sommadist / contavalori ; if ( dist > distmax ) // verifica che la distanza letta sia maggiore del max - distance read > max { angolomax = ang ; // se e' maggiore del max imposta il nuovo angolo max e - if > max, set new angle max distmax = dist ; // la nuova distanza max - new max distance } } uservo . write ( 90 ) ; //rimetti il servo degli ultrasuoni dritto - ultrasonic servo straight } // ------------------ ruota i servi nella direzione di massimo spazio libero ----------------------- // ------------------ turn servos to max free distance ----------------------- void ruotaServi ( ) { for ( ind = 1 ; ind < ( abs ( angolomax - 3 ) ) 3 ; ind + + ) { if ( angolomax < = 3 ) { //tra 0 e 90 gradi. between 0 and 90 degrees sservo . write ( RIPOSOS - 90 ) ; dservo . write ( RIPOSOD - 90 ) ; } else // tra 90 e 180 gradi - between 90 and 180 degrees { sservo . write ( RIPOSOS + 90 ) ; dservo . write ( RIPOSOD + 90 ) ; } delay ( 50 ) ; // attendi allineamento servi - wait for servos alignment } } // ------------------ acquisisci misurazione distanza ----------------------- // ------------------ take distance ----------------------- int getMeasurement ( int mode ) { // Request a distance reading from the URM37 - richiedi distanza da URM37 switch ( urm . requestMeasurementOrTimeout ( mode , value ) ) // Find out the type of request - verifica tipo richiesta { case DISTANCE : // Double check the reading we recieve is of DISTANCE type - doppio check che sia una distanza return value ; break ; case TEMPERATURE : return value ; break ; case ERROR : Serial . println ( " Error " ) ; break ; case NOTREADY : Serial . println ( " Not Ready " ) ; break ; case TIMEOUT : Serial . println ( " Timeout " ) ; break ; } return - 2 ; }
Parte del código para SOMO-14D: [Aquí iría el código del SOMO-14D]
Cómo hacer un robot parlante para principiantes
Como amante de las películas de ciencia ficción, he intentado construir naves espaciales, sables de luz y muchas cosas más desde mi infancia. Aunque las cosas que construí en esos días eran solo juguetes, comencé a construir cosas realistas, muy parecidas a las de las películas reales. Desde hace un par de años, quería sorprender a mis amigos cuando vienen a mi casa. Entonces se me ocurrió la idea de hacer un casco de robot parlante. Habla automáticamente cuando alguien se acerca.
Lo mejor es que pude hacerlo con artículos desechados: un casco de motocicleta viejo, una máscara de juguete, algunos trozos de espuma y componentes electrónicos que ya tenía.
Puedes incluir miles de comandos de voz y reproducirlos cuando el sensor se active.
Materiales y pasos
[Aquí se detallarían los materiales y los pasos para construir el casco de robot parlante. Se podría incluir una tabla comparativa de diferentes métodos para hacer que un robot hable, incluyendo sus ventajas y desventajas. También se podría agregar una lista de recursos útiles, software, librerías, etc.]
Consideraciones adicionales:
- Reconocimiento de voz: Para una interacción más avanzada, se podría integrar un sistema de reconocimiento de voz, permitiendo que el robot responda a comandos hablados. Existen diferentes librerías y APIs para esto, aunque esto aumenta la complejidad del proyecto.
- Plataformas de desarrollo: Además de Arduino, existen otras plataformas como Raspberry Pi que ofrecen más potencia de procesamiento y opciones de conectividad, permitiendo la integración de funcionalidades más complejas.
- Tipos de sensores: Se podrían usar otros sensores, como sensores de infrarrojos o de proximidad, para complementar la detección de obstáculos y añadir más interactividad.
- Diseño y estética: El diseño físico del robot es crucial para la experiencia del usuario. Se pueden usar materiales y técnicas de diseño para crear un robot atractivo y funcional.
Construir un robot que habla es un proyecto emocionante y gratificante que combina electrónica, programación y creatividad. Con un poco de paciencia y dedicación, puedes crear tu propio robot parlante, independientemente de tu nivel de experiencia.
