Например TDA7294

Форум РадиоКот • Просмотр темы - Вопрос по GY-271 (Цифровой компас QMC5883)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс июл 27, 2025 22:08:53

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Вопрос по GY-271 (Цифровой компас QMC5883)
СообщениеДобавлено: Пт сен 25, 2020 13:31:44 
Вымогатель припоя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06
Сообщений: 545
Откуда: Николаев / Украина
Рейтинг сообщения: 0
Всем привет! имеется модуль Цифрового компаса QMC5883L. Программу пишу в Ардуино ИДЕ. Установил несколько библиотек: Mecha_QMC5883L и DFRobot_QMC5883, покрутил в руках, вроде работает, циферки в мониторе порта бегут и меняются в зависимости от поворота/наклона датчика.
Мне нужно сделать определение "верха" и "низа". То есть мне нужно его встроить в устройство, чтобы при перевороте устройства понимать где верх. Высокая точность не нужна, так как корпус будет прямоугольным, и на ребро его никто ставить не будет.
Подскажите, как это реализовать? Что-то сообразить не могу. Проблема в том что при перевороте меняются значения у всех трех осей, так как положение в пространстве может поменяться как угодно... и это вводит меня в какой-то ступор.

вот пример из библиотеки от DFRobot_QMC5883:
Спойлер
Код:
/*!
 * @file QMC5883_readRaw.cpp
 * @brief show raw data
 * @n 3-Axis Digital Compass IC
 *
 * @copyright   [DFRobot](<a href="http://www.dfrobot.com" title="http://www.dfrobot.com" rel="nofollow">http://www.dfrobot.com</a>), 2017
 * @copyright   GNU Lesser General Public License
 *
 * @author [dexian.huang](<a href="mailto:952838602@qq.com">952838602@qq.com</a>)
 * @version  V1.0
 * @date  2017-7-3
 */

#include <Wire.h>
#include <DFRobot_QMC5883.h>

DFRobot_QMC5883 compass;

int minX = 0;
int maxX = 0;
int minY = 0;
int maxY = 0;
int offX = 0;
int offY = 0;

void setup()
{
  Serial.begin(115200);

  // Initialize Initialize QMC5883
  while (!compass.begin()){
    Serial.println("Could not find a valid QMC5883 sensor, check wiring!");
    delay(500);
  }
  if(compass.isHMC() ){
    Serial.println("Initialize HMC5883");
    compass.setRange(HMC5883L_RANGE_1_3GA);
    compass.setMeasurementMode(HMC5883L_CONTINOUS);
    compass.setDataRate(HMC5883L_DATARATE_15HZ);
    compass.setSamples(HMC5883L_SAMPLES_8);
  }else if(compass.isQMC()){
    Serial.println("Initialize QMC5883");
    compass.setRange(QMC5883_RANGE_2GA);
    compass.setMeasurementMode(QMC5883_CONTINOUS);
    compass.setDataRate(QMC5883_DATARATE_50HZ);
    compass.setSamples(QMC5883_SAMPLES_8);
  }
}

void loop()
{
  Vector mag = compass.readRaw();
  Serial.print(mag.XAxis);
  Serial.print(":");
  Serial.print(mag.YAxis);
  Serial.print(":");
  Serial.println(mag.ZAxis);
}

