1.16. 地磁计和指南针

望文生义,地磁计就是利用传感器测量地球磁场的方法来确定物体水平方向(与地面垂直的方向)上的朝向。我们四大发明之一的指南针正是 利用地球磁场的原理,古代人们就已发现地球是一个很大的磁铁,而且南北极朝向南北极始终保持不变,周围无更强磁场的小磁铁受到地磁 方向的影响也始终朝向一个固定的方向。指南针的小磁极的指向始终保持不变,这样就可以帮助我们确定正确的方向,指南针诞生后对大航海 时代的发展起到积极推进作用,那个时代在海上行船全靠指南针(罗盘)和北斗星的指引,他们都具有始终不变的方向。

今天我们知道地球磁场并不稳定,甚至有科学预言,地球磁极会发生翻转。地磁南北极与地球南北极并不一致,如下图所示,他们方向相反, 而且两对极点连线之间存在夹角。

../../_static/images/bluefi_basics/magnetic_sn.jpeg

1.16.1. 地磁计的数据

使用下面的程序示例,观察地磁计数据的变化规律。示例程序如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  import time
  from hiibot_bluefi.sensors import Sensors
  from hiibot_bluefi.screen import Screen
  screen = Screen()
  sensors = Sensors()
  magn = sensors.magnetic
  show_data = screen.simple_text_display(title="BlueFi Magnetometer", title_scale=1, text_scale=2)
  while True:
      magn = sensors.magnetic
      show_data[2].text = "X: {:.2f}".format(magn[0])
      show_data[2].color = screen.RED
      show_data[3].text = "Y: {:.2f}".format(magn[1])
      show_data[3].color = screen.GREEN
      show_data[4].text = "Z: {:.2f}".format(magn[2])
      show_data[4].color = screen.BLUE
      show_data.show()
      time.sleep(0.1)

将本示例程序保存到BlueFi的/CIRCUITPY/code.py文件中,当BlueFi执行示例程序时,旋转BlueFi并观察地磁计给出的三个分量数值的变化。

示例代码分析:

  • 第1行,导入一个Python内建的模块“time”
  • 第2行,从“/CIRCUITPY/lib/hiibot_bluefi/sensors.py”模块中导入一个名叫“Sensors”的类
  • 第3行,从“/CIRCUITPY/lib/hiibot_bluefi/screen.py”模块中导入一个名叫“Screen”的类
  • 第4行,将导入的“Screen”类实例化为一个实体对象,名叫“screen”
  • 第5行,将导入的“Sensors”类实例化为一个实体对象,名叫“ensors”
  • 第6行,定义一个名叫“magn”的Sensors类gyro型变量,并赋初值为sensors.magnetic
  • 第7行,定义一个名叫“show_data”的Screen类的多行文本显示子类,设置文本显示的标题为“BlueFi Gyroscope”,标题字体放大1倍,文本字体放大2倍
  • 第8行,一个无穷循环的程序块
  • 第9行(无穷循环程序块的第1行),用sensors.magnetic更新变量magn
  • 第10行(无穷循环程序块的第2行),设置多行文本显示子类的第2行的文本内容为magn0]的值
  • 第11行(无穷循环程序块的第3行),设置多行文本显示子类的第2行的文本颜色为红色
  • 第12行(无穷循环程序块的第4行),设置多行文本显示子类的第3行的文本内容为magn[1]的值
  • 第13行(无穷循环程序块的第5行),设置多行文本显示子类的第3行的文本颜色为绿色
  • 第14行(无穷循环程序块的第6行),设置多行文本显示子类的第4行的文本内容为magn[2]的值
  • 第15行(无穷循环程序块的第7行),设置多行文本显示子类的第4行的文本颜色为蓝色
  • 第16行(无穷循环程序块的第8行),更新多行文本显示
  • 第17行(无穷循环程序块的第9行),执行time的sleep方法,参数为0.1秒

通过本示例的数据信息,你观察到地磁计的数据与BlueFi的姿态和朝向之间存在什么样的关系?

1.16.2. 指北针和电子罗盘

我们修改前一个示例,增加北方的指示,我们以BlueFi金手指的方向为准,当BlueFi的LCD显示器保持与地水平面平行时, 金手指对着正北方时地磁计指北针归零,旋转BlueFi过程中,将给出BlueFi的金手指水平方向与正北方的夹角。示例程序如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
  import time
  from hiibot_bluefi.sensors import Sensors
  from hiibot_bluefi.screen import Screen
  screen = Screen()
  sensors = Sensors()
  sensors.MagnRange = 0
  magn = sensors.compassHeading
  show_data = screen.simple_text_display(title="BlueFi Magnetometer", title_scale=1, text_scale=2)
  while True:
      magn = sensors.magnetic
      show_data[2].text = "X: {:.2f}".format(magn[0])
      show_data[2].color = screen.RED
      show_data[3].text = "Y: {:.2f}".format(magn[1])
      show_data[3].color = screen.GREEN
      show_data[4].text = "Z: {:.2f}".format(magn[2])
      show_data[4].color = screen.BLUE
      show_data[5].text = "North: {}".format(sensors.compassHeading)
      show_data[5].color = screen.YELLOW
      show_data.show()
      time.sleep(0.1)

在前一个示例的基础上,把BlueFi的金手指水平方向与正北方的夹角显示在多行文本的第5行,并使用黄色字体。

现在你知道为什么指南针并不指向南方而是指向北方的原因了吗?


总结:

  • 地球磁场
  • 地磁南北极和地理南北极
  • 地磁计
  • 指南针
  • 多行文本显示的数据结构
  • 文本字体的缩放
  • 本节中,你总计完成了17行代码的编写工作

重要

Sensors类的地磁传感器接口

  • magnetic (属性, 元组类型, 只读, 每个分量的有效值: -10.24~+10.24), BlueFi的Sensors类magnetic属性, 地磁计的三个分量值
    • magnetic[0]: x方向分量
    • magnetic[1]: y方向分量
    • magnetic[2]: z方向分量
  • compassHeading (属性, 只读, 有效值: 0~359), BlueFi的Sensors类指北针方向属性, 给出当前方向与正北方向的夹角
  • MagnRange (属性, 可读可写, 有效值: 0~3), BlueFi的Sensors类地磁计量程属性, 0:4G, 1:8G, 2:12G, 3:16Guass
  • MagnRate (属性, 可读可写, 有效值: 0~10), BlueFi的Sensors类地磁传感器数据更新率属性, 0:0.625Hz, 1:1.25Hz, 2:2.5Hz, 3:10Hz, .., 9:560hz, 10:1KHz
  • MagnPerforMode ((属性, 可读可写, 有效值: 0~10), BlueFi的Sensors类地磁传感器性能模式, 0:LP, 1:MD, 2:HP, 3:UP