Cómo construir tu propio Google AIY sin el equipo

Manuel Gómez
Manuel Gómez

El asistente de voz de Google ha existido por un tiempo y cuando Amazon lanzó su API de Alexa y trajo el código de PaaS Cloud a la Raspberry Pi 2, era solo cuestión de tiempo antes de que todos los demás se subieran al tren rápido hacia el reino de los creadores. Google simplemente lo hizo con estilo.

Pocos saben que la API del Asistente de Google para Raspberry Pi 3 ha existido por algún tiempo, pero cuando decidieron regalar equipo gratis con los números de mayo de 2017 de la revista MagPi, impresionaron a todos. Desafortunadamente, el mundo tiene más creadores y piratas informáticos y el número de copias de la revista es limitado.

En esta entrada, organizo la versión de bricolaje del kit AIY para todos los demás que quieran hablar con una caja de cartón. Miro más de cerca el equipo libre, lo separo, lo ensamblo y lo reemplazo con magia de bricolaje. Para facilitar las cosas, también diseñé un gabinete que puedes imprimir en 3D para completar el kit. Empezar.

El desmontaje

Gritarle a mi amigo [Shabaz] en el Reino Unido para enviarme una copia del MagPi. El “Kit de herramientas de voz de Google AIY Projects” (en adelante conocido como el kit de herramientas) contiene dos PCB y muchas otras cosas. El Voice Hat, que parece una tarjeta de sonido a dieta, tiene un número muy limitado de elementos. Detallaré cada sección y diseñaré el esquema KiCAD para el mismo uno tras otro.

Servicios

Empezando por el lado izquierdo, hay 6 conjuntos de encabezados de 3 pines con la etiqueta “Servicios”. El control de servicio previsto es posible gracias al módulo PWM integrado de Raspberry Pi 3. Cada conjunto tiene un pin GPIO, 5V y conexión GND. El pin GPIO no se conecta directamente al encabezado Raspberry Pi 3, sino a través de resistencias limitadoras de corriente de 220 ohmios (etiquetadas como R1-R6).

Suministro de electricidad

Justo al sur de estos hay dispositivos con la etiqueta Q5 y ​​Q6, que supongo que son parte de un circuito de potencia electivo. Corrígeme si me equivoco, pero aquí está mi valoración. La operación es simple, donde Q5 se enciende solo cuando el voltaje de entrada es mayor que los 5V del puerto USB. Un simple comparador debería funcionar, así que utilizo el LM393 como referencia.

EDITAR: [Raivsr] señaló que esto podría ser el equivalente al “Diodo Ideal” de Raspberry Pi.

Interfaces de comunicación

Al norte de los cabezales de “Servicio” hay un I2C con etiqueta J15 que se conecta directamente al encabezado Raspberry Pi 3. Esto significa que no es necesario que estén conectados a nada con tomacorrientes de 5V. No se usan en la tabla, pero discutiremos más sobre eso más adelante. Inmediatamente al lado están los encabezados SPI y UART de 2 pines. Nuevamente, estos se conectan directamente al cabezal principal y sirven solo como disyuntor.

El DAC y EEPROM

Un poco más abajo y llegamos al circuito en caja con un QFN de 16 pines marcado como “AKK BDQ”. Aquí está el MAX MAX98357A (PDF), que es un I2S-DAC con un amplificador de clase D. Sin embargo, impulsa el altavoz directamente porque solo hay una salida, solo puede ser dinero o una combinación de estéreo. Todavía es bastante inestable para el presupuesto.

Lo interesante es la presencia de JP6, que parece tener todas las conexiones I2S de la Maxim MAX98357A y algunas otras líneas seleccionadas. Combinado con las dos rutas que se conectan a la salida del segundo altavoz, es posible que pueda combinar otra placa de salida Maxim MAX98357A de arriba para obtener sonido estéreo. Haré el esquema y lo haré descargable y si quieres darle dinero, déjame saber los resultados. Considérelo una tarea opcional.

Junto al DAC hay un SSOP de 8 pines, que es una EEPROM I2C 24C32 (PDF). No está vinculado al título I2C del que hablé antes, sino a los pines 27 y 28 del título Raspberry Pi 3. Según el blog de la Fundación Raspberry Pi.

