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

Перевод этой страницы:

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


Боковая панель

Для чего нужен ОрбиКрафт

Подсистемы конструктора

Инструкции по работе с ОрбиКрафт

Уроки

Лабораторная оснастка

Знакомство с Arduino

Полезная нагрузка на базе Arduino

Обратная связь

Новости

sun_subsys

Солнечный датчик

Виртуальное потребление - 45мА

 Солнечные датчики

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

Для получения сырых данных измерений можно воспользоваться функцией (на языке С):

int sunsensor_request_raw(uint16_t num, uint16_t *pRAW_data1, uint16_t *pRAW_data2);

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

Вычисление конкретных зависимостей угла от уровней освещенности называется калибровкой датчика под различные условия. Тем не менее даже без калибровки датчики подобной конструкции могут быть использованы для наведения на солнце путем анализа взаимной освещенности правой и левой полусфер датчика.

Следует обратить внимание, что точность установки самих сенсоров внутри корпусов солнечных датчиков не идеальна - так оно и бывает в реальной жизни, делая каждый датчик по-своему уникальным. Это связано с неточностью изготовления корпусов относительно требуемых размеров, погрешностями установки плат электроники внутри корпусов, неидеальностью самих сенсоров (все они немного отличаются друг от друга).

Большинство подобных погрешностей остается неизменными в течение срока эксплуатации, хотя бывают и погрешности, сильно зависящие от внешних факторов (например, температуры). В нашем случае полагаем, что погрешности измерений каждого из датчиков неизменны во времени, несильно зависят от температуры, и это дает возможность выполнить их однократную калибровку перед началом использования.

Пример кода проверки солнечных датчиков на языке С

  #include "libschsat.h"
 
  /*
  ** Lab 4: get a raw data from a sun sensor
  */
  void control(void)
  {
  	int i;
  	const int num = 1;	/* sun sensor #1 */
    	printf("Enable sensor #%d\n", num);
  	sun_sensor_turn_on(num);
    	printf("Get RAW data from sun sensor #%d\n", num);
  	for (i = 0; i < 10; i++) {
  		uint16_t value1;
  		uint16_t value2;
  		if (LSS_OK == sun_sensor_request_raw(num, &value1, &value2)) {
  			printf("%d: raw=%d ; %d\n", i, value1, value2);
  		} else {
  			puts("Fail!");
  		}
  		Sleep(1);
  	}
  	printf("Disable sensor #%d\n", num);
  	sun_sensor_turn_off(num);
  }

Пример кода проверки солнечного датчика №1 на языке Python

  # Get raw data from sun sensor №1
  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)

Пример кода проверки четырех солнечных датчиков на языке Python

def control(): # Основная функция программы, в которой нужно вызывать остальные функции
	sun_result = [0,0,0] # Инициализируем sun_result
	sun_sensor_num = 0 # Инициализируем переменную для номера солнечного датчика
 
	#Цикл для включения, опроса и выключения четырех солнечных датчиков по очереди:
 
	for sun_sensor_num in range (1,5):
 
		print "Enable sun sensor №", sun_sensor_num
		sun_sensor_turn_on(sun_sensor_num) # Включаем солнечный датчик
		sun_sensor_num +=1
	sleep(1) # Ждем включения 1 секунду	
 
 
	for i in range(10): #Считываем показания 10 раз
 
		for sun_sensor_num in range (1,5):	
			print "Get RAW data from sun sensor №", sun_sensor_num 
			sun_result = sun_sensor_request_raw(sun_sensor_num) 
			if not sun_result[0]: # если датчик не вернул сообщение об ошибке,
				print "state:", sun_result[0], "raw =", sun_result[1], sun_result[2]
			elif sun_result[0] == 1: # если датчик вернул сообщение об ошибке 1
				print "Fail because of access error, check the connection" 
			elif sun_result[0] == 2: # если датчик вернул сообщение об ошибке 2
				print "Fail because of interface error, check your code"
			sleep(1)  # Показания считываются раз в секунду
			sun_sensor_num +=1
		i += 1
 
	for sun_sensor_num in range (1,5):	
		print "Disable sun sensor №", sun_sensor_num
		sun_sensor_turn_off(sun_sensor_num)  # Выключаем солнечный датчик
		sun_sensor_num +=1

Описание __старой__ версии датчика.

sun_subsys.txt · Последние изменения: 2020/08/17 14:02 — golikov

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