Чтение данных из eagle tree airspeed v3

Я пытаюсь получить значения этого датчика Airspeed v3 от eagle tree, но, похоже, мой I2C работает неправильно.

Я купил модуль в стороннем режиме и следовал этим инструкциям на веб-сайте производителя.

Я зашел на форум rcgroups и обнаружил правильные значения битов, упомянутых в документации по WRITE и READ.

Я начал разработку кода, но не могу получить значения от датчика. Предполагается, что он посылает мне значение в формате 2 байта, указывающее измеренную скорость полета. Но, что удивительно, когда я вызываю этот метод Wire.requestFrom(AIRSPEED_ADDRESS, 2), он возвращает 0, поэтому связь почему-то не работает. Раньше я использовал I2C для датчика ADXL345, и он отлично работает.

Результаты этих строк

Serial.println(data[0]);  
Serial.println(data[1]);

всего -1 указывает на то, что данные недоступны для отображения.

Кто-нибудь знает, как заставить это работать? Я что-то упустил?

Это мой код прямо сейчас.

#include <Wire.h>

#define AIRSPEED_ADDRESS  0xEA
#define WRITE_BIT         0x00
#define READ_BIT          0x01


void setup() {
  // подключаемся к шине I2C (библиотека I2Cdev не делает этого автоматически)
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Program started");
}

void loop() {
  byte data[2] = {0};
  int i = 0;
  int16_t velocidade = 0;

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  if (!Wire.write(WRITE_BIT)) {
    Serial.println("error sending write_bit");
  }
  Wire.endTransmission();

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  if (!Wire.write(0x07)) {
    Serial.println("error sending 0x07");
  }
  Wire.endTransmission(false);

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  if (!Wire.write(READ_BIT)) {
    Serial.println("error sending read_bit");
  }
  else {
    //Serial.println("хорошо, отправка read_bit");
  }  
  Wire.endTransmission();

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  Serial.print("bytes read from slave: ");
  Serial.println(  Wire.requestFrom(AIRSPEED_ADDRESS, 2) );
  data[0] = Wire.read();
  data[1] = Wire.read();
  Wire.endTransmission(); 

  velocidade = data[1] | (data[0] << 8);
  Serial.println(data[0]);  
  Serial.println(data[1]);  
  Serial.println(" ");  

}

, 👍1

Обсуждение

Это действительно полезно. Большое спасибо!, @James Huo


2 ответа


Лучший ответ:

1

Это интересно, но после использования другой библиотеки код сработал.

Он должен точно следовать тому, что написано в техническом описании, чтобы добиться результата.

Следующий исходный код делает это и получает скорость полета от датчика:

#define SENSOR_ADDRESS 0xEA 
#include <Wire.h> 
#include <I2cMaster.h> 
TwiMaster AIRSPEED_SENSOR(true); 

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

long airspeed_update(void) { 
  static struct { 
    union { int16_t val; uint8_t raw[2]; 
    } airspeed16; 
  } airspeedv3; 

  long airsp;    

  if(AIRSPEED_SENSOR.start(SENSOR_ADDRESS | I2C_WRITE)) { 
    delay(10);   
    AIRSPEED_SENSOR.write(0x07);  
    delay(10); 
    AIRSPEED_SENSOR.stop(); 
  } 

  if(AIRSPEED_SENSOR.restart(SENSOR_ADDRESS | I2C_READ)) { 
    delay(10);  
    airspeedv3.airspeed16.raw[0]=AIRSPEED_SENSOR.read(false); 
    delay(10); 
    airspeedv3.airspeed16.raw[1]=AIRSPEED_SENSOR.read(true); 
    delay(10); 
    AIRSPEED_SENSOR.stop();
  } 

  airsp=airspeedv3.airspeed16.val; 
  return airsp; 
}

void loop() {    
  int airspeed = airspeed_update(); Serial.println(airspeed); 
  delay(50);
}

Загрузите эту библиотеку здесь.

,

2

Я обнаружил, что адрес I2C на моем датчике Eagletree Airspeed V3 равен 0x75, а НЕ 0xEA.

следующий код, адаптированный из первого примера выше, работает на моем Nano:

/*
* обратите внимание, что время имеет решающее значение - см. задержку (5)
* и бит/с установлено на 115200
* работает нормально, но почистить 19-5-2019 jaf
*/

#include <Wire.h>

#define AIRSPEED_ADDRESS  0x75
#define WRITE_BIT         0x00
#define READ_BIT          0x01


void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("Program started");
}

void loop() {
  byte data[2] = {0};
  int i = 0;

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  Wire.write(WRITE_BIT); 
  Wire.endTransmission();

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  Wire.write(0x07); 
  Wire.endTransmission();

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  Wire.write(READ_BIT); 
  Wire.endTransmission();

  Wire.beginTransmission(AIRSPEED_ADDRESS);  
  Wire.requestFrom(AIRSPEED_ADDRESS, 2);
  data[0] = Wire.read();
  Wire.endTransmission();

  Serial.println(data[0]);  
  delay(5);
}
,