sexta-feira, 31 de janeiro de 2014

Pi4j, Wiiring Pi e libpi4j.so - mais um problema resolvido no hackathon soujava da Campus Party 2014!

Ae galera,

Outro problema que enfrentamos foi para executar o pi4j no tomcat no raspberry para trocar o estado de portas digitais do Rpi. Por alguma razão, aplicativos tipo "main" que usam o pi4j não apresentaram este problema mas executando um servlet no tomcat isso acontece.

Basicamente a JVM não encontra o código nativo libpi4j.so ao executar o servlet que tenta chavear a porta digital do RPi e de fato eu não encontrei este arquivo na distribuição que fornecemos para o hackathon, bom começo!

A solução foi baixar o zip do pi4j, descompactamos ele e encontramos o libpi4j.so no pi4core directory. Copiamos o libpi4j.so para o diretório /home/pi/java/jdk1.8/jre/lib/ext e boa! Ops, também não deu certo.

Na tentativa seguinte demos permissão de execução com chmod 755 libpi4j.so e pronto, funfou. Nada grave, a pergunta é: porque funciona com apps java com método main? Seguir cenas do próximo capítulo!

Como acessar o Java Embedded Panel com Jersey Client facinho facinho! - Campus Party 2014

É assim bem simples, crie um projeto no NetBeans e depois adicione a biblioteca Jersey clicando com botão direito do mouse nas propriedades do projetos -> bibliotecas.

Ai copia e cola este código:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package embeddedpanel;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

/**
 *
 * @author root
 */
public class EmbeddedPanel {

    public static void main(String[] args) {
        System.out.println("External Temperature: " + getTemperature());
        System.out.println("Humidity            : " + getHumidity());
        System.out.println("Distance            : " + getDistance());
        System.out.println("Alcohol             : " + getAlcohol());
        setRGB(255, 0, 0);
        setRGB(0, 255, 0);
        setRGB(0, 0, 255);
    }

    public static void setRGB(int red, int green, int blue) {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.12:8080/things/red/" + red);
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        webResource = client
                .resource("http://192.168.1.12:8080/things/green/" + green);
        response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        webResource = client
                .resource("http://192.168.1.12:8080/things/blue/" + blue);
        response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }

    }

    public static float getTemperature() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.11:8080/things/temp_out");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Float.parseFloat(output);

    }

    public static float getHumidity() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.11:8080/things/humidity");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Float.parseFloat(output);

    }

    public static int getDistance() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.11:8080/things/distance");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Integer.parseInt(output);

    }

    public static int getAlcohol() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.12:8080/things/alcohol");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Integer.parseInt(output);
    }
}

E boa!

Ah, se estiver aqui na Campus não esqueca de entrar na rede WIFI do Embedded Panel:

WIFI: iot
PWD: iotiotiot

É assim bem simples começar a usar Internet of Things sem ter que soldar nem programar placas!

Boa Diversão,
Vinicius Senger

terça-feira, 17 de setembro de 2013

Java , Android e Raspberry Pi: Controlando a internet das coisas com a voz

Sabe aquelas crianças que estão sempre pensando em alguma coisa pra aprontar ? Então, elas crescem e ficam assim:  CRAZY.

Afinal de contas: I'm, you're, we're CRAZY.

No final de agosto a equipe Globalcode participou do QCon pela primeira vez e no Dia de Java na UFSCar pelo décima vez (pelas nossas contas)... apresentando mais uma demo inusitada.


Dessa vez a ideia foi controlar o robô, o ventilador e tudo que estiver plugado na central de automação com a voz utilizando uma aplicação Android.

Perdeu ? Então, assista o vídeo:


Android + Java + Raspberry Pi + Internet das Coisas from Globalcode on Vimeo.

Acompanhe as novidades no http://facebook.com/eletronlivre siga-nos no http://twitter.com/eletronlivre
!
Agora, se você quer colocar a mão na massa e desenvolver suas próprias ideías... venha aprender e praticar no ANDROID HACKING WEEKEND, dias 21 e 22 de Setembro na Globalcode com o instrutor Ricardo Ogliari!
http://www.globalcode.com.br/robotica/android-hacking-weekend

