Форум РадиоКот https://radiokot.ru/forum/ |
|
Вопрос по GY-271 (Цифровой компас QMC5883) https://radiokot.ru/forum/viewtopic.php?f=61&t=172958 |
Страница 1 из 1 |
Автор: | forfrends [ Пт сен 25, 2020 13:31:44 ] |
Заголовок сообщения: | Вопрос по GY-271 (Цифровой компас QMC5883) |
Всем привет! имеется модуль Цифрового компаса 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: 229x: -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 |
Автор: | GARMIN [ Пт сен 25, 2020 14:58:07 ] |
Заголовок сообщения: | Re: Вопрос по GY-271 (Цифровой компас QMC5883) |
Наверное, для определения верха и низа тебе нужен не компас, а акселерометр. ЗЫ Даташит не читал. |
Автор: | forfrends [ Пт сен 25, 2020 16:26:00 ] |
Заголовок сообщения: | Re: Вопрос по GY-271 (Цифровой компас QMC5883) |
Так есть возможность измерения угла поворота. Вот еще пример кода: Спойлер#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: 826Y 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 Значения меняются в зависимости от поворота/наклона модуля |
Автор: | Stan47 [ Пт сен 25, 2020 20:47:51 ] |
Заголовок сообщения: | Re: Вопрос по GY-271 (Цифровой компас QMC5883) |
В моем понимании компас устройство двумерное и не может определять верх и низ. Либо он должен быть оснащен дополнительным устройством, например, гироскопом или гравитометром. В простейшем случае - ртутный переключатель... |
Автор: | lizard66 [ Сб сен 26, 2020 11:23:59 ] |
Заголовок сообщения: | Re: Вопрос по GY-271 (Цифровой компас QMC5883) |
При помощи магнитометра, определить верх/низ можно только условно. Надо знать начальное положение датчика относительно сторон света, при перевороте – показания меняются на 180 градусов. Кроме того датчик надо калибровать для местности, на которой он будет использоваться. ТСу, для выполнения условия, нужен акселерометр, ИМХО, хотя для компаса он тоже нужен. PS: Извиняюсь, не уточнил - при перевороте датчиков, на 180 градусов меняется не значение оси Z, а значение рассчитанного азимута Мои потуги с компасом на LSM303, во второй половине ролика есть калибровка: |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |