Controle sua casa com Raspberry Pi utilizando Reconhecimento de voz e Infravermelho

Autor

http://www.zola.com.br/zola3.pngEduardo Guimaraes Zola é formado em Ciências da Computação pela Universidade Presbiteriana Mackenzie, atua profissionalmente como desenvolvedor de softwares, e tem a eletrônica como hobby. Iniciou-se na informática em 1987, com as plataformas TK85 da Microdigital e CP500 da Prológica. Mais informações sobre o autor em: www.zola.com.br


Objetivo do projeto

Imagine controlar seus dispositivos eletrônicos através de comandos de voz em português !  Ou em inglês (se assim preferir).

Pois bem, apresento a vocês de forma sucinta, um projeto simples que poderá ser empregado em várias áreas, com diversos propósitos, conforme sua imaginação permitir.

Você poderá controlar dispositivos como: TV, DVD, Ar-Condicionado, Som, Iluminação, Receivers, ou seja, a maioria dos dispositivos que sejam controlados por controle remoto infravermelho(I.R.), e tudo isso ao comando de sua voz.

Para tanto, iremos construir um receptor e um emissor de I.R. que ficarão conectados ao Raspberry, e assim você poderá copiar funções de controle remotos que você tem em sua casa, e posteriormente reproduzi-los sem precisar do controle remoto original.

 

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 sugestão uma pequena protoboard.

·      Conhecimento intermediário em Linux, necessários 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 seria 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.)

 

Material

·      1 x 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.

·      1 x 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.

·      1 x LED Emissor I.R. 5mm TIL32 940nm – Servirá para controlar os seus dispositivos eletrônicos.

·      1 x 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.

·      1 x Resistor de 41 Ohm (amarelo, marrom, preto)

·      1 x Transistor PN2222

 


Hardware e Sistema Operacional

Rotulado como o menor PC do mundo, o Raspberry Pi, foi lançado em 2012 e desenvolvido no Reino Unido. Inclui um processador ARM, interface de rede, entrada de cartão SD, HDMI, USB e saídas de audio 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 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.  (Username: pi     Password: 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égios em um ambiente Linux.

Após a instalação do sistema operacional, o Raspbian lhe abrirá um menu. Sugiro que alguns passos sejam executados neste menu:

1)      Expand Filesystem: sugiro que esta opção seja selecionada para que haja um melhor aproveitamento no espaço do cartão SD.

2)      Change User Password: neste momento esta opção não é necessária. Desconsiderar.

3)      Enable Boot to Desktop: não recomendo esta opção para este projeto, pois queremos entrar em modo linha de comando. Desconsiderar.

4)      Internationalisation Options: opcional, caso queira configurar teclado e acentuação.

5)      Enable Camera: Desconsiderar.

6)      Add to Rastrack: Desconsiderar.

7)      Overclock: Desconsiderar.

8)      Advanced Options: conecte o cabo de rede, estando com acesso a internet, selecione a opção A5 Update, para que Raspibian 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

obs: digite a senha duas vezes para confirmar.

Agora vamos efetuar o login com o usuário root, digite:

su root

obs: entre com a senha de root, cadastrada no passo anterior.

 

Esquema e Montagem

Iniciaremos agora na 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 compontentes, conforme figura a baixo:

 


Os pinos utilizados 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.)

 

De acordo com cada cor, os fios são utilizados da seguinte forma:

·         Fio Vermelho:  alimentação  3.3v DC

·         Fio Preto:  Ground

·         Fio Azul:    Receptor I.R.

·         Fio Amarelo:   Emissor I.R.


Atenção: é importante que os componentes sejam posicionados na forma como mostra a figura, pois existe uma ordem correta na polaridade dos mesmos.

Obs: 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 na "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.

Foto do circuito:




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 ser feito 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

Primeiro teste de recepção de um sinal de I.R. qualquer, 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

Agora siga os passos que lhe são solicitados pelo irrecord:

1)      Você deverá pressionar, vários botões do controle remoto, para que o software compreenda as características do sinal deste controle.

2)      Agora será questionado o nome do botão que deseja configurar. Neste caso como exemplo, podemos digitar:  KEY_POWER , em seguida pressione o botão LIGAR do seu controle remoto, apontando-o para o receptor de infravermelho do circuito.

3)      Será solicitado outro botão, digite: KEY_VOLUMEUP , em seguida pressione o botão de aumentar o volume do seu controle remoto, e assim por diante.

4)      Agora, apenas tecle <enter> para encerrar a configuração deste etapa. Se for solicitado o processo de “Toggle bit mask”, apenas pressione <enter> e ignore esta etapa. As vezes é necessário aguardar dez segundos, para que o arquivo seja criado.

5)      Pronto, o seu arquivo de configuração já foi criado em /etc/lirc/lircd.conf

6)      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

 

7)      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

Agora 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 a 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.

Obs: 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 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:

 

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

Repare que para a gravação do audio, utilizamos o dispositivo plughw:1 que geralmente corresponde à webcam conectada à USB do seu Raspberry.

Obs: 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 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.

 

Agora você já pode controlar o seu Raspberry através de dois tipos de entrada: infravermelho  e audio/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 audio.  Você pode configurar isso aumentando ou diminuindo este valor.

Outro ponto a ser observado é que o audio 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 audio 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

Site do autor:  www.zola.com.br