На выходе вот это:
Спойлер-2550.00:11790.00:-10248.00
-2550.00:11790.00:-10244.00
-2550.00:11790.00:-10244.00
-1805.00:10420.00:-10240.00
-920.00:9092.00:-10240.00
-860.00:9110.00:-10244.00
-2680.00:7700.00:-7684.00
-3022.00:8416.00:-7680.00
-5314.00:11740.00:-7680.00
-6700.00:12430.00:-7684.00
-6378.00:11317.00:-5888.00
-6240.00:10840.00:-5124.00
-6391.00:10785.00:-4868.00
-7750.00:10290.00:-2564.00
-7750.00:10290.00:-2564.00
-7750.00:10290.00:-2564.00
-11131.00:12299.00:-768.00
-10465.00:13871.00:0.00
-12700.00:13950.00:-4.00
-12700.00:13950.00:-4.00
-12700.00:13950.00:-4.00
-12700.00:13950.00:-4.00
-12700.00:13950.00:-4.00
-12700.00:13950.00:-4.00
-11680.00:12890.00:5116.00
-11680.00:12890.00:5116.00
-11680.00:12890.00:5116.00
-11680.00:12890.00:5116.00
-11680.00:12890.00:5116.00
-11680.00:12890.00:5116.00
-12300.00:15080.00:7676.00
-11748.00:14003.00:8448.00
-10460.00:11490.00:10236.00
-10460.00:11490.00:10236.00
-10460.00:11490.00:10236.00
-10460.00:11490.00:10232.00
-10182.00:11436.00:10752.00
-8995.00:11439.00:12800.00
-9040.00:12185.00:12800.00
-9260.00:12420.00:12796.00
-9260.00:12420.00:12796.00
-7770.00:7790.00:15356.00
-7770.00:7790.00:15356.00
-7770.00:7790.00:15356.00
-7770.00:7790.00:15356.00
-6636.00:8574.00:15360.00
-6054.00:8742.00:15360.00
-6298.00:8661.00:15360.00
-6280.00:8490.00:15356.00
-6420.00:8810.00:15360.00
-6630.00:9290.00:15356.00
-6630.00:9290.00:15356.00
-6630.00:9290.00:15356.00
-4340.00:9040.00:17916.00
-4340.00:9040.00:17916.00
-4340.00:9040.00:17916.00
-4604.00:8878.00:17920.00
-4780.00:8770.00:17916.00
-2899.00:6754.00:17920.00
-5030.00:8970.00:17916.00
-5021.00:8949.00:17920.00
-5000.00:8900.00:17916.00
-5000.00:8900.00:17916.00
-5000.00:8900.00:17916.00
-5000.00:8900.00:17912.00
-5000.00:8900.00:17916.00
-5000.00:8900.00:17916.00
-5000.00:8900.00:17916.00
-5000.00:8900.00:17916.00
-6440.00:8828.00:15872.00
-6800.00:8810.00:15352.00
-6800.00:8810.00:15356.00
-6800.00:8810.00:15356.00
-6800.00:8810.00:15356.00
-6800.00:8810.00:15356.00
-6800.00:8810.00:15356.00
-6800.00:8810.00:15352.00
-6800.00:8810.00:15356.00
-8040.00:9114.00:14336.00
-9900.00:9570.00:12796.00
-9900.00:9570.00:12796.00
-9900.00:9570.00:12796.00
-9842.00:9664.00:13056.00
-7790.00:5200.00:15356.00
-7790.00:5200.00:15356.00
-7790.00:5200.00:15356.00
-7790.00:5200.00:15356.00
-9734.00:8764.00:13056.00

Вот пример из Mecha_QMC5883L:
Спойлер
Код:
#include <Wire.h>
#include <MechaQMC5883.h>

MechaQMC5883 qmc;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  qmc.init();
  //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
}

void loop() {
  int x, y, z;
  int azimuth;
  //float azimuth; //is supporting float too
  qmc.read(&x, &y, &z,&azimuth);
  //azimuth = qmc.azimuth(&y,&x);//you can get custom azimuth
  Serial.print("x: ");
  Serial.print(x);
  Serial.print(" y: ");
  Serial.print(y);
  Serial.print(" z: ");
  Serial.print(z);
  Serial.print(" a: ");
  Serial.print(azimuth);
  Serial.println();
  delay(100);
}

