sábado, 14 de maio de 2016

Recebendo as informações do Aplicativo ChicoBot via Módulo HC-05 através de um código-teste...


Ao enviar as informações (números) pelo aplicativo é necessário ter um algoritmo programado no Arduino para que os comandos sejam recebidos, interpretados e o robô se mova nas direções correspondentes às esperadas no aplicativo.

O aplicativo ChicoBot ao enviar os números "1", "2", "3" e "4", correspondentes as direções de locomoção, "empacotados" em variáveis, envia uma sequência de 0s e 1s que define o código do caracter na tabela ASCII enviado. Ou seja, a cada vez que um caracter é enviado, são mandados 8 bits, sendo eles "0" ou "1", para o módulo bluetooth HC-05. 

Se estudarmos como funciona o protocolo de comunicação do módulo bluetooth, o protocolo RS232, veremos que na transmissão de dados são enviados: 1 bit de início de transmissão, 1 bit de fim de transmissão, 1 bit de paridade e 8 bits de dados. Não precisamos nos preocupar com os bits que não sejam os 8 bits de dados. A grande questão para a comunicação funcionar é: saber como são representadas em bits os tipos de variáveis da linguagem Arduino para saber como declarar o comando que será recebido.

Depois deste resumo, vamos ao código com alguns comentários...


1ª parte: instruções na função "void setup".




Muita atenção a declaração da variável "comando". Por que ela é declara como byte? Não podia ser um "int"? Um "char"?
r: Ela é declarada como um byte porque na linguagem Arduino, os bytes são computados como um dado de 8 bits. Não poderia ser declarada como "int" porque os "ints" são computados como dados de 16 bits (consultar a "Reference" disponível em arduino.cc).

Em seguida temos as variáveis do tipo "boolean" que representaram os "estados das direções". Enquanto o robô estiver indo para a direita, por exemplo, a variável "direita" estará setada para "true" e quando não estiver mais indo para a direita, a variável estará setada para "false". Veremos como isso funcionará na função "void loop".

O circuito montado conta com 4 LEDs, um em cada pino, um no pino 4, um no pino5, um no pino 6 e outro no pino 7. Fiz isto para testar se a comunicação entre o aplicativo e o módulo estava rolando e cada LED indica uma direção na qual o robô estará se movendo ou não (LED aceso = o robô está indo naquela direção, LED apagado = o robô não está indo naquela direção). Para que isso se aplique no robô quando estiver pronto, vou precisar fazer as devidas conexões eletrônicas na ponte H e nos terminais dos motores, mas isso ocorrerá mais pra frente, só quando o robô já estiver pronto. 

Além das declarações de como funcionarão os pinos em que os LEDs estão (funcionarão como saída), a função "void setup" conta com os valores iniciais das variáveis correspondentes as direções. Elas começarão todas em "false" pois o robô não deverá sair andando sozinho. Estas declarações são feitas dentro desta função pois este código será executado primeiro e só uma vez, por isso se chama "setup".

Ah, e tem também a frequência baud rate em que porta serial funcionará, que é 9600 bauds. 


2ª parte: instruções na função "void loop".



Na estrutura da função "void loop" encontramos o comando "Serial.available()" sendo comparado com zero. Esta instrução diz que, se tiver algo na serial (no buffer da serial), o Arduino lê este dado com o comando "serial.read()" e armazena na variável "comando" o que estava na serial para ser lido. Por que comparar "serial.available" com zero? Porque se tiver algo na serial para ser lido, seu "comprimento"/valor será maior que zero. Só seria zero caso não houvesse nada na serial.

Depois que estas condições e ações são feitas, partimos para a parte de controle dos LEDs. Há basicamente mais três destas funções que vou explicar agora, totalizando quatro funções (controlar quatro LEDs que representam as quatro direções em que o robô vai se mover).

A estrutura começa com uma condição que compra a variável comando com o caractere "1" referente ao comando de andar para frente. A seguir, outra condição para testar se a variável "frente" é "false". Se esta for "false" e o que estiver armazenado em comando (que previamente estava na porta serial) for igual a "1", então a variável booleana "frente" se torna "true" e o LED correspondente a direção acende. Caso "frente" seja "true", então ao receber o caractere "1", o Arduino seta "frente" para "false" e apaga o LED.

Repare que as instruções estão preparadas para funcionar com o valor/estado anterior da direção, que no caso é representado visualmente pelo LED (aceso ou apagado = seguindo na direção ou não, respectivamente). Por isso, quando definimos a função "void setup", setamos inicialmente o valor de todas as direções para "false", assim o robô estará inicialmente parado.

3ª Parte: Instruções restantes do código.

 



Como disse a vocês, a estrutura da função explicada na segunda parte desta documentação se repete para as direções restantes. O comando "delay" para aplicar 1 segundo de atraso no programa foi posto apenas para teste e acompanhamento pela Serial Monitor.

É isso... Espero ter explicado claramente o código e quaisquer dúvidas perguntas são bem vindas no blog!





Nenhum comentário:

Postar um comentário