Для чего нужен ОрбиКрафт
Подсистемы конструктора
Инструкции по работе с ОрбиКрафт
Уроки
Лабораторная оснастка
Знакомство с Arduino
Полезная нагрузка на базе Arduino
Обратная связь
Новости
Для чего нужен ОрбиКрафт
Подсистемы конструктора
Инструкции по работе с ОрбиКрафт
Уроки
Лабораторная оснастка
Знакомство с Arduino
Полезная нагрузка на базе Arduino
Обратная связь
Новости
Виртуальное потребление - 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);
Пример кода проверки двигателя-маховика на языке С
#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)