Определить истинный север - PullRequest
3 голосов
/ 10 апреля 2011

Я работаю на устройстве Arduino, которое я строю.Я купил модуль GPS и компас, чувствительный к наклону, с акселерометром.

Я хочу определить истинный север, чтобы я всегда мог направить объект на солнце.По сути, я хочу, чтобы устройство всегда находило истинный север, где бы оно ни находилось.GPS даст положение, компас найдет магнитный север.Я предполагаю, что истинный север может быть получен во время перемещения устройства и записан в ОЗУ, а затем извлечен для использования, когда устройство неподвижно.

Но как?

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Вы пытаетесь получить максимум солнца для своей вращающейся солнечной панели?Если это так, то вы можете избежать грубых настроек положения между Востоком и Западом в соответствии с вашими часами (вы можете улучшить это, приняв в расчет позицию long / lat для расчета времени восхода и захода солнца).Вам понадобится много астрономических расчетов, если вы хотите точно контролировать азимут и высоту.Arduino не поддерживает двойной, а с одним у вас не будет очень точных результатов (их будет достаточно для трекера солнечных батарей, но недостаточно, если вы хотите, чтобы телескоп отслеживал какой-либо небесный объект).Я бы посоветовал либо много исследовать по этой теме, либо взглянуть на какое-то программное обеспечение для астрономии с открытым исходным кодом и извлечь необходимые вычисления из источника (если позволяют условия лицензии).Просто чтобы дать вам подсказку, это небольшая выдержка из компонента PilotLogic TMoon , которую вы можете получить в CodeTyphon / Lazarus / FPC найден установочный пакет здесь :

procedure Sun_Position_Horizontal(date:TdateTime; longitude,latitude: extended; var elevation,azimuth: extended);
var
  pos1: T_Coord;
begin
  pos1 := sun_coordinate(date);
  calc_horizontal(pos1,date,longitude,latitude);
end;

function sun_coordinate(date:TDateTime):t_coord;
var
  l,b,r: extended;
  lambda,t: extended;
begin
  earth_coord(date,l,b,r);
  (* convert earth coordinate to sun coordinate *)
  l := l+180;
  b := -b;
  (* conversion to FK5 *)
  t := (julian_date(date)-2451545.0)/365250.0*10;
  lambda:=l+(-1.397-0.00031*t)*t;
  l := l-0.09033/3600;
  b := b+0.03916/3600*(cos_d(lambda)-sin_d(lambda));
  (* aberration *)
  l := l-20.4898/3600/r;
  (* correction of nutation - is done inside calc_geocentric *)
{   calc_epsilon_phi(date,delta_phi,epsilon); }
{   l := l+delta_phi; }
  (* fill result and convert to geocentric *)
  result.longitude := put_in_360(l);
  result.latitude := b;
  result.radius := r*AU;
  calc_geocentric(result,date);
end;

procedure calc_horizontal(var coord:t_coord; date:TDateTime; longitude,latitude: extended);
var
  h: extended;
begin
  h := put_in_360(star_time(date)-coord.rektaszension-longitude);
  coord.azimuth := arctan2_d(sin_d(h), cos_d(h)*sin_d(latitude)-
                             tan_d(coord.declination)*cos_d(latitude));
  coord.elevation := arcsin_d(sin_d(latitude)*sin_d(coord.declination)+
                              cos_d(latitude)*cos_d(coord.declination)*cos_d(h));
end;

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

0 голосов
/ 13 сентября 2016

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

...