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):

Рисунок 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):

Рисунок 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.