Инструменты пользователя

Инструменты сайта


lesson02

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

lesson02 [2019/07/23 15:58]
golikov
lesson02 [2020/03/25 16:28]
Строка 1: Строка 1:
-====== 02 Урок. Знакомство с датчиками ====== 
-===== Датчик угловой скорости ===== 
-Датчик угловых скоростей предназначен для измерения угловой скорости вращающегося объекта. Измерять угловую скорость необходимо для того, чтобы можно было остановить вращение спутника – стабилизировать его. Также с помощью датчика угловой скорости можно заставить спутник вращаться с определенной скоростью. 
- 
-==== Принцип работы датчика угловой скорости ==== 
-Основным измерительным элементом датчика угловой скорости является специальный микроэлектромеханический (МЭМС) гироскоп. Это не обычный гироскоп,​ в котором с большой скоростью вращается диск, а миниатюрный вибрационный гироскоп. Внутри МЭМС гироскопа есть кольцо,​ которое,​ колеблется в одной плоскости. Если такой гироскоп поставить на вращающуюся платформу,​ плоскость которой совпадает с плоскостью колебаний кольца,​ то на нее начнет действовать сила Кориолиса пропорциональная скорости вращения платформы. Сила Кориолиса измеряется с использованием пьезоэлементов,​ которые выдают напряжение,​ пропорциональное приложенной силе. 
- 
-{{::​02image001.jpg?​nolink&​600|}} 
- 
-Определив силу Кориолиса и зная скорость колебания,​ можно вычислить угловую скорость и ее изменение (угловое ускорение). 
- 
-{{::​02image003.png?​nolink&​400|}} 
- 
-==== Проверка работоспособности датчика угловой скорости ==== 
- 
-Подключите датчик угловой скорости и СЭП к БКУ. 
-Откройте Notepad++ и напишите программу на Python или на С. 
- 
-Код на Python. 
-<file python hyro_test.py>​ 
-def control(): # Основная функция программы,​ в которой вызываем остальные функции 
- 
- hyro_result = [0,0,0,0] # Инициализируем hyro_result 
- num = 1 # Номер Датчика угловой скорости 
- print "​Enable angular velocity sensor №", num 
- hyro_turn_on(num) # Включаем ДУС 
- sleep(1) # Ждем включения 1 секунду 
- print "Get RAW data from angular velocity sensor"​ 
- 
- for i in range(10): ​ #​Считываем показания 10 раз 
- hyro_result = hyro_request_raw(num) #​записываем ответ функции 
- # hyro_request_raw в переменную hyro_result 
- if not hyro_result[0]:​ # если датчик не вернул сообщение об ошибке,​ 
- print "​state:",​ hyro_result[0],​ "x_raw =", hyro_result[1],​ \ 
- "​y_raw =", hyro_result[2],​ "z_raw =", hyro_result[3] 
- # Выводим данные 
- elif hyro_result[0] == 1: # если датчик вернул сообщение об ошибке 1 
- print "Fail because of access error, check the connection"​ 
- elif hyro_result[0] == 2: # если датчик вернул сообщение об ошибке 2 
- print "Fail because of interface error, check your code" 
- 
- sleep(1) # Показания считываются раз в секунду 
- 
- print "​Disable angular velocity sensor №", num 
- hyro_turn_off(num) ​  # Выключаем ДУС 
-</​file>​ 
- 
-Код на С. 
-<file c hyro_test.c>​ 
-#include "​libschsat.h"​ 
- 
-int control(){ 
- uint16_t num = 1;  // Номер Датчика угловой скорости 
- int16_t hyro_result[] = {0, 0, 0, 0}; 
- printf("​Enable angular velocity sensor № %d", num);  
- hyro_turn_on(num);​ // Включаем ДУС 
- Sleep (1);​ //​Ждем включения 1 секунду 
- printf("​\nGet RAW data from angular velocity sensor\n"​);​ 
-  
- int i; 
- for (i = 0; i < 10; i++) { //​Считываем показания 10 раз ​ 
- hyro_result[0] = hyro_request_raw(num,&​ hyro_result[1],&​ hyro_result[2],&​ hyro_result[3]);​ 
-  
- if (!hyro_result[0]) 
- { 
- printf("​state:​ %d", i); 
- printf("​ x_raw = %d", hyro_result[1]);​ 
- printf("​ y_raw = %d", hyro_result[2]);​ 
- printf("​ z_raw = %d\n", hyro_result[3]);​ 
-  
- } 
- else if (hyro_result[0] == 1) 
- { 
- printf("​Fail because of access error, check the connection"​);​ 
- } 
- else if (hyro_result[0] == 2) 
- { 
- printf("​Fail because of interface error, check your code"​);​ 
- } 
- Sleep(1); 
-  
- }  
- printf("​\nDisable angular velocity sensor № %d\n", num); 
- hyro_turn_off(num);​  
- return 0; 
-} 
- 
-</​file>​ 
- 
-Запустите программу и протестируйте работу ДУС. 
- 
-==== Анализ кода ==== 
- 
-Обратите внимание,​ после символа # пишут комментарии,​ которые никак не влияют на работу программы. 
- 
-Программа начинается с объявления функции control(). 
- 
-Затем мы создаем список hyro_result для получения данных от датчика и переменную num, хранящую номер датчика. 
-  
-Далее оператор print выводит сообщение о включении датчика. 
- 
-Затем функция hyro_turn_on(num) включает датчик с указанным номером. 
-  
-Функция sleep(1) приостанавливает выполнение программы на 1 секунду. 
- 
-Затем в цикле for i in range(10): мы 10 раз считываем и выводим значение датчика. 
- 
-Показания датчика считываем с помощью функции hyro_request_raw(num). 
- 
-===== Магнитометр ===== 
- 
-==== Назначение магнитометра ==== 
- 
-Информацию об ориентации спутник получает по датчику угловой скорости и магнитометру. Информация об угле нужна для того чтобы разворачивать спутник в необходимую сторону,​ а информация об угловой скорости необходима для того чтобы стабилизировать спутник,​ т.е. погасить угловое вращение. Управляющий момент создается с помощью двигателя маховика. 
- 
-==== Принцип работы магнитометра ==== 
- 
-Работа магнитометра основана на применении магниторезистивного эффекта,​ когда электрическое сопротивление проводника изменяется в соответствии с направлением линий магнитного поля. В основе датчика лежит слой пермаллоя (специального сплава никеля с железом),​ который обладает сильным магниторезистивным эффектом. Электрическое сопротивление пермаллоя меняется обычно в пределе ±5 % в зависимости от силы и направления действующего магнитного поля. 
- 
-{{::​02image004.png?​nolink&​400|}} 
- 
-Таким образом,​ измеряя силу тока, протекающего через слой пермаллоя при подаче постоянного напряжения +5В можно определить направление линий магнитного поля. Для того чтобы измерить направление магнитных линий по всем трем осям используют три маленьких датчика,​ ориентированных по осям X, Y и Z, установленные в одной микросхеме. 
- 
-{{::​02image005.png?​nolink&​400|}} 
- 
-{{::​02image007.png?​nolink&​200|}} 
- 
-==== Проверка работоспособности магнитометра ==== 
- 
-Откройте Notepad++ и напишите программу на Python или на С. 
- 
-Код на Python. 
-<file python mag_test.py>​ 
-def control(): # Основная функция программы,​ в которой вызываем остальные функции 
- mgn_result = [0,0,0,0] # Инициализируем mgn_result 
- num = 1  # номер магнитометра 
- print "​Enable magnetometer №", num 
- magnetometer_turn_on(num) 
- sleep(1) 
- print "Get RAW data from magnetometer" ​ 
- for i in range(10): 
- mgn_result = magnetometer_request_raw(num) 
- if not mgn_result[0]:​ # если датчик вернул сообщение об ошибке,​ 
- print "​state:",​ mgn_result[0],​ "x_raw =", mgn_result[1],​ \ 
- "​y_raw =", mgn_result[2],​ "z_raw =", mgn_result[3] ​ 
- # Обратите внимание на символ переноса строки! 
- elif mgn_result[0] == 1: 
- print "Fail because of access error, check the connection"​ 
- elif mgn_result[0] == 2: 
- print "Fail because of interface error, check your code" 
- sleep(1) 
- print "​Disable magnetometer №", num 
- magnetometer_turn_off(num) 
-</​file>​ 
- 
-Код на С. 
-<file c mag_test.c>​ 
-#define LSS_OK 0  
-#define LSS_ERROR 1  
-#define LSS_BREAK 2 
- 
-#include <​stdio.h>​ 
-#include <​stdint.h>​ 
-#include "​libschsat.h"​ 
-int control() // Основная функция программы,​ в которой вызываем остальные функции 
-{ 
- int16_t mgn_result[] = {0,0,0,0}; // Инициализируем mgn_result 
- uint16_t num = 1; // номер магнитометра 
- int i; 
- printf("​Rnable magnetometer №%d\n",​ num); 
- magnetometer_turn_on(num);​ 
- Sleep(1); 
- printf("​Get RAW data from magnetometer\n"​);​ 
- for (i = 0; i < 1000; i++) 
- { 
- mgn_result[0] = magnetometer_request_raw(num,&​ mgn_result[1],&​ mgn_result[2],&​ mgn_result[3]);​ 
- if (!mgn_result[0])//​ если датчик вернул сообщение об ошибке,​ 
- { 
- printf("​\nstate:​%d,​ \nx_raw =%d,\ny_raw =%d, \nz_raw =%d\n",​i,​ mgn_result[1],​ mgn_result[2],​ mgn_result[3]);​ //​Обратите внимание на символ переноса строки! 
- } 
- else if (mgn_result[0] == 1){ 
- printf("​Fail because of access error, check the connection"​);​ 
- } 
- else if (mgn_result[0] == 2){ 
- printf("​Fail because of interdace error, check your code"​);​ 
- } 
- Sleep(0.1);​ 
- } 
- printf("​Disable magnetometer №%d\n",​ num); 
- magnetometer_turn_off(num);​ 
- return 0; 
-} 
-</​file>​ 
- 
-Запустите программу и протестируйте работу магнитометра. 
- 
-==== Анализ кода ==== 
- 
-Программа начинается с объявления функции control(). 
- 
-Затем мы создаем список mgn_result для получения данных от датчика и переменную num, хранящую номер магнитометра. ​ 
- 
-Далее оператор print выводит сообщение о включении датчика. 
- 
-Затем функция magnetometer_turn_on(num) включает магнитометр с указанным номером. ​ 
- 
-Функция sleep(1) приостанавливает выполнение программы на 1 секунду. 
- 
-Затем в цикле for i in range(10): мы 10 раз считываем и выводим значение магнитометра. 
- 
-Показания магнитометра считываем с помощью функции magnetometer_request_raw(num). 
- 
-===== Солнечные датчики ===== 
- 
-==== Назначение солнечных датчиков ==== 
- 
-Назначение солнечных датчиков – определение расположения спутника относительно Солнца. Так-как положение Солнца относительно Земли в любой момент времени известно достаточно точно, следовательно,​ можно определить и расположение спутника относительно Земли. 
- 
-==== Принцип работы солнечных датчиков ==== 
- 
-В основе солнечного датчика лежит фотодетектор,​ который измеряет яркость света. Самые популярные фотодетекторы — это фоторезисторы и фотодиоды. Фоторезистор состоит из материала,​ сопротивление которого меняется в зависимости от интенсивности падающего света. ​ 
- 
-В отличие от фоторезистора фотодиод выдает напряжение под действием света. Фотодиодные датчики бывают нескольких типов — LEP (Latheral Effect Photodiode),​ QD-фотодиод (Quadrant Detector) или матричные. 
- 
-{{::​02image008.png?​nolink&​200|}} 
- 
-LEP фотодиод – это одиночный фотодиод с большой чувствительной поверхностью. 
- 
-{{::​02image009.png?​nolink&​200|}} 
- 
-QD-фотодиод состоит из четырех независимых фотодиодов,​ расположенных симметрично относительно центра чувствительной поверхности. 
- 
-{{::​02image011.png?​nolink&​200|}} 
- 
-{{::​02image013.png?​nolink&​200|}} 
- 
-Расчет положения пятна на поверхности QD-фотодиода получается из соотношений выходных токов фотодиодов. 
- 
-Матричный датчик содержит большое количество фотодиодов и позволяет определить положение Солнца еще точнее. 
- 
-{{::​02image015.png?​nolink&​200|}} 
- 
-==== Проверка работоспособности солнечных датчиков ==== 
- 
-Подключите по очереди солнечные датчики и СЭП к БКУ и проверьте их работу. 
- 
-Откройте Notepad++ и напишите программу на Python или на С. 
- 
-Код на Python. 
-<file python sun_test.py>​ 
-def control(): # Основная функция программы,​ в которой нужно вызывать остальные функции 
- sun_result = [0,0,0] # Инициализируем sun_result 
- num = 1 
- print "​Enable sun sensor №", num 
- sun_sensor_turn_on(num) 
- sleep(1) 
- print "Get RAW data from sun sensor"  ​ 
-  
- for i in range(10): 
- sun_result = sun_sensor_request_raw(num) 
- if not sun_result[0]:​ # если датчик вернул сообщение об ошибке,​ 
- print "​state:",​ sun_result[0],​ "raw =", sun_result[1],​ \ 
- sun_result[2] 
- elif sun_result[0] == 1: 
- print "Fail because of access error, check the connection" ​ 
- elif sun_result[0] == 2: 
- print "Fail because of interface error, check your code" 
- 
- sleep(1) 
- 
- print "​Disable sun sensor №", num 
- sun_sensor_turn_off(num) 
-</​file>​ 
- 
-Код на С. 
-<file c sun_test.c>​ 
-#include <​stdio.h>​ 
-#include <​stdint.h>​ 
-#include "​libschsat.h"​ 
-#define LSS_OK 0  
-#define LSS_ERROR 1  
-#define LSS_BREAK 2 
- 
-int control(){ //​Основная функция программы 
- uint16_t sun_result[] = {0, 0, 0}; // инициализируем sun_result 
- uint16_t num = 1; // номер солнечного датчика 
- printf("​Enable sun sensor №%d\n",​ num); 
- sun_sensor_turn_on(num);​ //​включаем датчик  
- Sleep(1); //Ждем включения 1 секунду 
- printf("​Get RAW data from sun sensor №%d\n",​ num); 
- int i; 
- for (i = 0; i < 10; i++) //​считываем показаия 10 раз 
- { 
- sun_result[0] = sun_sensor_request_raw(num,&​ sun_result[1],&​ sun_result[2]);/​*проверить как работает,​ очень странно, ​ что работает 
- если не работает задать sun_result[0] */ 
- if (!sun_result[0]){ //если датчик не вернул сообщение об ошибке,​ 
- printf("​state:​ %d raw = %d, %d\n", i, sun_result[1],​ sun_result[2]);​ 
- } 
-  
- else if (sun_result[0] == 1) { //если датчик вернул сообщение об ошибке 1 
- printf("​Fail because of access error, check the connection\n"​);​ 
- } 
- else if (sun_result[0] == 2) { //если датчик вернул сообщение об ошибке 2 
- printf("​Fail because of interface error, check you code\n"​);​ 
- } 
- Sleep(1); //​показания считываются раз в секунду 
- 
- } 
- printf("​Disable sun sensor №%d\n",​ num); 
- sun_sensor_turn_off(num);​ //​выключаем солнечный датчик 
- return 0; 
-} 
-</​file>​ 
- 
- 
-Запустите программу и протестируйте работу солнечного датчика. 
- 
-Поочередно протестируйте все 4 солнечных датчика. 
- 
-==== Анализ кода ==== 
- 
-Программа начинается с объявления функции control(). 
- 
-Затем мы создаем список sun_result для получения данных от датчика и переменную num, хранящую номер датчика. 
-  
-Далее оператор print выводит сообщение о включении датчика. 
- 
-Затем функция sun_sensor_turn_on(num) включает датчик с указанным номером. 
-  
-Функция sleep(1) приостанавливает выполнение программы на 1 секунду. 
- 
-Затем в цикле for i in range(10): мы 10 раз считываем и выводим значение датчика. 
- 
-Показания датчика считываем с помощью функции sun_sensor_request_raw(num). 
- 
-==== Задания ==== 
- 
-  - Проект "​Сигнализация"​. Измените программу датчика угловой скорости,​ чтобы он реагировал на незначительную вибрацию и сообщал о том, что кто-то коснулся Орбикрафта 
-  -  Проект "​Компас"​. Измените программу магнитометра чтобы он сообщал к какой стороне света Орбикрафт повернут кнопкой включения. 
-  - Проект "​Где Солнце?"​. Измените программу солнечных датчиков,​ чтобы Орбикрафт сообщал с какой стороны на него Светит Солнце. ​ 
  
lesson02.txt · Последние изменения: 2020/03/25 16:28 (внешнее изменение)

Инструменты страницы