• Welcome to LusoRobótica - Robótica em Português.
 

Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"

Started by megamartinelle, 27 de September de 2015, 17:50

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

jm_araujo

Tens que aprender a programar, senão torna-se difícil de encontrar onde estão os erros e torna mais difícil pequenas alterações ou adições (como devia ser adicionar alguns eixos).
Tive um bocadinho no almoço e "refiz" o teu código da primeira mensagem.

#include <Servo.h>

#define NUMERO_AMOSTRAS 15
#define NUMERO_EIXOS 3

//Pinos
enum{
    PinoSleep = 8
};
static const int PinoServo[NUMERO_EIXOS]={10,9,11}; 
static const int PinoAcelerometro[NUMERO_EIXOS]={0,1,2};

//Definições dos Eixos
static const char NomeEixos[NUMERO_EIXOS]={'X','Y','Z'};
static const int MapEixos[NUMERO_EIXOS][2]={{171,499}, //X
                                            {184,511}, //Y
                                            {184,511}}; //Z
                                           
Servo servos[NUMERO_EIXOS];   
   
int media;
int medicao[NUMERO_EIXOS][NUMERO_AMOSTRAS];

int amostra=0;

void setup()
{
    Serial.begin(9600);
    pinMode(PinoSleep, OUTPUT);
    digitalWrite(PinoSleep, HIGH);
    for(int eixo=0;eixo<NUMERO_EIXOS;eixo++) {
        servos[eixo].attach(PinoServo[eixo]);
    }
}

void loop()
{
    for (int eixo=0; eixo<NUMERO_EIXOS;eixo++) {
        medicao[eixo][amostra]=analogRead(PinoAcelerometro[eixo]);
        media=0;
        for (int i=0;i<NUMERO_AMOSTRAS;i++){
            media=media+medicao[eixo][i];
        }
        media=media/NUMERO_AMOSTRAS;
        media=map(media,MapEixos[eixo][0],MapEixos[eixo][1],180,0);
        servos[eixo].write(media);
       
        Serial.print(" Eixo ");
        Serial.print(NomeEixos[eixo]);
        Serial.print(" : ");   
        Serial.println(media);   
    }
    amostra++;
    if (amostra>=NUMERO_AMOSTRAS) amostra=0;
    delay(1);
}


Qual te parece mais legível e fácil de adicionar mais eixos?(resto do pessoal esteja à vontade para botar abaixo ;) )

PS:Não compilei, pode ter erros parvinhos como falta de ponto e virgulas e chavetas...

senso

Complicaste demasiado depressa, só meter uns for já ajudava, agora com arrays bi-dimensionais vais matar a cabeça ao rapaz.
Avr fanboy


jm_araujo

Quote from: senso on 29 de September de 2015, 14:44
Complicaste demasiado depressa, só meter uns for já ajudava, agora com arrays bi-dimensionais vais matar a cabeça ao rapaz.

A vantagem é que para adicionar eixos basta alterar as constantes, não se precisa de mexer mais no código, nem andar a fazer cut&pastes que sofrem de G.I.G.O. :D

megamartinelle

Galera muito obrigado pela ajuda, pretendo estudar mais programação e mais tarde postarei o resultado de como ficou e se deu certo.

megamartinelle

 jm_araujo, esse código que você me enviou já é para os 3 acelerômetros? E se não for pedir demais, tem como me enviar um arquivo falando como você chegou a esse código? Wuero entender mesmo que seja o básico.

megamartinelle

Tava estudando o código que postei e vi alguns erros e concertei. Agora ele está assim:

#include <Servo.h>

//Acelerômetro 1

Servo Servo1_Y;                               

Servo Servo2_X;

//Acelerômetro 2

Servo Servo3_Y;                               

Servo Servo4_X;

//Acelerômetro 3

Servo Servo5_Y;                               

Servo Servo6_X;

//Acelerômetro 1

int Eixo_X,Eixo_Y; //Leitura dos eixos

int Medicao1[15],Media1_Y;

int Medicao2[15],Media2_X;

//Acelerômetro 2

int Medicao3[15],Media3_Y;

int Medicao4[15],Media4_X;

//Acelerômetro 3

int Medicao5[15],Media5_Y;

int Medicao6[15],Media6_X;

int i,j,l;

int Pino_Sleep = 8;


void setup()
{
Serial.begin(9600); //Serial Monitor

pinMode(Pino_Sleep, OUTPUT);

digitalWrite(Pino_Sleep, HIGH);

//Acelerômetro 1

Servo1_Y.attach(3);
Servo2_X.attach(4);

//Acelerômetro 2

Servo3_Y.attach(5);
Servo4_X.attach(6);

//Acelerômetro 3

Servo5_Y.attach(7);
Servo6_X.attach(8);

i=0;
j=0;
l=0;
}

