作为指南针的磁力计 | stm32f3-Discovery板传感器-"第一部分"

151 阅读4分钟

大家好,希望你过得很好。在今天的博客中,我们将建立一个指南针。是的,你没有看错,我们将使用stm32f3-Discovery板的传感器来建立一个指南针。

在上一篇博客中,我们读到一个名为 Lsm303dlhc的软件包,它基本上适用于旧版本的发现板。我们确实有一个较新版本的发现板,因此我们将使用一个不同的包,名为LSM303agr,其中包含传感器磁力计和加速计。所以我们需要使用这个包来构建指南针。

由于我们正在使用嵌入式系统,它们使我们的任务快速而可靠。另外,与传统的计算机相比,它们的体积要小得多,这使它们变得紧凑和便携,对大规模生产很有用。嵌入式系统的管理是相当容易的,因为在其创建过程中使用的元素是廉价和持久的。嵌入式系统也具有成本效益。

让我们来建造它。

传感器

一个磁强计 是一个传感器,我们将在其上建立一个指南针。我们要建立的指南针将为我们提供磁场的方向。这个传感器没有在电路板上打开,而是装在LSM303agr 封装中。

Ultrasensitive magnetic-field sensor could be made from a wobbling compass  needle – Physics World

为了使用这个传感器,我们需要访问LSM303agr包。

如何从LSM303agr包中访问磁强计传感器?

首先,我们需要在我们的Cargo.toml中添加一个依赖项,就是这个:

lsm303agr = "0.1"

LSM303AGR click - 3D accelerometer and 3D magnetometer

现在要访问磁力计传感器,我们必须使用I2c总线,这将带我们到软件包中的传感器。

我们需要一个i2c协议的时钟线和数据线,这将有助于我们接近传感器。

我们可以使用 gpio外设及其b-端口来访问这两条线。这两条线都存在于pb6和pb7引脚:

let scl = gpiob.pb6.into_af4(&mut gpiob.moder, &mut gpiob.afrl);
let sda = gpiob.pb7.into_af4(&mut gpiob.moder, &mut gpiob.afrl);

现在,在对i2c ,我们可以进入LSM303agr封装:

let mut lsm = Lsm303agr::new_with_i2c(i2c);

在这之后,我们可以用它来获取磁力计数据:

lsm.set_mag_odr(MagOutputDataRate::Hz10).unwrap();

因此,像这样我们可以访问stm32f3-Discovery板的(磁力计)传感器和它在LSM303agr包中的读数。

磁场有大小之分,以高斯或特斯拉为单位测量,也有方向。F3上的磁强计同时测量外部磁场的大小和方向。

访问发现板的LED

现在,我们的另一项任务是访问F3板的LED,以便我们能够根据磁场方向闪烁它们。

使用gpio外设来访问LEDs。你可以查看这个 git资源库的代码。

在这之后,我假设你已经完成了LEDs部分的工作。

接下来是什么?

我们已经完成了实施。我们已经成功访问了LEDs和软件包。现在我们必须编写代码以从传感器获得读数。

注意:我们只在水平方向工作,因此我们不会读取垂直方向。因此,我们将只读取磁强计传感器的xy 轴值。现在让我们在一个变量中获取传感器的读数:

let magnetometer_data = lsm303agr.mag_data();
        let x_y_axis = match magnetometer_data {
            Ok(x_y_axis) => x_y_axis,
            Err(error) => {
                panic!("Reading not found {:?}", error)
            }
        };

所以到这里,我们已经完成了读数部分。我们已经在一个名为magnetometer_data的变量中得到了读数。

magnetometer_data中,我们要在x_y_axis变量中获取xy-axis的读数。

我们到底要实现什么?

好的,在进一步讨论之前,让我们先弄清楚我们在这里要实现什么。

所以我们将用4个方向来工作:

  • 东南
  • 东北部
  • 西南
  • 西北

我们将基本上与4个象限一起工作。根据xy-轴的值,我们将改变象限,不同的LED将根据不同的象限闪烁。在这里,每个象限将告诉我们磁场的方向。

基于这个条件,这就是我们的编码:

The Coordinate Plane

 let direction = match (x_y_axis.x > 0, x_y_axis.y > 0) {
            (true, true) => Direction::Southeast,
            (false, true) => Direction::Northeast,
            (true, false) => Direction::Southwest,
            (false, false) => Direction::Northwest,
        };

因此,现在当我们把板子向不同的方向移动时,它将读取不同的X轴和Y轴的读数,根据这些读数,我们将把它们与特定的方向相匹配,而方向已经被创建为一个枚举

这就是本博客的结束。还没有结束,我们不要让这篇博客太长,所以在这个系列的下一部分,我们肯定会把我们的传感器当作指南针使用。在下一部分中,我们将学习如何根据象限和关于itm的读数来编写LED灯的闪烁。谢谢你的阅读