Construa uma Smart Speaker Estilo Amazon Echo com Arduino e 1Sheeld
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino 101 | 1 |
| 1Sheeld | 1 |
| Lâmpada de bastão (Stick lamp) | 1 |
| Fita LED RGB | 1 |
| Placa Relé | 1 |
| Apple iPhone | 1 |
| Protoboard (genérica) | 1 |
| Cabo USB-A para B | 1 |
| Fios Jumper (genéricos) | 30 |
| Transistor NPN de Uso Geral | 3 |
Ferramentas e Máquinas Necessárias
- Furadeira
- Cano PVC
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Há alguns meses visitei um amigo e fiquei impressionado com o Amazon Echo que ele possuía.
Ele pode tocar música, controlar as luzes da casa, me dar notícias e status do clima, e até a data e hora, tudo isso apenas com comandos de voz.
Naquele momento, o maker dentro de mim gritou "por que não faço eu mesmo!".
E desde aquele dia comecei a procurar componentes que pudessem me ajudar a fazer um Amazon Echo baseado em Arduino, até encontrar o incrível 1Sheeld.
1Sheeld é uma plataforma para Arduino que permite acessar os sensores e capacidades do seu smartphone e usá-los em seus projetos Arduino.
Basicamente, é um shield de hardware que fica sobre sua placa Arduino e se comunica via Bluetooth com este app Android, para transferir dados entre ele e seu smartphone.
Você pode conferir o tutorial de primeiros passos no site do 1Sheeld, que o guiará passo a passo até você poder operar o 1Sheeld muito suavemente, e é uma referência incrível para ótimos projetos Arduino.
Usei neste projeto cinco shields dos 40+ shields no 1Sheeld.
O primeiro é o Voice Recognition Shield (Escudo de Reconhecimento de Voz) que usei para controlar todo o sistema com comandos de voz. É um shield muito simples que posso ativar com apenas 1 linha de código: VoiceRecognition.start();
Então usei o Music Player Shield (Escudo de Reprodutor de Música) que me permite acessar o reprodutor de música do smartphone e escolher as faixas que quero tocar muito suavemente. Na verdade, é tão simples que usei apenas esta linha para tocar o music player shield: MusicPlayer.play();
O terceiro shield que usei é um dos mais importantes do projeto, é o Text to Speech Shield (Escudo de Texto para Fala) que adiciona ao projeto uma interação humanoide de que alguém está respondendo ao que você diz. Foi tão fácil tornar o sistema responsivo: TextToSpeech.say("time in cairo is");
Após ativar o Text to Speech shield, ativei o Clock Shield (Escudo de Relógio) que retorna o relógio em tempo real e então o sistema pode responder com a hora quando eu pergunto, incrível! não é? :) e posso facilmente obter a hora atual no meu telefone usando esta função: Clock.queryDateAndTime();
O último shield que usei é o Internet Shield (Escudo de Internet), que na minha opinião é o shield mais poderoso no 1Sheeld. Usei esse shield para obter o status atual do clima na minha cidade natal usando uma API do site "openweathermap", onde posso chamar a API com esta linha: HttpRequest request1("/*o endereço da API */");
Passo 1: Reúna os Componentes
- Arduino 101 $30.99
- Placa 1Sheeld+ $54.94
- iPhone $155.5
- Cano PVC $2
- Fita LED $5
- Fonte de alimentação 12V $7
- Placa relé $3
- Jumpers e fios $3
- 3 transistores NPN $1
Passo 2:
Faça furos no cano para permitir a saída do som
Passo 3:
Pinte o cano PVC com spray preto
Passo 4: Faça a Fiação
- Conecte as fitas LED aos transistores e à fonte de alimentação
- Conecte a lâmpada à placa relé e terminais AC
- Conecte a placa relé e as fitas LED ao Arduino 101 conforme mencionado no código abaixo
- Monte tudo com o iPhone dentro do cano PVC
Passo 5: Configure a Biblioteca 1Sheeld
Você pode gerenciar qualquer biblioteca da IDE do Arduino. Basta clicar em Sketch >> Include library >> Manage libraries >> digite OneSheeld >> clique em install e pronto. Ou você pode baixar a biblioteca daqui: https://1sheeld.com/downloads/ Então abra sua Arduino IDE, escolha sketch na barra de menu >> Include library >> add .zip file >> escolha o arquivo zip que acabou de baixar.
Passo 6: Instale o App 1Sheeld
Baixe o app móvel 1Sheeld do site ou visite a Apple App Store ou Google Play Store para obter o app.
Passo 7: Acesse os Shields
Siga o tutorial de primeiros passos do 1Sheeld e no final escolha os seguintes shields:
- Voice Recognition (Reconhecimento de Voz)
- Text to Speech (Texto para Fala)
- Clock (Relógio)
- Internet
- Music Player (Reprodutor de Música)
Então pressione o botão de shield múltiplo.
Código
- Código Amazon Echo
Código Amazon Echo Arduino
/* OPCIONAL: Para reduzir o tamanho da biblioteca compilada e limitar seu uso de memória, você pode especificar quais shields deseja incluir no seu sketch definindo CUSTOM_SETTINGS e o respectivo INCLUDE_ define do shield. */
#define CUSTOM_SETTINGS
#define INCLUDE_INTERNET_SHIELD
#define INCLUDE_VOICE_RECOGNIZER_SHIELD
#define INCLUDE_TEXT_TO_SPEECH_SHIELD
#define INCLUDE_MUSIC_PLAYER_SHIELD
#define INCLUDE_CLOCK_SHIELD
/* Inclui biblioteca 1Sheeld. */
#include <OneSheeld.h>
/* cria um valor inicial para o contador millis. */
unsigned long previousMillis = 0;
/* cria um estado inicial para chamar alexa. */
bool state = 0;
/* Chama uma api que retornará o status do clima no Cairo, Egito. */
HttpRequest request1("https://api.openweathermap.org/data/2.5/weather?q=Cairo,EG&appid=43d95b4cf5d0573e2dfe5186c160017a");
/* define os 3 transistores nos pinos 3,5 e 6. */
#define strip1 3
#define strip2 6
#define strip3 5
/* define a lâmpada no pino 13. */
int lamp = 13;
/* define a variável que conterá as horas e minutos. */
int hour, minute;
/* Cria 2 arrays de caracteres para capturar a string que você deseja da frase. */
char b[4];
char c[4];
/* define variáveis para conter hora e minutos em string. */
String strh, strm;
/* define variável para conter o status do dia am ou pm. */
String noon;
/* Comandos de voz definidos pelo usuário. */
const char mainCommand[] = "alexa";
const char weatherCommand[] = "how is the weather today";
const char playCommand[] = "play music";
const char clockCommand[] = "what time is it";
const char stopCommand[] = "stop";
const char lightonCommand[] = "turn on the lights";
const char lightoffCommand[] = "turn off the lights";
void setup() {
/* Inicia Comunicação. */
OneSheeld.begin();
/* define as fitas LED e a lâmpada como saída. */
pinMode(strip1,OUTPUT);
pinMode(strip2,OUTPUT);
pinMode(strip3,OUTPUT);
pinMode(lamp,OUTPUT);
/* Inscreve no callback de sucesso para a requisição. */
request1.setOnSuccess(&onSuccess1);
/* Inscreve nas respostas de valor json. */
request1.getResponse().setOnJsonResponse(&onJsonReply1);
/* ao reconhecer voz, chama a função "myFunction". */
VoiceRecognition.setOnNewCommand(&myFunction);
}
void loop () {
/* faz um delay de 5 segundos usando contador millis para manter a detecção de voz viva. */
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 5000) {
previousMillis = currentMillis;
/* obtém a hora atual no seu telefone. */
Clock.queryDateAndTime();
/* inicia reconhecimento de voz. */
VoiceRecognition.start();
}
/* salva a hora e minutos do smartphone em variáveis. */
hour = Clock.getHours();
minute = Clock.getMinutes();
/* detecta o status da hora se é am ou pm. */
if (hour > 12) {
hour -= 12;
noon = "P M";
} else {
noon = "A M";
}
/* salva hora e minutos como string. */
strh = String(hour);
strm = String(minute);
/* salva a string em um array de caracteres. */
strh.toCharArray(b, 4);
strm.toCharArray(c, 4);
}
/* Esta função será invocada cada vez que um novo comando for dado. */
void myFunction (char *commandSpoken) {
/* verifica se alguém chamou alexa ou não. */
if (!strcmp(mainCommand, VoiceRecognition.getLastCommand())) {
alexon();
MusicPlayer.setVolume(5);
/* se sim, torna state = 1. */
state = 1;
}
/* verifica se você pediu para tocar música depois de chamar alexa. */
if (!strcmp(playCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff();
MusicPlayer.play();
delay(10000);
MusicPlayer.stop();
state = 0;
}
/* verifica se você pediu para obter o status do clima depois de chamar alexa. */
else if(!strcmp(weatherCommand,VoiceRecognition.getLastCommand())&& state == 1) {
alexoff();
Internet.performGet(request1);
/* Espera 5 segundos. */
OneSheeld.delay(5000);
state = 0;
}
/* verifica se você pediu a hora depois de chamar alexa. */
if(!strcmp(clockCommand,VoiceRecognition.getLastCommand()) && state == 1) {
alexoff();
/* 1Sheeld responde usando text-to-speech. */
TextToSpeech.say("time in cairo is");
delay(1300);
TextToSpeech.say(b);
delay(600);
TextToSpeech.say(c);
delay(800);
TextToSpeech.say(noon);
delay(500);
state = 0;
}
/* verifica se você pediu para ligar a lâmpada depois de chamar alexa. */
if (!strcmp(lightonCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff();
digitalWrite(lamp,HIGH);
TextToSpeech.say("the lights turned on");
delay(6000);
state = 0;
}
/* verifica se você pediu para desligar a lâmpada depois de chamar alexa. */
else if (!strcmp(lightoffCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff();
digitalWrite(lamp,LOW);
TextToSpeech.say("the lights turned off");
delay(3000);
state = 0;
}
}
void onSuccess1(HttpResponse & response1) {
/* Usando a resposta para consultar a cadeia Json até o valor requerido. */
/* ou seja, Obtém o valor de 'main' no primeiro objeto do array 'weather' na resposta. */
/* Desde que a resposta esteja em formato JSON. */
response1["weather"][0]["main"].query();
delay(200);
}
void onJsonReply1(JsonKeyChain & hell,char * output) {
if(hell == request1.getResponse()["weather"][0]["main"]) {
TextToSpeech.say("the weather today in cairo is");
delay(2000);
/* 1Sheeld responde usando text-to-speech shield. */
TextToSpeech.say(output);
}
}
void alexon(){
/* Liga as fitas em ordem como a mesma ordem do amazon echo. */
digitalWrite(strip1,HIGH);
delay(200);
digitalWrite(strip2,HIGH);
delay(200);
digitalWrite(strip3,HIGH);
}
void alexoff(){
/* Desliga as fitas. */
digitalWrite(strip1,LOW);
digitalWrite(strip2,LOW);
digitalWrite(strip3,LOW);
}
Esquemáticos
Processo de manufatura
- Transferência de Dados de Temperatura e Umidade entre Dois Arduinos via Firebase
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Controle Remoto Universal Android com Arduino, 1Sheeld e IR
- Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
- Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
- Pixel Chaser: Jogo LED Interativo de Um Toque com Arduino Nano
- Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
- Braço Robótico Inteligente Controlado por Arduino: Tutorial DIY Fácil
- Tanque Autônomo com Walabot, Arduino, Raspberry Pi e Integração Alexa
- Construa um Rádio FM Compacto com Arduino Nano e RDA5807M