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:
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:
Comentar
muito bom , sera que da pra ligar controle de ps2 wireless em arduino mega
muito legal
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)