É isso ai pessoal!
[]s
Yara Senger
http://twitter.com/yarasenger
http://blog.globalcode.com.br/search/label/yara

quarta-feira, 11 de setembro de 2013

Pipoqueira com Raspberry Pi, Arduino, Java Embedded

I'm we're you're CRAZY! 

Este é o tema de mais um vídeo gravado pelo Vinicius Senger, as vesperas do TDC2013 São Paulo.

O projeto é bem diferente.
Um pipoqueira retrô automatizada. Na parte superior ele colocou um Raspberry Pi com Java Embedded, um Arduino e uma combi que tem o sistema de alto falantes que diz as instruções para o pipoqueiro. As luzes, motores da panela e aquecimento são controlados / automatizados!

Assista o vídeo, curta as fotos e venha comer uma boa pipoca na Globalcode em São Paulo nos minicursos gratuitos!


WE ARE CRAZY from Globalcode on Vimeo.

Curioso pra saber como é a pipoqueira "por dentro"?


Ficou interessado ? Quer aprender mais ?

Não perca o Android Hacking Weekend, e faça uma imersão no desenvolvimento Android com foco em Internet das Coisas! Dias 21 e 22 de Setembro na Globalcode SP. Mais informações:
http://www.globalcode.com.br/robotica/android-hacking-weekend

[]s
Yara Senger
twitter.com/yarasenger 

quarta-feira, 13 de fevereiro de 2013

Arduino, Java Embeeded e Raspeberry PI na Campus Party 2013

Esta edição da Campus Party foi muito especial.

Vinicius Senger, fundador da Globalcode e também da iniciativa EletronLivre apresentou seu último projeto, um robô com Arduino + Raspeberry PI com Java Embeeded para mais de 200 campuseiros super empolgados em conversar, programar e mostrar seus próprios projetos. 

Não participou da Campus Party e mesmo assim quer aproveitar a palestra ?



Mas, o melhor da Campus Party ainda estava por vir Pete Lomas, um dos criadores do Raspeberry PI apresentou uma palestra na sexta-feira no evento, uma oportunidade única de conversar com ele, mostrar nossos projetos e aumentar ainda mais a comunidade interessada em Raspeberry PI no Brasil.

Bruno Souza, que era um dos hosts do palco de desenvolvimento e extremamente envolvido com a Campus Party (não apenas no Brasil!)  nos apresentou Pete Lomas, que prontamente tirou duas camisetas infantis da sua mochila e deu para nossos filhos Maria e Rafael, que vestiram imediatamente.

O mais interessante é que mesmo estando apressado para outras reuniões com a imprensa ele foi extremamente gentil, olhou com curiosidade e fazendo diversas perguntas sobre o robô, e terminou a conversa despedindo-se com palavras muito gentis de agradecimento a todas as pessoas que estava ajudando a divulgar o Raspeberry PI.

 

Mas, a Campus Party não termina na Campus Party, e felizmente tem diversos efeitos colaterais. Esta semana fomos surpreendidos com um post do Pete Lomas com uma menção super bacana e algumas fotos nossas. Thank you Pete Lemos!

Agradecimetos: Sim, muita gente pra agradecer!

É isso ai, agradeço aos amigos Bruno Souza e David Ruiz  pela oportunidade especial que nós do SouJava tivemos (Otavio Santana, Mauricio Leal e vários outros colaboradores)  de participar da organização da trilha de desenvolvimento e da realiação do curso Java. Parabéns também para o instrutor Ricardo Ogliari e Thiago Vespa pelas apresentações sobre Android e TV Digital com Java durante a Campus Party.

Mais agradecimentos a Renata Nobre da trilha de SoftwareLivre aonde sorteamos entradas para o TDC2013 e para os cursos online de Android e Desenvolvimento Web com Java EE!

