Mudanças entre as edições de "Oficina 2 de App Inventor - Arduino"
Linha 101: | Linha 101: | ||
====Variáveis Envolvidas==== | ====Variáveis Envolvidas==== | ||
+ | |||
+ | |||
+ | ===3.4 - Descrição do Protocolo de Comunicação=== | ||
+ | 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. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | '''Protocolo APP/Coordenador''' | ||
+ | |||
+ | As mensagens enviadas do APP para o Coordenador tem o formato de Strings. | ||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | Na figura abaixo é mostrado a estrutura desses pacotes. | ||
+ | |||
+ | [[Arquivo:EstruturaPacotesAPP.png|800px]] | ||
+ | |||
+ | |||
+ | Os delimitadores e os tipos de mensagem nesse protocolo são descritos abaixo: | ||
+ | |||
+ | '''Delimitadores de Mensagem''' | ||
+ | |||
+ | '''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. | ||
+ | |||
+ | '''END_MSG '#' (1 Byte )''' | ||
+ | |||
+ | Caracter da tabela ASCII que indica fim de mensagem. | ||
+ | |||
+ | '''Divisor de Campos da Mensagem''' | ||
+ | |||
+ | '''DIV_MSG '|' (1 Byte )''' | ||
+ | |||
+ | 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. | ||
+ | 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: | ||
+ | |||
+ | D2, D4, D7, D8, D12, D13. | ||
+ | |||
+ | '''MSG_ANALOGWRITE 11 (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 acionamento de um dos pinos digitais com PWM. | ||
+ | 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: | ||
+ | |||
+ | D3, D5, D6, D9, D10, D11. | ||
+ | |||
+ | '''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. | ||
+ | |||
+ | [[Arquivo:MSG_COMANDOB.png|600px]] | ||
+ | |||
+ | '''MSG_DIGITALREAD 13 (1 Byte )''' | ||
+ | |||
+ | Valor com tamanho igual a 1 byte enviado como decimal. Define mensagem de pedido de leitura de uma das portas digitais seguintes: | ||
+ | |||
+ | D2, D4, D7, D8, D12, D13. | ||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | '''RSP_LEITURA 15 (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. | ||
+ | |||
+ | '''MSG_STATUS 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. | ||
+ | As portas analógicas do microcontrolador que permitem essa leitura são as seguintes: | ||
+ | |||
+ | A0, A1, A2, A3, A4, A5. | ||
+ | |||
+ | '''RSP_STATUS 17 (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 analógica solicitada em mensagem do tipo 16. | ||
+ | |||
+ | '''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. | ||
+ | |||
+ | '''Porta''' | ||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | '''Protocolo ZigBee - Coordenador/End Device''' | ||
+ | |||
+ | Na figura abaixo pode ser observada a estrutura dos pacotes de dados do protocolo ZigBee. | ||
+ | |||
+ | [[Arquivo:UARTDataFramePayload.PNG|600px]] | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | A imagem abaixo mostra a troca de mensagens entre o APP, Coordenador e Dispositivos Finais. | ||
+ | |||
+ | |||
+ | |||
+ | [[Arquivo:TROCA_MSG.png|900px]] |
Edição das 21h40min de 13 de maio de 2015
Comunicação entre o APP e os controladores
Comunicação entre o APP e o servidor de Automação
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.
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 abaixo relaciona possíveis eletroeletrônicos com as portas do Arduino e respectivos tipos de sinal usados para seu controle.
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.
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. Após o envio desse tipo de mensagem é aguardado mensagem de confirmação do tipo 12.
Os pinos reservados para acionamento digital na placa Arduino, ou seja, com valores 0 ou 1 são os pinos:
D2, D4, D7, D8, D12, D13.
MSG_ANALOGWRITE 11 (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 acionamento de um dos pinos digitais com PWM. 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:
D3, D5, D6, D9, D10, D11.
MSG_DIGITALREAD 13 (1 Byte )
Valor com tamanho igual a 1 byte enviado como decimal. Define mensagem de pedido de leitura de uma das portas digitais seguintes:
D2, D4, D7, D8, D12, D13.
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.
RSP_LEITURA 15 (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.
MSG_STATUS 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. As portas analógicas do microcontrolador que permitem essa leitura são as seguintes:
A0, A1, A2, A3, A4, A5.
Porta
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.
Variáveis Envolvidas
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:
get_char - Usada para guardar o primeiro byte recebido na porta bluetooth, ou seja, o caractere de início de mensagem.
disp_xbee - Define o módulo XBee de destino;
APP_command - Define o tipo de comando;
pin_num - Define a porta do microcontrolador;
pin_value - Define o valor da porta.
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.
Em seguida é definida a comunicação com os módulos bluetooth e XBee a uma velocidade de 9600bps.
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.
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.
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.
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.
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.
Comunicação entre o servidor de automação e os controladores
Variáveis Envolvidas
3.4 - Descrição do Protocolo de Comunicação
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.
Protocolo APP/Coordenador
As mensagens enviadas do APP para o Coordenador tem o formato de Strings.
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.
Na figura abaixo é mostrado a estrutura desses pacotes.
Os delimitadores e os tipos de mensagem nesse protocolo são descritos abaixo:
Delimitadores de Mensagem
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.
END_MSG '#' (1 Byte )
Caracter da tabela ASCII que indica fim de mensagem.
Divisor de Campos da Mensagem
DIV_MSG '|' (1 Byte )
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. 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:
D2, D4, D7, D8, D12, D13.
MSG_ANALOGWRITE 11 (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 acionamento de um dos pinos digitais com PWM. 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:
D3, D5, D6, D9, D10, D11.
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_DIGITALREAD 13 (1 Byte )
Valor com tamanho igual a 1 byte enviado como decimal. Define mensagem de pedido de leitura de uma das portas digitais seguintes:
D2, D4, D7, D8, D12, D13.
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.
RSP_LEITURA 15 (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.
MSG_STATUS 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. As portas analógicas do microcontrolador que permitem essa leitura são as seguintes:
A0, A1, A2, A3, A4, A5.
RSP_STATUS 17 (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 analógica solicitada em mensagem do tipo 16.
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.
Porta
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.
Protocolo ZigBee - Coordenador/End Device
Na figura abaixo pode ser observada a estrutura dos pacotes de dados do protocolo ZigBee.
A imagem abaixo mostra a troca de mensagens entre o APP, Coordenador e Dispositivos Finais.