Вот что на выходе при попытке "аккуратно" перевернуть датчик "вверх ногами":
Спойлерx: -1458 y: -1715 z: 435 a: 229
x: -1461 y: -1682 z: 450 a: 229
x: -1450 y: -1680 z: 480 a: 229
x: -1442 y: -1705 z: 461 a: 229
x: -1422 y: -1690 z: 515 a: 229
x: -1491 y: -1670 z: 466 a: 228
x: -1545 y: -1710 z: 308 a: 227
x: -1637 y: -1760 z: 66 a: 227
x: -1712 y: -1737 z: -265 a: 225
x: -1707 y: -1755 z: -630 a: 225
x: -1632 y: -1778 z: -888 a: 227
x: -1686 y: -1652 z: -840 a: 224
x: -1700 y: -1442 z: -1031 a: 220
x: -1668 y: -1295 z: -1132 a: 217
x: -1458 y: -1168 z: -1408 a: 218
x: -1230 y: -1112 z: -1592 a: 222
x: -933 y: -1075 z: -1710 a: 229
x: -466 y: -1115 z: -1815 a: 247
x: 22 y: -1183 z: -1737 a: 271
x: 361 y: -1246 z: -1605 a: 286
x: 485 y: -1283 z: -1541 a: 290
x: 600 y: -1238 z: -1436 a: 295
x: 713 y: -1290 z: -1382 a: 298
x: 772 y: -1380 z: -1305 a: 299
x: 838 y: -1432 z: -1223 a: 300
x: 787 y: -1445 z: -1261 a: 298
x: 667 y: -1468 z: -1385 a: 294
x: -17 y: -1191 z: -1712 a: 269
x: -872 y: -1117 z: -1677 a: 232
x: -1493 y: -1360 z: -1323 a: 222
x: -1720 y: -1440 z: -1036 a: 219
x: -1851 y: -1501 z: -662 a: 219
x: -1848 y: -1491 z: -87 a: 218
x: -1646 y: -1476 z: 383 a: 221
x: -1368 y: -1466 z: 692 a: 226
x: -1165 y: -1427 z: 853 a: 230
x: -1028 y: -1387 z: 933 a: 233
x: -940 y: -1367 z: 1001 a: 235
x: -896 y: -1372 z: 996 a: 236
x: -911 y: -1375 z: 977 a: 236
x: -921 y: -1395 z: 973 a: 236
x: -940 y: -1380 z: 985 a: 235
x: -950 y: -1382 z: 968 a: 235
x: -926 y: -1385 z: 982 a: 236
x: -926 y: -1377 z: 998 a: 236
x: -940 y: -1370 z: 982 a: 235
x: -940 y: -1377 z: 966 a: 235
x: -950 y: -1355 z: 973 a: 234
x: -975 y: -1357 z: 955 a: 234
x: -1227 y: -1382 z: 826 a: 228
x: -1597 y: -1427 z: 453 a: 221
x: -1776 y: -1468 z: 93 a: 219
x: -1861 y: -1390 z: -136 a: 216
x: -1900 y: -1365 z: -563 a: 215
x: -1597 y: -1360 z: -1288 a: 220
x: -1093 y: -1337 z: -1635 a: 230
x: -531 y: -1320 z: -1806 a: 248
x: 227 y: -1292 z: -1691 a: 279
x: 572 y: -1273 z: -1527 a: 294
x: 833 y: -1258 z: -1305 a: 303
x: 940 y: -1253 z: -1143 a: 306
x: 1008 y: -1238 z: -1060 a: 309
x: 975 y: -1198 z: -1125 a: 309
x: 757 y: -938 z: -1433 a: 308
x: 585 y: -787 z: -1546 a: 306
x: 502 y: -680 z: -1586 a: 306
x: 507 y: -611 z: -1576 a: 309
x: 510 y: -650 z: -1581 a: 308
x: 515 y: -631 z: -1576 a: 309
x: 526 y: -603 z: -1567 a: 311

_________________
Сделать своими руками всегда интересней чем просто купить и пользоваться


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по GY-271 (Цифровой компас QMC5883)
СообщениеДобавлено: Пт сен 25, 2020 14:58:07 
Держит паяльник хвостом
Аватар пользователя