“La EEPROM contiene información sobre la fabricación de la placa, la instalación de GPIO y algo llamado fragmento de ‘árbol de dispositivos’, básicamente una descripción del hardware adjunto que permite a Linux cargar automáticamente los controladores necesarios”.

Así que tiene un poco de salsa extra y podría usar BusPirate para descartar los datos, pero no estoy seguro de si Google lo considera propiedad intelectual, así que no lo haré. Tengo una alternativa para ello, así que sigue leyendo.

Conductores

Moviéndonos a la derecha, encontramos 4 cabezas marcadas como “Conductores”. Estos son circuitos MOSFET para controlar cargas como relés. [Shabaz] Excelente seguimiento de los componentes de este y los 3 pines son GPIO, 5V y Driver.

Los MOSFET pueden impulsar cargas de hasta 500 mA cada uno gracias a un interruptor polys, sin embargo, los GPIO también se pueden usar directamente. Las cargas a cargar deben conectarse entre los pines marcados con ‘+’ y ‘-‘. El encabezado de la izquierda es un acceso directo a los encabezados GPIO de Raspberry Pi 3 y el esquema refleja lo mismo.

Úselos para conectar LED o dispositivos similares para indicar el funcionamiento de los relés o cargas.

Conectores de micrófono y botón

Suceden cosas más interesantes en la parte superior derecha con un botón y dos conectores JST. El conector de 4 pines está diseñado para el botón que se encuentra en la parte superior del recinto compuesto. El pequeño botón pulsador montado en PCB está cableado en paralelo al interruptor externo y se puede utilizar en su lugar durante la instalación y las pruebas. El JST de 5 pines es para el conector del micrófono y tiene todos los pines I2S.

Los micrófonos

Por último, la placa de micrófono tiene la marca 432 QDF21G, y tiene micrófonos digitales Knowles SPH0645LM4H MEM que hablan I2S directamente.

¡Aquí lo tienes!

Se trata de poner fin a la destrucción y toda la información necesaria para crear su propio kit AIY. Los archivos esquemáticos de KiCAD se pueden descargar desde GitHub, sin embargo, les dejo con la parte divertida que es el diseño y el enrutamiento.

Aquí hay algo de comida que invita a la reflexión. Algunas partes se pueden omitir y el tamaño del sombrero se puede reducir al Pi Zero pHat.

Por razones simples, utilizo la imagen del sistema operativo preconfigurada de la página de Google AIY. Falta un poco en 900 MB y se puede descargar directamente desde Goolge (archivo enorme).

Agregar botón de cierre

Probablemente hayas notado el pequeño botón dorado junto al gran botón verde en la imagen de arriba y esa es la primera parte del ejercicio. Es un botón de parada y se agrega porque no quiero usar SSH en el cuadro cada vez que quiero deshabilitarlo de forma segura.

Obtenga el botón que desea usar y agregue dos cables con cabezas femeninas. Este funciona un poco incluso sin Voice Hat, así que pruébalo. Luego, si tiene un sombrero de voz, agregue cabezas masculinas a la parte I2C. Puede elegir otros pines y seguirá funcionando. Conecte el botón al SDA o GPIO 2 e inicie el Pi 3.

Abra su editor de texto favorito y copie y pegue el siguiente código en él.

#!/bin/python
# Simple script for shutting down the raspberry Pi at the press of a button.
# by Inderpreet Singh

import RPi.GPIO as GPIO
import time
import os

# Use the Broadcom SOC Pin numbers
# Setup the Pin with Internal pullups enabled and PIN in reading mode.
GPIO.setmode(GPIO.BCM)
GPIO.setup(02, GPIO.IN, pull_up_down = GPIO.PUD_UP)

# Our function on what to do when the button is pressed
def Shutdown(channel):
    os.system("sudo shutdown -h now")

# Add our function to execute when the button pressed event happens
GPIO.add_event_detect(02, GPIO.FALLING, callback = Shutdown, bouncetime = 2000)

# Now wait!
while 1:
    time.sleep(1)

Guarde los archivos en su directorio / home / pi como shutdown.py

En una terminal, escriba los siguientes comandos

 chmod +x shutdown.py python shutdown.py & 

