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.

Exibições: 1490

Responder esta

Respostas a este tópico

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

RSS

© 2023   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço