collapse

* Posts Recentes

Arame de Estendal por almamater
[Hoje às 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"  (Lida 13767 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #15 em: 29 de Setembro de 2015, 14:41 »
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.
Código: [Seleccione]
#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...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #16 em: 29 de Setembro 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.
Avr fanboy

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #17 em: 29 de Setembro de 2015, 14:56 »
Obrigado Arthur, estou fazendo isso :D

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #18 em: 29 de Setembro de 2015, 14:59 »
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

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #19 em: 30 de Setembro de 2015, 00:24 »
Galera muito obrigado pela ajuda, pretendo estudar mais programação e mais tarde postarei o resultado de como ficou e se deu certo.

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #20 em: 30 de Setembro 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.

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #21 em: 30 de Setembro de 2015, 04:44 »
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

Offline artur36

  • Mini Robot
  • *
  • Mensagens: 795
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
« Responder #22 em: 30 de Setembro de 2015, 06:35 »
Se reparares os erros são exactamente iguais aos que tinhas anteriormente, contínuas a ter variáveis por declarar.

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #23 em: 30 de Setembro de 2015, 06:57 »
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!

Offline artur36

  • Mini Robot
  • *
  • Mensagens: 795
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
« Responder #24 em: 30 de Setembro de 2015, 07:05 »
Como corrigiste os primeiros erros?

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #25 em: 30 de Setembro de 2015, 11:14 »
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).

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #26 em: 30 de Setembro de 2015, 14:27 »
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!

Offline artur36

  • Mini Robot
  • *
  • Mensagens: 795
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
« Responder #27 em: 30 de Setembro de 2015, 14:45 »
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

Offline megamartinelle

  • Mini Robot
  • *
  • Mensagens: 101
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #28 em: 30 de Setembro de 2015, 15:02 »
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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
« Responder #29 em: 30 de Setembro de 2015, 18:52 »
Isso vai fazer uns movimentos bem estranhos com 3 acelerómetros.
Avr fanboy