AD4M4ST0R – controlo por joystick

This post is part 7 of 9 of  AD4M4ST0R - um rover LEGO

Apenas uma breve explicação do modo como o rover é controlado quando em modo ‘joystick’:

É utilizado apenas o joystick da direita, correspondente ao par de eixos 2 (horizontal) e 3 (vertical). A «potência» aplicada aos motores vai ser proporcional ao movimento do joystick portanto aos valores lidos nos eixos e que podem variar entre -1.0 e +1.0 sendo que no caso do eixo vertical estão invertidos (o sentido positivo é para baixo). Assim:

(x,y) = (axis2, -axis3)

Defini uma zona morta ao redor da posição central (10% portanto entre -10.0 e +10.0 para ambos os eixos) de modo a que pequenos toques no joytick sejam ignorados:

Diagram2

Além disso para evitar acelerações bruscas optei por dar mais importância às amplitudes menores que às maiores (como numa torneira em que se tem que rodar cada vez mais a torneira para se aumentando o caudal de água). Isso consegue-se aplicando uma função logarítmica:

f(x,y) = log10(100x,100y)

Não existe log10(0) mas isso já está prevenido a priori porque o centro está incluído na zona morta. O menor valor fora da zona morta será 0.1 e o maior valor será 1.0 [primeiro quadrante apenas]. Ora

  • log10(100 x 0.1) = 1
  • log10(100 x 1.0) = 2

Como os motores aceitam valores entre -100 e +100 basta aplicar um factor de escala de 50x para cobrir a gama toda. Mas no meu programa usei um factor de 25x apenas porque achei que o rover movia-se demasiado rápido [estou a pensar definir um botão do gamepad para comutar entre 25x e 50x para movimentos de precisão vs. corridas].

As curvas ocorrem quando o valor de x é não-nulo e nessas ocasiões reduzo o motor correspondente em 33% do valor de x (se quisermos curvas mais apertadas basta aumentar este valor).

O resto do código é apenas identificação dos quadrantes de modo a acertar os sinais dados aos motores.

Series Navigation<< AD4M4ST0R – medindo luminosidadeAD4M4ST0R – minor update >>

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *