LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Tópico iniciado por: megamartinelle em 27 de Setembro de 2015, 17:50

Título: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 27 de Setembro de 2015, 17:50
Galera gostaria de uma pequena ajuda :D

Meu objetivo é conectar 3 acelerometros MMA7361 no arduino mega para controlar 9 servos. tenho o código para controle de 3 que no caso é apenas um acelerometro. Como posso fazer para controlar os 3 no mesmo arduino?

Código:

#include <Servo.h>

Servo Servo_Y;                               

Servo Servo_X;

Servo Servo_Z;

int Eixo_X,Eixo_Y,Eixo_Z;

int Medicao1[15],Media_X;

int Medicao2[15],Media_Y;

int Medicao3[15],Media_Z;

int i,j,l;

int Pino_Sleep = 8;

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

pinMode(Pino_Sleep, OUTPUT);

digitalWrite(Pino_Sleep, HIGH);

Servo_Z.attach(11);
Servo_X.attach(10);
Servo_Y.attach(9);

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

void loop()
{

Eixo_X = analogRead(0);

Medicao1=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);

Servo_X.write(Media_X);


Eixo_Y = analogRead(1);

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

Servo_Y.write(Media_Y);


Eixo_Z = analogRead(2);

Medicao3[l]=Eixo_Z;


Media_Z=(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;

l++;

if(l>=15)l=0;

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

Servo_Z.write(Media_Z);

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

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

Serial.print(" Eixo Z: ");
Serial.println(Media_Z);
delay(1);
}
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: artur36 em 27 de Setembro de 2015, 19:01
Primeiro que tudo acho completamente desnecessário o SPAM de estar a criar dois tópicos exactamente iguais em secções distintas do forum, seria de "bom tom" pedires a um moderador para apagar um dos tópicos.

Quanto à tua pergunta não sei ajudar-te directamente e nem sequer me darei ao trabalho de abrir um tab no navegador para pesquisar que acelerómetro é esse e como comunicar com este, pesquisar para aprender acho que deves ser tu a fazê-lo já que o projecto é teu.

A ajuda que te posso dar é muito simples:
- Precisas realmente de ler 3 acelerómetros distintos? Se é por falta de eixos existem acelerómetros de 9 eixos.
- Sabes ler os dados de um acelerómetro individualmente e processar correctamente os seus dados?
- Sabes accionar correctamente um servomotor individualmente?
- Sabes controlar mais que um servo num mesmo código correctamente?

Só quando puderes responder afirmativamente a estas 4 perguntas é que te deves preocupar em ler 3 acelerómetros, antes disso é escusado avançares mais.
Nota que eu perguntei se sabias correctamente, não se já tinhas copiado o código necessário de outro lado. Isto não é uma crítica destrutiva mas sim construtiva, não dizes concretamente qual o teu projecto, mas controlar 9 servos com dados de acelerómetros não me parece um projecto simples e ideal para primeiros projectos, é importante que percebas realmente todos os bocados individuais do teu código e não apenas copiá-los de outro lado, isto será depois muito importante quando aparecerem os primeiros erros e tiveres de descobrir de onde eles vêm.
Se dominares os pequenos passos que necessitas para o teu projecto, comandar um servo e ler correctamente um acelerómetro, depois é só uma questão de os replicares várias vezes no projecto ao chamar a função respectiva quando esta for necessário, para isso aconselho-te a tentares desenhar um fluxograma para teres claro em que condições necessitas de ler o(s) acelerómetro(s) e accionar os servos.

P.S.: A leitura de vários acelerómetros não será nenhum bicho de sete cabeças, lê bem a datasheet para perceberes como funciona a comunicação com este, provavelmente será I2C ou SPI portanto ou tens de activar o pino "chip select" do acelerómetro que queres ler ou tens de definir endereços independentes para os acelerómetros e na comunicação enviar o endereço respctectivo (não sei de cabeça a que protocolo corresponde cada um dos métodos mas de qualquer das maneiras estuda bem a datasheet que vem lá isto bem explicado)

