(Quem manja de ARDUÍNO também pode ajudar)

Olá pessoal, tenho um projeto com MSP430 onde eu preciso ler os dados do MPU6050(acelerômetro e giroscópio) via I²C e transmitir usando o nRF24L01+ via SPI. Até aí tudo bem, consigo fazer as duas coisas, porém, separadamente, por que os pinos de SPI são os mesmos do I²C e um interfere no outro!!!

Preciso de algum jeito de mudar os pinos MISO e MOSI na biblioteca SPI ou do rádio. Estou usando a IDE Energia(praticamente a mesma do arduíno), com as bibliotecas ENRF, SPI.

Ou.. Mudar os pinos SDA e SCL, que já tentei e não tive sucesso...

Sei que pro I²C funcionar, é necessário dar um "start" na comunicação e depois um "stop". Consigo fazer isso sem alterar a forma com que a biblioteca do MPU6050 trabalha? Alguém sabe como? Se sim, talvez dê certo usar a SPI e I²C nos mesmos pinos, ficaria algo do tipo: 

Inicia I²C;

Lê dados do acelerômetro/giroscópio;

Termina I²C;

Inicia SPI;

Envia dados via nRF24L01+;

Termina I²C;

Exibições: 3230

Anexos

Responder esta

Respostas a este tópico

O jeito é emular uma SPI ou I2C por software e usar um pino qualquer. O SPI é mais fácil de fazer.

 

Nao mexi com essa parte, mas olhando por cima a documentacao em http://arduino.cc/en/Reference/SPI achei uma referencia a

SS (Slave Select) - the pin on each device that the master can use to enable and disable specific devices.

Sera que isso serve para o seu caso? Porque ai ACHO que daria para alternar entre I2C e SPI.

Então Gabriel, eu pensei que daria certo fazer esse "chaveamento", por que na I2C também tem um start/stop, mas pelo oque li nessa hora de pesquisa, parece que não.... Mas seria muita mancada da Texas fazer uma coisa dessas que não desse pra usar depois... Bom, continuo aguardando mais opiniões, enquanto adapto um código que tenho... Obrigado!

Hmmm, puxa vida, vou acabar tendo que fazer uma biblioteca separada pro nRF, por que estou mais familiarizado com ele do que com o acelerômetro.... É o jeito, esse esquema de "chavear" parece não dar certo... 

A SPI usa o Mosi (Master out serv in) que é  saída para o  servo . E o Miso (Master in serv Out) que é entrada para o master.(o seu master é o chip da Texas).

Para habilitar o Servo que se conecta na SPI voce deve por o pino do servo SS (Chip select) em baixa (direto no terra) enquanto  põe em alta o chip que se conecta na I2C.E vice versa.

Escolha 2 pinos que não seja os usado na comunicação para alternar o estado do chip select (ss) do sensores.

então vai precisar de :

Miso,Mosi para SPI (Leitura e escrita)

Sda ,clock para I²C (escrita e leitura )

1 pino para comuntar chip select do spi

1 pino para comutar chip select do i2c

(alguns chips i2c usam mais de 1 bit para ser selecionado)

Oi Almir,

Sobre o CS do SPI, tudo bem, porém no I2C a unica forma perigosa que vejo de ligar e desligar o módulo, seria ligando a alimentação dele em um pino do MCU, posso estar enganado, mas não há um CS nele... Não quero fazer isso.. Eu havia pensado que com o Start/Stop do I2C e com o CS da SPI já daria certo, vou escrever um código rápido e testar...

Para melhor visualizar o dilema, deixo aqui o código do meu transmissor:

// Bibliotecas necessarias p/funcionamento do MPU6050
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

// Bibliotecas necessarias p/funcionamento do nRF24L01+
#include <Enrf24.h>
#include <nRF24L01.h>
#include <string.h>
#include <SPI.h>

#define RF_CE P2_0

MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;

Enrf24 radio(P2_0, P2_1, P2_2); // P2.0=CE, P2.1=CSN, P2.2=IRQ
const uint8_t txaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };

const char *str_ini = "INICIO";
const char *str_end = "FIM";

void setup()
{
   // Inicializacao do nRF24L01+
   SPI.begin();
   SPI.setDataMode(SPI_MODE0);
   SPI.setBitOrder(1); // MSB-first
   radio.begin(); // Defaults 1Mbps, channel 0, max TX power
   radio.setTXaddress((void*)txaddr);


   radio.print(str_ini); radio.flush(); // Apenas para verificar se o receptor esta recebendo dados antes de ligar o i2c
   //CE LOW
   digitalWrite(RF_CE, LOW); - Desliga o radio

   Wire.begin();
   Serial.begin(9600); 
   // Inicializacao do MPU6050
   Serial.println("Initializing I2C devices...");
   accelgyro.initialize();
   Serial.println("Testing device connections...");
   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}

void loop()
{
   //CE LOW - Desliga o radio
   digitalWrite(RF_CE, LOW);
   // Faz a leitura de posicionamento do modulo
   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

   // Mostra os valores na serial
   Serial.print("a/g:\t");
   Serial.print(ax); Serial.print("\t");
   Serial.print(ay); Serial.print("\t");
   Serial.print(az); Serial.print("\t");
   Serial.print(gx); Serial.print("\t");
   Serial.print(gy); Serial.print("\t");
   Serial.println(gz); // <--------------------- Ate aqui tudo bem, mostra os dados na tela.

   //CE HIGH - Liga o radio
   digitalWrite(RF_CE, HIGH); // <----------------- A partir daqui o problema, o radio nao transmite dado algum
   // Envia a leitura de posicionamento via radio
   radio.print(str_ini); radio.flush();
   radio.print(ax); radio.flush();
   radio.print(ay); radio.flush();
   radio.print(az); radio.flush();
   radio.print(gx); radio.flush();
   radio.print(gy); radio.flush();
   radio.print(gz); radio.flush();
   delay(500);
   radio.print(str_end); radio.flush();

   delay(500);
}

Oi! e aonde eu encontro as bibliotecas I2Cdev.h e MPU6050_6Axis_MotionApps20.h ?

Bom dia Paulo,

A leitura do acelerômetro/Giroscópio é feita utilizando alguma biblioteca?

Porque o mais simples, que eu consigo imaginar, é continuar utilizando a biblioteca do nRF e implementar a comunicação I2C por software. Eu encontrei essa referência, espero que ajude.

Abraço.

http://forum.43oh.com/topic/3617-energia-library-software-i2c-maste...

Oi Murilo, sim, a leitura do acelerômetro é feita com essa biblioteca: http://code.google.com/p/launchpad-stellaris-energia/wiki/Mpu6050Usage

Obrigado pela referência, vou ler com atenção e depois com mais tempo implementar essa biblioteca...

De qualquer forma, consegui um jeito do código funcionar, não da melhor forma, mas... Já é um resultado :)

Vou colocar em resposta abaixo.
 

Deixo aqui os arquivos de código da IDE energia, que muito provavelmente funcionará com Arduíno também, apenas fazendo download da biblioteca MPU6050 do Jeff Rowberg no github e acrescentando ao seu projeto.

Esse sketch funcionou comigo em uma launchpad v1.5 com msp430g2553, MPU6050 e nRF24L01+.

Não é o melhor jeito de conseguir oque eu queria, mas já é um começo.

Quem puder testar e dar o ok, agradeço!

Abraços!

Anexos

Por favor, tem como vc me passar a biblioteca do MPU6050?
E vc fez a calibração?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço