16 dezembro 2015

Darth Vader Fm Mind Power

Resolvi unir dois hacks feitos anteriormente. O projeto piFM e o projeto de acender LEDs através da GPIO do Raspberry Pi.

Utilizei uma cabeça de Darth Vader de plástico, vendida na padaria que contém umas pastilhas (muito ruins por sinal), furei os olhos do Darth Vader e coloquei dois LEDs (infelizmente não tinha vermelho, somente azul).



Conectei os dois LEDs a pino 12 da GPIO em série com um resistor de 470 Ohms. Assim mandando um sinal alto na porta 12 ligo os LEDs com 3,3V de saída.



Baixei algumas falas do Darth Vader pelo torrent, e utilizei o ffmpeg para converter em um formato que o piFM entenda, dessa forma criei o shell script mp3player.sh
 
#!/bin/bash

ffmpeg -i $1 -f s16le -ar 22.05k -ac 1 - | sudo ./pifmlib/pifm -

O Darth Vader irá falar utilizando o seu poder da mente através de ondas FM em 103.3MHz.

Criei um script em python (vader.py) utilizando a biblioteca RPi.GPIO para enviar um sinal alto ao pino 12, fazendo ligar os LEDs, e enviando sinal baixo para desligar os LEDs, assim os LEDs acenderão quando o Darth Vader estiver se comunicando via FM.

import RPi.GPIO as GPIO
import PiFm2 as PiFm

def init_env():
 GPIO.setmode(GPIO.BOARD)
 GPIO.setwarnings(0)
 GPIO.setup(12,GPIO.OUT)

def eyes_on():
 GPIO.output(12,1)

def eyes_off():
 GPIO.output(12,0)



Alterei o código Python do piFM (piFM.py) incluindo a função playMp3 que na verdade invoca o script shell mp3player.sh, veja como ficou a função:

from subprocess import call

def playMp3( filename ):
   call(["./mp3player.sh", filename])

Assim é possível invocar o método playMp3 dentro do código vader.py, e então criei as funções das falas:

def power_darkside():
 eyes_on()
 PiFm.playMp3("./pifmlib/sounds/Darkside.mp3")
 eyes_off()

def breathing():
 eyes_on()
 PiFm.playMp3("./pifmlib/sounds/Vadrbrth.mp3")
 eyes_off()

Para ficar mais bacana e pensar em possíveis interações através de Web Services, criei um script python para responder a requisições HTTP, assim sendo possível acionar o Darth Vader através da Web. O VaderServer.py, utilizando a biblioteca BaseHTTPServer do Python. Um trecho do código que trata as requisições está abaixo:

import cgi
import sys
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import vader

class MainHandler(BaseHTTPRequestHandler):

   def do_GET(self):
   p = self.path.split("?")
   path = p[0][1:].split("/")
   params = {}
   if len(p) > 1:
     params = cgi.parse_qs(p[1],True,True)
     print params
     print params['vader'][0]
   if params['vader'][0]=='0':
     vader.power_darkside()
   if params['vader'][0]=='1':
     vader.breathing()
   if params['vader'][0]=='2':
     vader.dont_make_destroy()
   if params['vader'][0]=='3':
     vader.dont_fail()
   if params['vader'][0]=='4':
     vader.dont_comeback() 

  Para iniciar o servidor é necessário passar a porta como parâmetro:

sudo python VaderServer.py 8000 


E abrir o navegador, ou comando curl, ou wget com a seguinte url:

http\\ipdopi:8000?vader=0


Cada número passado de 0 a 4 corresponde a uma fala do DarthVader.

O resultado final está abaixo.



Espero ter ajudado, o código está no github (https://github.com/ferauche/VaderDemo)

Ferauche