Tutorial: Como utilizar a Spider Controller para controlar vários servos

Olá Garagistas! Neste tutorial mostraremos como você pode utilizar a Spider Controller para controlar vários servos. Como demonstração utilizaremos 4 servos para agitar bandeiras do Brasil, onde através de potenciômetros faremos o controle do tempo de acionamento entre um servo e o outro e também do tempo de alteração de posição do servo.

Material Utilizado:

Spider Controller

4x Servo - Motor Pequeno

2x Potenciômetro 10K

1x Protoboard

Alguns Jumpers

Fonte 6V/2A

1. Spider Controller

Imagem 1 - Spider Board


A Spider Controler possui um ATmega2560 em sua placa, e esse microcontrolador já vem com o bootloader do Arduino Mega nele, com isso você além de poder controlar 48 Servos (Pequeno), também irá poder utilizar os pinos de I/O, entrada analógica como se fosse uma placa Arduino tradicional e também usar a própria interface Arduino IDE para programá-la.
Essa placa é perfeita para robôs que exijam um grande número de servos, como o hexapods e robôs humanóides.

2. Montagem

Figura 1 - Montagem

3. Sketch


#include <Servo.h>

Servo servo_1; //Cria uma instância da biblioteca Servo.h para servo_1
Servo servo_2; //Cria uma instância da biblioteca Servo.h para servo_2
Servo servo_3; //Cria uma instância da biblioteca Servo.h para servo_3
Servo servo_4; //Cria uma instância da biblioteca Servo.h para servo_4

int anteriorMillis=0; //Variável para controle de tempo
int next=0; //Variável para contagem de acionamento

int i1=0; //Variável de contagem para armazenar posição do servo1
int i2=0; //Variável de contagem para armazenar posição do servo2
int i3=0; //Variável de contagem para armazenar posição do servo3
int i4=0; //Variável de contagem para armazenar posição do servo4

int pot_intervalo = 0; //Variável para armazenar o intervalo de acionamento de um servo para outro
int pot_atualiza = 0; //Variável para armazenar o intervalo de atualização da posição dos servos;

void setup()
{
  servo_1.attach(30); //Atribui o servo_1 ao pino D30
  servo_2.attach(31); //Atribui o servo_2 ao pino D31
  servo_3.attach(32); //Atribui o servo_3 ao pino D32
  servo_4.attach(33); //Atribui o servo_4 ao pino D33

  servo_1.write(0); //Posiciona o servo_1 na posição 0
  servo_2.write(0); //Posiciona o servo_2 na posição 0
  servo_3.write(0); //Posiciona o servo_3 na posição 0
  servo_4.write(0); //Posiciona o servo_4 na posição 0

    delay(500); //Aguarda 500 milissegundos
}


void loop()
{
  unsigned long atualMillis = millis(); //Armazena o tempo decorrido desde que o programa comecou a ser rodado

  pot_intervalo = 0; //Variável para armazenar o intervalo de acionamento de um servo para outro
  pot_atualiza = 0; //Variável para armazenar o intervalo de atualização da posição dos servos

  for(int i=0;i<10;i++) //Executa 10 leituras dos potenciômetro dos pinos A0 e A5
  {
    pot_intervalo = pot_intervalo + map(analogRead(A0), 0, 1023, 1, 1000); //Faz a leitura do potenciômetro ligado ao pino A0
    pot_atualiza = pot_atualiza + map(analogRead(A5), 0, 1023, 1, 10); //Faz a leitura do potenciômetro ligado ao pino A5
  }

  pot_intervalo = pot_intervalo/10; //Tira a média do valor lido pelo potenciômetro no pino A0
  pot_atualiza = pot_atualiza/10; //Tira a média do valor lido pelo potenciômetro no pino A5

  if(atualMillis - anteriorMillis > pot_intervalo) //Se o tempo decorrido for maior que 1000 milissegundos
  {
    anteriorMillis = atualMillis; //Armazena o valor atual de Millis em anteriorMillis
    next++; //Habilita o próximo servo
  }

  servonext(); //Executa a função servonext();
  delay(pot_atualiza); //Aguarda pelo tempo determinado pelo o valro do potenciômetro
}


void servonext()
{
  if(next > 0 && i1<360)//Se next for maior que 0 e i1 menor que 360
  {
    if (i1>179) servo_1.write(360-i1); //Se i1 for maior que 179, atualiza a posição do servo para (360-i1)
    else servo_1.write(i1); //Senão atualiza a posição do servo para i1
    i1++; //Incrementa i1
  }

  if(next > 1 && i2<360)//Se next for maior que 1 e i2 menor que 360
  {
    if (i2>179) servo_2.write(360-i2); //Se i2 for maior que 179, atualiza a posição do servo para (360-i1)
    else servo_2.write(i2); //Senão atualiza a posição do servo para i2
    i2++; //Incrementa i2
  }  

  if(next > 2 && i3<360)//Se next for maior que 2 e i3 menor que 360
  {
    if (i3>179) servo_3.write(360-i3); //Se i3 for maior que 179, atualiza a posição do servo para (360-i1)
    else servo_3.write(i3); //Senão atualiza a posição do servo para i3
    i3++; //Incrementa i3
  }  

  if(next > 3 && i4<360)//Se next for maior que 3 e i4 menor que 360
  {
    if (i4>179) servo_4.write(360-i4); //Se i4 for maior que 179, atualiza a posição do servo para (360-i1)
    else servo_4.write(i4); //Senão atualiza a posição do servo para i4
    i4++; //Incrementa i4

    if(i4>359) //Se i4 for maior que 359
    {
      asm volatile("jmp 0 "); //Reinicia a programação
    }
  }
}

Referências:

https://www.sparkfun.com/products/11498

Exibições: 2873

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Bruno Alberto Guimaraes em 10 janeiro 2015 às 14:20

muito bom   , sera que da pra ligar controle de ps2 wireless em arduino mega

Comentário de gilberto fructos em 1 junho 2014 às 19:05

muito legal

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço