Определить истинный север

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

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

Но как?

2 ответа

Вы пытаетесь получить максимум солнца для своей солнечной панели? Если это так, то вы можете избежать грубых настроек положения между Востоком и Западом в соответствии с вашими часами (вы можете улучшить это, приняв в расчет позицию 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 не нужен. Вы также можете найти Север один раз во время установки, поэтому вам не нужен компас.

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

Другие вопросы по тегам