Карма: 16
Рейтинг сообщений: 197
Зарегистрирован: Вс дек 02, 2012 16:58:33
Сообщений: 922
Откуда: от туда
Рейтинг сообщения: 0
Наверное, для определения верха и низа тебе нужен не компас, а акселерометр.
ЗЫ Даташит не читал.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по GY-271 (Цифровой компас QMC5883)
СообщениеДобавлено: Пт сен 25, 2020 16:26:00 
Вымогатель припоя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06
Сообщений: 545
Откуда: Николаев / Украина
Рейтинг сообщения: 0
Так есть возможность измерения угла поворота. Вот еще пример кода:
Спойлер#include <Wire.h> //I2C Arduino Library

#define addr 0x0D //I2C Address for The HMC5883

void setup() {

Serial.begin(9600);
Wire.begin();


Wire.beginTransmission(addr); //start talking
Wire.write(0x0B); // Tell the HMC5883 to Continuously Measure
Wire.write(0x01); // Set the Register
Wire.endTransmission();
Wire.beginTransmission(addr); //start talking
Wire.write(0x09); // Tell the HMC5883 to Continuously Measure
Wire.write(0x1D); // Set the Register
Wire.endTransmission();
}

void loop() {

int x, y, z; //triple axis data

//Tell the HMC what regist to begin writing data into


Wire.beginTransmission(addr);
Wire.write(0x00); //start with register 3.
Wire.endTransmission();

//Read the data.. 2 bytes for each axis.. 6 total bytes
Wire.requestFrom(addr, 6);
if (6 <= Wire.available()) {
x = Wire.read(); //MSB x
x |= Wire.read() << 8; //LSB x
z = Wire.read(); //MSB z
z |= Wire.read() << 8; //LSB z
y = Wire.read(); //MSB y
y |= Wire.read() << 8; //LSB y
}

// Show Values
Serial.print("X Value: ");
Serial.println(x);
Serial.print("Y Value: ");
Serial.println(y);
Serial.print("Z Value: ");
Serial.println(z);
Serial.println();

delay(500);
}

Возвращает:
СпойлерX Value: 826
Y Value: 982
Z Value: -483

X Value: 831
Y Value: 977
Z Value: -488

X Value: 831
Y Value: 985
Z Value: -480

X Value: 811
Y Value: 963
Z Value: -480

X Value: 828
Y Value: 990
Z Value: -477

X Value: 828
Y Value: 990
Z Value: -467

X Value: 813
Y Value: 985
Z Value: -477

Значения меняются в зависимости от поворота/наклона модуля

_________________
Сделать своими руками всегда интересней чем просто купить и пользоваться


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по GY-271 (Цифровой компас QMC5883)
СообщениеДобавлено: Пт сен 25, 2020 20:47:51 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 56
Зарегистрирован: Ср ноя 08, 2017 19:56:39
Сообщений: 490
Откуда: СПб
Рейтинг сообщения: 0
В моем понимании компас устройство двумерное и не может определять верх и низ. Либо он должен быть оснащен дополнительным устройством, например, гироскопом или гравитометром. В простейшем случае - ртутный переключатель...

_________________
Звание - сила


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по GY-271 (Цифровой компас QMC5883)
СообщениеДобавлено: Сб сен 26, 2020 11:23:59 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 3
Рейтинг сообщений: 19
Зарегистрирован: Чт май 14, 2015 16:58:00
Сообщений: 35
Откуда: Kharkiv
Рейтинг сообщения: 0
При помощи магнитометра, определить верх/низ можно только условно. Надо знать начальное положение датчика относительно сторон света, при перевороте – показания меняются на 180 градусов. Кроме того датчик надо калибровать для местности, на которой он будет использоваться. ТСу, для выполнения условия, нужен акселерометр, ИМХО, хотя для компаса он тоже нужен.


PS: Извиняюсь, не уточнил - при перевороте датчиков, на 180 градусов меняется не значение оси Z, а значение рассчитанного азимута

Мои потуги с компасом на LSM303, во второй половине ролика есть калибровка:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y