Controle sua casa com o Raspberry Pi, utilizando Reconhecimento de Voz e Infravermelho


Apresentaremos um projeto simples que poderá ser empregado em várias áreas, com diversos propósitos. Você poderá controlar dispositivos como: TV, DVD, Ar-Condicionado, Som, Iluminação, Receivers, ou seja, a maioria dos dispositivos que são controlados por controle remoto infravermelho (I.R.), e tudo isso ao comando de sua voz em português (ou em inglês, se assim preferir).
Autor: Eduardo Guimarães Zola

Conhecimentos necessários para a montagem do projeto
  • Conhecimento básico em eletrônica geral, pois será necessário ligar alguns fios e componentes utilizando como suporte uma pequena protoboard.
  • Conhecimento intermediário em Linux, necessário para instalação do sistema operacional Raspbian, instalações de pacotes e edição de alguns arquivos no Raspberry Pi.
  • O leitor não precisa entender de programação, porém se tiver uma noção básica de script será interessante para o entendimento do código-fonte.

Tecnologias utilizadas
  • Raspberry Pi;
  • Google Speech Recognition API;
  • LIRC (Linux Infrared Remote Control);
  • Emissor e Receptor Infravermelho (I.R.).

Hardware e Sistema Operacional
Rotulado como o menor PC do mundo, o Raspberry Pi foi lançado em 2012 e desenvolvido na Grã-Bretanha. Inclui um processador ARM, interface de rede, entrada de cartão SD, HDMI, USB e saídas de áudio e vídeo.
Para a montagem do projeto, utilizaremos como plataforma o Raspberry Pi/Modelo B, pois este modelo possui 512 MB de memória RAM. O sistema operacional que utilizaremos é o Raspbian, que é uma derivação do Linux/Debian própria para o Raspberry Pi. Para tanto um cartão SD de pelo menos 4 GB será necessário para a instalação do sistema operacional e os demais pacotes de software. O download do Raspbian pode ser obtido em http://www.raspberrypi.org/downloads.
Para não nos desviarmos do contexto deste projeto, não iremos nos aprofundar no passo a passo da instalação do sistema operacional, porém todas as instruções para instalação do mesmo podem ser obtidas em http://www.raspberrypi.org.
Após a instalação do Raspbian, efetue o login utilizando o usuário “pi” que, por padrão, possui a senha “raspberry”. Para facilitar a montagem do projeto e instalação de todos os pacotes, utilizaremos o usuário “root”, pois assim evitaremos contratempos no meio do caminho. Este, por padrão, é o usuário com maior privilégio em um ambiente Linux.
Após a instalação do sistema operacional, o Raspbian abrirá um menu. Sugiro que alguns passos sejam executados neste menu:
  • Expand Filesystem: recomendo que esta opção seja selecionada para que haja um melhor aproveitamento no espaço do cartão SD.
  • Change User Password: neste momento esta opção não é necessária. Desconsiderar.
  • Enable Boot to Desktop: não recomendo esta opção para este projeto, pois queremos entrar em modo linha de comando. Desconsiderar.
  • Internationalisation Options: opcional, caso queira configurar teclado e acentuação.
  • Enable Camera: Desconsiderar.
  • Add to Rastrack: Desconsiderar.
  • Overclock: Desconsiderar.
  • Advanced Options: conecte o cabo de rede, estando com acesso a internet, selecione a opção A5 Update, para que o Raspbian possa ser atualizado. Este processo pode levar algum tempo, pois as atualizações serão “baixadas” via internet. Ao finalizar a atualização, clique em “Finish”.
Agora vamos definir uma senha para o usuário root, então digite na linha de comando: sudo passwd root. Digite a senha duas vezes para confirmar. Na sequência, vamos efetuar o login com o usuário root, então digite: su root Entre com a senha de root, cadastrada no passo anterior.
  
Esquema e Montagem
Iniciaremos agora a parte eletrônica do projeto. O esquema de montagem é muito simples, usaremos apenas quatro pinos do Raspberry Pi. Basta seguir o modelo, ligando os fios e componentes.
Os pinos utilizados na figura 1 são:
  • Pino 1: Saída de 3,3V
  • Pino 6: GND
  • Pino 11: GPIO 17 (servirá para escrita no emissor de I.R.)
  • Pino 12: GPIO 18 (servirá para leitura do receptor de I.R.)

F1. Utilizando apenas 4 pinos do Rasberry Pi.

De acordo com cada cor, os fios da figura 2 são utilizados da seguinte forma:
  • Fio Vermelho: alimentação 3,3 VDC.
  • Fio Preto: Ground.
  • Fio Azul: Receptor I.R.
  • Fio Amarelo: Emissor I.R.

F2. Esquema de ligações dos componentes do circuito ao Raspberry PI.

