2011-04-10 80 views
3

我正在使用我正在构建的Arduino设备。 我买了一个GPS模块和一个带有加速度计的倾斜传感器。确定真北

我想确定真正的北方,这样我就可以随时指向一个朝向太阳的物体。 基本上我希望设备在任何地方都能找到真正的北方。 GPS会给出一个位置,指南针会发现磁北。我想真正的北方可以在设备移动期间获得并写入RAM中,然后在设备静止时取回使用。

但是如何?

+0

磁北和真北似乎够接近,不是吗? – fingerman 2011-04-10 17:31:56

+0

时钟和GPS足够了吗?这很棒,因为GPS和arduino已经有了一个时钟。是否有我需要用GPS +时钟确定太阳位置的计算?事实上,当你处于一个固定的位置时,你如何确定你的方向?在一定程度左右? – user701052 2011-04-10 18:06:51

+0

如果没有指南针,如果它向左或向右转而不向前或向后移动,您的设备无法准确判断北。如果您查看手机上的GPS映射软件或没有嵌入式指南针的汽车导航仪设备,您可以看到效果。当你左转或右转时,你的方向在显示器上被延迟很多,因为软件需要大量的移动来确定方向的改变。 – avra 2011-04-11 09:16:42

回答

1

您是否想要为您的太阳能电池板获得最多的阳光?如果是这样,那么您可以根据您的时钟在东西方之间进行粗略的位置设置(您可以通过在账户中获取长/经纬位置来计算日出和日落时间来改善此情况)。如果你想精确控制方位角和仰角,你将需要大量的天文计算。 Arduino不支持双倍速度,而且单个你不会有非常准确的结果(它们对于太阳能电池板跟踪器来说已经足够了,但是如果你想望远镜跟踪一些天空物体,这还不够)。我的建议是对这个主题进行大量调查,或者查看一些开源天文软件,并从源头上提取所需的计算结果(如果许可条款允许)。只给你一个提示,这是来自PilotLogic TMoon分量小提取物,你可以在CodeTyphon /拉撒路/ FPC安装包得到发现here

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。你也可以在安装时找到一次North,所以你也不需要指南针。

0

当罗盘靠近一些磁性材料时,罗盘将会出现故障并且根本不会实用。您可以根据您的位置计算太阳的方位角和仰角。在您的系统中使用一些数字编码器并计算增量运动更实用。使用标准工具可以使用arduino上的校准按钮来标准化参数。对于微调,可以为上下运动提供手动按钮。