Skip to main content

10 Урок. Ориентация ОрбиКрафт 3D с помощью солнечных датчиков

tip

Прежде чем переходить к работе с солнечными датчиками советуем сначала изучить 08 Урок. Работа с ПИД-регулятором.

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

К каждому из датчиков можно обратиться по определенному адресу:

 * 1 датчик - 0x10 
* 2 датчик - 0x11
* 3 датчик - 0x12
* 4 датчик - 0x13

Система кооринат солнечных датчиков конструктора

Рисунок 1. Система кооринат солнечных датчиков конструктора

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

Для 1 датчика-[001010100]

Для 2 датчика-[001-100010]

Для 3 датчика-[0010-10-100]

Для 4 датчика-[0011000-10]

Программа ориентации по солнечным датчикам

Для использования показаний с солнечных датчиков в качестве входных значений для ПИД-регулятора надо, в первую очередь, научиться получать значения с этих датчиков. Для этого можно использовать функцию sunsensor_get_raw(i, vector)

где i – номер датчика от 0 до 3;

vector – указатель на массив int32_t, куда будут записаны показания по 3 осям.

Например:

int32_t v [3]; 
sunsensor_get_raw(2, v);

Теперь мы можем обратиться к показаниям третьего солнечного датчика (не забываем, нумерация с нуля, а значит номер 2 – это третий датчик):

v[0] – Показания по оси x;

v[1] – Показания по оси y;

v[2] – Показания по оси z.

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

После этого значение надо преобразовать в угол к оси X. Этот угол уже можно использовать как входное значение для ПИД-регулятора.

Рассчитав управляющее значение, нам надо как-то передать его на УДМ – маховик – чтобы он изменил свою скорость вращения. Для удобного представления данных используется структура:

struct motor_torque 
{
float torque; uint16_t time; }__attribute__((packed));

В поле torque записывается управляющее значение ПИД-регулятора, а в поле time – значение задержки dt. Этот фрагмент кода позволяет заполнить структуру данными и послать сообщение на маховик. Для этого надо знать адрес маховика. В конструкторе маховики имеют адреса A, B и C в шестнадцатеричной системе счисления, что соответствует адресам 10, 11, 12 в десятеричной системе счисления.

tq.torque = PD_OUT; 
tq.time = (uint16_t)(dt * 1000.0);

send_unican_message(11, 2576, (uint8_t*)&tq, sizeof(tq)); // 11 – адрес маховика В

Кроме стабилизации, аппарат должен выполнять какую-то полезную задачу. Для выполнения кода полезной нагрузки параллельно с кодом стабилизации необходимо добавить в код дополнительный поток:

pthread_t thread; // Создаём поток 
pthread_create(&thread, NULL, payloadFunction, NULL); // Привязываем поток к функции
void *payloadFunction(void *vargp) // Функция, которая будет вызываться
{

}

Задание: создайте программу для ориентации ОрбиКрафт 3D по солнечным датчикам.