Mudanças entre as edições de "Oficina 2 de App Inventor - Arduino"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(22 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
 
=Comunicação entre o APP e os controladores=
 
=Comunicação entre o APP e os controladores=
 +
 +
Na estrutura App Inventor- Arduinos preparada para desenvolvimento do projeto, existem três Arduinos. Apenas um deles se comunicará com o APP instalado no celular, chamaremos esse Arduino de servidor. Os outros dois Arduinos controlarão os dispositivos eletroeletrônicos ligados em suas portas e farão a comunicação com o Arduino Servidor. Chamaremos esses dois Arduinos de controladores.
  
 
Antes de iniciarmos a oficina de hoje precisamos entender como foi estruturada a comunicação entre o APP e os dispositivos eletrônicos conectados aos controladores.
 
Antes de iniciarmos a oficina de hoje precisamos entender como foi estruturada a comunicação entre o APP e os dispositivos eletrônicos conectados aos controladores.
  
Lembrando da plataforma adotada do arduino, as mensagens devem ser embutidas nas variáveis globais previstas no código do APP. A estrutura das mensagens bem como o range de valores já foram previamente construídos pelo software que roda na plataforma. Assim, as informações contidas nessas mensagens irão definir a porta física correta que deve ser escrito ou lido um valor conforme o tipo de sinal envolvido na porta correspondente. O detalhe das portas está mostrado o esquema da figura abaixo.
+
A comunicação do APP será sempre com o Arduino servidor. Este por sua vez repassará a informação para os Arduinos controladores. Entre o servidor e o APP a comunicação é via Bluetooth. Entre o servidor e os controladores usamos a tecnologia Xbee para fazer a comunicação.
 +
O APP é sempre o responsável pelo início da comunicação. Para mudar o estado de qualquer uma das portas (digitais ou PWM) o pedido tem origem no APP. Do mesmo modo, para verificar o estado de uma das portas (Digital ou Analógica) o comando tem origem no APP.
 +
Na figura abaixo estão indicadas as posições das portas digitais, PWMs e Analógicas do Arduino. Na estrutura montada, com Arduino servidor e Arduinos controladores, só teremos acesso as portas dos Arduinos controladores.  
  
 
<center>[[Arquivo:PortasArduino.png|600px]]</center>
 
<center>[[Arquivo:PortasArduino.png|600px]]</center>
  
Como exemplo, se o programa receber na variável ''APP_command'' o tipo de mensagem ''MSG_DIGITALWRITE'' com valor 10 e na variável ''pin_num'' o valor 1, o subsistema de Gerenciamento de comando App executa o comando solicitado no pino digital 2 (primeiro pino digital após pinos 0 e 1, RX e TX). Se o programa receber na variável ''APP_command'' o tipo de mensagem ''MSG_DIGITALWRITE'' com valor 10 e na variável ''pin_num'' o valor 2, o subsistema de Gerenciamento de comando App executa o comando solicitado no pino digital 4 (segundo pino digital após pinos 0 e 1, RX e TX).
 
  
De maneira semelhante, a função processa o valor correto dos pinos digitais PWM e dos pinos analógicos.
+
A figura que segue relaciona possíveis eletroeletrônicos que podem ser acionados/monitorados pelas portas do Arduino, com seus respectivos tipos de sinais.
 +
 
 +
<center>[[Arquivo:SimbolosEletros.png|600px]]</center>
  
A figura abaixo relaciona possíveis eletroeletrônicos com as portas do Arduino e respectivos tipos de sinal usados para seu controle.
 
  
<center>[[Arquivo:SimbolosEletros.png|600px]]</center>
 
  
 +
==Descrição do Protocolo de Comunicação==
  
Com o valor correto da porta definido pela função anterior, os comandos são executados conforme os parâmetros recebidos.
 
  
Se o controlador receber corretamente a mensagem do servidor e executar os comandos conforme solicitado, é montada e enviada em seguida uma mensagem de retorno para confirmar o recebimento da mensagem ou enviar valores de retorno.
+
'''Protocolo APP/Servidor'''
  
==Variáveis Envolvidas==
+
As mensagens enviadas do APP para o servidor tem o formato de Strings (sequência de caracteres).
  
As variáveis criadas no código usadas para a extração dos campos da mensagem do APP e manipulação pelos diferentes subsistemas são as seguintes:
+
Essas Strings contém:
 +
* delimitadores de início e fim;
 +
* campos que definem: o tipo de mensagem, o Arduino controlador de destino, o pino do Arduino que será controlado ou lido, e o valor referente ao controle do pino.
  
'''''get_char ''''' - Usada para guardar o primeiro byte recebido na porta bluetooth, ou seja, o caractere de início de mensagem.
+
Entre os campos e delimitadores há um caracter separador.
  
'''''disp_xbee ''''' - Define o módulo XBee de destino;
+
As mensagens de retorno do Servidor para o APP contém um número menor de dados, assim, a estrutura do pacote é simplificada.
  
'''''APP_command''''' - Define o tipo de comando;
 
  
'''''pin_num''''' - Define a porta do microcontrolador;
+
Na figura abaixo  são mostradas as estruturas desses pacotes.
  
'''''pin_value''''' - Define o valor da porta.
+
[[Arquivo:EstruturaPacotesAPP.png|800px]]
  
  
No início do programa são definidos os tipos de mensagem, e o endereço dos módulos XBee que fazem parte do sistema.
+
Os delimitadores e os campos da mensagem desse protocolo são descritos abaixo.
  
Em seguida é definida a comunicação com os módulos bluetooth e XBee a uma velocidade de 9600bps.
+
== Delimitadores de Mensagem ==
  
O programa verifica a chegada de mensagens enviadas pelo Aplicativo nas portas onde o módulo bluetooth está conectado, colocando qualquer byte recebido na variável get_char.
+
 +
'''Identificador de inicio da mensagem - '*' (1 Byte )'''
  
Se o caractere recebido na variável get_char for diferente do caractere definido como início de mensagem, o programa retorna e inicia nova leitura na porta bluetooth.
+
Caracter da tabela ASCII que indica início de mensagem. Quando transmitido para o servidor, este inicia a recepção dos dados enviado.  
  
Se esse caractere for igual ao caractere de início de mensagem, é iniciada a recepção dos próximos bytes, os bytes são recebidos campo por campo e colocados nas suas respectivas variáveis.
 
  
Se o tipo de mensagem não for válida, não executa nenhuma ação, retornando ao início no final do código.
+
'''Identificador de fim da mensagem - '#' (1 Byte )'''
  
Se o tipo de mensagem for válida verifica o endereço do módulo XBee de destino, cujo valor foi recebido e guardado na variável disp_xbee. Com o auxílio da biblioteca xbee, é montado uma mensagem padrão Zigbee repassando os dados alocados nas variáveis para os campos do payload.Após a montagem a mensagem é enviada para o Controlador de Eletroeletrônicos.
+
Caracter da tabela ASCII que indica fim de mensagem. Quando transmitido para o servidor, este termina a recepção dos dados.  
  
Após enviada a mensagem para o Controlador, o programa verifica o retorno do Controlador indicando o recebimento da mensagem e execução do comando. Essa mensagem de retorno pode conter valores que devem ser mostrados ao usuário. O programa então extrai o dado do pacote Zigbee, monta e envia um novo pacote de resposta no padrão exigido pelo APP.
 
  
==Descrição do Protocolo de Comunicação==
+
'''Divisor de Campos da Mensagem'''
Para a comunicação entre os componentes do sistema foram utilizados dois protocolos.
+
 
No envio de dados entre o Coordenador da rede e os dispositivos finais foi utilizado o protocolo ZigBee, utilizando módulos rádio XBee. No entanto, para a troca de mensagens entre o APP e o Coordenador foi definido um protocolo específico e utilizado módulos Bluetooth.
+
'''DIV_MSG - '|' (1 Byte )'''
  
----
+
Caracter da tabela ASCII definido como separador dos campos da mensagem.
  
'''Protocolo APP/Coordenador'''
 
  
As mensagens enviadas do APP para o Coordenador tem o formato de Strings.
+
== Campos da mensagem ==
  
Essas Strings contém delimitadores de início e fim, campos que definem o tipo de mensagem, o módulo XBee de destino, o pino do Arduino que será controlado ou lido, e o valor referente ao controle do pino.
 
  
Entre os campos e delimitadores há um caracter separador.
 
  
As mensagens de retorno do Coordenador para o APP contém um número menor de dados, assim, a estrutura do pacote é simplificada.
+
''' Tipo_msg - (número indicando o tipo da mensagem) '''
  
 +
Número que determina o tipo de mensagem. Os tipos possíveis são: Digitalwrite, Digitalread, PWMwrite, Analogicoread,  DigitalResposta, AnalogicoResposta.
  
Na figura abaixo  é mostrado a estrutura desses pacotes.
 
  
[[Arquivo:EstruturaPacotesAPP.png|800px]]
+
'''Id-Xbee - (1 ou 2) '''
  
 +
Identifica o Arduino controlador para qual a mensagem deverá ser enviada.
  
Os delimitadores e os tipos de mensagem nesse protocolo são descritos abaixo:
 
  
'''Delimitadores de Mensagem'''
+
'''Porta - (número correspondente a uma porta do Arduino) '''
 
'''START_MSG '*' (1 Byte )'''
 
  
Caracter da tabela ASCII que indica início de mensagem. Quando transmitido e identificado numa recepção, inicia-se a recepção do pacote de dados enviado.  
+
Identifica a porta a ser lida ou escrita.
  
'''END_MSG '#' (1 Byte )'''
 
  
Caracter da tabela ASCII que indica fim de mensagem.
+
'''Valor - (valor a ser escrito na porta) '''
  
'''Divisor de Campos da Mensagem'''
+
Define o valor a ser escrito numa porta digital ou PWM.
  
'''DIV_MSG '|' (1 Byte )'''
+
=== Detalhamento dos tipos de mensagens ===
  
Caracter da tabela ASCII definido como separador dos campos da mensagem.
 
  
'''Tipos de Mensagem - Tipo_msg'''
 
  
'''MSG_DIGITALWRITE 10 (1 Byte )'''
 
  
Valor com tamanho igual a 1 byte enviado como  decimal. Define tipo de mensagem para que o microcontrolador  ligado ao dispositivo final execute um comando de acionamento ou desligamento de um dos seus pinos digitais.
+
'''MSG_DIGITALWRITE - 10 (1 Byte )'''
Após o envio desse tipo de mensagem é aguardado mensagem de confirmação do tipo 12.
 
  
Os pinos reservados para acionamento digita na placa Arduinol, ou seja, com valores 0 ou 1 são os pinos:
+
Define a ação de escrita numa porta digital, no campo valor deverá ser especificado ''0'' ou ''1''.
  
D2, D4, D7, D8, D12, D13.
 
  
'''MSG_ANALOGWRITE 11 (1 Byte )
+
Os pinos reservados para acionamento digital na placa Arduino, ou seja, são os pinos:
  
Valor com tamanho igual a 1 byte enviado como decimal. Define tipo de mensagem para que o microcontrolador  ligado ao dispositivo final execute um acionamento de um  dos pinos digitais com PWM.
+
  D2, D4, D7, D8, D12, D13.
Após o envio desse tipo de mensagem é aguardado mensagem de confirmação do tipo 12.
 
  
Os pinos reservados para acionamento  digital com PWM, ou seja, com valores que podem variar entre 0 e 255 são os pinos:
+
No campo ''Porta'' os pinos são identificados pelos seguintes pinos
  
D3, D5, D6, D9, D10, D11.
+
{| class="wikitable" style="text-align: center; width: 30%;background-color: #fffff0"
 +
|+Números das portas digitais e seus pinos no Arduino
 +
|-
 +
|style="text-align: center;color: white;background-color: #d00000"|Porta
 +
| style="text-align: center;color: white;background-color: #d00000"|Pino
 +
|-
 +
|1
 +
|D2
 +
|-
 +
|2
 +
|D4
 +
|-
 +
|3
 +
|D7
 +
|-
 +
|4
 +
|D8
 +
|-
 +
|5
 +
|D12
 +
|-
 +
|6
 +
|D13
 +
|}
  
'''RSP_COMANDO 12 (1 Byte )'''
 
  
Valor com tamanho igual a 1 byte enviado como  decimal. Tipo de mensagem que confirma a execução de um comando após uma mensagem do tipo 10 ou 11.
+
'''MSG_PWMWRITE 11 (1 Byte )
  
[[Arquivo:MSG_COMANDOB.png|600px]]
+
Acionamento de um  dos pinos digitais com PWM.
  
'''MSG_DIGITALREAD 13 (1 Byte )'''
+
Os pinos reservados para acionamento  PWM, ou seja, com valores que podem variar entre 0 e 255 são os pinos:
  
Valor com tamanho igual a 1 byte enviado como decimal. Define mensagem de pedido de leitura de uma das portas digitais seguintes:
+
  D3, D5, D6, D9, D10, D11.
  
D2, D4, D7, D8, D12, D13.
+
No campo ''Porta'' os pinos são identificados pelos seguintes pinos
  
Após o envio desse tipo de mensagem é aguardado mensagem de resposta do tipo 15, com o valor solicitado (0 ou 1) num de seus campos.
+
{| class="wikitable" style="text-align: center; width: 30%;background-color: #fffff0"
 +
|+Números das portas PWM e seus pinos no Arduino
 +
|-
 +
|style="text-align: center;color: white;background-color: #d00000"|Porta
 +
| style="text-align: center;color: white;background-color: #d00000"|Pino
 +
|-
 +
|1
 +
|D3
 +
|-
 +
|2
 +
|D5
 +
|-
 +
|3
 +
|D6
 +
|-
 +
|4
 +
|D9
 +
|-
 +
|5
 +
|D10
 +
|-
 +
|6
 +
|D11
 +
|}
  
  
'''RSP_LEITURA 15 (1 Byte )'''
+
'''MSG_DIGITALREAD 13 (1 Byte )'''
  
Valor com tamanho igual a 1 byte enviado como decimal. Tipo de mensagem de resposta que define o valor de leitura da porta digital PWM solicitada em mensagens do tipo 13 e 14.
+
Define pedido de leitura de uma das portas digitais seguintes:
 +
{| class="wikitable" style="text-align: center; width: 30%;background-color: #fffff0"
 +
|+Números das portas digitais e seus pinos no Arduino
 +
|-
 +
|style="text-align: center;color: white;background-color: #d00000"|Porta
 +
| style="text-align: center;color: white;background-color: #d00000"|Pino
 +
|-
 +
|1
 +
|D2
 +
|-
 +
|2
 +
|D4
 +
|-
 +
|3
 +
|D7
 +
|-
 +
|4
 +
|D8
 +
|-
 +
|5
 +
|D12
 +
|-
 +
|6
 +
|D13
 +
|}
  
'''MSG_STATUS 16 (1 Byte )'''
+
'''MSG_AnalogicalRead 16 (1 Byte )'''
  
Valor com tamanho igual a 1 byte enviado como  decimal. Define mensagem de pedido de leitura de uma das portas analógicas do microcontrolador.
+
Define mensagem de pedido de leitura de uma das portas analógicas.
As portas analógicas do microcontrolador que permitem essa leitura são as seguintes:
+
Os pinos analógicos que permitem essa leitura são as seguintes:
  
 
  A0, A1, A2, A3, A4, A5.
 
  A0, A1, A2, A3, A4, A5.
  
'''RSP_STATUS 17 (1 Byte )'''
+
As portas analógicas correspondentes aos pinos são:
  
Valor com tamanho igual a 1 byte enviado como  decimal. Tipo de mensagem de resposta que define o valor de leitura da porta analógica solicitada em mensagem do tipo 16.
+
{| class="wikitable" style="text-align: center; width: 30%;background-color: #fffff0"
 +
|+Números das portas analógicas e seus pinos no Arduino
 +
|-
 +
|style="text-align: center;color: white;background-color: #d00000"|Porta
 +
| style="text-align: center;color: white;background-color: #d00000"|Pino
 +
|-
 +
|1
 +
|A0
 +
|-
 +
|2
 +
|A1
 +
|-
 +
|3
 +
|A2
 +
|-
 +
|4
 +
|A3
 +
|-
 +
|5
 +
|A4
 +
|-
 +
|6
 +
|A5
 +
|}
  
'''Identificador do Controlaor - Id XBee'''
 
  
Valor com tamanho igual a 1 byte enviado como  decimal. Pode assumir os valores 1 ou 2, referente ao Controlador do ambiente.
+
'''RSP_LEITURA 15 (1 Byte )'''
  
'''Porta'''
+
Mensagem de resposta que fornece o valor de leitura da porta digital solicitada em mensagens do tipo 13.
  
Valor com tamanho igual a 1 byte enviado como  decimal. Pode assumir valores de 1 a 6 e indicam a porta onde o eletroeletrônico está ligado no Controlador.
 
  
'''Valor'''
 
  
Valor com tamanho igual a 1 byte enviado como  decimal. Assume valores entre 0 e 255 e indicam o estado do eletroeletrônico ou o valor de ajuste.
+
'''RSP_LEITURA 17 (1 Byte )''''
 +
 
 +
Mensagem de resposta que fornece o valor de leitura da porta analógica solicitada em mensagens do tipo 16.
  
 
==OFICINA - Atuação sobre a placa controladora usando sinais digitais e PWM==
 
==OFICINA - Atuação sobre a placa controladora usando sinais digitais e PWM==
 +
 +
Para atingir os objetivos desta oficina é necessário utilizar os códigos da oficina anterior que seleciona o servidor de automação para a comunicação com os controladores. A partir desse ponto é lançada as seguintes tarefas:
 +
 +
#Fique atento as explicações dos professores a respeito de como é estruturada e endereçada as mensagens para os controladores;
 +
#Em um protoboard monte um circuito simples de LEDs que serão alimentados pelas portas digitais e PWM; Siga as instruções e cuidados orientados pelos professores;
 +
#Elabore um código para acender um LED em qualquer porta digital através do botão liga/desliga criado no layout da oficina anterior;
 +
#Agora faça com que o led ligue e desligue alternadamente cada vez que se aperta o mesmo botão;
 +
#Crie Um pisca pisca-pisca usando um timer;
 +
#Crie um novo comando usando um slider e use uma das portas PWM para controlar a luminosidade do led desde apagado até acesso por completo.

Edição atual tal como às 07h02min de 10 de dezembro de 2015

Comunicação entre o APP e os controladores

Na estrutura App Inventor- Arduinos preparada para desenvolvimento do projeto, existem três Arduinos. Apenas um deles se comunicará com o APP instalado no celular, chamaremos esse Arduino de servidor. Os outros dois Arduinos controlarão os dispositivos eletroeletrônicos ligados em suas portas e farão a comunicação com o Arduino Servidor. Chamaremos esses dois Arduinos de controladores.

Antes de iniciarmos a oficina de hoje precisamos entender como foi estruturada a comunicação entre o APP e os dispositivos eletrônicos conectados aos controladores.

A comunicação do APP será sempre com o Arduino servidor. Este por sua vez repassará a informação para os Arduinos controladores. Entre o servidor e o APP a comunicação é via Bluetooth. Entre o servidor e os controladores usamos a tecnologia Xbee para fazer a comunicação. O APP é sempre o responsável pelo início da comunicação. Para mudar o estado de qualquer uma das portas (digitais ou PWM) o pedido tem origem no APP. Do mesmo modo, para verificar o estado de uma das portas (Digital ou Analógica) o comando tem origem no APP. Na figura abaixo estão indicadas as posições das portas digitais, PWMs e Analógicas do Arduino. Na estrutura montada, com Arduino servidor e Arduinos controladores, só teremos acesso as portas dos Arduinos controladores.

PortasArduino.png


A figura que segue relaciona possíveis eletroeletrônicos que podem ser acionados/monitorados pelas portas do Arduino, com seus respectivos tipos de sinais.

SimbolosEletros.png


Descrição do Protocolo de Comunicação

Protocolo APP/Servidor

As mensagens enviadas do APP para o servidor tem o formato de Strings (sequência de caracteres).

Essas Strings contém:

  • delimitadores de início e fim;
  • campos que definem: o tipo de mensagem, o Arduino controlador de destino, o pino do Arduino que será controlado ou lido, e o valor referente ao controle do pino.

Entre os campos e delimitadores há um caracter separador.

As mensagens de retorno do Servidor para o APP contém um número menor de dados, assim, a estrutura do pacote é simplificada.


Na figura abaixo são mostradas as estruturas desses pacotes.

EstruturaPacotesAPP.png


Os delimitadores e os campos da mensagem desse protocolo são descritos abaixo.

Delimitadores de Mensagem

Identificador de inicio da mensagem - '*' (1 Byte )

Caracter da tabela ASCII que indica início de mensagem. Quando transmitido para o servidor, este inicia a recepção dos dados enviado.


Identificador de fim da mensagem - '#' (1 Byte )

Caracter da tabela ASCII que indica fim de mensagem. Quando transmitido para o servidor, este termina a recepção dos dados.


Divisor de Campos da Mensagem

DIV_MSG - '|' (1 Byte )

Caracter da tabela ASCII definido como separador dos campos da mensagem.


Campos da mensagem

Tipo_msg - (número indicando o tipo da mensagem)

Número que determina o tipo de mensagem. Os tipos possíveis são: Digitalwrite, Digitalread, PWMwrite, Analogicoread, DigitalResposta, AnalogicoResposta.


Id-Xbee - (1 ou 2)

Identifica o Arduino controlador para qual a mensagem deverá ser enviada.


Porta - (número correspondente a uma porta do Arduino)

Identifica a porta a ser lida ou escrita.


Valor - (valor a ser escrito na porta)

Define o valor a ser escrito numa porta digital ou PWM.

Detalhamento dos tipos de mensagens

MSG_DIGITALWRITE - 10 (1 Byte )

Define a ação de escrita numa porta digital, no campo valor deverá ser especificado 0 ou 1.


Os pinos reservados para acionamento digital na placa Arduino, ou seja, são os pinos:

D2, D4, D7, D8, D12, D13.

No campo Porta os pinos são identificados pelos seguintes pinos

Números das portas digitais e seus pinos no Arduino
Porta Pino
1 D2
2 D4
3 D7
4 D8
5 D12
6 D13


MSG_PWMWRITE 11 (1 Byte )

Acionamento de um dos pinos digitais com PWM.

Os pinos reservados para acionamento PWM, ou seja, com valores que podem variar entre 0 e 255 são os pinos:

D3, D5, D6, D9, D10, D11.

No campo Porta os pinos são identificados pelos seguintes pinos

Números das portas PWM e seus pinos no Arduino
Porta Pino
1 D3
2 D5
3 D6
4 D9
5 D10
6 D11


MSG_DIGITALREAD 13 (1 Byte )

Define pedido de leitura de uma das portas digitais seguintes:

Números das portas digitais e seus pinos no Arduino
Porta Pino
1 D2
2 D4
3 D7
4 D8
5 D12
6 D13

MSG_AnalogicalRead 16 (1 Byte )

Define mensagem de pedido de leitura de uma das portas analógicas. Os pinos analógicos que permitem essa leitura são as seguintes:

A0, A1, A2, A3, A4, A5.

As portas analógicas correspondentes aos pinos são:

Números das portas analógicas e seus pinos no Arduino
Porta Pino
1 A0
2 A1
3 A2
4 A3
5 A4
6 A5


RSP_LEITURA 15 (1 Byte )

Mensagem de resposta que fornece o valor de leitura da porta digital solicitada em mensagens do tipo 13.


RSP_LEITURA 17 (1 Byte )'

Mensagem de resposta que fornece o valor de leitura da porta analógica solicitada em mensagens do tipo 16.

OFICINA - Atuação sobre a placa controladora usando sinais digitais e PWM

Para atingir os objetivos desta oficina é necessário utilizar os códigos da oficina anterior que seleciona o servidor de automação para a comunicação com os controladores. A partir desse ponto é lançada as seguintes tarefas:

  1. Fique atento as explicações dos professores a respeito de como é estruturada e endereçada as mensagens para os controladores;
  2. Em um protoboard monte um circuito simples de LEDs que serão alimentados pelas portas digitais e PWM; Siga as instruções e cuidados orientados pelos professores;
  3. Elabore um código para acender um LED em qualquer porta digital através do botão liga/desliga criado no layout da oficina anterior;
  4. Agora faça com que o led ligue e desligue alternadamente cada vez que se aperta o mesmo botão;
  5. Crie Um pisca pisca-pisca usando um timer;
  6. Crie um novo comando usando um slider e use uma das portas PWM para controlar a luminosidade do led desde apagado até acesso por completo.