Editado para rasurar as passagens onde depois do alerta do senso e de analisar mais friamente a minha resposta reconheço que errei
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: senso em 27 de Setembro de 2015, 19:34
Que arrogância, é mesmo preciso esse tom?
Por mim era já uma semana de férias só pela PDM que demonstras nesse post

Pelo analogRead obviamente que é um acelerómetro com saida analógica.

Basicamente é só replicar o código 3 vezes e mudar os pinos do analogRead para os outros 2 acelerómetros e adicionar mais servos em pinos diferentes.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 em 27 de Setembro de 2015, 20:04


Que arrogância, é mesmo preciso esse tom?
Por mim era já uma semana de férias só pela PDM que demonstras nesse post
Senso desde já peço desculpa a ti e a qualquer outro membro que tenha interpretado a minha resposta como arrogante ou de qualquer maneira menos própria para o fórum, não foi de todo essa a minha intenção.
Analisando friamente a minha resposta talvez tenhas alguma razão.
Mantenho em parte a minha resposta em especial no que se refere ao tópico duplicado  má reconheço que podia ter dado ao menos uma olhadela ao código apresentado e realmente teria percebido rapidamente que a saída do acelerometro seria analógica e não um qualquer protocolo digital como erradamente pressupôs.
De qualquer das maneiras Mantenho as perguntas que deixei, acho muita dificuldade em perceber o básico, neste caso afinal apenas ler mais que uma entrada analógica, para quem quer fazer mover 9 servos através de acelerometros.

P.S.: Quanto ás férias cabe aos moderadores decidirem, sendo tu um deles se assim o decidires aceito-o perfeitamente, como disse acima reconheço agora que podia ter tido outra postura...
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 27 de Setembro de 2015, 21:16
Arthur, eu criei em outra sessão por engano e não tem como eu apagar. Então não tem como remover meu post da outra sessão!
E Senso, eu fiz o que você falou antes mesmo de postar aqui no forum, mas deu erro na hora de fazer a compliação.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 em 27 de Setembro de 2015, 21:34
Arthur, eu criei em outra sessão por engano e não tem como eu apagar. Então não tem como remover meu post da outra sessão!
E Senso, eu fiz o que você falou antes mesmo de postar aqui no forum, mas deu erro na hora de fazer a compliação.
Pelo que sei do fórum só um moderador pode apagar um tópico.
Se já tentas-te mas deu erro coloca aqui as alterações que fizeste ao código e que erro deu
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 28 de Setembro de 2015, 03:58
Bem vou mandar duas partes de como eu fiz.

PRIMEIRA:

Código: [Seleccione]
#include <Servo.h>

Servo Servo1_Y;                               

Servo Servo2_X;

Servo Servo3_Z;

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

Servo Servo4_Y;                               

Servo Servo5_X;

Servo Servo6_Z;

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

Servo Servo7_Y;                               

Servo Servo8_X;

Servo Servo9_Z;


int Eixo_X,Eixo_Y,Eixo_Z;

int Medicao1[15],Media1_X;

int Medicao2[15],Media2_Y;

int Medicao3[15],Media3_Z;

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

int Medicao4[15],Media4_X;

int Medicao5[15],Media5_Y;

int Medicao6[15],Media6_Z;

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

int Medicao7[15],Media7_X;

int Medicao8[15],Media8_Y;

int Medicao9[15],Media9_Z;


int i,j,l;

int Pino_Sleep = 8;

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

pinMode(Pino_Sleep, OUTPUT);

digitalWrite(Pino_Sleep, HIGH);

//Acelerômetro 1
Servo1_Z.attach(2);
Servo2_X.attach(3);
Servo3_Y.attach(4);
 
//Acelerômetro 2
Servo4_Z.attach(5);
Servo5_X.attach(6);
Servo6_Y.attach(7);
 
//Acelerômetro 3
Servo7_Z.attach(8);
Servo8_X.attach(9);
Servo9_Y.attach(10);

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


