Ola, sou meio novo na área das  postagens e no fórum(eu leio algumas discussões ^^). 

Tive dificuldades para controlar o servo com a acelerômetro então to postando aqui um simples tutorial para quem quiser controlar servo com acelerômetro  E como é difícil de achar um material eu vou postar aqui para ajudar o pessoal e compartilhar conhecimento.

No projeto eu utilizei 1 acelerômetro MMA7361L e 2 Servo motor TOWER PRO SG-5010, era para fazer o controle de 1 copo com liquido em cima de uma plataforma(ela ficou muito pesada), e essa plataforma variava nos eixos X e Y e estava em cima de um carrinho que se deslocava em um percurso com obstáculos.

Quando eu apenas faço a leitura do acelerômetro não varia muito com esse código, mas quando utilizo o servo ele começa a variar um pouco.

No meu caso foi que coloquei muito peso em cima do eixo do servo então o PC não conseguia fornecer corrente o suficiente para o Arduino poder controlar o servo e começava a tremer, para parar com isso tive que utilizar uma bateria LiPO 2A/h.

Então estou postando o código que serve para controlar os servos com o acelerometro, não vai precisar de plataforma nem nada só descrevi isso pois foram algumas dificuldades que tive e então estou postando para diminuir a dor de cabeça.

Segue o código:

#include <Servo.h> //Adciona a biblioteca para utilizar servo motor.


Servo Servo_Y; //Objeto de controle do servo em relação ao eixo x.


Servo Servo_X; //Objeto de controle do servo em relação ao eixo y.


int Eixo_X,Eixo_Y; //Variaveis que irão armazenar a leitura do eixo x e y do acelerometro.


int Medicao1[15],Media_X; //Medicao1[15] é um vetor com 15 posicoes onde cada posicao ira armazenar
//uma leitura do eixo x do acelerometro e Media_X ira armazenar a média das 15 leituras


int Medicao2[15],Media_Y; //Medicao2[15] é um vetor com 15 posicoes onde cada posicao ira armazenar
//uma leitura do eixo y do acelerometro e Media_y ira armazenar a média das 15 leituras


int i,j; //Essas variaveis irão fazer a contagem das medicoes e quando chegar a 15 que é o limite,
//retorna para o comeco onde serao feitas 15 novas medicoes.


int Pino_Sleep = 8; //Variavel que recebe o valor do pino sleep do acelerometro,
//para sair do modo de espera e funcionar corretamente que esta conectado
//no pino 8 do Arduino.


void setup()
{

Serial.begin(9600); //Funcao que inicia a comunicacao serial com 9600 baud.


pinMode(Pino_Sleep, OUTPUT); //Define o pino 13 do Arduino como saida.


digitalWrite(Pino_Sleep, HIGH); //Envia 5V para o pino sleep do acelerometro
//assim ele sai do modo de espera.


Servo_X.attach(10); //Atribui o obejto do servo ao pino 10.
Servo_Y.attach(9); //Atribui o obejto do servo ao pino 9.


i=0; //Variavel i recebe o valor 0.
j=0; //Variavel j recebe o valor 0.

}


void loop() 
{

//Medicao de inclinacao no eixo X
Eixo_X = analogRead(0); //Variavel Eixo_X Armazena o valor da leitura do canal 0,
//onde esta conectado o eixo x do acelerometro.


Medicao1[i]=Eixo_X; //Aqui atribui a variavel i onde ira receber as 15 amostras de leitura.


//Tira a media das 15 leituras(amostras).
Media_X=(Medicao1[0]+Medicao1[1]+Medicao1[2]+Medicao1[3]+Medicao1[4]+Medicao1[5]+Medicao1[6]+Medicao1[7]+Medicao1[8]+Medicao1[9]+Medicao1[10]+Medicao1[11]+Medicao1[12]+Medicao1[13]+Medicao1[14])/15;
i++; //Incrementa ate a leitura 15.


if(i>=15)i=0;//Se atingir ou igualar a 15 amostra de leitura retorna a 0 para começar mais 1 ciclo.


Media_X=map(Media_X,171,499,180,0); //Os valores da media da leitura variam numa faixa de 202 a 506,
//onde são convertidos na faixa de 0 a 180 para poder sincronizarem
//com os angulos do servomotor em relacao ao eixo X.


Servo_X.write(Media_X); //Avisa o servo para ir na posição armazenada na variavel "Media_X",
//no caso conforme o valor do acelerometro varia de 0 a 180
//o servo vai na posição.


//Medicao de inclinacao no eixo Y
Eixo_Y = analogRead(1); //Variavel Eixo_Y Armazena o valor da leitura do canal 1,
//onde esta conectado o eixo Y do acelerometro.


Medicao2[j]=Eixo_Y; //Aqui atribui a variavel j onde ira receber as 15 amostras de leitura.


//Tira a media das 15 leituras(amostras).
Media_Y=(Medicao2[0]+Medicao2[1]+Medicao2[2]+Medicao2[3]+Medicao2[4]+Medicao2[5]+Medicao2[6]+Medicao2[7]+Medicao2[8]+Medicao2[9]+Medicao2[10]+Medicao2[11]+Medicao2[12]+Medicao2[13]+Medicao2[14])/15;


j++; //Incrementa ate a leitura 15.


if(j>=15)j=0;//Se atingir ou igualar a 15 amostra de leitura retorna a 0 para começar mais 1 ciclo.


Media_Y=map(Media_Y,184,511,180,0); //Os valores da media da leitura variam numa faixa de 202 a 506,
//onde são convertidos na faixa de 0 a 180 para poder sincronizarem
//com os angulos do servomotor em relacao ao eixo Y.


Servo_Y.write(Media_Y); //Avisa o servo para ir na posição armazenada na variavel "Media_Y",
//no caso conforme o valor do acelerometro varia de 0 a 180
//o servo vai na posição.


//Envia os dados da variavel Media_X para a serial, para poder ler os angulos de inclinação pela serial
Serial.print(" Eixo X: ");
Serial.print(Media_X);


//Envia os dados da variavel Media_Y para a serial, para poder ler os angulos de inclinação pela serial
Serial.print(" Eixo Y: ");
Serial.println(Media_Y);
delay(1); //Faz um ciclo de leitura a cada 1 milisegundos.

}