É importante lembrar que os componentes sejam posicionados na forma como mostra a figura, pois existe uma ordem correta na polaridade dos mesmos.
Para facilitar a montagem do projeto, sugiro ao leitor utilizar uma pequena protoboard. Agora conecte o circuito, conforme segue:
  • Pino 1 do receptor I.R. no pino 12 do Raspberry (GPIO 18).
  • Pino 2 do receptor I.R. no GND (ou pino 6) do Raspberry.
  • Pino 3 do receptor I.R. no Positivo (ou pino 1) do Raspberry.
  • Pino E do transistor no GND (ou pino 6) do Raspberry.
  • Pino B do transistor no pino 11 do Raspberry (GPIO 17).
  • Pino C do transistor no "perna" mais curta do LED emissor I.R.
  • Conecte a "perna" mais comprida do LED emissor I.R. no resistor, e na sequência, conecte no positivo (ou pino 1) do Raspberry.
Observe o aspecto do circuito montado na figura 3.

F3. Aspecto da montagem do protótipo em protoboard.
  
Instalando o LIRC
LIRC significa Linux Infrared Remote Control e refere-se ao software que fará todo o controle necessário para emissão e recepção dos sinais de I.R. O processo é muito simples, pois basicamente o que você precisará fazer é apontar para o receptor IR (do Raspberry) o controle remoto que deseja capturar, e apertar as teclas desejadas. Este processo será necessário fazer apenas uma única vez. Para instalar o LIRC digite: apt-get install lirc.
Apontando o LIRC para as devidas GPIOs: modprobe lirc_rpi gpio_in_pin=18 gpio_out_pin=17.
Primeiramente, teste de recepção de um sinal de I.R. qualquer, então digite: killall lircd mode2 -d /dev/lirc0.
Em seguida, aponte algum controle para o receptor do Raspberry e clique em algum botão do controle. Neste momento você já deve ver a decodificação do sinal de I.R.
CTRL+C para sair.
Devemos então, remover o arquivo- padrão de configuração, e na sequência criar o nosso próprio arquivo, digite: rm /etc/lirc/lircd.conf. Agora, vamos gravar alguns comandos do controle remoto da sua TV: irrecord -d /dev/lirc0 /etc/lirc/lircd.conf. Siga os passos que lhe são solicitados pelo irrecord:
Você deverá pressionar vários botões do controle remoto para que o software compreenda as características do sinal deste controle. Neste momento, será questionado o nome do botão que deseja configurar. Neste caso, como exemplo, podemos digitar: KEY_POWER , e, em seguida pressione o botão LIGAR do seu controle remoto, apontando-o para o receptor de infravermelho do circuito.
Será solicitado outro botão, digite: KEY_VOLUMEUP, e, depois, pressione o botão de aumentar o volume do seu controle remoto, e assim por diante. Agora, apenas tecle para encerrar a configuração deste etapa. Se for solicitado o processo de “Toggle bit mask”, apenas pressione e ignore esta etapa. Às vezes é necessário aguardar dez segundos, para que o arquivo seja criado. Pronto, o seu arquivo de configuração já foi criado em /etc/lirc/lircd.conf.
Edite o arquivo, utilizando um editor qualquer (no meu caso, utilizei o nano): nano /etc/lirc/lircd.conf. Altere a linha: name /etc/lirc/lircd.conf para o nome do seu dispositivo, exemplo: name TV_SALA. Agora, vamos editar o arquivo /etc/lirc/hardware.conf, alterando as seguintes linhas para:
START_IREXEC = true
DRIVER = "default"
DEVICE = "/dev/lirc0"
MODULES = "lirc_rpi"
Próximo passo, iremos carregar o daemon do LIRC digite: /etc/init.d/lirc start. Vamos reproduzir o sinal de I.R. do comando gravado. Digite: irsend SEND_ONCE TV_SALA KEY_POWER. Note que, neste momento, a sua TV deve ligar. Caso não tenha ligado, verifique se o emissor de I.R. do Raspberry está bem localizado em relação a sua TV. Outra dica é verificar se o LED emissor está acendendo. Como a luz I.R. é invisível ao olho humano, você pode utilizar a câmera de vídeo de um celular qualquer. Ao apontar a câmera para o LED, deverá ser possível ver a luz sendo emitida.

Configurando o IREXEC
O IREXEC, também é um daemon que faz parte do pacote do LIRC, porém este é responsável por mapear um sinal de I.R. a ser recebido de um comando a ser executado no Linux. Exemplo: Ao clicar no play do botão de um controle remoto, fazer com que o Raspberry reproduza um MP3, ou apareça uma mensagem na tela. Exemplo de conteúdo do arquivo /etc/lirc/lircrc:
begin
remote = TV_SALA
button = KEY_VOLUMEUP
prog = irexec
repeat = 0
config = echo "CLICOU O BOTAO VOLUME UP"
end
Salve o arquivo e reinicie o serviço do lircd, execute: /etc/init.d/lirc restart. Pronto, agora você será capaz de comandar o seu Raspberry através de um controle remoto I.R.
Observação: Você pode ter vários blocos de begin/end dentro do mesmo arquivo de configuração. Este arquivo de configuração geralmente fica em /etc/lirc/lircrc. Outro ponto é que o serviço do lircd deve ser reiniciado após qualquer alteração nos arquivos da pasta /etc/lirc. Para isso, execute: /etc/init.d/lirc restart
  
