私が構築しているArduinoデバイスに取り組んでいます。GPS モジュールと、加速度計付きの傾斜検知コンパスを購入しました。
オブジェクトを常に太陽に向けられるように、真北を特定したいと考えています。基本的に、デバイスがどこにいても常に真北を検出するようにします。GPS は位置を示し、コンパスは磁北を見つけます。デバイスの移動中に真北を取得し、RAM に書き込み、デバイスが静止しているときに使用するために取得できると思います。
しかし、どのように?
私が構築しているArduinoデバイスに取り組んでいます。GPS モジュールと、加速度計付きの傾斜検知コンパスを購入しました。
オブジェクトを常に太陽に向けられるように、真北を特定したいと考えています。基本的に、デバイスがどこにいても常に真北を検出するようにします。GPS は位置を示し、コンパスは磁北を見つけます。デバイスの移動中に真北を取得し、RAM に書き込み、デバイスが静止しているときに使用するために取得できると思います。
しかし、どのように?
回転式ソーラーパネルに最大限の太陽を当てようとしていますか? その場合は、時計に合わせて東と西の間で大まかな位置を設定するだけで済みます (日の出と日の入りの時間を計算するために、経度/緯度の位置を考慮に入れることでこれを改善できます)。方位角と仰角の両方を正確に制御するには、多くの天文計算が必要になります。Arduino は double をサポートしておらず、single ではあまり正確な結果が得られません (ソーラー パネル トラッカーには十分ですが、望遠鏡で空のオブジェクトを追跡する場合は不十分です)。私のアドバイスは、このトピックについて詳しく調査するか、オープンソースの天文学ソフトウェアを調べて、ソースから必要な計算を抽出することです (ライセンス条件が許す場合)。ヒントとして、これは PilotLogic からの抜粋です。CodeTyphon /Lazarus/FPCインストール パッケージで取得できる TMoon コンポーネントは、次の場所にあります。
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 のキャリブレーション ボタンを使用して、標準ツールを使用してパラメータを正規化できます。微調整のために、上下の移動用の手動ボタンを設けることができます。