Bom dia pessoal,

Estou começando a montar um sistema de automação residencial e quero utilizar esses 3 caras ai. Seguindo este tutorial, consegui fazer funcionar.

Mas o quero é algo um pouco mais complicado (eu acho!). Utilzarei o raspberry como central e os arduinos como nós. Quando uma pessoa acessasse o raspberry pelo navegador, seria enviado informações para os arduinos.

E também terá interruptores touch nos arduinos. Ai quando alguém acionar o interruptor, o arduino manda informação para o raspberry, que muda o estado daquele interruptor no navegador.

Já consigo fazer a transmissão do raspberry para os arduinos. O raspberry envia uma informação para o arduino, que manda de volta pro raspberry indicando que a ação foi realizada.

Também consegui que o raspberry fique "ouvindo" qualquer informação que venha dos arduinos. Mas esse listener do raspberry fica consumindo quase 100% da cpu. Não sei até quanto isso é prejudicial ao raspberry.

O que eu fiz foi assim: criei um scanner que fica ouvindo e esperando alguma informação dos arduinos. Quando alguem acessa o raspberry pelo navegador e executa alguma ação, eu mato o processo do scanner e ativo o sender. Quando o sender confirma (ou não) o recebimento, eu executo novamente o scanner. Essa foi a forma que consegui fazer.

Vocês tem alguma experiência com isso? Acham que isso é a forma correta de se fazer essa comunicação?

PS.: desculpa pelo texto longo! É que queria explicar direitinho a situação.

Exibições: 1494

Responder esta

Respostas a este tópico

 Olá Renato. 

 Quando você fala em "listener", me remete à programação Java, por acaso você tem experiência com Java?

 Em outras linguagens, dependendo de como você criou este "listener", teremos duas possibilidades mais comuns: 

1) Listener feito através de "pooling", que é o seu software ficar a todo instante verificando se chegou mensagens para ele.  

   Neste modo é comum aumentar o processamento da máquina, e perder tempo nas verificações.

2) Listener feito através de interrupções (eventos).

    Neste modo o processamento é extremamente reduzido, e seu software fica mais versátil para executar outras tarefas.

 Qual destas opções você utilizou na sua implementação? Talvez a única coisa que precisa é alterar a estrutura do seu software, assim reduzindo o processamento.

 E qual linguagem está utilizando?

 Fico no aguardo. ^^

 T++. 

Oi Daniel,

Eu fiz o script executando através de pooling.

Fiz o script em C, porque já peguei boa parte do script pronto. Mas tenho experiência em java, ruby, python e nodejs.

Você já fez algo desse tipo? Poderia me ajudar na implementação?

Renato, ma minha sugestão - conecte um Arduino no Raspberry (via serial, usb ou I2C).

Esse Arduino executaria a função de listener. É um disperdicio usar o Rasp Pi para isso.

Quando o Arduino receber uma comunicação, avisa o Rasp Pi através de uma interrupção.

Muito obrigado pela sugestão José Gustavo.

Vou tentar montar esse esquema essa semana, ai volto aqui e digo o resultado.

Uma dúvida: como aviso ao Rasp Pi através de uma interrupção?

Pensei em criar um script em ruby que vai ficar lendo a serial. Quando receber alguma informação, avisa a aplicação web pra mudar o status da lâmpada.

Renato eu também não sei.

Terá que pesquisar. 

Veja isso :

http://raspberrywebserver.com/gpio/using-interrupt-driven-gpio.html

Oi pessoal,

Voltando com os resultados.. realmente foi bem mais tranquilo utilizar o arduino conectado no raspberry. Consegui resolver o que queria de um modo mais fácil.

O que eu fiz foi: usei o arduino ligado no raspberry pi pela USB e fiz um script em ruby pra ficar lendo a serial. Consegui reduzir ao máximo o consumo da CPU.

O próximo passo é instalar o Nginx e criar uma aplicação Ruby on Rails para o usuário poder ligar/desligar as lampadas, o ar condicionado, tv, as tomadas pelo browser.

A cada passo que for conseguindo, vou dando o feedback. Valeu pela ajuda!

Muito bom !

Parabéns !

Usou interrupção no Raspberry Pi ?

José Gustavo,

Estava pensando e lendo uns artigos ontem, não sei se vai ser possível utilizar interrupção no raspberry com o Nrf24l01+.

Mas estou pesquisando e lendo esse[1] artigo, que inclusive tem uma séria de posts falando sobre interrupção.

_______

1 - http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspb...

José Gustavo,

To lendo muita coisa e consegui ter uma noção maior sobre interrupções.

Primeiro preciso conectar uma porta do arduino com alguma GPio do raspberry. Ai quando o arduino receber a informação pelo módulo, eu coloco a porta do arduino em HIGH, ai eu ativo a interrupção e executo o código pra ler a informação da serial.

Não sei se vai dar pra vcs entenderem, mas na minha cabeça ta fazendo sentido. :P

Renato nos microcontroladores e microprocessadores existem interrupções de hardware e interrupções de software. 

A comunicação serial usava interrupção de hardware nos primeiros microprocessadores. Quando algumas linhas de controle (request to send, clear to send, etc)  eram ativadas, as rotinas de leitura e gravação eram executadas. Isso a decadas atrás. 

Hoje a comunicação serial nem usa mais essas linhas de controle. Só transmit e receive. Estou desatualizado,mas com certeza deve usar os dois tipos de interrupções.

No caso do Raspberry Pi dê uma estudada nisso:(pode ser complexo para entender) 

GPIO

http://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/...

BCM2835

http://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm28...

INTERRUPTS

Each GPIO pin, when configured as a general-purpose input, can be configured as an interrupt source to the ARM. Several interrupt generation sources are configurable:

  • Level-sensitive (high/low)
  • Rising/falling edge
  • Asynchronous rising/falling edge

Level interrupts maintain the interrupt status until the level has been cleared by system software (e.g. by servicing the attached peripheral generating the interrupt).

The normal rising/falling edge detection has a small amount of synchronisation built into the detection. At the system clock frequency, the pin is sampled with the criteria for generation of an interrupt being a stable transition within a 3-cycle window, i.e. a record of "1 0 0" or "0 1 1". Asynchronous detection bypasses this synchronisation to enable the detection of very narrow events.

José Gustavo,

Muito obrigado pelas dicas!

Mas surgiu uma dúvida: eu posso conectar uma porta do arduino diretamente numa entrada do raspberry? 

Como tinha dito, pensei em conectar uma porta do arduino diretamente numa entrada do raspberry para ativar um script através de interrupção. Vi que muitos tutoriais sobre i2c, mas não sei se é o modo correto de fazer isso.

Renato, não tinha visto sua pergunta.

Pode sim conectar uma porta do Arduino (5V)  no Raspberry Pi (3,3V)

Não conecte diretamente pois poderá danificar o seu Raspberry Pi.

Recomendo que use um módulo de conversão bidirecional de tensão.

Existem vários modelos no mercado. Procure : Conversor bidirecional de tensão

https://www.sparkfun.com/products/12009

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço