Перейти к основному содержимому

02 Урок. Знакомство с датчиками

Датчик угловой скорости и магнитометр установлены в модуле БВМ конструктора ОрбиКрафт 3D (рисунок 1):

Модуль БВМ с ДУС и магнитометром

Рисунок 1. Модуль БВМ с ДУС и магнитометром

Датчик угловой скорости

Назначение датчика угловой скорости

Датчик угловых скоростей предназначен для измерения угловой скорости вращающегося объекта. Измерять угловую скорость необходимо для того, чтобы можно было остановить вращение спутника – стабилизировать его. Также с помощью датчика угловой скорости можно заставить спутник вращаться с определенной скоростью.

Принцип работы датчика угловой скорости

Основным измерительным элементом датчика угловой скорости является специальный микроэлектромеханический (МЭМС) гироскоп. Это не обычный гироскоп, в котором с большой скоростью вращается диск, а миниатюрный вибрационный гироскоп. Внутри МЭМС гироскопа есть кольцо, которое, колеблется в одной плоскости (рисунок 2). Если такой гироскоп поставить на вращающуюся платформу, плоскость которой совпадает с плоскостью колебаний кольца, то на нее начнет действовать сила Кориолиса пропорциональная скорости вращения платформы. Сила Кориолиса измеряется с использованием пьезоэлементов, которые выдают напряжение, пропорциональное приложенной силе:

Конструкция ДУС

Рисунок 2. Конструкция ДУС

Определив силу Кориолиса и зная скорость колебания, можно вычислить угловую скорость и ее изменение (угловое ускорение).

Микросхема чувствительного элемента

Рисунок 3. Микросхема чувствительного элемента

Проверка работоспособности датчика угловой скорости

Подключите БВМ к СЭП. Откройте Web-интерфейс и напишите следующую программу.

#include <stdio.h>
#include <stdint.h>
#include "libschsat.h"

void control(void){

float gyro_x = 0, gyro_y = 0, gyro_z = 0;
uint16_t gyro_num = 0;
gyro_set_offset(0, 0, 0, 0);

for (int i = 0; i < 20; i++){
mSleep(1000);
gyro_request_raw(gyro_num, &gyro_x, &gyro_y, &gyro_z);
printf("Gyro: %f %f %f\n", gyro_x, gyro_y, gyro_z);
}
puts("Sent");
}

Запустите программу и протестируйте работу ДУС.

Программа в WEB-интерфейсе (рисунок 4):

Код программы в Web-интерфейсе и пример полученных с помощью нее данных

Рисунок 4. Код программы в Web-интерфейсе и пример полученных с помощью нее данных

Анализ кода

Cоздаем переменные gyro_x, gyro_y, gyro_z для получения данных от датчика и переменную num, хранящую номер ДУС.

Функция mSleep(1000) приостанавливает выполнение программы на 1 секунду.

Затем в цикле for (int i = 0; i < 20; i++) мы 20 раз считываем и выводим значение ДУС.

Показания ДУС считываем с помощью функции:

gyro_request_raw(gyro_num, &gyro_x, &gyro_y, &gyro_z)

Смещение ноля

Часто датчик угловой скорости имеет смещение ноля, и в покое показывает ненулевые значения.

Для того, чтобы увеличить точность показаний датчика используется специальная функция для задания смещения ноля

gyro_set_offset (uint16_t num, float offset_X, float offset_Y, float offset_Z)

Давайте научимся ее использовать. Установите Орбикрафт неподвижно и запустите предыдущую программу теста ДУС.

В неподвижном состоянии показания датчика будут примерно одинаковыми (рисунок 5):

Показания датчика в неподвижном состоянии

Рисунок 5. Показания датчика в неподвижном состоянии

Для проверки работы функции задания смещения ноля запустите следующую программу:

#include <stdio.h>
#include <stdint.h>
#include "libschsat.h"

