Чтение данных из 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(" ");
}
@bpinhosilva, 👍1
Обсуждение2 ответа
Лучший ответ:
Это интересно, но после использования другой библиотеки код сработал.
Он должен точно следовать тому, что написано в техническом описании, чтобы добиться результата.
Следующий исходный код делает это и получает скорость полета от датчика:
#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);
}
Загрузите эту библиотеку здесь.
Я обнаружил, что адрес 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);
}
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Датчик качества воздуха Sparkfun CCS811 не работает
- MAX30102 показывает частоту сердечных сокращений: 0.00 ударов в минуту / SpO2: 0%
- Датчики I2C не работают при подключении к LCD дисплею 20X04
- Измерения датчиков My Atlas Scientific дают нулевые значения при первом чтении
- Проблема стабильности кода прерываний, связанного с датчиком расхода
- DHT20 и дисплей Oled не работают вместе
- Как предотвратить попадание помех от Livewire/других датчиков в матрицу клавиатуры с одним аналоговым выводом (с использованием резисторов)?
Это действительно полезно. Большое спасибо!, @James Huo