
开源协议
:CC BY-NC-SA 3.0
(未经作者授权,禁止转载)描述
先天八卦的由来
先天八卦,又称“伏羲八卦”,是中国古代哲学和宇宙观的重要组成部分,由传说中的伏羲氏所创。它通过八种基本符号(卦)的排列组合,抽象地描述了自然界的基本原理和万物变化的规律。先天八卦是《易经》的核心内容之一,被认为是宇宙生成和运行的原始模型。八卦是由三个爻(阳爻“—”和阴爻“--”)组成的符号。八卦分别是:乾(☰)、坤(☷)、震(☳)、巽(☴)、坎(☵)、离(☲)、艮(☶)和兑(☱)。它们分别象征自然界中的八种基本元素或状态,排列被认为表现了宇宙的平衡状态,是天、地、雷、风、水、火、山、泽之间的相互作用。先天八卦强调的是天地初开、宇宙生成的规律,体现了静态的宇宙秩序。而后天八卦则由文王所创,更加关注事物的变化与动态发展的规律,常用于实际的预测和分析。
代码部分
电子罗盘部分
代码流程从系统初始化开始,通过调用HAL_Init()
重置所有外设并初始化Flash接口和系统时钟Systick,接着通过SystemClock_Config()
配置系统时钟,同时初始化GPIO、I2C、定时器和ADC等外设,并延迟100ms以防启动电流过大。然后进入传感器和外设的初始化阶段,初始化磁力计LIS2MDL和加速度计LIS2DW12,并通过启动ADC校准功能为后续的精确测量做好准备。随后,从EEPROM中读取磁力计数据的椭球矫正参数,包括中心点坐标和半径值,若数据有效则加载用于矫正传感器读数。系统启动定时器中断,用于周期性操作。初始化完成后,通过一系列LED点亮操作确认初始化状态。进入主循环后,系统持续读取磁力计和加速度计的数值,将磁力计数据通过矫正参数转化为标准化值,并计算偏航角Yaw值,将Yaw值用于控制LED阵列显示方向。如果当前偏航角变化超过30度,则重置休眠计数器,否则根据静止时间逐步增加休眠计数器,当达到设定时间(如30秒)后,配置加速度计进入活动检测模式并使系统进入低功耗休眠模式。电池电量监测功能通过定时检查触发,启动ADC测量电池电压,并根据电压水平点亮相应数量的LED用于指示电量状态。当电压过低时,系统通过闪烁部分LED进行低电量提示。整个流程通过多种功能模块协同工作,实现了传感器数据采集、方向显示、低功耗管理和电池电量监测等功能。
椭球矫正部分
代码的主要流程包括系统初始化、传感器配置和磁力计数据处理。首先通过HAL_Init
初始化系统外设并重置寄存器,随后通过SystemClock_Config
配置系统时钟,延迟500ms以防止启动电流过大。外设初始化完成后,分别调用LIS2MDL_Init
和LIS2DW12_InitForSingleConversion
对磁力计和加速度计进行初始化,确保它们进入工作模式,并分配用于存储传感器数据的缓冲区。然后进行椭球矫正参数采集,系统读取指定数量的磁力计数据点,计算其统计参数,并构建一个系数矩阵和非齐次向量,通过矩阵求逆和矩阵乘法计算出椭球拟合参数。拟合参数用于求解椭球的中心和半径,这些矫正参数被写入EEPROM以便后续使用。在主循环中,程序持续读取磁力计和加速度计数据,利用椭球矫正参数对磁力计读数进行校正,并根据校正后的数据进行进一步处理,例如后续的方向感知或状态监测功能。
背板装饰
使用1mm亚克力或1mmpcb可以绘制背板,蛇年了,当然得是Python咯!
外壳设计
外壳打印请不要使用尼龙材料!
磁力计为什么要椭球矫正
磁力计在测量地磁场时,通常会受到各种因素的影响,如传感器的偏置、比例因子误差和非正交误差等。这些误差会导致测量结果偏离真实值,形成一个椭球形的误差分布。为了提高测量精度,需要对这些误差进行矫正,使得测量结果更加接近一个理想的球形分布。这一过程被称为椭球矫正。椭球矫正的主要目的是消除或减少系统误差,磁矢量在空间中尽可能呈现出一个球心在原点处的单位球体。
那么问题来了,如何进行椭球的矫正呢?我们能够拿到的数据是若干个在三维空间中测量到的磁矢量的值,我们需要通过这些数据来估计出椭球的参数,然后对测量结果进行矫正。这个过程通常可以通过最小二乘法来实现。具体来说,我们可以将椭球模型表示为一个椭球的标准方程,通过最小二乘法来拟合这个方程,从而得到椭球的参数。
在矩阵分析中,超定方程的最小二乘解为,其中为的矩阵,,为的未知向量,为的已知向量。最小二乘解为。在椭球矫正中,我们可以将磁矢量的测量值表示为一个的向量,椭球模型表示为一个的矩阵,其中为椭球的参数个数。通过最小二乘法,我们可以得到椭球的参数,从而对测量结果进行矫正。但是在单片机的计算中,解的参数涉及到了矩阵的乘法和求逆运算,十分消耗内存和算力。单片机在求解加法运算是十分迅速的,我们可以通过提前求极值的方式来预处理降低运算的复杂度。
最小二乘解的形式等价为,其中表示二范数。
证明:
对其求偏导可以得到
也就是
证明完毕。(注意这里不是真正的等价,但是通常解出现在极值点处)
那么我们可以开始考虑一个三维空间中的标准球体
其中和是磁矢量的测量值,是误差,是椭球的参数。
考虑一个标准的椭圆方程
等价为
我们令
最小化目标为
对其求偏导可以得到
推出
那么我们只需要求解一次六维矩阵的逆就可以得到最小二乘法的解——但是标准的求逆运算太麻烦了,在单片机中同样会消耗大量的资源,使用LU分解可以大大降低矩阵求解的难度,加快求逆的速度。
在线性代数中, LU分解(LU Factorization)是矩阵分解的一种,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积,求解L或U矩阵的逆非常简单,LU分解的算法不讲述了,分解的算法在源码中。
硬件部分介绍
硬件部分主要包括一个基于STM32L010F4P6微控制器(MCU)的核心控制单元,周围辅以多个传感器、接口电路和电源管理模块。STM32L010F4P6通过其GPIO引脚连接多个功能模块,包括LED指示灯、按键输入、电池电压监测、时钟输入以及通信接口等。两个主要传感器为LIS2MDLTR和LIS2DW12TR,分别负责磁场和加速度数据的采集,它们通过I2C总线连接到MCU,利用SDA和SCL引脚进行数据传输。此外,设计中包括用于电源管理的RT9013-33GB稳压器和TC4056A锂电池充电管理模块,提供稳定的3.3V供电,并支持电池的安全充电功能。电路中还包含多级滤波电容(如100nF和10uF)以减少电源纹波,以及关键位置的电阻网络(如10k、100k电阻)以实现分压和电流限制功能。外围电路包括用于USB电源输入的Type-C接口,集成多个VBUS和GND连接,确保电源输入的可靠性。其他附加功能包括LED阵列指示灯(LED1至LED8)用于状态显示,以及单独的调试接口(SWD)用于程序烧录和调试操作。
功能介绍
- 磁力计指北,在任何开机状态下北向灯常亮
- 电量检测,按下按钮,循环灯的数量表示当前的电量
- 自动休眠,30s无动作进入休眠状态,休眠电流100uA
- 摇晃唤醒,在休眠状态任意摇晃可以唤醒设备
烧录说明
- 首先需要烧录P1部分的代码,烧录完成后一个灯会自动是闪烁,请大范围旋转设备,直到灯光不闪烁为止;
- 一部分完成后,烧录P2部分的代码,如果开机后灯光停滞,说明磁力计焊接有问题;
采购说明
电池规格为601230,螺丝规格为m1.6*10,smt表贴螺丝为。
制作注意事项
已知问题:休眠电流过大,100uA只能待机90天(200mAh电池);
PCB顶层1.6mm板厚,指定位置丝印,沉金;
PCB底层1.6mm板厚,指定位置丝印,彩色丝印沉金色;
LDO的RT9013-33GB请替换为TPS70933DBVR,该LDO具有超低静态电流;
设计图

BOM


评论