Protocolo
Então, você já montou a criança e fez todas as ligações necessárias? O que falta pra fazer ele funcionar? Sim, o “software”, a coisa que vai fazer ele se movimentar e alterar seu rosto (por enquanto, é só o que ele faz)… falar e enxergar vai ficar para o futuro, mas tenho planos pra isso. E para isso vamos entender o código, no qual já fiz zilhões de modificações e definitivamente não é mais o código pelo qual comecei. Não tive o cuidado de ir guardando as modificações feitas ao longo dos últimos meses, mas a princípio a base do código dele era aquele mostrado no post Preparativos (ou ajustando servos), que é uma forma beeeem simplificada do que uso hoje. Estou estudando ainda como vou publicá-lo, mas já é possível fazer algumas explicações do funcionamento.
Para começar, vejamos o protocolo (conjunto de comandos) que o código atual aceita para fazermos ele realizar movimentos (entre outras coisas):
Comando: | Parâmetros: | Exemplo: | Função: |
---|---|---|---|
(A-P) | (0-180)[:speed] | A150 ou F50:20 | Movimenta o servo (A-P) para a posição desejada (0-180), opcionalmente especificando-se um parâmetro de velocidade que subdivide o movimento em passos |
~ | (0-9999) | ~300 | Pausa a execução durante a quantidade especificada de milissegundos |
* | (A-P)(0-180);(A-P)(0-180);…[:speed] | *A150;F50;C30:20 | Movimenta os servos para suas posições desejadas de forma intercalada para simular a movimentação simultânea, opcionalmente pode-se especificar o parâmetro de velocidade no final para subdividir os movimentos em passos |
! | (0-15) | !5 | Desliga um determinado servo, aqui representado de 0 até 15 (ao invés de A-P) |
OFF | — | OFF | Desliga todos os servos |
( | (A-P):(0-999) | (A:200 | Define o valor mínimo de pulso do determinado servo |
) | (A-P):(0-999) | )E:500 | Define o valor máximo de pulso do determinado servo |
| | — | BT|^andar.seq| | Separador de comandos |
^ | nomearquivo.seq | ^andar.seq | Executa os movimentos do arquivo selecionado (dentro da pasta 'jarvis') |
BT | — | BT | Liga/desliga a espera e conexão de um dispositivo bluetooth |
BUSY | — | BUSY | Retorna 1 se estiver "ocupado" e 0 caso o contrário |
RESET | — | RESET | Reseta a conexão Wi-Fi e espera um novo cliente |
ACC | — | ACC | Liga/desliga a aceleração gradual do movimento (recurso experimental) |
LASER | — | LASER | Liga o pino definido para o laser do braço (recurso experimental) |
DISTANCE | — | DISTANCE | Retorna a distância (em centímetros) calculada a partir de um sensor ultrasônico conectado (recurso experimental) |
# | nomearquivo.img | #kyloren.img | Exibe a imagem selecionada (dentro da pasta 'jarvis') no display OLED |
@ | nomearquivo.mp3 | @baymax.mp3 | Reproduz o som selecionado (fora da pasta 'jarvis', é necessário estar na raiz do armazenamento ou SD) |
Como o nome diz, os “recursos experimentais” são testes que fiz e que não são fundamentais para o funcionamento básico. Os “—” no parâmetro significa que não há nenhum parâmetro. Os parâmetros entre [] (colchetes) são opcionais e entre () (parênteses) são obrigatórios. A-P significa, qualquer letra de A até P (A, B, C, D, E, …, P) e o mesmo vale para valores de 0-180 (0, 1, 2, 3, 4, …, 180).
Estes comandos podem ser enviados a partir do Monitor Serial (no Arduino IDE/Visual Studio) ou através de uma conexão TCP. A partir da conexão Bluetooth, por enquanto, só é possível enviar o comando de executar as posições de um arquivo (o circunflexo acima, ^), isso porque o app que tenho usado no celular Android (AMR Gestures), para enviar comandos a partir de desenhos na tela, já envia com um ^ na frente, então decidi aproveitar este recurso. Voltando ao caso da conexão, uma vez que você grave o software na Linkit ONE, não precisará usar o cabo USB para controlá-lo, bastando haver um roteador disponível (que você configura no código) e que você saiba o IP que foi obtido. Com esta possibilidade, você pode desenvolver facilmente em qualquer linguagem/sistema o software de controle. Para facilitar, por exemplo, desenvolvi em .NET o software no qual posso gerenciar e criar os movimentos, que também disponibilizarei em breve.
A execução consiste em um loop que espera chegar dados na porta serial, ou na conexão TCP, ou na conexão Bluetooth (salvo a observação do parágrafo anterior) e as executa. É feito um processamento de strings para separar o que é o comando, parâmetros, etc. Essa parte do processamento é a mais trabalhosa (digo em questão de CPU) e se estivéssemos usando um Arduino comum com certeza demoraria muito (se é que seria possível, devido à pouca memória disponível). Ainda preciso fazer muitas otimizações neste quesito, portanto sugestões serão muito bem-vindas, após a publicação do código.
Ah, e a imagem deste post é dedicada à minha gata (Marie) que ficou passeando na frente do monitor e dormindo no teclado enquanto eu tentava escrever, rsrsrsrs.
One thought on “Protocolo”