sexta-feira, 6 de maio de 2016

Enviando comandos para o Chico pelo aplicativo ChicoBot...


Esta documentação parte do princípio de que você, leitor, já sabe usar o MIT App Inventor 2 ou está minimamente familiriazado com o mesmo, ferramenta utilizada para desenvolver este aplicativo.
Caso não esteja familiarizado, você pode pesquisar por "tutorial como usar o app inventor" ou "como usar app inventor 2 arduino" que trará vídeos no YouTube ensinando a usar a ferramenta e ensinando a dar os primeiros passos para fazer algo com uma aplicação legal!

Bem, vamos lá...


1ª Parte: Comandos realizados assim que a tela inicial é aberta.



O primeiro passo é fazer a inicialização das variáveis de comando: Frente, Ré, Esquerda e Direita. 
Tente evitar pôr nomes com caracteres especiais nas variáveis como acentos, tiles e etc, pois alguns sistemas não reconhecem estes caracteres de acordo com a tabela ASCII e você pode ter problema ao rodar seu programa. Neste caso eu já havia tentado a palavra "Ré" sem acento e posteriormente tentei com acento e deu certo.

As outras duas variáveis ("StatusConText" e "comando") representam, respectivamente, a string atribuída a variável "StatusConText" que aparecerá abaixo do label "Status da Conexão" na tela inicial do dispositivo Android e a variável que armazenará o comando a ser enviado via bluetooth para o HC-05 ligado ao Arduino, por isso "comando" é definida como uma string ("texto") que não contém nenhum caracter.

Assim que a tela (Screen1) inicializa, seu texto na barra cinza localizada no topo da tela é setado para "ChicoBot" e o texto presente na caixa abaixo do label "Status da Conexão" é setado para "Não realizada!", pois assim que o aplicativo é fechado a conexão é desfeita, logo, se o aplicativo é iniciado, a conexão sempre ainda não terá sido realizada.

A seguir, encontramos uma condição que verifica se o bluetooth do dispositivo Android está ativado. Se ele está ativado, estão o texto abaixo do label "Status BT" é setado para "BT Ativado". Caso o bluetooth do dispositivo não esteja ativado, o texto sera setado para "BT desativado". 

* Aqui no código, sempre que encontrarmos funções com classes como "BluetoothAndroid.Enabled", para acharmos essas funções no App Inventor 2 devemos procurar pelo primeiro nome antes do ponto "BluetoothAndroid" no canto esquerdo inferior da página, onde aparecerão todos os recursos que adicionamos na área "Designer"(botão ao lado de "Blocks" no canto superior direito próximo ao e-mail em que a conta está logada). Clicando nestes recursos, o AI2 (App Inventor 2) disponibiliza todas as funções disponíveis para usar a determinada variável como argumento.

O próximo comando armzena no banco de dados do aplicativo "TinyDB1" o endereço do dispositivo pareado sob a tag "Dispositivo armazenado" para que quando procuremos por dispositivos e encontremos dispositivos que o Android já se conectou anteriormente utilizando esta aplicação, consigamos encontrar pela mesma.

A condição seguinte, indaga se o tamanho da conteúdo da variável que contém o endereço do dispositivo a quem o Android vai se conectar é maior que zero. Ou seja, se há um dispositivo a se conectar, o retorno desta condição será verdadeiro porque o tamanho do conteúdo da variável será maior que zero. Atendendo a esta condição, encontra-se mais uma em seguida que questiona se o dispositivo armazenado na tag está pareado com o Android. Se estiver pareado, segue o baile, se não estiver o aplicativo emite um alerta dizendo "Dispositivo não pareado!". Terminando de executar os comandos da condição anterior, caso nada esteja armazenado na variável "EndDispositivo", sob a tag "Nenhum" um valor "vazio" ficará armazenado.

2ª Parte: Procurando via bluetooth por dispositivos disponíveis.



Esta segunda parte do código começa com as ações executadas assim que o botão "Conectar" é clicado. Assim que isto ocorre, uma tela é aberta com uma lista dos endereços MAC, dos dispositivos pareados com o Android, seguidos dos nomes destes dispositivos.

