Comunicação e Movimentos
A comunicação com o Jarvis pode se dar de três maneiras diferentes:
- Pela porta serial (Serial), através do Monitor Serial ou qualquer outro aplicativo do tipo;
- Por uma conexão TCP na porta 2390 do IP obtido da rede wi-fi;
- Por uma conexão serial Bluetooth (SPP).
A comunicação por Bluetooth só serve para movimentos, por enquanto (maio/2016), mas em breve funcionará como as outras duas, recebendo quaisquer comandos. Os comandos devem seguir o que foi apresentado no post Protocolo, com a possibilidade de múltiplos comandos separados pelo caracter “|” (tal que). A princípio recomendo utilizar o Monitor Serial do Arduino IDE, pois você terá informações de depuração na tela, o que torna mais fácil identificar problemas. Faça testes com envios simples, como…
A100|B90|C30
… e outros mais complexos como:
*A120;B70;C30:5
E veja os servos se movimentarem. Esta também é uma ótima oportunidade para ajustá-los, conforme explicado no post Preparativos.
O que acontece dentro da Linkit ONE é o seguinte:
- Ela espera dados por uma das três maneiras acima, continuamente;
- Ao receber algo, ela quebra a informação em tokens (pequenos pedaços de texto), através da separação pelo caracter “|”;
- Ela itera sobre esses tokens executando cada um, de acordo com o comando dado.
E assim o loop se repete indefinidamente. A quebra é realizada através da função split(). Alguns comandos são palavras inteiras (como RESET e OFF, por exemplo), já outros são identificados pelo primeiro caracter (como ^, @, #, ~, etc.). Caso nenhum comando seja reconhecido, assume-se que é um servo com uma posição (como A100, por exemplo).
Os tokens também são subdivididos, já que normalmente possuem mais de um elemento. Para isso, existem as funções:
getValue(s) – extrai o valor numérico do servo (A=0, B=1, etc.) ou simplesmente o valor numérico (no caso da pausa);
getExtraValue(s) – extrai o valor numérico depois do caracter “:” (como ao movimentar múltiplos servos [*], por exemplo).
Funções com nomes auto-explicativos são:
offServo(servonum) – Desliga o servo especificado;
moveServo(servonum, pos, velocidade) – Movimenta o servo especificado para a posição desejada com n passos (velocidade);
moveServos(servonums[], poss[], velocidade) – Movimenta múltiplos servos para suas posições, com n passos (velocidade);
playServo(s) – Interpreta o texto e chama moveServo();
playServos(matriz) – Recebe uma matriz e chama moveServos();
E basicamente estas são as funções necessárias para a movimentação. Para maiores detalhes, “use the Source, Luke!”
No próximo post veremos outras funções do código.