void control(void){

float gyro_x = 0, gyro_y = 0, gyro_z = 0;
uint16_t tmp=0;

Sleep(1);
gyro_set_offset(tmp, gyro_x, gyro_y, gyro_z);
Sleep(1);
gyro_request_raw(tmp, &gyro_x, &gyro_y, &gyro_z);
printf("Before fix:\n %f %f %f", gyro_x, gyro_y, gyro_z);
Sleep(1);
gyro_set_offset(tmp, gyro_x, gyro_y, gyro_z);
Sleep(1);
gyro_request_raw(tmp, &gyro_x, &gyro_y, &gyro_z);
printf("\nAfter fix:\n %f %f %f \n", gyro_x, gyro_y, gyro_z);
uint8_t data[0];
send_unican_message(25, 2656, data, 0);
}
к сведению

В этой программе мы первоначально обнуляем значения угловых скоростей, после чего перезаписываем в те же переменные полученные осредненные значения после первого вычисления и, основываясь на них, проводим вычисление еще раз.

Теперь показания ДУС в покое почти не отличаются от ноля (рисунок 6):

Сравнения показаний ДУС

Рисунок 6. Сравнения показаний ДУС

Просмотр графика значений ДУС

Запустите Houston App и подключитесь к нему по Wi-Fi как рассказано на этой странице.

В этом режиме на вкладке AVS можно посмотреть график изменения значений, возвращаемых датчиком угловой скорости (рисунок 7):

График изменения значений ДУС

Рисунок 7. График изменения значений ДУС

Магнитометр

Назначение магнитометра

Информацию об ориентации спутник получает по датчику угловой скорости и магнитометру. Информация об угле нужна для того, чтобы разворачивать спутник в необходимую сторону, а информация об угловой скорости необходима для того, чтобы стабилизировать спутник, то есть погасить угловое вращение. Управляющий момент создается с помощью двигателя маховика.

Принцип работы магнитометра

Работа магнитометра основана на применении магниторезистивного эффекта, когда электрическое сопротивление проводника изменяется в соответствии с направлением линий магнитного поля. В основе датчика лежит слой пермаллоя (специального сплава никеля с железом), который обладает сильным магниторезистивным эффектом. Электрическое сопротивление пермаллоя меняется обычно в пределе ±5 % в зависимости от силы и направления действующего магнитного поля (рисунок 8):

Конструкция магнитометра

Рисунок 8. Конструкция магнитометра

Таким образом, измеряя силу тока, протекающего через слой пермаллоя при подаче постоянного напряжения +5В можно определить направление линий магнитного поля. Для того чтобы измерить направление магнитных линий по всем трем осям используют три маленьких датчика, ориентированных по осям X, Y и Z, установленные в одной микросхеме (рисунок 9):

Направление магнитных линий по трем осям

Рисунок 9. Направление магнитных линий по трем осям

Проверка работоспособности магнитометра

Подключите БВМ к СЭП. Откройте Web-Интерфейс и напишите следующую программу:

#include <stdio.h>
#include <stdint.h>
#include "libschsat.h"

void control(void){

float mag_x = 0, mag_y = 0, mag_z = 0;
uint16_t mag_num = 0;

for (int i = 0; i < 20; i++){
mSleep(1000);
magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z);
printf("Mag: %f %f %f\t\n", mag_x, mag_y, mag_z);
}
puts("Sent");
}

Программа в WEB-интерфейсе (рисунок 10):

Программа в Web-интерфейсе

Рисунок 10. Программа в Web-интерфейсе

Запустите программу и протестируйте работу магнитометра.

Пример полученных данных

Рисунок 11. Пример полученных данных

Анализ кода

Cоздаем переменные mag_x, mag_y, mag_z для получения данных от датчика и переменную num, хранящую номер магнитометра.

Функция mSleep(1000) приостанавливает выполнение программы на 1 секунду.

Затем в цикле for (int i = 0; i < 20; i++) мы 20 раз считываем и выводим значение магнитометра.

Показания магнитометра считываем с помощью функции:

magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z)

Просмотр графика значений магнитометра

Запустите Houston App и подключитесь к нему по Wi-Fi как рассказано на этой странице.

В этом режиме на вкладке Magnetometer можно посмотреть график изменения значений, возвращаемых магнитометром (рисунок 12):

График изменения значений магнитометра

Рисунок 12. График изменения значений магнитометра

Пользовательский API

Справочник по пользовательскому API со всеми функциями работы с ОрбиКрафт 3D находится на страницах: Пользовательский API на языке С++ и Пользовательский API на языке Python.