Assim que o usuário seleciona o dispositivo na lista (tradução literal do verbo "Pick"), uma primeira condição testa se o bluetooth do Android está disponível. Caso esteja disponível, seta a variável "EndDispotivo" para o endereço do dispositivo selecionado na lista aberta pelo botão "Conectar". Em seguida, dentro desta mesma condição, o aplicativo chama o banco de dados para armazenar sob a tag "Dispositivo armazenado" o endereço contido na variável "EndDispositivo". 

Na próxima condição, o código testa novamente se o dispositivo selecionado está mesmo pareado. Caso esteja pareado, uma nova condição testa se a conexão com o dispositivo selecionado foi realizada. Se a conexão foi realizada, seta o texto na caixa de texto abaixo do label "Dispositivo:" para o endereço e o nome do dispositivo ao qual o Android está conectado, seta o texto que indica o status da conexão para "Pronta!" e envia de volta para o dispositivo conectado o seu próprio endereço. Esta última ação de enviar o endereço do próprio dispositivo (ao qual o Android está conectado) para ele mesmo foi necessária para estabilizar a conexão. Antes, quando o código não tinha esta instrução, assim que o Android enviava um comando para o HC-05 o aplicativo exibia erros 507 e 515, questionando se o Android estava mesmo conectado a algum dispositivo ou se o dispositivo conectado estava ativado. Por quê? Não tenho a menor idéia, não sei se é um padrão da comunicação RS232 via SPP, mas comparando alguns códigos encontrados na internet e testando-os, percebi que esta instrução se fazia necessária para "selar" a conexão.

Em seguida, se a conexão não for realizada por algum problema (comunicação, erros, bugs e etc) o aplicativo emite um alerta dizendo "Problemas na conexão!" e o usuário deverá novamente clicar no botão "Conectar".

Caso o botão "Desconectar" seja pressionado, o Android encerra a conexão estabelecida no momento. Caso não haja nenhuma conexão no momento, nada acontece.

3ª Parte: Enviando os comandos para o módulo HC-05.



Chegando a última parte do código, temos as funções de cada botão que ordena uma ação. A lógica de funcionamento dos botões é exatamente a mesma: quando o botão de determinada direção é clicado, o aplicativo testa se o Android está conectado a algum dispositivo e envia o conteúdo armazenado na variável correspondente a direção em questão. Assim que o botão é "desclicado", o aplicativo repete este teste da conexão e envia novamente o número armazenado na variável correspondente a direção. Exemplo: se o usuário clicou no botão "Ré" o aplicativo testa se o Android está conectado a algum dispositivo. Se estiver, o Android enviará o conteúdo armazenado na variável global "Ré" que é a string contendo apenas o número "2". Assim que o usuário retirar o dedo do botão "Ré", o aplicativo repetirá o teste e enviará novamente o algarismo "2". Se o usuário der um toque, clicar e tirar o dedo rápido do botão, o número "2" será enviado duas vezes de forma bem rápida.

* O número é enviado quando o usuário pressiona o botão e depois novamente quando solta o botão porque eu desejo que o meu robô siga para determinada direção enquanto o usuário estiver com o dedo no botão. No código do Arduino, que comentarei aqui no blog, vocês vão entender melhor como funciona este procedimento e como fiz para o Arduino interpretar esta forma de comando.

** Anteriormente tentei enviar direto uma string contendo apenas o número "2", mas por algum motivo desconhecido isso não deu certo. A recepção só ocorreu quando criei uma variável global para armazenar o conteúdo referente a direção de locomoção desejada e a enviei. 
O arduino ao receber comandos via bluetooth deve receber comandos de início de envio e término de envio. Talvez, criando uma variável com um conteúdo e a enviando, o aplicativo já insira os comandos de início e parada de transmissão, já que, quando transmitia apenas o algarismo "2", nenhum comando \n ou \r estava sendo enviado.

No próximo post, comentarei todo o meu código da sketch do Arduino que diz respeito a recepção destes comandos enviados pelo aplicativo ChicoBot.

Nenhum comentário:

Postar um comentário