Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
lesson5 [2019/05/14 10:51] golikov [Проверка работоспособности магнитометра Орбикрафт] |
lesson5 [2019/05/14 11:15] golikov [Получение сырых данных для калибровки магнитометра] |
||
---|---|---|---|
Строка 103: | Строка 103: | ||
Загрузите в БКУ следующую программу, которая произведет 60 измерений с шагом в 1 сек. | Загрузите в БКУ следующую программу, которая произведет 60 измерений с шагом в 1 сек. | ||
- | <code python> | + | |
+ | Код на Python. | ||
+ | <file python azimuth.py> | ||
import math | import math | ||
Строка 128: | Строка 130: | ||
magnetometer_turn_off(mag_num) | magnetometer_turn_off(mag_num) | ||
+ | </file> | ||
- | </code> | + | Код на С. |
+ | <file c azimuth.c> | ||
+ | #include <stdio.h> | ||
+ | #include <stdint.h> | ||
+ | #include "libschsat.h" | ||
+ | #define LSS_OK 0 | ||
+ | #define LSS_ERROR 1 | ||
+ | #define LSS_BREAK 2 | ||
+ | |||
+ | |||
+ | #include <math.h> | ||
+ | void control(void){ | ||
+ | int time_step = 1; | ||
+ | uint16_t mag_num = 1; | ||
+ | printf("Enable magnetometer %d\n", mag_num); | ||
+ | magnetometer_turn_on(mag_num); | ||
+ | Sleep(1); | ||
+ | int mag_state = 0; | ||
+ | |||
+ | int16_t p_dataX; | ||
+ | int16_t p_dataY; | ||
+ | int16_t p_dataZ; | ||
+ | int16_t *pRAW_dataX = &p_dataX; | ||
+ | int16_t *pRAW_dataY = &p_dataY; | ||
+ | int16_t *pRAW_dataZ = &p_dataZ; | ||
+ | int i; | ||
+ | for (i = 0; i < 60; i++){ | ||
+ | mag_state = magnetometer_request_raw(mag_num, pRAW_dataX, pRAW_dataY, pRAW_dataZ); | ||
+ | float mag_alpha; | ||
+ | if (!mag_state){ | ||
+ | mag_alpha = atan2(p_dataY, p_dataX)/M_PI*180; | ||
+ | printf("mag_alpha atan2 = %f\n", mag_alpha); | ||
+ | } | ||
+ | else if (mag_state == 1){ | ||
+ | printf("Fail because of access error, check the connection\n"); | ||
+ | } | ||
+ | else if (mag_state == 2){ | ||
+ | printf("Fail because of interface error, check your code\n"); | ||
+ | } | ||
+ | Sleep(time_step); | ||
+ | } | ||
+ | printf("Disable magnetometer %d\n", mag_num); | ||
+ | magnetometer_turn_off(mag_num); | ||
+ | } | ||
+ | </file> | ||
Поворачивайте магнитометр с шагом в 30 градусов и записывайте выдаваемое значение угла в таблицу EXCEL. Должна получится примерно вот такая таблица с данными. | Поворачивайте магнитометр с шагом в 30 градусов и записывайте выдаваемое значение угла в таблицу EXCEL. Должна получится примерно вот такая таблица с данными. | ||
Строка 218: | Строка 265: | ||
По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны. | По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке Python, представленный ниже. Во время сбора данных магнитометр необходимо хаотично вращать, стараясь повернуть его во все возможные стороны. | ||
- | <code python> | + | Код на Python. |
+ | <file python raw_data.py> | ||
def control(): #Основная программы, в которой вызываем остальные функции | def control(): #Основная программы, в которой вызываем остальные функции | ||
Строка 231: | Строка 279: | ||
sleep(0.05) #Задержка пять сотых секунды | sleep(0.05) #Задержка пять сотых секунды | ||
magnetometer_turn_off(num) #Выключение магнитометра | magnetometer_turn_off(num) #Выключение магнитометра | ||
- | </code> | + | </file> |
+ | |||
+ | Код на С. | ||
+ | <file c raw_data.c> | ||
+ | #include <stdio.h> | ||
+ | #include <stdint.h> | ||
+ | #include "libschsat.h" | ||
+ | #define LSS_OK 0 | ||
+ | #define LSS_ERROR 1 | ||
+ | #define LSS_BREAK 2 | ||
+ | |||
+ | |||
+ | void control(void){ //Основная программа, в которой вызываем остальные функции | ||
+ | /*Для вывода данных необходимость в объявлении массива отпадает*/ | ||
+ | int16_t mgn_result[] = {0, 0, 0, 0}; //Инициализируем mgn_result | ||
+ | uint16_t num = 1; | ||
+ | magnetometer_turn_on(num); //Включаем магнитометр | ||
+ | Sleep(1); | ||
+ | int i; | ||
+ | for (i = 0; i < 1000; i++) //Выполним 500 измерений | ||
+ | { | ||
+ | mgn_result[0] = magnetometer_request_raw(num, &mgn_result[1],&mgn_result[2],&mgn_result[3]); | ||
+ | if(!mgn_result[0]){ //Если датчик не вернул сообщение об ошибке | ||
+ | printf("%d, %d, %d\n", mgn_result[1], mgn_result[2], mgn_result[3]); | ||
+ | } | ||
+ | Sleep(0.5); //Задержка пять сотых секунды | ||
+ | } | ||
+ | magnetometer_turn_off(num); | ||
+ | } | ||
+ | </file> | ||
Соедините БКУ с СЭП и магнитометром. Не прикрепляйте магнитометр к пластине, чтобы его было удобно вращать. Загрузите программу в Орбикрафт и запустите ее. Хаотично вращайте магнитометр, чтобы собрать сырые данные со всех возможных вариантов его ориентации. | Соедините БКУ с СЭП и магнитометром. Не прикрепляйте магнитометр к пластине, чтобы его было удобно вращать. Загрузите программу в Орбикрафт и запустите ее. Хаотично вращайте магнитометр, чтобы собрать сырые данные со всех возможных вариантов его ориентации. |