SEGUNDA PARTE NÃO CONSIGO COLOCAR MAIS 2 CÓDIGOS SEM QUE FIQUE DANDO ERRO. ENTÃO VOU MANDAR ELA AQUI DE COMO ELA REALEMNTE É COM APENAS UM ACELERÔMETRO:

void loop()
{

Eixo_X = analogRead(0);

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

Servo_X.write(Media_X);


Eixo_Y = analogRead(1);

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

Servo_Y.write(Media_Y);


Eixo_Z = analogRead(2);

Medicao3[l]=Eixo_Z;


Media_Z=(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;

l++;

if(l>=15)l=0;

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

Servo_Z.write(Media_Z);

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

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

Serial.print(" Eixo Z: ");
Serial.println(Media_Z);
delay(1);

AGORA NÃO ESTOU CONSEGUINDO ACRESCENTAR MAIS SEM QUE DE ERRO


Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: senso em 28 de Setembro de 2015, 12:37
E que erro é que dá?
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 28 de Setembro de 2015, 20:30
Mesagem de erro: Arduino: 1.6.5 (Windows 8.1), Placa:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

c_digo_teste_aceler_metro.ino: In function 'void setup()':
c_digo_teste_aceler_metro:64: error: 'Servo1_Z' was not declared in this scope
c_digo_teste_aceler_metro:66: error: 'Servo3_Y' was not declared in this scope
c_digo_teste_aceler_metro:69: error: 'Servo4_Z' was not declared in this scope
c_digo_teste_aceler_metro:71: error: 'Servo6_Y' was not declared in this scope
c_digo_teste_aceler_metro:74: error: 'Servo7_Z' was not declared in this scope
c_digo_teste_aceler_metro:76: error: 'Servo9_Y' was not declared in this scope
c_digo_teste_aceler_metro.ino: In function 'void loop()':
c_digo_teste_aceler_metro:94: error: 'Media_X' was not declared in this scope
c_digo_teste_aceler_metro:108: error: 'Media_Y' was not declared in this scope
c_digo_teste_aceler_metro:116: error: 'Servo3_Y' was not declared in this scope
c_digo_teste_aceler_metro:124: error: 'Media_Z' was not declared in this scope
c_digo_teste_aceler_metro:132: error: 'Servo1_Z' was not declared in this scope
c_digo_teste_aceler_metro:146: error: 'Servo6_X' was not declared in this scope
c_digo_teste_aceler_metro:162: error: 'Servo5_Y' was not declared in this scope
c_digo_teste_aceler_metro:178: error: 'Servo4_Z' was not declared in this scope
c_digo_teste_aceler_metro:192: error: 'Servo9_X' was not declared in this scope
c_digo_teste_aceler_metro:208: error: 'Servo8_Y' was not declared in this scope
c_digo_teste_aceler_metro:224: error: 'Servo7_Z' was not declared in this scope
'Servo1_Z' was not declared in this scope

  Este relatório deveria ter mais informações
  "Mostrar saída verbosa durante a compilação"
  habilitado em Arquivo > Preferências.



Como está o programa:



void loop()
{

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

Eixo_X = analogRead(0);

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

Servo2_X.write(Media_X);


Eixo_Y = analogRead(1);

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


Eixo_Z = analogRead(2);

Medicao3[l]=Eixo_Z;


Media_Z=(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;

l++;

if(l>=15)l=0;

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

Servo1_Z.write(Media_Z);

///////////////////////////////////// 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);

Servo6_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);

Servo5_Y.write(Media_Y);


Eixo_Z = analogRead(5);

Medicao3[l]=Eixo_Z;


Media_Z=(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;

l++;

if(l>=15)l=0;

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

Servo4_Z.write(Media_Z);

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

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

Servo9_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);

Servo8_Y.write(Media_Y);


Eixo_Z = analogRead(5);

Medicao3[l]=Eixo_Z;


Media_Z=(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;

l++;

if(l>=15)l=0;

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

Servo7_Z.write(Media_Z);

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

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

Serial.print(" Eixo Z: ");
Serial.println(Media_Z);
delay(1);
}
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 em 28 de Setembro de 2015, 20:38
O erro diz que as variáveis não estão declaradas ou não estão acessíveis na função indicada. No primeiro código que apresentas-te tens as variáveis declaradas fora das funções imediatamente a seguir ao include, assim são variáveis globais e acessíveis em todas as funções, está assim agora, é que neste excerto não aparece sequer o include?

P.s.: estou a ver no tapatalk pelo que pode ser erro de interpretação porque este não apresenta o código devidamente formatado...

P.S.2: Caso as variáveis estejam declaradas no sítio correcto vê se por acaso não te esqueceste nessa zona de algum ponto e Virgula, é um erro que me acontece com alguma frequência (o bem do MpLab é que sublinha as zonas em erro)
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 28 de Setembro de 2015, 21:01
Vou analisar com mais calma, em tornoi de 3 dias falo se ta normal ou não. Por favor,não bloquei essep ost para que eu não venha ter que criar outro se necessario. Desde já agradeço pela ajuda!
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 em 28 de Setembro de 2015, 21:28
Tenta perceber o que se passa com a declaração das variáveis pois todos os erros apresentados relacionam-se com isso, se depois não existirem mais erros partes para os testes "físicos" a ver se funciona
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: jm_araujo em 28 de Setembro de 2015, 22:38
Já agora dá uma vista ao comando "for". Quando num código se vê o mesmo bloco repetido n vezes, o programador está a fazer algo mal.
Por exemplo:
Código: [Seleccione]
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;

Fica muito mais legível, fácil de detetar erros e fazer alterações se for:
Código: [Seleccione]
#define AMOSTRAS 15

MediaX=0;
for (int cnt=0;cnt<AMOSTRAS;cnt++) {
    MediaX=MediaX+Medicao1[cnt];
}
MediaX=MediaX/AMOSTRAS;
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 29 de Setembro de 2015, 07:20
Vou analisar com mais cuidado. Então você me recomenda subistituir essa parte:

 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;

Pela a que você me enviou?
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 em 29 de Setembro de 2015, 09:09
Não adianta substituíres o exemplo sem compreender o que ele faz, até porque tens mais sítios onde podes aplicar  a mesma simplificação. Se não conseguiste compreender o exemplo estuda um pouco do ciclo FOR, é muito útil sempre que quiseres repetir uma mesma tarefa um número definido de vezes, seja uma soma matemática seja um movimento de um servo.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: jm_araujo 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...
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: senso 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.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 29 de Setembro de 2015, 14:56
Obrigado Arthur, estou fazendo isso :D
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: jm_araujo 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
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle 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.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle 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.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle 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
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 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.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle 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!
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 em 30 de Setembro de 2015, 07:05
Como corrigiste os primeiros erros?
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: jm_araujo 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).
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle 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!
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um &quot;Arduino MEGA&quot;
Enviado por: artur36 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
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle 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
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: senso em 30 de Setembro de 2015, 18:52
Isso vai fazer uns movimentos bem estranhos com 3 acelerómetros.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: artur36 em 30 de Setembro de 2015, 19:04
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

Sim deu para entender tudo, com já suspeitávamos os teus conhecimentos AINDA não são suficientes para um projecto deste tipo. Isto não é mau, apenas indica que tens de aprender mais, tens de começar pelo básico da linguagem de programação e ir evoluindo a partir daí.
Não se constrói uma casa começando pelo telhado mas sim pelas suas fundações, se as fundações não estiverem bem feitas começaram a surgir problemas mais tarde que no extremo podem levar a casa a ruir, é o que está a acontecer contigo não tens as fundações necessárias e como tal estás a cometer erros nas coisas mais básicas e não os consegues resolver sozinho apesar do compilador indicar explicitamente quais são, se continuares a insistir neste projecto sem regressar às fundações do código vais chegar a um extremo em que vais ficar desmotivado e desistir da electrónica e de microcontroladores.
Não estou a dizer para esqueceres este projecto, o que tens de fazer é arrumá-lo durante algum tempo, mas sem nunca o esquecer, e dedicares algum tempo a estudar a linguagem C e a lógica de programação Arduino. Não é nenhum bicho de 7  cabeças e depois de compreenderes bem os blocos básicos da linguagem perceberás que o céu é o limite.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: artur36 em 30 de Setembro de 2015, 19:25
Entretanto como o Senso já alertou essa ideia tem alguns problemas, este projecto tem algum fim específico ou é só mesmo para "entretenimento" pessoal?
É que o que à partida parece simples não o é, os acelerómetros não te darão um deslocamento físico mas apenas um valor de aceleração que depois tens de transformar num vector de deslocação (distância e ângulo). Para simulares algo parecido com um braço humano (penso que seja isso que queres pois queres ir buscar directamente o movimento à posição do teu braço) irás precisar de no mínimo 6 eixos, para ser uma "cópia" fidedigna precisas de 7 que são os que o braço humano possuí, e tens de ter em conta que os sensores a usar para medir este movimento teriam de ser colocados em diferentes locais do braço e que o sensor do pulso por exemplo irá captar todos os movimentos dos "eixos" mais atrás que se não forem filtrados resultam em "ruído" sobreposto ao que queres realmente medir.

Trabalhei em ambiente industrial com um braço robótico destes e posso-te dizer que o firmware que eles possuem tem de ser muito complexo mesmo:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg.directindustry.com%2Fimages_di%2Fphoto-g%2Farticulated-robot-6-axis-handling-transfer-18302-3218651.jpg&hash=69f83d9199134c7ccfa8cc086bb7a6f1ceda70a3)

Poderias eventualmente reduzir o número de eixos para 3 e fazer algo deste género:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Frobotpalletizing.co.uk%2Fwp-content%2Fuploads%2F2012%2F09%2Fmpl160_robot.jpg&hash=fd821e242f30b02939f92eb97c742bb3128678c1)
Este poderia em teoria ser controlado por apenas um acelerometro de 3 eixos colocado na palma da mão mas terias de garantir que este se encontraria sempre "paralelo ao chão" para garantir medições correctas e de alguma cinemática inversa para transformar estas medições nos movimentos necessários dos motores para que o actuador no fim do braço robótico se colocasse na posição desejada. Novamente muito acima das capacidades que tens agora.

