Boa noite garagistas.
seguinte...
eu estou pegando o ângulo X e Y do acelerometro e controlando dois servos.
até aí tudo bem, funciona...
so que o X ( na horizontal) está rodando o servo para o outro lado...
quando eu coloco pra esquerda o servo vai pra direita e vice versa.
alguem que ja mecheu com isso ou tem idéia do que eu posso fazer pra consertar isso?
bem, é isso.
Obrigado.
Tags:
o que vc quer é que quando vc coloque pra esquerda, o servo vire pra esquerda, e pra direita, ele vire pra direita?
multiplica o valor recebido do acelerometro por (-1) que vc inverte ;)
ou ainda, vire o acelerometro 180º no eixo x... tipo, vc ja jogou Wii? se vc segurar o nunchuck ao contrario, ele vai ter os comandos de torçao invertidos... se aplica no seu projeto, se vc esta recebendo os dados ao contrario, só virar o acelerometro pra outra direçao ;)
claro que eu chutei, eu nao sei qual o range de valores que seu acelerometro te retorna... talvez, se vc der uma explicada melhor...
Olá, Wagner.
obrigado pelas respostas.
eu estou recebendo do acelerometro valores entre 65 a 220 e passando pro servo.
myservo.write( map(ace_x, 65,220,0,180));
dessa maneira ele está funcionando, mas como eu falei, se eu coloco pra esquerda ele vai pra direita...
Obrigado.
de quanto a quanto vc considera "direita" ou "esquerda"?
depois do almoço posto um exemplo de um controle que fiz usando o acelerometro do nunchuck, deve servir como base pra ideias, pelo menos...
ahh, tranquilo, Wagner.
o acelerometro que estou usando eh do NunChuck tb hehehe
qualquer coisa estou pro aqui.
Abraços.
bom, meu codigo ta uma bagunça, mas eu vou resumir so com a parte do acelerometro... estou controlando 2 motores, é um "tanque":
#include <Wire.h>
#include "nunchuck_funcs.h"
int E1 = 6;
int M1 = 7;
int E2 = 5;
int M2 = 4;
int acelera=0;
int direcao=0;
int minimo=10;// minimo pra ser considerado comando
...
void setup()
{
Serial.begin(19200);
nunchuck_setpowerpins();
nunchuck_init(); // send the initilization handshake
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
Serial.print("Controles OK\n");
}
void loop()
{
if( loop_cnt > 10 ) { // every 100 msecs get new data
loop_cnt = 0;
nunchuck_get_data();
accx = nunchuck_accelx();
accy = nunchuck_accely();
accz = nunchuck_accelz();
joyx = nunchuck_joyx();
joyy = nunchuck_joyy();
zbut = nunchuck_zbutton();
cbut = nunchuck_cbutton();
acelera=accy -125; //(teoricamente eu recebo 0 a 255, mas na pratica nao é assim, ehehe, eu defini que 125 é a metade aproximada)
direcao=accx -125;
acelera=acelera*(-1);//gambi, motor invertido
if(direcao>=5 or direcao<=(-5)){ //aqui, o 5 é uma tolerancia(porque é dificil manter o acelerometro precisamente no centro) que defini pra deixar o motor desligado, altere a gosto... alem disso tem mais uma tolerancia na variavel "minimo"
if(direcao<0){
motord=direcao*(-1);
motore=direcao;
}
if(direcao>0){
motore=direcao;
motord=direcao*(-1);
}
}else{
motore=0;
motord=0;
}
motore=motore+acelera;
motord=motord+acelera;
if(motore>0){
digitalWrite(M1,HIGH);
}else{
digitalWrite(M1,LOW);
}
if(motord>0){
digitalWrite(M2,HIGH);
}else{
digitalWrite(M2,LOW);
}
if(motore<0){
motore=motore*(-1);
}
if(motord<0){
motord=motord*(-1);
}
if(motore>minimo){
analogWrite(E1, motore); //controle de velocidade PWM
}else{
digitalWrite(E1, 0);
}
if(motord>minimo){
analogWrite(E2, motord); //controle de velocidade PWM
}else{
digitalWrite(E2, 0);
}
e blablabla... explicando
eu recebo de 0 a 255, vc pode considerar o mesmo no seu caso
por aproximaçao e observaçao do debug do que o serial.print do acelerometro me devolvia, eu defini que a "metade", o estado "parado" do acelerometro é 125
entao, valores abaixo de 125 eu defini "esquerda", e maiores "direita", vc pode fazer o emsmo pra "frente" e "tras", enfim, o que vale aqui é o principio. e vc pode fazer de varias maneiras
if(valor<125){
vai pra frente, meu filho
}else{
vai pra tras
}
meu codigo é meio confuso, porque alem de controlar a direçao, eu controlo velocidade e tal, mas da pra vc sacar como eu "recolhi" os dados do nunchuck e apliquei...
olha um video do meu codigo rolando:
http://www.youtube.com/watch?v=v9OYgpIR6bg
isso aí, espero ter te dado uma "luz" :D
ps, se no seu caso esta funcionando, apenas invertido... faça um controle de fluxo do tipo
if(mandou ir pra direita){
manda ir pra esquerda;
}
e vice versa... é "feio", mas resolve, ehehhe
aew Wagner.
Consegui...era simples e eu nao tinha reparado.
apenas troquei isso:
myservo.write( map(ace_x, 65,220,0,180));
por isso
myservo.write( map(ace_x, 65,220,180,0));
Obrigado mais uma vez.
Abraços
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por