/////////////////////////////////// TA FODA ESSA PARTE CARAI FI

void loop()
{

///////////////////////////////////// ACELERÔMETRO 1

Eixo_X = analogRead(0);

Medicao[j]=Eixo_X;

#define AMOSTRAS 15

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++;

if(i>=15)i=0;
Media_X=map(Media_X,171,499,180,0);

Servo2_X.write(Media_X);

///////////////////////////

Eixo_Y = analogRead(1);

Medicao[j]=Eixo_Y;

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;

j++;

if(j>=15)j=0;

Media_Y=map(Media_Y,184,511,180,0);

Servo1_Y.write(Media_Y);


///////////////////////////////////// ACELERÔMETRO 2


Eixo_X = analogRead(3);

Medicao1[j]=Eixo_X;

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++;

if(i>=15)i=0;
Media_X=map(Media_X,171,499,180,0);

Servo4_X.write(Media_X);

//////////////////////

Eixo_Y = analogRead(4);

Medicao2[j]=Eixo_Y;


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++;

if(j>=15)j=0;

Media_Y=map(Media_Y,184,511,180,0);

Servo3_Y.write(Media_Y);


///////////////////////////////////// ACELERÔMETRO 3

Eixo_X = analogRead(3);

Medicao[j]=Eixo_X;

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++;

if(i>=15)i=0;
Media_X=map(Media_X,171,499,180,0);

Servo6_X.write(Media_X);

//////////////////////

Eixo_Y = analogRead(4);

Medicao[j]=Eixo_Y;


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++;

if(j>=15)j=0;

Media_Y=map(Media_Y,184,511,180,0);

Servo5_Y.write(Media_Y);



Serial.print(" Eixo X: ");
Serial.print(Media_X);

Serial.print(" Eixo Y: ");
Serial.println(Media_Y);

delay(1);
}

Número de erro foi reduzido bastante, agoratenho esse erro:

c_digo_teste_aceler_metro.ino: In function 'void loop()':
c_digo_teste_aceler_metro:83: error: 'Medicao' was not declared in this scope
c_digo_teste_aceler_metro:87: error: 'Media_X' was not declared in this scope
c_digo_teste_aceler_metro:108: error: 'Media_Y' was not declared in this scope
'Medicao' was not declared in this scope

artur36

Se reparares os erros são exactamente iguais aos que tinhas anteriormente, contínuas a ter variáveis por declarar.

megamartinelle

Sim, sim, já percebi isso a questão agora é eu reconhecer e saber o que fazer, se puder me ajudar e me dizer o pq ficou de tal maneira eu agradeço!


jm_araujo

Quote from: megamartinelle on 30 de September de 2015, 02:07
jm_araujo, esse código que você me enviou já é para os 3 acelerômetros? E se não for pedir demais, tem como me enviar um arquivo falando como você chegou a esse código? Wuero entender mesmo que seja o básico.

Acho que o código não pode ser mais claro. Estuda-o até o entenderes e terás as tuas respostas.

Como cheguei a esse código? Peguei no teu e eliminei todas as repetições que encontrei. Como tinha dito anteriormente quando se repete blocos de código (ainda por cima com cut&paste), é normalmente por má programação, que ajuda a propagar erros e torna-o muito mais difícil de manter (cada correção tem de ser corretamente feita em todos os blocos copiados o que raramente se consegue e dá sempre merda).

megamartinelle

Eu corrigir os outros erros eliminando todos os eixos "Z" que não vou usar e reparei que tinha marcado tudo errado. Tipo, servo1_Y eu coloquei no acelerômetro 1 no eixo Y o servo 2, tava indicando os servos errados tava tudo confuso. Masagora melhorou, só falta eu entender esse erro de agora!

artur36

Vamos voltar ao início, quais os teus reais conhecimentos de linguagem C e o que queres fazer em concreto com o teu projecto, faz-nos um resumo rápido dos objectivos dele

megamartinelle

Bem, meu conhecimento em C pra ser sinsero, não sei oque te dizer cara até pq comecei a estudar mesmo um livro de liguagem de programação em C a 3 dias. E meu real objetivo com esse projeto é fazer um braço robótico que se mova de acordo com meus movimentos. Ou seja, eu poderia usar pontenciometro no lugar dos acelerômetros, mas isso ficaria com imprecisão. E os acelerômetro são bem melhores!

Deu pra entender algo? kkk

senso

Isso vai fazer uns movimentos bem estranhos com 3 acelerómetros.
Avr fanboy