Ah, e falta um agradecimento especial a Janete Longo que tirou estas fotos lindas e teve a extrema delicadeza de compartilhar conosco. 

Um abraço, e fica a dica: quem não foi, perdeu. Eu confesso que perdi muito... mas o que eu aproveite valeu cada minuto!

Yara Senger

domingo, 27 de janeiro de 2013

Quadricoptero, impressora 3D e gadgets no Vale do Silicio

Uma das pessoas que mais contagiou o Vinicius Senger apresentando diversos novos conceitos e pessoas realacionadas a Eletrônica, Robótica e Automação residêncial foi o nosso amigo Benedicto Franco Jr., que em longas horas de conversa sempre nos atualiza com novidades diretamente do Vale do Silicio, onde mora e trabalha como Software Engineer na Yahoo! Inc. em projetos de altissima escalabilidade.
Em Outubro de 2012 fizemos um pequeno vídeo com alguns dos hackings interessantes que encontramos na oficina dele!


Quadricoptero, impressora 3D e gadgets no Vale do Silicio from Globalcode on Vimeo.

É isso ai pessoal! Muita empolgação pra todos vocês!
[]s
Yara Senger
twitter.com/yarasenger
twitter.com/eletronlivre
facebook.com/eletronlivre

domingo, 23 de dezembro de 2012

Automação Residencial com Arduino na Prática - Parte 2 (Interface OSC)


Neste post vou descrever o processo de configuração para a comunicação entre o dispositivo móvel de comando (Iphone/Ipad/Ipod/Android) e o Arduino que é o núcleo da central de Automação.

Para estabelecer essa comunicação utilizaremos  o protocolo OSC (Open Sound Control) que é uma evolução do protocolo MIDI adaptada para transporte via TCPIP.

Mais informações sobre o protocolo OSC podem ser obtidas aqui.

As principais vantagens de usar esse protocolo são as seguintes:
  • Apresenta resposta rápida aos comandos
  • Biblioteca ARDOSC disponível para Arduino
  • Disponibilidade de ferramenta simples para o desenvolvimento de interfaces gráficas customizadas para Iphone, Ipad, Ipod, e Android chamada TouchOSC Editor. Com essa ferramenta, não é necessário conhecer nada de programação IOS para desenvolver interfaces gráficas de comando para automação.

A biblioteca recotanaARDOSC trabalha em conjunto com a biblioteca Ethernet oficial do Arduino, sendo assim qualquer shield ethernet baseado no chip W5100 deve funcionar sem problemas.

A versão da Lib ARDOSC indicada no link acima é compatível com a IDE 1.0 do Arduino, sendo que recomendo utilizarem essa versão.

A biblioteca ARDOSC torna bastante simples a configuração da comunicação OSC no Arduino, pois além das definições de interface de comunicação, temos apenas que definir quais são as rotinas que devem ser executadas para cada comando OSC recebido.

Para executar esta demonstração de comunicação OSC , serão necessários os seguintes componentes:
  • Arduino
  • Shield Ethernet
  • 2 leds
  • 2 resistores de 1K
  • 2 chaves tactil
  • fios para conexão
  • protoboard
  • Roteador WiFi (pode ser o existente na sua rede residencial)
  • dispositivo móvel (Iphone,Ipad,Ipod ou Android)

A idéia básica é ligar e desligar 2 leds conectados ao arduino, a partir da tela de um dispositivo móvel (Iphone, Ipad, Ipod ou Android). Além disso poderemos também controlar os leds a partir de duas chaves conectadas diretamente no Arduino, sendo que neste caso o status dos Leds deverão ser atualizados na tela do dispositivo móvel.


1o Passo  (Criar a interface gráfica de comando no TouchOSC Editor)

Neste primeiro passo criaremos uma tela customizada para o dispositivo de controle, que pode ser um IPhone,Ipad,Ipod ou Android. Para isso utilizaremos o aplicativo TouchOSC Editor que está disponível aqui .

Depois de baixar e instalar a versão do aplicativo TouchOSC Editor compatível com o seu sistema operacional, abra o aplicativo.

