Autor Tema: Duda PIC18f4550 con dos acelerómetros  (Leído 3891 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alSources

  • PIC10
  • *
  • Mensajes: 2
Duda PIC18f4550 con dos acelerómetros
« en: 10 de Marzo de 2013, 09:53:29 »
Hola amigos!

Decir que soy novato en el mundo de la electrónica y que gracias a éste foro he aprendido mucho sobre los PIC. En mi proyecto he decidido usar el 18f4550, pues era de los pocos que poseen puerto USB, imprescindible para programar desde ordenador portátil sin RS232.
El objetivo del proyecto es comparar la inclinación de dos placas de metal (no es necesaria mucha precisión, y como máximo serán 30º); por esto, pensé en comparar las lecturas obtenidas de dos acelerómetros. Pero aquí es donde empezaron mis dudas de novato. A grandes rasgos, os las explico:

  1. Utilizo acelerómetros digitales o analógicos?
  2. Modelo de acelerómetro (podeís recomendarme?)
 
He visto los tutoriales del foro de acelerómetros, como soldarlos, como interpretar los datos, etc...pero no encontré ningún caso en el que utilizara dos.

En el caso de utilizar analógicos...pensé que podía utilizar interrupciones para interpretar las lecturas, pero tampoco tengo muy claro a que se refiere los canales del ADC de mi PIC.

Saludos

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Duda PIC18f4550 con dos acelerómetros
« Respuesta #1 en: 10 de Marzo de 2013, 12:49:52 »



Analógicos o digitales, es a gusto del consumidor, si los eliges analógicos, tu PIC tendrá que disponer de ADC y al menos 6 entradas analógicas (x, y, z para cada acelerómetro), los digitales se suelen controlar por I2C o SPI.

Yo los utilizo digitales, en concreto el  ADXL345 controlado por SPI (también se pueden controlar por I2C), tienen 2 patitas para interrupciones.
Como analógico, podrías usar el MMA7361.

No veo inconveniente para que gestiones varios acelerómetros con un PIC, yo tengo un diseño con 3 acelerómetros ADXL345, controlados por SPI.
Hay muchos más modelos de acelerómetros, puedes mirar en Amidata, busca por ADXL* o  MMA7* y te saldrán un puñado.



Desconectado alSources

  • PIC10
  • *
  • Mensajes: 2
Re: Duda PIC18f4550 con dos acelerómetros
« Respuesta #2 en: 11 de Marzo de 2013, 06:43:11 »
Hola!
Muchas gracias por tu ayuda! Mi PIC tiene cuatro entradas analógicas....pero creo q es suficiente pues en el proyecto usaré acelerómetros de dos ejes. Gracias por aconsejarme los modelos!
Por cierto, me podrías pasar la parte de tu diseño donde lees los datos de los acelerómetros?  :oops:
Gracias de antemano!

Desconectado miquel

  • PIC12
  • **
  • Mensajes: 69
Re: Duda PIC18f4550 con dos acelerómetros
« Respuesta #3 en: 28 de Marzo de 2013, 07:10:51 »
Si te interesa utilizar el MMA7455 que es digital, puedes probar este codigo :


Código: [Seleccionar]



#define MMA7455_ADR_WRITE        0x3A            //Adreça de escritura       
#define MMA7455_ADR_READ         0x3B            //   "   de lectura         
#define MMA7455_REG_CTL          0x16            //Registre de control       
#define MMA7455_MODE             0x05            //0b00000101        2G >> 0bxxxx01xx       Mode >> 0bxxxxxx01 
#define MMA7455_X_REG            0x06            //Eix X Registre 8bit           
#define RADIANS_GRAUS            57.295781       //57.2958







void WriteReg(Byte Adr, Byte Reg, Byte Val) ;
Byte ReadReg(Byte Adr, Byte Reg);








struct MMA7455_Struct
   {
   signed int16 X;
   signed int16 Y;
   signed int16 Z;
   signed int16 X_0;
   signed int16 Y_0;
   signed int16 Z_0;
   float32 Ang_X;
   float32 Ang_Y;
  } Acc;













void MMA7455_Inici(void)
{
i2c_start();
i2c_write(MMA7455_ADR_WRITE);
i2c_write(MMA7455_REG_CTL);
i2c_write(MMA7455_MODE);
i2c_stop();
}




void MMA7455_Llegir(void)
{
signed int8 X,Y,Z;
i2c_start();
i2c_write(MMA7455_ADR_WRITE);     
i2c_write(MMA7455_X_REG);       
i2c_start();
i2c_write(MMA7455_ADR_READ);     
X=i2c_read();
Y=i2c_read();         
Z=i2c_read(0);         
i2c_stop();
Acc.X=Y;
Acc.Y=X;         
Acc.Z=Z;         
}



void MMA7455_Zero(void)
{
signed int16 J,N;
signed int16 ACu_X=0;
signed int16 Acu_Y=0;
signed int16 Acu_Z=0;
N=100;
for (J=0; J < N; J++)
   {
   MMA7455_Llegir();
   Acu_X+=Acc.X;
   Acu_Y+=Acc.Y;
   Acu_Z+=Acc.Z;
   delay_us(1000);
   }
Acu_X/=N;
Acu_Y/=N;
Acu_Z/=N;
Acc.X_0=-Acu_X;
Acc.Y_0=-Acu_Y;
Acc.Z_0=63 - Acu_Z;
Acc.X=0;
Acc.Y=0;
Acc.Z=0;
}



void MMA7455_Angle(void)
{
float Xg,Yg,Zg,R;
MMA7455_Llegir();
Acc.X+=Acc.X_0;
Acc.Y+=Acc.Y_0;
Acc.Z+=Acc.Z_0;
Xg=Acc.X;
Yg=Acc.Y;
Zg=Acc.Z;
R=sqrt((Xg * Xg) + (Yg * Yg) +(Zg * Zg));
Xg/=R;
Yg/=R;
Zg/=R;
Acc.Ang_X=atan2(Xg,Zg) * RADIANS_GRAUS;
Acc.Ang_Y=atan2(Yg,Zg) * RADIANS_GRAUS;
}




Para iniciar el acelerometro utiliza la funcion MMA7455_Inici(void) y despues con MMA7455_Angle(void) tienes los angulos en
float32 Ang_X  y    float32 Ang_Y

Saludos,


Miquel