02 Урок. Знакомство с датчиками
Датчик угловой скорости и магнитометр установлены в модуле бортовой вычислительной машины конструктора Orbix.
Датчик угловой скорости
Назначение датчика угловой скорости
Датчик угловых скоростей предназначен для измерения угловой скорости вращающегося объекта. Измерять угловую скорость необходимо для того, чтобы можно было остановить вращение космического аппарата – стабилизировать его. Также с помощью датчика угловой скорости можно заставить аппарат вращаться с определенной скоростью.
Принцип работы датчика угловой скорости
Основным измерительным элементом датчика угловой скорости является специальный микроэлектромеханический (МЭМС) гироскоп. Это не обычный гироскоп, в котором с большой скоростью вращается диск, а миниатюрный вибрационный гироскоп. Внутри МЭМС гироскопа есть кольцо, которое, колеблется в одной плоскости (рисунок 1). Если такой гироскоп поставить на вращающуюся платформу, плоскость которой совпадает с плоскостью колебаний кольца, то на нее начнет действовать сила Кориолиса пропорциональная скорости вращения платформы. Сила Кориолиса измеряется с использованием пьезоэлементов, которые выдают напряжение, пропорциональное приложенной силе:

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

Рисунок 2. Микросхема чувствительного элемента
Проверка работоспособности датчика угловой скорости
Подключите БВМ к СЭП. Откройте 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-интерфейсе (рисунок 3):

Рисунок 3. Код программы в 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)
Давайте научимся ее использовать. Установите Orbix неподвижно и запустите предыдущую программу теста ДУС.
В неподвижном состоянии показания датчика будут примерно одинаковыми (рисунок 4):

Рисунок 4. Показания датчика в неподвижном состоянии
Для проверки работы функции задания смещения ноля запустите следующую программу:
#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);
}
В этой программе мы первоначально обнуляем значения угловых скоростей, после чего перезаписываем в те же переменные полученные осредненные значения после первого вычисления и, основываясь на них, проводим вычисление еще раз.
Теперь показания ДУС в покое почти не отличаются от ноля (рисунок 5):

Рисунок 5. Сравнения показаний ДУС
Просмотр графика значений ДУС
Запустите Houston App и подключитесь к нему по Wi-Fi как рассказано на этой странице.
В этом режиме на вкладке AVS можно посмотреть график изменения значений, возвращаемых датчиком угловой скорости (рисунок 6):

Рисунок 6. График изменения значений ДУС
Магнитометр
Назначение магнитометра
Информацию об ориентации космический аппарат получает по датчику угловой скорости и магнитометру. Информация об угле нужна для того, чтобы разворачивать аппарат в необходимую сторону, а информация об угловой скорости необходима для того, чтобы стабилизировать космический аппарат, то есть погасить угловое вращение. Управляющий момент создается с помощью двигателя маховика.
Принцип работы магнитометра
Работа магнитометра основана на применении магниторезистивного эффекта, когда электрическое сопротивление проводника изменяется в соответствии с направлением линий магнитного поля. В основе датчика лежит слой пермаллоя (специального сплава никеля с железом), который обладает сильным магниторезистивным эффектом. Электрическое сопротивление пермаллоя меняется обычно в пределе ±5 % в зависимости от силы и направления действующего магнитного поля (рисунок 7):

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

Рисунок 8. Направление магнитных линий по трем осям
Проверка работоспособности магнитометра
Подключите БВМ к СЭП. Откройте 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-интерфейсе (рисунок 9):

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

Рисунок 10. Пример полученных данных
Анализ кода
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 можно посмотреть график изменения значений, возвращаемых магнитометром (рисунок 11):

Рисунок 11. График изменения значений магнитометра
Пользовательский API
Справочник по пользовательскому API со всеми функциями работы с Orbix находится на страницах: Пользовательский API на языке С++ и Пользовательский API на языке Python.