Na janela abaixo, selecione as opções de “Layout Size“ e ”Layout Orientation” confome seu dispositivo móvel .

Adicionar legenda

Obs: O campo "Page Name" não é importante neste teste, porém ele pode ser utilizado num sistema de automação mais elaborado para identificar o ambiente controlado pelos comandos da página. (ex: cozinha. sala, dormitórios, etc). Toda vez que for selecionada uma página diferente, um comando OSC será enviado para o Arduino com o "Page Name" correspondente a página selecionada. Essa informação poderá ser utilizada no Arduino para devolver para o celular o status das lâmpadas daquela página .

Clicando na aba cinza com o botão direito do mouse, podemos adicionar outras páginas a nossa interface e cada página pode conter botões de comandos diferentes, semelhante as telas que mostrei no primeiro post deste tema. 
Podemos assim dividir a casa em setores, onde cada página contem os comandos de um setor da residência.

Para inserir os controles na página, clique com o botão direito do mouse na parte preta da tela e selecione o tipo de controle desejado. (neste caso use o ”toggle button”)

Surgirá um objeto do tipo ”toggle button” na tela que poderá se dimensionado confome desejado.


  • Defina um nome para o togge button no campo "Name"
  • Selecione a cor desejada para o botão em Color  
  • Desmarque a opção auto em OSC e na caixa logo abaixo digite o commando OSC que deseja associar a esse botão (neste caso vamos usar  "/ard/led1"  (sem aspas))
  • Defina Value Range como (From=0  e To=1) * 
* (esses são os valores de argumento que serão enviados com o comando OSC ”/ard/led1” quando o botão mudar de estado)
Neste caso:
Botão desligado: envia 0
Botão acionado: envia 1


Para criar o segundo segundo botão de controle, clicar novamente com o botão direito do mouse na parte preta da tela e selecionar ”toggle button”
















Configurar o Segundo toggle buttom conforme figura acima:

Uma vez finalizado clique em ”save “, escolha onde quer salvar e dê um nome para o layout .

Existem vários outros tipos de objetos de comando que podem ser utilizados, inclusive labels que podem identificar os botões e incrementar o aspecto visual da interface, porém neste exemplo vamos criar apenas os dois toggle buttons necessários para a nossa demostração.

Para disponibilizar o layout que criamos e transferir para o dispositivo móvel, basta clicar em ”Sync” no TouchOSC Editor e em seguida executar no Iphone, Ipad ou Ipod o procedimento descrito abaixo .


2o passo   (Instalar e configurar o TouchOSC no dispositivo móvel)


Baixar o TouchOsc para seu dispositivo móvel na apple store ou na Google Play.


Ao executar o TouchOSC pela primeira vez aparecerá a janela abaixo:




Selecione a primeira opção “OSC: Not Configured” 

  • Posicione a opção Enabled em ON.
  • Indique em Host o IP definido para o seu Arduino.
  •  Em Port (outgoing) indique a porta definida para serverPort no código do Arduino.
  • Em Port (incoming) indique a porta definida para destPort no código do Arduino.

O campo Local IP Address é o IP atribuido atualmente ao dispositivo móvel. Ele é informado automaticamente pelo aplicativo TouchOSC.


  • Toque em TouchOSC no canto superior esquerdo da tela para retornar ao menu inicial (tela abaixo).





As opções MIDI Mobilizer e CoreMIDI podem ficar em Disabled.

Para adicionar ao dispositivo móvel o novo layout que criamos no TouchOSC Editor, toque em Layout (Simple) e então na tela abaixo clique em Add.




Neste momento deverá aparecer uma tela semelhante a esta abaixo, porém indicando que um host foi encontrado. (será indicado o nome do seu PC onde está o layout que criamos).




Importante: o PC e o dispositivo móvel deverão estar conectados na mesma rede para que seja possível transferir o layout.


Toque no host que foi encontrado e o layout será transferido para o dispositivo móvel.