Eu tive problemas com o pino de sleep(demorei pra descobri também) do acelerômetro também então liguei ele no 3V3 direto(junto com a alimentação do acelerômetro). Em relação ao mesmo, se você conectar ele direto ao 3V3 nem precisa de enviar os 5V, mas, caso for fazer que nem eu de mandar 5V conecte um resistor para diminuir a tensão para 3V3. Eu tinha usado um de 4.7K(funciona) só que o servo fica tremendo. Não mande 5V pois o acelerometro começa a aquecer, não achei isso normal então recomendo usar 3V3.

Nos valores da função map eu utilizei 184,511 no servo 2 e 171,499 no servo1. pois era a faixa que variava no meu acelerômetro, no caso de vocês terão que ver qual faixa que varia e substituir. Para ver a faixa é só comentar a linha "Servo_Y.write(Media_Y);"(pois ja não esta mais sincronizado com o servo)  e para o eixo X a mesma coisa. 

Para inverter a direção do servo, se tiver de 0,180 poem 180,0.

Eu utilizei 15 medições, mas com umas 10 estabiliza e com 5 ele fica tremendo.

No tempo eu coloquei 1 ms(no meu caso não tremeu muito), mas, com 50 ou 25 fica bom também. 

Segue mais alguns links aqui que achei sobre leitura de tensão e angulo e estou postando um arquivo que o cara também controla servo utilizando um outro código(eu não achei o link), esta em inglês.

Nesse link ele mostrou como fazer a ligação e utilizou um exemplo da biblioteca do acelerômetro:

http://www.geeetech.com/wiki/index.php/MMA7361_Triple_Axis_Accelero...

Neste aqui ele lê a tensão em cada eixo e tem um exemplo em ângulos que variam de -90 a 90( fica de -78 a -85 ate 76 a 85) não é uma precisão de -90 a 90 certinha mas da pa quebra o galho.

http://www.dfrobot.com/wiki/index.php/Triple_Axis_Accelerometer_MMA... 

Vou ficar devendo o esquema elétrico agora mas vou ver se consigo mais pra frente posta-lo.

Para avisar não precisa utilizar a bateria para alimentar, eu utilizei pois era um carro e também tinha carga em cima do eixo do servo(como descrevi no começo sobre o PC também).

Então é isso ae, caso tenham alguma duvida, correção de alguma coisa, etc é só postar. Eu vou conseguir responder mais no período da noite pois trabalho a tarde.

Abraço.

Exibições: 2414

Anexos

Responder esta

Respostas a este tópico

Marcelo, você alimentou seus servos e o arduino com a mesma bateria?

Não, usei uma bateria para os servos e uma para o arduino, pois era grande o eixo que eu tinha que movimentar e o servo estava consumindo muita corrente.

Ate +

Sério? Eu não estou conseguindo alimentar dois servos com uma bateria de 9 V =/

Bom eu usei uma bateria de 2A/h, Que projeto você esta fazendo? Essa bateria de 9V é comum(Duracell)? Qualquer coisa mande o esquema elétrico.

Eu estava usando baterias de 9 volts comuns, não era duracel. Fiz um rapidinho aqui no paint.


 vc acha que duas pilhas dessa em série resolvem o meu problema?

Hi Erick, I really appreciate your input, so thank you for that.

Do you have any sketch of the circuit. Cause I saw you have two pins for "Pin sleep".

Thanks again.

Kind Regards.

Hi Erick, I really appreciate your input, so thank you for that.

Do you have any sketch of the circuit. Cause I saw you have two pins for "Pin sleep".

Thanks again.

Kind Regards.

Jonatan

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço