Невозможно понять получение данных от магнитометра HMC5883L и акселерометра ADXL345.

c++ c

Ниже приведены регистры X, Y, Z для HMC5883L. Регистры HMC5883L

в то время как это код Arduino для HMC5883L для получения показаний X, Y, Z. Если вы посмотрите на этот код, мы не упомянем адреса X, Y, Z специально.

  Wire.beginTransmission(0x1E);
  Wire.write(0x02);
  Wire.write(0b00000001);
  Wire.endTransmission();
  delay(10);

  Wire.requestFrom(0x1E,6);
  if (Wire.available() > 5)
  {
    x = readValue();
    y = readValue();
    z = readValue();
  }
  else 
  {
    Serial.println("No data found");
  }
int readValue()
{
  int val = Wire.read()<<8; 
      val |= Wire.read();

  return val;
}

Мы пишем только Wire.request() и не упоминаем адреса X, Y, Z специально для HMC5883L. В то время как в случае ADXL345 мы упоминаем каждый регистр X, Y, Z отдельно для получения данных. Это как раз мой вопрос, например, почему бы просто не использовать Wire.requestFrom() и для ADXL345. Когда мы получим доступ к каждому регистру X, Y, Z отдельно? а когда не будем?

Ниже приведен код Arduino ADXL345 для чтения данных по оси X.

  Wire.beginTransmission(0x53); 
  // Запрашиваем определенные регистры для данных
  Wire.write(0x32);
  Wire.write(0x33);  
  Wire.endTransmission(); 
  Wire.requestFrom(0x53,2);
  if(Wire.available()<=2) {  
    X0 = Wire.read(); 
    X1 = Wire.read(); 
    X1=X1<<8;
    X_out =X0+X1;
    Xa=X_out/256.0; 
  }

Технические описания обоих датчиков доступны по ссылке.

Приведенный выше код не принадлежит мне. https://drive.google.com/open?id=1AswNTdBz55Rfg3nu4-YsLFj4ANrsCL5I

, 👍1

Обсуждение

используйте таблицу данных, чтобы определить правильный способ получения данных с устройства, @jsotola


1 ответ


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

1

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

void setup() 
{
  // поместите сюда код установки для однократного запуска:
  Serial.begin(9600);
  // отправляем 0x3C 0x00 0x70 (8-среднее, 15 Гц по умолчанию, нормальное измерение)
  Wire.begin();
  Wire.beginTransmission(0x1E);
  Wire.write(0x00);
  Wire.write(0x70);
  Wire.endTransmission();
  delay(10);
  // отправляем 0x3C 0x01 0xA0 (усиление = 5 или любое другое желаемое усиление)
  Wire.beginTransmission(0x1E);
  Wire.write(0x01);
  Wire.write(0xA0);
  Wire.endTransmission();
  delay(10);
  //отправить 0x3C 0x02 0x00 (режим непрерывного измерения)
  Wire.beginTransmission(0x1E);
  Wire.write(0x02);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(10);

}
void loop() 
{


  Wire.requestFrom(0x1E,6);
  if (Wire.available() > 5)
  {
    x = readValue();
    y = readValue();
    z = readValue();
  }
  else 
  {
    Serial.println("No data found");
  }
  data = String(x) + "   ,   " + String(y) + "   ,   " + String(z);
  //Отправить 0x3C 0x03 (указать на первый регистр данных 03)
  Serial.println(data);
  Wire.beginTransmission(0x1E);
  Wire.write(0x03);
  Wire.endTransmission();
  delay(100);
}

Точно так же в даташите на ADXL345 указано, что данные должны считываться отдельно из каждого осевого регистра отдельно.

,