Isto não é de todo dizer para parares, muito pelo contrário, deves interpretar como um incentivo para aprenderes para que num futuro próximo já tenhas as capacidades necessárias.
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: artur36 em 30 de Setembro de 2015, 19:32
Entretanto não sei que livro estás a ler mas se quiseres um bom livro sobre linguagem C em português posso-te recomendar o mesmo que me foi recomendado, "Linguagem C" de Luís Damas.
No Brasil uma pesquisa rápida apareceu aqui http://www.saraiva.com.br/linguagem-c-10-edicao-2007-1568252.html (http://www.saraiva.com.br/linguagem-c-10-edicao-2007-1568252.html) mas se for como em portugal qualquer grande superficie que venda tecnologia e tenha secção de livraria tem. Também se encontra em formato "e-book" nos locais habituais...
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 30 de Setembro de 2015, 23:12
Obrigado mesmo por toda ajuda que me foi dada e conselhos. No inicio achei ruim, tipo fiquei meio que me achando burro, mas eu reconheço que não tenho tal conhecimento. Obrigado a todos!
Título: Re: Como posso ligar 3 acelerometro MMA7361 em apenas um "Arduino MEGA"
Enviado por: megamartinelle em 30 de Setembro de 2015, 23:14
Vou parar por um momento não com o projeto em si, apenas com a programação. Tentar achar uma solução para usar potenciometro de uma maneira mais precisa em vez do acelerômetro!