Невозможно понять получение данных от магнитометра HMC5883L и акселерометра ADXL345.
Ниже приведены регистры X, Y, Z для 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
@cassini, 👍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 указано, что данные должны считываться отдельно из каждого осевого регистра отдельно.
- Как запрограммировать ардуино на чистом C/C++?
- RtcDateTime' не называет тип
- как отправить аргумент объектам ESP8266WebServer в функции
- Какие Arduino поддерживают ATOMIC_BLOCK?
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Разница между массивом char и массивом unsigned char
- Не могу использовать uint16_t в библиотеке
- Как объединить два значения в строку?
используйте таблицу данных, чтобы определить правильный способ получения данных с устройства, @jsotola