Criando movimentos – Homúnculo

Criando movimentos

Criar movimentos poderá exigir um certo grau de paciência e um processo de teste e correção. Como não dispomos de servos que nos informem suas posições, temos que ir na tentativa e erro para fazer ele se movimentar (por enquanto).
Um dos problemas ao começar a fazer isso é a velocidade com que os servos se movimentam. Caso ele vá muito rápido, podemos não ter o movimento desejado ou causar seu desequilíbrio. Porém, não temos como controlar a velocidade, já que ela depende totalmente do servo, uma vez que ele tentará, o mais rápido possível, alcançar a posição que determinamos. O que se pode fazer é “quebrar” esse movimento em passos menores e dar uma pequena pausa entre esses passos, o que fará com que ele vá “mais devagar”. Por exemplo, se você quer ir de 0 a 180º, em 5 passos, você teria que ir incrementando 36 (180 dividido por 5):
0 -> 36 -> 72 -> 108 -> 144 ->180
Só que isso é particularmente mais complicado quando se é necessário mexer mais de um servo simultaneamente, primeiro porque o incremento não vai ser o mesmo para todos os servos, e além disso você precisa conhecer a posição atual deles para poder calculá-lo. Supondo dois servos (A e B), onde A está na posição 50º atualmente e B está na posição 20º, e você quer que A vá para 150º e B vá para 160º em 4 passos, os valores seriam:
incremento de A = (150-50)/4 = 25
incremento de B = (160-20)/4 = 35
A50 -> B20 -> A75 -> B55 -> A100 -> B90 -> A125 -> B125 -> A150 -> B160
Repare que os movimentos são intercalados entre A e B, caso contrário, B só se movimentaria depois que A tivesse completado, e nosso intuito é movê-los de forma simultânea. E nem sempre o incremento será positivo, pois você pode ir para “trás”, ou seja, de 120º para 50º, por exemplo. Outro detalhe é que não temos como saber a posição atual do servo (a não ser que a tenhamos definido antes e guardado esse valor), pois não temos como solicitar do servo qual é a sua posição atual (até tem como, mas você precisa abrir o servo e colocar um fio a mais vindo do potenciômetro, para ler seu valor; além de dar um trabalho danado, também não é muito preciso).
A princípio, quando a placa é iniciada e nenhum movimento é executado, todos servos tem suas posições desconhecidas. O mesmo ocorre quando executamos o comando OFF, que desliga todos os servos. A partir do momento que fazemos algum movimento nos servos, a última posição atual de cada um deles fica armazenado no vetor lastpulse. Baseando-se nestas posições armazenadas é que a rotina moveServos() consegue fazer esses cálculos (vide o código-fonte Jarvis.ino).
O importante neste caso é saber que o primeiro movimento de cada servo *não* tem como ser suave, já que não se tem a informação da posição anterior dele. Portanto, é importante que haja um “movimento inicial” antes de se tentar fazer outros movimentos (para se ter uma base para se começar). É justamente para isso que servem os arquivos inicial.seq, inicial_pernas.seq, inicial_bracos.seq e inicial_cabeca.seq. Eles definem o movimento inicial, o “acordar” dele, colocando o mesmo em uma posição a partir das quais faremos outros movimentos. Isso é importante não apenas para que se possa ter a suavidade dos outros movimentos, mas também para termos o desejado equilíbrio. Se você tentar movimentar as pernas com os braços totalmente soltos (desligados) verá que dependendo da inclinação eles poderão se mexer e comprometer o equilíbrio.
Como os ajustes dos seus servos com certeza serão diferentes dos que usei, você certamente perderá horas fazendo ajustes nos arquivos .seq para obter os mesmos movimentos. Por isso, aconselho começar pelos arquivos que começam com “inicial” e depois partir para os outros.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Translate »