Controlando Micro Servo 9g usando Joystick 20

Quem começa a mexer com servo motores no Arduino geralmente tem, como um dos primeiros projetos, controlar o ângulo de rotação do motor usando um potenciômetro, ou utilizar botões para girar o eixo para a direita ou para a esquerda.

Hoje mostraremos uma outra alternativa, que é o uso de um Módulo Joystick para controle de Micro Servos 9g, itens disponíveis para compra na loja FILIPEFLOP:

O módulo joystick trabalha com potenciômetros para definir o deslocamento dos eixos X e Y, e um push button para o eixo Z. Cada um deles se comunica com o Arduino por meio de um pino específico (VRx para o eixo X, VRy para o eixo Y e SW para o botão), e a alimentação do circuito é de 5V.

O servo que vamos utilizar, o micro servo 9g, é muito utilizado em aeromodelismo e projetos de robótica por seu tamanho e peso reduzidos, que não comprometem o torque e o desempenho do motor:

Micro Servo 9G

Ligação do Joystick ao Arduino

No nosso circuito, vamos ligar dois servo motores ao Arduino, controlando um deles pelo movimento do eixo X do joystick, e outro pelo movimento do eixo Y. Esse tipo de ligação pode ser utilizado com um Suporte Pan/Tilt (abaixo), muito usado em câmeras de monitoração. Nesse tipo de dispositivo, é utilizado um servo motor para controlar a rotação da base, e outro para alterar a inclinação da câmera :

Suporte Pan Tilt

A ligação do joystick ao Arduino e também aos dois servo motores pode ser feita dessa maneira:

Circuito Joystick - Servo - Pan/Tilt

Programa controle Pan/Tilt

Como o joystick é formado basicamente por dois potenciômetros e um push button, não há necessidade de utilizar bibliotecas específicas para o módulo. Já para o servo, vamos utilizar a biblioteca VarSpeedServo, disponível neste link.

A biblioteca VarSpeedServo permite controlar a velocidade de movimentação do servo motor, o que não é possível com a biblioteca Servo original embutida na IDE do Arduino. Na VarSpeedServo, utilizamos o comando abaixo para definição da porta e das velocidades minima e máxima (entre 0 e 255) de cada servo:

nome_servo.attach( porta, velocidade minima, velocidade maxima)

Para movimentação do motor, simplesmente definimos a posição e a velocidade:

nome_servo.slowmove( posição, velocidade)

Criamos então dois objetos servo dentro do programa. Um é o servo_base, utilizando a porta 7 do Arduino, e o outro o servo_inclinacao, utilizando a porta 8. Dentro do loop, são lidos os valores recebidos dos potenciômetros (eixo X, porta analógica 4 e eixo Y, porta analógica 5), que são usados para movimentar o servo correspondente dentro do limite de 180 graus.

Lembre-se de que você ainda tem disponível o botão do joystick (pino SW), para incluir novas funções no programa.

Gostou ? Conte-nos sua experiência com este post e visite nossa loja FILIPEFLOP !

Posts Relacionados

Deixe uma resposta

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