Esto debería hacer que el script funcione en segundo plano. Si presiona el botón, el Pi debería apagarse inmediatamente. Puede optar por agregar un retraso comentando la llamada de suspensión en el código de muestra. Alternativamente, también puede cambiar el GPIO reemplazando el número apropiado en el script de Python.

¡Fresco! Ahora podemos deshabilitar presionando un botón.

Agregar tarjeta de sonido USB

La alternativa obvia al Google AIY Voice Hat es usar cualquier tarjeta USB disponible de varias fuentes. La forma más sencilla es simplemente conectar uno y configurar el programa para usarlo en lugar del Hat, pero cuando se instalan dos controladores, los scripts de Python deben reconfigurarse para que todo funcione sin problemas.

Una vez insertada la tarjeta de sonido, lo primero que debe hacer es verificar si ha sido reconocida o no. En la ventana final, escriba:

 aplay - l 

Los scripts utilizan ‘aplay’ para pronunciar las respuestas, por lo que debería ver dos dispositivos de audio. Tenga en cuenta que config.txt desactivó el sonido integrado (consulte la referencia del árbol de dispositivos) y puede habilitarlo si planea usar un micrófono USB en lugar de la tarjeta de sonido. La salida de Windows debería verse como la imagen a continuación.

Me gustaría configurar la tarjeta de sonido USB como el sonido predeterminado, y para eso necesitamos modificar /etc/asound.conf.

sudo nano /etc/asound.conf

Elimine el contenido existente y reemplácelo con texto como se muestra a continuación. Aunque esto configura el dispositivo de entrada y salida predeterminado para el dispositivo USB, todavía hay un paso para encender las cosas. (Para salir de nano, use Ctrl + x, y, return)

Luego editamos a un archivo audio.py que maneja todas las funciones de reproducción y grabación de audio. Para hacer esto, abra el archivo en su editor de texto favorito; el mío es un enano:

 sudo nano /home/pi/voice-recognizer-raspi/src/audio.py 

Desplácese hacia abajo hasta la parte que dice ‘arecord’, que está en la función __init__. Aparentemente hay un proceso diligente que mantiene la grabadora funcionando, como mostraré en el video. Por ahora, queremos editar los argumentos para que use la tarjeta USB para capturar el sonido en lugar del Voice Hat original. Una simple modificación para usar ‘-D’, ‘sysdefault: CARD = 1’ sería suficiente como se muestra en la siguiente imagen.

Se necesita un cambio similar para la función aplay un poco más en el código.

¡Con eso, se acabó el truco! Haga doble clic en ‘test_audio.py’ para comprobar si el sonido funciona. Sin embargo, solo nos falta una parte del rompecabezas: ¡el botón ‘escuchar’! Así que simplemente inserte un botón entre GPIO23 y el pin de tierra adyacente y luego ejecute “src / main.py” para comenzar a jugar con DIY Google AIY.

Manifestación

Una pequeña demostración de vídeo del truco propuesto con una tarjeta de sonido USB, un altavoz externo y un micrófono barato.

Recinto

El gabinete impreso en 3D está diseñado en Fusion360 y los archivos STL son parte del repositorio de GitHub. Puede usar el mismo gabinete para varios proyectos, ya que hay pines para Raspberry Pi y los puertos están resaltados para mayor comodidad. Hay mucho espacio en el interior para agregar sombreros y circuitos adicionales.

Divido el gabinete por la mitad para que sea más fácil acceder a los GPIO. Todo se presionará correctamente, incluida la tapa superior, que tiene orificios para tres botones. Sin embargo, tendría sentido tener botones más pequeños, ya que el resultado es más duro que el cartón. Hay suficiente espacio para el altavoz si elige incluir uno ligeramente diferente.

No he tenido la oportunidad de imprimir uno y actualizaré esta página después de que avance el tema. Aquí está el regreso del proyecto.

Resumen