Toque então em Layout e selecione o novo layout que foi transferido.

Depois toque em Done.

O layout novo que criamos será apresentado na tela e já estará pronto para usar.


Mais detalhes sobre esta configuração podem ser obtidos na documentação do TouchOSC que pode ser consultada aqui.

Para layouts customizados para dispositivos Android, consultar a documentação aqui.

3o Passo  (montar o circuito no Arduino e carregar o código)

Bem agora só falta montar os componentes adicionais e carregar o código no Arduino para ele interpretar as mensagens OSC e controlar os LEDs.

A montagem dos componentes no Arduino deverá ser executada conforme foto abaixo:



A seguir temos o código arduino que utilizaremos nesta demonstração onde comentei cada linha para facilitar o entendimento:




O código acima permite controlarmos os 2 leds do circuito a partir da tela do celular.

Na primeira parte do código, temos as definições da interface Ethernet e portas utilizadas pelo protocol OSC.

 Notem que temos as portas serverPortdestPort.

  • Serverport é a porta que o Arduino receberá as mensagens OSC que o dispositivo móvel (Iphone/Ipad/Ipod/Android) envia.
  • DestPort é a porta que o arduino vai usar para enviar mensagens OSC para o dispositivo móvel (Iphone/Ipad/Ipod/Android).

O arduino poderá enviar mensagens OSC para o dispositivo móvel quando for necessário atualizar o status dos LEDs. Isso acontecerá quando eles forem ligados ou desligados a partir das chaves tactil conectadas no Arduino.

No cenário real de automação essas chaves estarão nos módulos remotos (MA02, Comando, Dimmer ou IR/RGB) que terão comunicação ZIBEE com o módulo central através dos XBees.
Este tema será abordado no próximo post (parte 3).

No método "setup", fazemos a associação dos comandos OSC com as rotinas que deverão ser executadas para cada um deles.


  server.addCallback("/ard/led1",&func1);  //define que a rotina "func1" sera executada para o comando OSC "/ard/led1"
  server.addCallback("/ard/led2",&func2);  //define que a rotina "func2" sera executada para o comando OSC "/ard/led2"

No método "setup" também são configurados os modos de operação das portas dos leds e ativados os resistores de PullUps internos para as portas das chaves.

Finalmente no método loop temos leituras das chaves e as rotinas específicas para cada comando OSC.

Os comandos OSC podem conter valores dos seguintes tipos:

- Int32
- Float
- String

No nosso exemplo vamos receber argumentos Float por isso utilizaremos (int)_mes->getArgFloat(0)

Basicamente uma mensagem OSC tem as seguintes informações:
  • OSCAdr (identificação do comando que se quer enviar)
  • destIP  (endereço IP do destino da mensagem)
  • destPort  (porta utilizada para envio da mensagem)
  • Arg (argumento associado ao OSCAdr que pode ser do tipo Int32, Float ou String)

Para montar e enviar uma mensagem OSC no Arduino, usamos as seguintes linhas de comando:

OSCMessage txMes;  //cria uma nova mensagem OSC
txMes.setAddress(destIP,destPort);  //define endereço IP e porta do destino da mensagem OSC
txMes.beginMessage("/ard/led1");  //define comando OSC

txMes.addArgFloat(!state);  //define argumento Float que sera enviado 
client.send(&txMes);  //envia mensagem OSC 


Para adicionar argumentos na mensagem OSC podemos usar as seguintes opções:

txMes.addArgInt32(int);
txMes.addArgFloat(float);
txMes.addArgString(string);

Abaixo temos um diagrama com as associações entre os parâmetros inseridos no TouchOSC e o código no Arduino:



Abaixo um video demonstrando o funcionamento do que foi apresentado nesta parte 2 do tópico Automação Residencial com Arduino na Prática .



Em caso de dúvidas, fiquem a vontade para fazer perguntas, tanto nos comentários como por email.

Na parte 3 falaremos sobre comunicação ZIGBee usando módulos XBee.

Até lá. 

Um Feliz Natal a todos