20 Comentários

  1. Olá gostaria de agradecer este projeto, mas gostaria de saber como posso duplicar o mesmo código (2 joysticks controlando 4 servo motores). Se puder me ajudar eu agradeço

    1. Bom dia Phelippe,

      Obrigado. Você pode utilizar esse código como base e duplicá-lo para controle de 4 motores. Se forem motores DC, sugiro a leitura desse artigo :

      http://blog.filipeflop.com/motores-e-servos/controle-motor-dc-12v-com-motor-shield.html

      Lá explicamos como utilizar o motor shield, que aceita até 4 motores DC.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  2. Ótimo post, e também gostaria de saber se você conhece alguma loja onde posso adquirir um suporte para servo, semelhante ao da primeira figura, muito obrigado, site é 10

  3. Cara muito show! to precisando que na hora em que eu soltar o joystick o servo não retorne para posição
    inicial, mas permaneça na posição que está. tem como?desde já agradeço!!!Valew!

    1. Boa tarde Rael,

      O que você pode fazer é travar as variáveis do programa, para que quando ele volte á posição central do joystick ele não mexa no Servo.

      Abraço.

      Adilson – Equipe FILIPEFLOP

      1. como se faz isso por favor.

    2. Muito bom o tutorial. Alterei o seu código para permitir usar o joystick como ajuste final, sem o servo retornar junto com o joy.
      Caso alguém se interesse:

      //Programa : Controle servo motor com joystick
      //Autor : FILIPEFLOP modificado por SJS para nao retornar ao ponto medio em conjunto com o joy

      #include

      #define HORIZ_SERVO_PIN 10
      #define VERT_SERVO_PIN 9
      #define KEY_JOY_PIN A0 //CLICK DO JOYSTICK
      #define HORIZ_JOY_PIN A1
      #define VERT_JOY_PIN A2

      //544 = 0, 2400 = 180 graus
      //RESTRICOES FISICAS H: 700-2400 V: 750-1500
      #define MID_POINT_HORIZ 1600 //Middle point for LR Servo; only used if there is no existing calibration
      #define MID_POINT_VERT 1000 //Middle point for UD Servo; only used if there is no existing calibration
      #define INF_POINT_HORIZ 1925 //Left-Bottom point for LR Servo; only used if there is no existing calibration
      #define INF_POINT_VERT 800 //Left-Bottom point for UD Servo; only used if there is no existing calibration
      #define MIN_AMPL_SERVO_H 700
      #define MAX_AMPL_SERVO_H 2000
      #define MIN_AMPL_SERVO_V 750
      #define MAX_AMPL_SERVO_V 1500

      //range: 0-1023
      #define MID_POINT_JOY_H 500 //posicao de repouso do joy
      #define MID_POINT_JOY_V 493
      #define TOLERANCIA_JOY 3 //tolerancia entre as leituras do joy
      #define FATOR_JOY 0.1 //fator de sensibilidade do joy

      Servo servo_horiz;//Cria objeto para controlar o servo base
      Servo servo_vert;

      int val_x; //Armazena o valor do eixo X
      int val_y;
      int ult_val_x = MID_POINT_JOY_H;
      int ult_val_y = MID_POINT_JOY_V;

      void setup(){
      servo_horiz.attach(HORIZ_SERVO_PIN, MIN_AMPL_SERVO_H, MAX_AMPL_SERVO_H);//Define a porta a ser ligada ao servo base
      servo_vert.attach(VERT_SERVO_PIN, MIN_AMPL_SERVO_V, MAX_AMPL_SERVO_V);

      servo_horiz.write(MID_POINT_HORIZ);//Move o servo base para a posicao definida pelo joystick
      servo_vert.write(MID_POINT_VERT);
      }

      void loop() {
      val_x = analogRead(HORIZ_JOY_PIN);//Recebe o valor do joystick, eixo X
      val_y = analogRead(VERT_JOY_PIN);

      val_x -= MID_POINT_JOY_H; //diferenca a ser movida
      if(abs(val_x) > TOLERANCIA_JOY){ //se a diferenca e grande
      val_x = int(val_x * FATOR_JOY) + ult_val_x; //somando aa ultima posicao relativa
      // val_x = map(val_x, 0, 1023, 1, 180);//Converte o valor lido para um valor entre 1 e 180 graus
      ult_val_x = val_x;
      val_x = map(val_x, 0, 1023, MIN_AMPL_SERVO_H, MAX_AMPL_SERVO_H);
      servo_horiz.write(val_x);
      }
      val_y -= MID_POINT_JOY_V; //diferenca a ser movida
      if(abs(val_y) > TOLERANCIA_JOY){
      val_y = int(val_y * FATOR_JOY) + ult_val_y; //somando aa ultima posicao relativa
      ult_val_y = val_y;
      DEBUG_PRINTc(“Servo val_y: “, val_y, __LINE__);
      val_y = map(val_y, 0, 1023, MIN_AMPL_SERVO_V, MAX_AMPL_SERVO_V);
      servo_vert.write(val_y);
      }

      delay(250);//Aguarda a movimentacao do servo e reinicia a leitura
      }

      1. Damn…
        * como ajuste FINO

      2. Bom Dia SJS
        gostei da sua alteração no projeto.
        preciso justamente disto, de quando soltar o joystick o servo não retorne a posição Zero,
        Porém, não conseguii compilá-lo e gostaria que se possivel me enviasse novamente o cogido para colocar no software arduino

  4. obrigado!desculpe a ignorância mas é que estou iniciando no arduino, como faço pra travar as variáveis conforme vc falou?ah e estou usando um sensor shield v4.0 para conectar os servos(arduino mega), poderia me enviar um exemplo de código?eu agradeço e muito desde já valew mesmo!!!!!

  5. como colocar um motor dc junto no programa ?? podia me dar um exemplo ?? obrigado !!

  6. Boa tarde
    Pessoal, sabem me informar se consigo posições intermediários de posicionamento de um servo motor ( mg 996r) preciso posiciona-lo em 100 graus… consigo essa posição ajustando a largura do pulso apenas?

  7. Boa noite!
    Gostei do texto.
    Montei e funcionou bem.
    Mas, os motores ficam funcionando mesmo quando não toco no joystick.
    Isso faz tremer o tilt.
    Alguém sabe resolver?

  8. Podia ter um tutorial só de como montar esse suporte pan-tilt, sofri aqui! D=

  9. Como iniciante em arduíno e também em blog seguo o tutorial acima para acionar 2 servos

    com o Joystick mas eles não responderam aos comandos

    Parece que há necessidade de mesclar os sketchs antes individuais para que tenha êxito.

    Sendo o caso , como seria o novo*SKETCH ?
    oBRIGADO

  10. Excelente. Tem como adicionar um transmissor para comandar a distância?

  11. Olá sou seguidor do site gosto muito de seus projetos parabens !
    Uma duvida como alterar o sketch para os servos movimentarem mas rapido ?

    1. servo_inclinacao.attach(x, 1, 180);. Altere o valor “x”, pois ele indica tempo.

  12. Para este servo eu não preciso da ponte H então?

  13. Olá,
    No texto diz “utilizamos o comando abaixo para definição da porta e das velocidades minima e máxima (entre 0 e 255) de cada servo”. Porém nas linhas 19 e 21, foram utilizados 1-180 como minimo e maximo do motor ao invés de 0-255.

    19 servo_base.attach(7, 1, 180);
    21 servo_inclinacao.attach(8, 1, 180);

    Isso se deu apenas por uma escolha pessoal? Eu poderia realmente utilizar de 0-255?

    Grato desde já!