collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


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


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


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]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: MPU 9150 - magnetômetro  (Lida 3579 vezes)

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

Offline nvoltex

  • Mini Robot
  • *
  • Mensagens: 211
MPU 9150 - magnetômetro
« em: 11 de Maio de 2015, 22:06 »
Já alguém usou um MPU9150?

Eu tenho o usado, mas apenas os dados raw do acelerômetro e giroscópio.

Contudo agora surgiu-me a necessidade de usar os dados do magnetómetro (também raw) e não estou a conseguir.

Encontrei um sketch que em teoria fazia isso (http://playground.arduino.cc/Main/MPU-9150?action=sourceblock&num=1), contudo os dados do magnetómetro não estar certos pois para além de serem iguais nos 3 eixos, estão num "range" estranho.

Eu estou a evitar usar bibliotecas como o I2Cdev uma vez que quando usei entravam em conflito com alguma componente do rosserial (ROS) e não me permitiam publicar o que desejava.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: MPU 9150 - magnetômetro
« Responder #1 em: 11 de Maio de 2015, 22:10 »
Experimenta nao ler o acc e o giro e ler so o mag para testar se funciona.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MPU 9150 - magnetômetro
« Responder #2 em: 11 de Maio de 2015, 22:11 »
Como é que uma biblioteca que fala com UM chip em especifico via I2C vai impedir o funcionamento de um periférico serial?
Mais, porquê copiar e colar sem olhar quando podes simplesmente ver o funcionamento da biblioteca e ver que registos precisam de ser massajados para funcionar como deve ser?
Avr fanboy

Offline nvoltex

  • Mini Robot
  • *
  • Mensagens: 211
Re: MPU 9150 - magnetômetro
« Responder #3 em: 11 de Maio de 2015, 22:40 »
Experimenta nao ler o acc e o giro e ler so o mag para testar se funciona.

Sim, já tentei isso e não consigo.

Uma das minhas dúvidas está ligada com os registos do magnetómetro, pois os endereços dos registos do sketch que enviei estão diferentes destes: http://cdn.sparkfun.com/datasheets/Sensors/IMU/RM-MPU-9150A-00.pdf

Contudo se tentar ler dos que estão enumerados na "datasheet" também não consigo. Não devia ser possível ler directamente? Ou como o magnetómetro é como um "dispositivo" diferente, tenho de fazer algo mais?

Como é que uma biblioteca que fala com UM chip em especifico via I2C vai impedir o funcionamento de um periférico serial?
Mais, porquê copiar e colar sem olhar quando podes simplesmente ver o funcionamento da biblioteca e ver que registos precisam de ser massajados para funcionar como deve ser?

Eu não sei dar as razões para o comportamento que observei, mas a verdade é que depois de muito tentar desisti de usar a bibliotecas como o I2Cdev uma vez que com a adição delas estava a ter problemas na comunicação com ROS.

Não copiei e colei nada...
Simplesmente pus o link do sketch que inicialmente usei para testar as leituras do giro/acce e que em teoria implementava a possibilidade de fazer leituras do magnetómetro.


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MPU 9150 - magnetômetro
« Responder #4 em: 11 de Maio de 2015, 23:07 »
Agarrar nisto:
Código: [Seleccione]
void MPU9150_setupCompass(){
  MPU9150_I2C_ADDRESS = 0x0C;      //change Adress to Compass

  MPU9150_writeSensor(0x0A, 0x00); //PowerDownMode
  MPU9150_writeSensor(0x0A, 0x0F); //SelfTest
  MPU9150_writeSensor(0x0A, 0x00); //PowerDownMode

  MPU9150_I2C_ADDRESS = 0x69;      //change Adress to MPU

  MPU9150_writeSensor(0x24, 0x40); //Wait for Data at Slave0
  MPU9150_writeSensor(0x25, 0x8C); //Set i2c address at slave0 at 0x0C
  MPU9150_writeSensor(0x26, 0x02); //Set where reading at slave 0 starts
  MPU9150_writeSensor(0x27, 0x88); //set offset at start reading and enable
  MPU9150_writeSensor(0x28, 0x0C); //set i2c address at slv1 at 0x0C
  MPU9150_writeSensor(0x29, 0x0A); //Set where reading at slave 1 starts
  MPU9150_writeSensor(0x2A, 0x81); //Enable at set length to 1
  MPU9150_writeSensor(0x64, 0x01); //overvride register
  MPU9150_writeSensor(0x67, 0x03); //set delay rate
  MPU9150_writeSensor(0x01, 0x80);

  MPU9150_writeSensor(0x34, 0x04); //set i2c slv4 delay
  MPU9150_writeSensor(0x64, 0x00); //override register
  MPU9150_writeSensor(0x6A, 0x00); //clear usr setting
  MPU9150_writeSensor(0x64, 0x01); //override register
  MPU9150_writeSensor(0x6A, 0x20); //enable master i2c mode
  MPU9150_writeSensor(0x34, 0x13); //disable slv4
}

E ver onde é que está a falhar.
Avr fanboy

Offline TheDeadLives

  • Mini Robot
  • *
  • Mensagens: 398
Re: MPU 9150 - magnetômetro
« Responder #5 em: 11 de Maio de 2015, 23:57 »
Não querendo propagar aqui a ideia de copy & paste, utiliza a library da i2cdevlib. É a melhor biblioteca para os mpu's: http://www.i2cdevlib.com/devices/mpu9150#source

Offline nvoltex

  • Mini Robot
  • *
  • Mensagens: 211
Re: MPU 9150 - magnetômetro
« Responder #6 em: 12 de Maio de 2015, 10:45 »
Agarrar nisto:
Código: [Seleccione]
void MPU9150_setupCompass(){
  MPU9150_I2C_ADDRESS = 0x0C;      //change Adress to Compass

  MPU9150_writeSensor(0x0A, 0x00); //PowerDownMode
  MPU9150_writeSensor(0x0A, 0x0F); //SelfTest
  MPU9150_writeSensor(0x0A, 0x00); //PowerDownMode

  MPU9150_I2C_ADDRESS = 0x69;      //change Adress to MPU

  MPU9150_writeSensor(0x24, 0x40); //Wait for Data at Slave0
  MPU9150_writeSensor(0x25, 0x8C); //Set i2c address at slave0 at 0x0C
  MPU9150_writeSensor(0x26, 0x02); //Set where reading at slave 0 starts
  MPU9150_writeSensor(0x27, 0x88); //set offset at start reading and enable
  MPU9150_writeSensor(0x28, 0x0C); //set i2c address at slv1 at 0x0C
  MPU9150_writeSensor(0x29, 0x0A); //Set where reading at slave 1 starts
  MPU9150_writeSensor(0x2A, 0x81); //Enable at set length to 1
  MPU9150_writeSensor(0x64, 0x01); //overvride register
  MPU9150_writeSensor(0x67, 0x03); //set delay rate
  MPU9150_writeSensor(0x01, 0x80);

  MPU9150_writeSensor(0x34, 0x04); //set i2c slv4 delay
  MPU9150_writeSensor(0x64, 0x00); //override register
  MPU9150_writeSensor(0x6A, 0x00); //clear usr setting
  MPU9150_writeSensor(0x64, 0x01); //override register
  MPU9150_writeSensor(0x6A, 0x20); //enable master i2c mode
  MPU9150_writeSensor(0x34, 0x13); //disable slv4
}

E ver onde é que está a falhar.

Foi nisso mesmo que peguei para tentar perceber que configuração estavam a fazer e porque é que não estava a funcionar.

Só que estava a tentar ler o device ID para confirmar que estava a conseguir comunicar com o magnetómetro e não consegui. Também não encontrei no register map nenhuma indicação do endereço do magnetómetro.

Não querendo propagar aqui a ideia de copy & paste, utiliza a library da i2cdevlib. É a melhor biblioteca para os mpu's: http://www.i2cdevlib.com/devices/mpu9150#source

Tal como referi, o uso de outras bibliotecas estava a entrar em conflito com outras coisas pelo que desisti dessa alternativa.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MPU 9150 - magnetômetro
« Responder #7 em: 12 de Maio de 2015, 12:21 »
Citar
The MPU-9150 is a multi-chip module (MCM) consisting of two dies integrated into a single LGA package.
One die houses the 3-Axis gyroscope and the 3-Axis accelerometer. The other die houses the AK9875C 3-
Axis magnetometer from Asahi Kasei Microdevices Corporation.

Provavelmente isto é um erro:
Código: [Seleccione]
  MPU9150_writeSensor(0x25, 0x8C); //Set i2c address at slave0 at 0x0CFala em 0x0C e escreve 0x8C, é ler a datasheet para entender o porquê daquele bit a 1..

E isso é relativamente simples, tens 2 chips, um é o MPU, o outro é o magnetometro, falas com o magnetómetro só para ter a certeza que está a funcionar e depois dizes ao MPU qual é o endereço do magnetómetro para o MPU falar com ele e ir lá buscar os dados, se não estás a usar o CPU do MPU, lê o magnetómetro directamente, ou muda para chips de outro fabricante, sempre achei os Invensense interessantes no papel, mas dado os NDA que têm em cima só tens acesso a meia datasheet e não os podes utilizar a fundo, logo siga para sensores da ST.
« Última modificação: 12 de Maio de 2015, 12:25 por senso »
Avr fanboy

Offline nvoltex

  • Mini Robot
  • *
  • Mensagens: 211
Re: MPU 9150 - magnetômetro
« Responder #8 em: 12 de Maio de 2015, 16:39 »
Esse bit a 1 é para o slave executar uma leitura em vez de escrita.

Contudo se for possível ler directamente do magnetometro sem ter de colocar o slave a ler e colocar nos External Sensor Data registers até seria melhor.

Isto pois não sei bem como fazer uso dos slaves, uma vez que são apenas quatro e em teoria queria ler 6 endereços diferentes (segundo o mapa de registos que coloco em anexo).

EDIT:
Depois de mais alguns testes percebi porque não consegui aceder ao magnetometro directamente.

Para tal tenho de activar o I2C bypass e desactivar o I2C master mode (registos 0x37 e 0x6A respectivamente) e assim já consigo ter acesso e realizar as leituras desejadas.

« Última modificação: 12 de Maio de 2015, 20:58 por nvoltex »