Google ya tenía sus API abiertas al público, pero la imagen de Raspbian preconfigurada ayudará a mucha gente a comenzar. Intenté organizar los conceptos básicos de la tarjeta de sonido y también dar los planos para una tarjeta equivalente si desea crear una. Para otros, la posibilidad de usar una tarjeta de sonido externa está explicada y probada y espero que inspire a la gente a involucrarse realmente en tales proyectos. El mundo necesita más AIY y esta es tu oportunidad para comenzar, así que, ¿a qué estás esperando? Sea pirateado.

  • Casino amistoso dice:

    Pff, Raspberry Pi es fácil.

    Construí un cliente de Amazon Alexa (básicamente Echoa Point) usando solo ESP32, un micrófono Knowles SPH0645LM4H y un amplificador AMX98357A I2S. Codificó el firmware desde cero en C, como es correcto y correcto.

    • Kyle Brinkerhoff dice:

      enviar a HAD o no sucedió

      • Casino amistoso dice:

        desafío aceptado – ¿aún necesita un archivo adjunto, algunas ideas (preferiblemente no aburridas)?

        • Arcilla dice:

          Una hermosa caja de madera de una tienda de segunda mano.

        • philosiraptor117 dice:

          si tiene acceso a una impresora 3d, simplemente haga un disco negro con la tecla HAD gay en la parte superior

        • RF Dweeb dice:

          Las otras ideas son bastante estándar, buenas pero estándar. ¿Por qué no un cuenco de refresco vacío? Vea si puede configurar bien todos los componentes electrónicos con pocos o ningún cambio visible en el exterior del contenedor.

          Tal vez haga problemas interesantes de RF en wifi. Intentaría ver si podría usar la lata como plano de tierra para una antena de parche, ¿tal vez?

          Solo un pensamiento.

        • Montrough dice:

          ¡Tardis! 🙂

          Hay un stl 3D en alguna parte o coge el concentrador USB Tardis y colócalo allí. 🙂

        • Andy dice:

          Dentro de una torreta de Portal.

          • Casino amistoso dice:

            Finalmente una buena idea. ThinkGeek los creó, pero dejaron de crearlos. Las copias baratas en eBay parecen … baratas.

        • Rodney McKay dice:

          caso: Fiambrera de los Jetsons.

        • keith de canadá dice:

          Una máquina inútil con un retraso de cinco segundos en el botón “abrir micrófono”. : sonreír:

          • Casino amistoso dice:

            Gran lado pensando allí.

        • Miguel dice:

          ¿Y Furby?

    • xchip dice:

      ¿Y cómo grabas el sonido? ¿Puede la muestra de ESP32 ser más rápida que la ESP8266?

      • Greenaum dice:

        Presumiblemente, el micrófono Knowles tiene una salida I2S como la del artículo. Por tanto, no se necesitaba muestreo.

  • Arcilla dice:

    No estoy de acuerdo con el último sentimiento transmitido en el artículo. El mundo necesita * servicios de reconocimiento de voz espía menos posesivos. Sin embargo, un análisis genial.

    • Ostraco dice:

      Nada impide que las personas creen una versión casera. Simplemente no se beneficiará tanto de todos los datos que tendría la versión en la nube.

      • xchip dice:

        De acuerdo, me decepcionó que utilice fuentes cerradas de Google. Existen alternativas de código abierto aunque son bastante difíciles de usar. Usar estos, ese es el verdadero desafío.

  • Ostraco dice:

    “El mundo necesita más AIY y esta es tu oportunidad de comenzar, así que, ¿a qué estás esperando? Obtén un truco”.

    La gente quiere a Jarvis (Iron Man) como hogar. Si puedes conseguirlo para tu armadura personal, ¿tanto mejor?

  • Gordon Endersby dice:

    Esta eprom adicional proporciona la información de identificación del sombrero.
    Parte de la especificación requiere esto para que el raspador pueda reconocer qué sombrero / complemento a bordo se puso.
    Está completamente documentado. No es necesario ingresarlo.
    https://github.com/raspberrypi/hats

  • James Purcell dice:

    “Desafortunadamente, el mundo tiene más creadores y piratas informáticos y el número de copias de la revista es limitado”.
    Equivocado. hay tierras más egoístas que están dispuestas a comprar todas las copias que tiene una tienda, y venderlas a precios inflados y no usarlas.
    Basta con echar un vistazo a eBay y ver todas las espumas egoístas que venden copias.

    • krispurgeon dice:

      Guau. Nunca se me ocurrió que la gente haría eso. Espuma.

      • Ostraco dice:

        Compre barato, venda caro. Hmmm, ¿ahora dónde he escuchado eso antes?

    • Montrough dice:

      Sí, vi en FleaBay una revista con el equipo por $ 60 (no miré el envío). B&N local solo tuvo la edición de marzo (???). Decidí construir la mía propia (partes de Adafruit).

  • James Purcell dice:

    “Lo interesante es la presencia de JP6, que parece tener todas las conexiones I2S del Maxim MAX98357A y algunas otras líneas seleccionadas. Combinado con las dos rutas que se conectan a la salida del segundo altavoz, es posible que pueda hacer coincidir otro MAX98357A- Salir de la placa de arriba para obtener sonido estéreo. Haré el esquema y lo haré descargable y si quieres darle dinero, déjame saber los resultados. Considéralo una tarea opcional “.

    Gracias por preguntarme sobre este conjunto de puntos de enlace.

    • Montrough dice:

      Debería ser como los micrófonos duales, uno elegido a tierra, otro a Vcc. No estoy seguro de si el software lo utilizará. Sin embargo, creo que otro software servirá.

  • gastador dice:

    AI-¿por qué?

  • Steve dice:

    ¿Ha considerado agregar un comando de parada segura en lugar de un botón dedicado? Este y varios comandos adicionales se documentan aquí http://ktinkerer.co.uk/list-mods-raspberry-pi-aiy-project/

  • Montrough dice:

    @Inderpreet, gran trabajo. Esa es la forma en que algunas personas saben. Puede obtener un botón arcade con iluminación LED, un transportador con EEPROM 24C32, el amplificador I2S (Maxim MAX98357A) y un micrófono I2S (Knowles SPH0645LM4H MEMs). Aunque no es lo mismo que la placa AIY, espero que siga funcionando con el código AIY. Tengo todas las partes y construí parte del AIY en el HAT y espero terminarlo en unas semanas (tengo un Google Home para poder jugar).

    Y sí, basé la lista parcial en el artículo anterior que hiciste sobre la destrucción del AIY. Muchísimas gracias.

    • Montrough dice:

      Maldita sea …
      … puedes conseguir las piezas de Adafruit

    • John dice:

      Supongo que no se necesita EEPROM. Alternativamente, use pi zero y el transportador más pequeño y redúzcalo al tamaño del altavoz.

  • Un dron dice:

    Hmmm … Interesante trabajo. Pero, ¿por qué dejar que Google te espíe a ti y a todo lo que te rodea?

  • Quién sabe dice:

    Tengo la impresión de que nunca ves proyectos con hardware para protegerte de google o amazon, sino solo más habilitadores.

  • Steven dice:

    ¿Soy el único idiota que encontró las instrucciones en la revista que no coincidían con las del sitio web?

  • John Hewitt dice:

    Si el banco de controladores GPIO MosFET es un pin de “tierra”, está realmente conectado a tierra o simplemente está conectado a tierra. ¿Lo hiciste sonar por un metro porque lo intenté?

  • Igor Kravchenko dice:

    Hola,

    No tengo equipo y estoy tratando de seguir tus instrucciones. Utilizo RPI 3. Tengo un problema con la sección de la tarjeta de sonido. El archivo /etc/asound.conf no existe. Además, el directorio / home / pi / voice-Recognizer-raspi / no existe, por lo que obviamente el archivo /home/pi/voice-recognizer-raspi/src/audio.py no existe.

    Tengo un problema al conectar dispositivos de audio. ¿Qué tengo que hacer?

    Gracias.

  • Tim Rustige dice:

    Hola, cualquier persona interesada en esto puede encontrar útil este enlace: http://www.securipi.co.uk/voice-recognition-and-command-with-a-raspberry-pi-and-google-cloud-speech- api /

  • Matt Benson dice:

    En lugar de agregar un botón para cerrar el pi con elegancia, ahora puede decir “interruptor de frambuesa”. Esta característica se agregó hace algún tiempo.

    https://github.com/google/aiyprojects-raspbian/blob/master/src/action.py#L287

  • Matt Benson dice:

    El gabinete carece de un orificio para el enchufe trasero.

  • Matt Benson dice:

    Y también para la tarjeta microSD.

  • Quinten Negro dice:

    Tengo el Asistente de Google funcionando sin la tapa de voz (solo un micrófono USB, auriculares en el conector y un botón) y
    1) No puedo encender un botón LED porque no sé qué GPIO está asignado para eso. ¿Alguien puede ayudarme con qué GPIO y codificación para especificar el GPIO de mi elección?
    2) También me gustaría emitir el sonido a GPIO en lugar del conector (y lo operaré con una placa amplificadora que tengo y la conectaré a un altavoz simple). ¿Existe una forma sencilla de redirigir el sonido? Leí en alguna parte que estaba dirigido a GPIO 45 y 46 o algo así, pero eso no se puede lograr con los pines. Aparentemente, se puede redirigir a GPIO 18 y otros a través del modificador ALT. (??) Por encima de mi nivel para averiguar esto. ¿Alguien tiene una solución simple?
    ¡Gracias!

  • alainparmentier dice:

    Acerca de la sección de fuente de alimentación:
    ¿Cómo opera el LM393 (pin 8): de + 5V a USB? (¿pin 2.4 del encabezado PI?)
    ¿Qué pasa si el Pi está alimentado solo por el conector de la valla de la placa?
    ¿Podría ser mejor operar el LM393 desde un conector de barril?

  • alainparmentier dice:

    ¿Qué es el conector de botón y rienda?

  • Paul Watson (HCS Voice packs Ltd) dice:

    Si alguien quiere crear una herramienta conmigo, contácteme (tengo respuestas autorizadas por mí de algunas de las mejores estrellas de ciencia ficción del mundo).

    Estoy buscando un codificador / diseñador para crear una unidad con respuestas pregrabadas para las funciones de automatización del hogar.

  • aburrido dice:

    Existe la posibilidad de que el pinout del DAC + AMP esté desactivado; lo más probable es que la salida funcione en un circuito de amortiguación donde colocaste (C?) Para el condensador.

    Me pregunto cuáles son las configuraciones de ganancia para ese máximo DAC / AMP + esos valores de resistencia, por lo que puedo ver que lo opera en otro sistema.

    • aburrido dice:

      * o podrían ser sombreros de filtro si están marcados con pF .. ¡ja!

  • Nicolás dice:

    Acabas de comenzar mi AIY mientras miraba el video 🙂

  • Luke Weston dice:

    “Un simple comparador tiene que ser suficiente, así que estoy usando el LM393 como referencia”.

    Obviamente no, porque LM393 es un comparador dual en un paquete de 8 pines.

    El dispositivo SOT26 tiene la etiqueta K4S, que se parece a DMMT5401.

    No es lo mismo que el par BCM857BS-PNP utilizado en la Raspberry Pi, pero la arquitectura es prácticamente idéntica.

    El dispositivo SOT23, etiquetado como 23X, es un DMG2305UX al igual que la Raspberry Pi.

  • CaptClearLeft dice:

    Por lo tanto, Google AIY se ha actualizado y /audio.py ya no tiene la configuración “arecord” y “aplay”. Parece que estas configuraciones ahora están en home / pi / voice-Recognizer-scratch / src / aiy / drivers / _player.py Y home / pi / voice-Recognizer-scratch / src / aiy / drivers / _recorder.py

  • Mehrdad Majzoobi dice:

    intentó abrir el esquema en KiCad pero se queja de que faltan algunas bibliotecas:

    No se encontraron las siguientes bibliotecas:

    bibliotecas / POLYFUSE
    mensaje de voz

    ¿Le gustaría cargar estas bibliotecas también?

  • mmajzoobi dice:

    intentó abrir el esquema en KiCad pero se queja de que faltan algunas bibliotecas:

    No se encontraron las siguientes bibliotecas:

    bibliotecas / POLYFUSE
    mensaje de voz

    ¿Le gustaría cargar estas bibliotecas también?

  • swmoon2 dice:

    Hola,
    Gracias por su detallado manual de bricolaje.
    En otro sitio, encontré una publicación que explicaba cómo conectar un auricular bluetooth a una raspberry pi. Así que me pregunto si es posible crear mi propio Asistente de Google con una frambuesa pi y unos auriculares bluetooth.
    Siguiendo los pasos finalmente conecté el auricular bluetooth. Pero no sé cómo configurar el micrófono y el altavoz para el Asistente de Google.
    Si tienes una idea, ayúdame.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *