• 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.

megamartinelle

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

artur36

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

senso

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.
Avr fanboy

artur36



Quote from: senso on 27 de September 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
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...

megamartinelle

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.

artur36

Quote from: megamartinelle on 27 de September 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.
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

megamartinelle

Bem vou mandar duas partes de como eu fiz.

PRIMEIRA:

#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



senso

Avr fanboy

megamartinelle

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

artur36

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)

megamartinelle

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!

artur36

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

jm_araujo

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:
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:

#define AMOSTRAS 15

MediaX=0;
for (int cnt=0;cnt<AMOSTRAS;cnt++) {
    MediaX=MediaX+Medicao1[cnt];
}
MediaX=MediaX/AMOSTRAS;


megamartinelle

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?

artur36

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.