Anime seu Peixe Billy Bass com Qualquer Fonte de Áudio – Guia Passo a Passo
Componentes e Materiais
| Componente | Descrição | Qtd |
|---|---|---|
| Arduino UNO | Qualquer modelo Arduino. | 1 |
| Shield Motor/Stepper/Servo Adafruit v2.3 para Arduino | Kit versão 2.3. | 1 |
| Amazon Alexa Echo Dot | Ou qualquer outra fonte de áudio. | 1 |
Sobre o Projeto
Há cerca de um mês, o artista Brian Kane publicou um vídeo viral mostrando um peixe cantor "Big Mouth Billy Bass" aparentemente dublado pela Alexa da Amazon. A internet enlouqueceu, e eu também – mas principalmente queria entender como funcionava para criar o meu.
Após ver vários projetos com Raspberry Pi e Alexa, imaginei que Brian tivesse feito um projeto Pi que animasse o hardware do Billy Bass. Cheguei a sugerir isso no meu programa semanal no YouTube, Maker Update.
Mas, pensando melhor, o hack mais simples seria usar o áudio de um Echo Dot de US$ 49 e processá-lo com um Arduino para acionar os motores existentes.
Já tinha um Arduino e um motor shield (minha primeira vez usando o shield). Comprei o Billy Bass usado na Amazon por cerca de US$ 15 (pode achar mais barato em brechós) e o Echo Dot novo.
Dois tutoriais me deram esperança: um guia de 2012 do sfool sobre mover servo com som via Arduino e outro de 2013 do Dotten sobre a animatrônica do Billy Bass.
Entendendo que o Billy Bass (assim como um Furby) é movido por dois motores DC baratos de 5V, o desafio era fazer esses motores tremerem em resposta ao som. Com tentativa e erro, encontrei uma solução viável. O código está longe de perfeito e há muitos recursos a adicionar, mas quis publicar para que todos possam melhorar.
Materiais Necessários
- Peixe Cantor Big Mouth Billy Bass (1)
- Arduino Uno (1)
- Fonte de alimentação do Arduino Uno (1)
- Adafruit Motor Shield v2 (1)
- Conector minijack de painel (1)
- Fio encapado (várias cores ajudam)
- Amazon Echo Dot (ou qualquer fonte de áudio) (1)
- Pequeno alto-falante recarregável (1)
- Cabo de áudio minijack (⅛") (1)
- Adaptador divisor minijack (1)
Ferramentas Necessárias
- Chave de fenda pequena
- Ferro de solda e solda
- Alicate de desencapar
- Alicate de corte
- Furadeira e brocas
Passo 1: Prepare o Peixe

Meu peixe usado chegou sem funcionar. Sem hesitação, abri: desparafusei a parte traseira, removi os chicotes de cabos e retirei a placa de circuito e o buzzer piezoelétrico para ganhar espaço.
Sobrou um chicote de 4 fios: dois para a boca e dois para a cabeça/cauda (depende da direção do motor).
Cortei quatro fios coloridos de mesmo comprimento, estanhei as pontas e inseri nos soquetes do chicote. No próximo passo, conectaremos ao motor shield.
Passo 2: Prepare o Motor Shield

Apenas 4 conexões no shield, duas soldadas. Também dá para ligar mais dois fios se quiser experimentar o motor da cauda/cabeça.
- Soldagem da entrada de áudio: Dois fios coloridos, um no GND e outro no pino Analógico 0. Leve até o conector minijack de painel: o fio do A0 vai ao contato da ponta (tip) do plugue; o GND vai ao contato da base (sleeve).
- Motores do peixe: Par de fios da boca (preto e laranja/amarelo) nos bornes do Motor 1. Opcional: fios da cauda/cabeça (branco e vermelho) no Motor 2 (o código ainda não usa).
- Jumper VIN: Verifique se o jumper está nos pinos "VIN Jumper". Sem ele, o shield não liga.
Encaixe o shield no Arduino, alimente e veja o LED de potência acender.
Passo 3: Carregue o Código

O código mistura o sketch "DC Motor Test" (demo do motor shield) e o "Sound to Servo" de Cenk Özdemir (2012).
Versão atual não anima a cabeça/cauda. Tentei, mas prejudicava a responsividade da boca. Quero manter a boca responsiva enquanto cabeça/cauda animam lentamente, mas minha habilidade de codificação no Arduino ainda limita. Postarei atualizações quando resolver ou receber sugestões.
Passo 4: Montando Tudo

Com o código carregado e cabo de áudio no jack, teste com uma fonte de áudio no cabo livre (usei meu celular tocando podcast). Se a boca mexer, faça um furo na placa do peixe, fixe o jack.
Para a Alexa falar pelo peixe: cabo de áudio no divisor Y, alto-falante recarregável na outra entrada, plugue macho do divisor na saída de áudio do Echo Dot.
Ligue o alto-falante, aumente volume no alto-falante e na Alexa. Chame a Alexa (clima, piadas, notícias). Você ouvirá a voz pelo alto-falante enquanto a boca do peixe acompanha. Quanto mais perto o alto-falante da cabeça do peixe, mais realista o efeito.
O desafio agora é encaixar alto-falante e Arduino dentro do peixe e fechar. Ainda estou resolvendo essa parte.
Passo 5: Próximos Passos

Muito a melhorar, sugestões bem-vindas. Pretendo lançar versão 2.0 em breve.
- Animar cabeça e cauda sem perder responsividade da boca.
- Recarregar o alto-falante pelo Arduino.
- Botão vermelho do Billy Bass (ou substituto) para alternar entre modo "fala" (boca) e "música" (corpo todo).
- Limpar o código (muito lixo da mistura).
- Usar Arduino menor: Adafruit Feather + shield de 2 motores para Feather seria ideal. Talvez um para boca, outro para cabeça/cauda.
Código
SoundToDC (Arduino)
/* Make a DC Motor Move to Sound. Public domain. Donald Bell, Maker Project Lab (2016).
Baseado em Sound to Servo por Cenk Özdemir (2012) e DCMotorTest da Adafruit. */
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61); // para stacking
Adafruit_DCMotor *myMotor = AFMS.getMotor(1); // M1 = boca
Adafruit_DCMotor *myOtherMotor = AFMS.getMotor(2); // M2 = cauda
int SoundInPin = A0;
int LedPin = 12; // LED opcional
void setup() {
Serial.begin(9600);
AFMS.begin(); // frequência padrão 1.6KHz
// AFMS.begin(1000); // ou 1KHz
myMotor->setSpeed(0);
myMotor->run(FORWARD);
myMotor->run(RELEASE);
pinMode(SoundInPin, INPUT);
pinMode(LedPin, OUTPUT);
myOtherMotor->setSpeed(0);
myOtherMotor->run(FORWARD);
myOtherMotor->run(RELEASE);
pinMode(SoundInPin, INPUT);
}
void loop() {
uint8_t i;
int sensorValue = analogRead(SoundInPin);
int LEDValue = map(sensorValue, 0, 512, 0, 255);
sensorValue = map(sensorValue, 0, 512, 0, 180); // 512 em vez de 1023 para leituras melhores
int MoveDelayValue = map(sensorValue, 0, 255, 0, sensorValue);
if (sensorValue > 10) { // corta ruído estático
delay(1);
myMotor->run(FORWARD);
for (i = 140; i < 255; i++) {
myMotor->setSpeed(i);
}
analogWrite(LedPin, sensorValue);
myMotor->run(RELEASE);
myOtherMotor->run(RELEASE);
delay(1);
}
analogWrite(LedPin, 0);
}
Processo de manufatura
- Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
- Facilitando Comunicação Surdo-Cego com 1Sheeld e Arduino
- Mealheiro Inteligente: Controlar Aceitador de Moedas com Arduino Nano
- Construa um Billy Bass "Grande Boca" Controlado por Alexa com Arduino, Shield L293D e Amplificador LM386
- Detector de Frequência de Áudio com Arduino – Meça Picos de Som com Módulo de Alta Sensibilidade
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Integrando Sensor de Impressão Digital Capacitivo DFRobot com Arduino ou ESP8266
- Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
- Como Reproduzir Áudio com Arduino UNO e DFPlayer Mini – Guia Passo a Passo
- Braço Robótico 6 GDL Controlado por Nunchuk com Arduino Mega