Reconhecimento de voz
Utilizaremos uma técnica bem simples para o reconhecimento de voz, onde deixaremos todo o trabalho a ser feito para o Google. Criaremos um script bash que irá capturar sua voz, através de sua câmera (webcam), e em seguida enviá-la ao Google, e retornar um texto (string) das palavras reconhecidas.
O primeiro passo será instalar os utilitários necessários, para isso digite:
apt-get install sox
apt-get install flac
apt-get install mpg123
Crie um script chamado voz.sh e digite a seguinte linha do box 1. Repare que para a gravação do áudio, utilizamos o dispositivo plughw:1 que geralmente corresponde à webcam conectada à USB do seu Raspberry.
Observação: Este arquivo pode ser baixado em http://www.zolalab.com.br/repos/voz.sh. O seguinte comando irá efetuar o download: wget http://www.zolalab.com.br/repos/voz.sh.
Após criar o arquivo, não esqueça de adicionar o atributo de execução ao mesmo, utilizando o comando: chmod +x voz.sh.
Uma dica importante é a regulagem do ganho do microfone, que pode ser feita através do software alsamixer, que é um mixer de som. Digite alsamixer e após executá-lo, tecle em F6, e escolha o dispositivo de entrada do microfone, no caso a sua webcam. Agora, tecle F5 para que todos os canais sejam mostrados. Pronto, é só regular o ganho de entrada.
Neste momento, você já pode controlar o seu Raspberry através de dois tipos de entrada:
  • infravermelho;
  • áudio/voz.
Para testar, execute o arquivo voz.sh e após executá-lo, diga em voz alta uma ou duas palavras, e assim, obterá o retorno das palavras reconhecidas, em formato texto. Como passamos o parâmetro -d 3, estamos informando o gravador (arecord) que grave apenas 3 segundos de áudio. Você pode configurar isso aumentando (ou diminuindo) este valor.
Outro ponto a ser observado é que o áudio gravado só será enviado ao Google quando algum som for detectado, evitando assim consumo desnecessário do link de internet. A condição para que o áudio seja submetido ao Google, é a intensidade do volume detectado no microfone, que pode ser modificado no trecho “if [ $volume > 3.0 ]” do script, conforme a sua necessidade.
Dúvidas ou sugestões, podem ser enviadas para egzola@gmail.com.

Box 1:
clear
while [ true ]
do
echo "Aguardando comando de voz"
arecord -q -D plughw:1 -d 3 -f cd -t wav -r 16000 /dev/shm/voz.wav
volume=`sox /dev/shm/voz.wav -n stats -s 16 2>&1 | awk '/Max level/ {print $3}'`
echo "Volume detectado: $volume"
if [ $volume > 3.0 ]
then
flac /dev/shm/voz.wav -f --best --sample-rate 16000 -o /dev/shm/voz.flac 2>/dev/null
palavra=`wget -O - -o /dev/null --post-file /dev/shm/voz.flac --header="Content-Type: audio/x-flac; rate=16000" http://www.google.com/speech-api/v1/recognize?lang=pt-BR | iconv -f UTF-8 -t ISO-8859-1 | awk -v txt="text" '{sz=split($0,arr,","); for (p=1; p<=sz; p++) print arr[p]; exit }' | awk -F: 'NR==3 { print $3; exit }'`

palavra=`echo $palavra | tr -d '\"'`
echo
echo $palavra
echo
if [ "$palavra" == "ligar tv" ]
then
echo "enviando comando para ligar TV"
irsend SEND_ONCE TV_SALA KEY_POWER
fi
if [ "$palavra" == "música" ]
then
mpg123 /mp3/musica.mp3
fi
echo
fi

/Box 1

Lista de materiais:
Raspberry Pi - Modelo B, configurado e rodando o sistema operacional Raspbian. Além disso, deve possuir conexão com a internet para que o reconhecimento de voz possa ser realizado.
Webcam USB - Servirá apenas como microfone, portanto, sugiro que utilize uma câmera barata. No meu caso, estou usando uma Webcam Microsoft VX-2000, pois ela é reconhecida automaticamente no Linux.
LED Emissor I.R. 5 mm TIL32 940 nm – Servirá para controlar os seus dispositivos eletrônicos.
LED Receptor I.R. TSOP38238 (2,5V a 5,5V) – Servirá para absorver/ aprender os comandos dos seus controles remotos. Por exemplo, você poderá copiar o botão de Volume Up do seu controle da TV para dentro do Raspberry.
Resistor - 41 ohms (amarelo, marrom, preto)
Transistor -  PN2222

/box 2
* Matéria originalmente publicada na revista Eletrônica Total; Ano:24 N° 158; Jul / Ago –2013

Postagens mais visitadas deste blog

The Mystery of USB Chargers

Programação de um CLP: Modos de programação

STRONG SRT 4622 Satellite TV Receiver Repaired