Двигатель-маховик
Виртуальное потребление - 2000мА

Рисунок 1. Двигатель-маховик
При движении по орбите многим спутникам требуется точная ориентация определенными гранями в нужном направлении - относительно Земли, Солнца, звезд или как-то иначе. Например, чтобы навестись камерой ДЗЗ на Землю или солнечными батареями на Солнце. На малых же аппаратах для обеспечения заданной ориентации спутника в пространстве относительно центра масс чаще всего используются двигатели-маховики (рисунок 1).
Двигатель-маховик - электромеханическое устройство, представляющий собой электромотор с насаженным на его ось вращения колесом. Двигатель вращается, то ускоряясь, то замедляясь, и по закону сохранения кинетического момента, вращается быстрее или медленнее сам космический аппарат. Так как в условиях космоса внешние силы отсутствуют и количество движения не может изменяться, вращение маховика по часовой стрелке приводит к вращению всего космического аппарата против часовой стрелки. Таким образом управляя двигателем и вращением двигателя-маховика мы можем управлять движением вокруг центра масс (по сути, вращением) всего аппарата.
В нашей модели свободное вращение конструктора ОрбиКрафт, и следовательно, маховика, возможно только вокруг одной оси - вертикальной. Поэтому на «спутник» устанавливается только один маховик ориентации.
Для работы с двигателем маховика используются следующие функции (на языке C):
int32_t motor_set_speed(uint16_t num,int16_t RPM,int16_t *confirm);
Позволяет задать скорость маховику, в случае успеха возвращает код LSS_OK и значение confirm равное требуемому RPM. Однако реальный разгон маховика до требуемой скорости может занять достаточно продолжительное время.
Следующая функция позволяет запросить текущую скорость маховика:
int32_t motor_request_speed(uint16_t num,int16_t *pRPM);
Код проверки магнитометра на языке C
#include "libschsat.h"
/*
** Lab 5: manage motor speed
*/
void control(void)
{
const int num = 1; /* motor number #1 */
int16_t temp;
int16_t rpm = -3000; /* -3000 ... +3000 */
printf("Enable motor #%d\n", num);
motor_turn_on(num);
Sleep(1);
printf("Manage speed motor #%d\n", num);
while (rpm <= 3000) {
printf("<<< Set speed to %d\n", rpm);
if (LSS_OK == motor_set_speed(num, rpm, &temp)) {
if (temp == rpm)
printf("\t%d confirmed\n", rpm);
}
Sleep(1);
if (LSS_OK == motor_request_speed(num, &temp)) {
printf("Got speed %d >>>\n", temp);
} else {
puts("Fail! >>>");
}
rpm += 500;
}
printf("<<< Set speed to 0\n");
if (LSS_OK == motor_set_speed(num, 0, &temp)) {
if (temp == 0)
printf("\t%d confirmed\n", 0);
}
Sleep(1);
if (LSS_OK == motor_request_speed(num, &temp)) {
printf("Got speed %d >>>\n", temp);
} else {
puts("Fail! >>>");
}
Sleep(1);
motor_set_speed(num, 0, &temp);
Sleep(1);
printf("Disable motor #%d\n", num);
motor_turn_off(num);
}
Код проверки магнитометра на языке Python
def control(): # Основная функция программы, в которой нужно вызывать остальные функции
#Инициализируем переменных:
motor_response = [0,0] # Инициализируем массив, в который будут записываться показания с маховика, где первый элемент - сообщение об ошибке
num = 1
rpm = 0 #rpm = rotation per minute, то есть, количество оборотов в минуту, будем изменять от -3000 до +3000
#Включаем маховик
print "Enable reaction wheel №", num
motor_turn_on(num)
sleep(1)
#Изменяем скорость маховика от - 3000 до 3000 со скоростью 500 обортов в минуту
print "Manage speed of motor №", num
while rpm >= -3000:
#Установим скорость маховика - 3000
# motor_set_speed устанавливает скорость rpm и возвращает значение о текущей скорости в motor_response
print "Set speed to -3000"
motor_response = motor_set_speed(num, rpm)
if not motor_response[0]: #Если ошибки нет, то
if motor_response[1] == -3000: # Если заданная скорость достигнута, то
print "-3000 rotations per minute confirmed" #Выводим подтверждение
else:
print "Got speed", motor_response[1]
elif motor_response[0] == 1:
print "Fail because of access error, check the connection"
elif motor_response[0] == 2:
print "Fail because of interface error, check your code"
rpm += -500
sleep(1) # Ждем 1 секунду
print "Set speed to 3000 "
while rpm <= 3000:
motor_response = motor_set_speed(num, rpm)
if not motor_response[0]:
if motor_response[1] == 3000:
print "3000 rotations per minute confirmed"
else:
print "Got speed", motor_response[1]
elif motor_response[0] == 1:
print "Fail because of access error, check the connection"
elif motor_response[0] == 2:
print "Fail because of interface error, check your code"
rpm += 500
sleep(1)
print "Set speed to 0"
while rpm != 0:
motor_response = motor_set_speed(num, rpm)
if not motor_response[0]:
if motor_response[1] == 0:
print "0 rotations per minute confirmed"
else:
print "Got speed", motor_response[1]
elif motor_response[0] == 1:
print "Fail because of access error, check the connection"
elif motor_response[0] == 2:
print "Fail because of interface error, check your code"
rpm += -500
sleep(1)
print "Disable reaction wheel №", num
motor_turn_off(num)