大家好,希望你过得很好。在今天的博客中,我们将建立一个指南针。是的,你没有看错,我们将使用stm32f3-Discovery板的传感器来建立一个指南针。
在上一篇博客中,我们读到一个名为 Lsm303dlhc的软件包,它基本上适用于旧版本的发现板。我们确实有一个较新版本的发现板,因此我们将使用一个不同的包,名为LSM303agr,其中包含传感器磁力计和加速计。所以我们需要使用这个包来构建指南针。
由于我们正在使用嵌入式系统,它们使我们的任务快速而可靠。另外,与传统的计算机相比,它们的体积要小得多,这使它们变得紧凑和便携,对大规模生产很有用。嵌入式系统的管理是相当容易的,因为在其创建过程中使用的元素是廉价和持久的。嵌入式系统也具有成本效益。
让我们来建造它。
传感器
一个磁强计 是一个传感器,我们将在其上建立一个指南针。我们要建立的指南针将为我们提供磁场的方向。这个传感器没有在电路板上打开,而是装在LSM303agr 封装中。

为了使用这个传感器,我们需要访问LSM303agr包。
如何从LSM303agr包中访问磁强计传感器?
首先,我们需要在我们的Cargo.toml中添加一个依赖项,就是这个:
lsm303agr = "0.1"

现在要访问磁力计传感器,我们必须使用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和软件包。现在我们必须编写代码以从传感器获得读数。
注意:我们只在水平方向工作,因此我们不会读取垂直方向。因此,我们将只读取磁强计传感器的x 和y 轴值。现在让我们在一个变量中获取传感器的读数:
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变量中获取x 和y-axis的读数。
我们到底要实现什么?
好的,在进一步讨论之前,让我们先弄清楚我们在这里要实现什么。
所以我们将用4个方向来工作:
- 东南
- 东北部
- 西南
- 西北
我们将基本上与4个象限一起工作。根据x 和y-轴的值,我们将改变象限,不同的LED将根据不同的象限闪烁。在这里,每个象限将告诉我们磁场的方向。
基于这个条件,这就是我们的编码:

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灯的闪烁。谢谢你的阅读