发作品签到
专业版

先天八卦电子罗盘

工程标签

707
0
0
6

简介

超低功耗和成本的的古风八卦电子罗盘,待机时长90天!

简介:超低功耗和成本的的古风八卦电子罗盘,待机时长90天!
”暖冬创趣迎新年“
复刻成本:20

开源协议

CC BY-NC-SA 3.0

(未经作者授权,禁止转载)
创建时间:2024-12-23 14:07:36更新时间:2025-01-13 07:36:40

描述

先天八卦的由来

先天八卦,又称“伏羲八卦”,是中国古代哲学和宇宙观的重要组成部分,由传说中的伏羲氏所创。它通过八种基本符号(卦)的排列组合,抽象地描述了自然界的基本原理和万物变化的规律。先天八卦是《易经》的核心内容之一,被认为是宇宙生成和运行的原始模型。八卦是由三个爻(阳爻“—”和阴爻“--”)组成的符号。八卦分别是:乾(☰)、坤(☷)、震(☳)、巽(☴)、坎(☵)、离(☲)、艮(☶)和兑(☱)。它们分别象征自然界中的八种基本元素或状态,排列被认为表现了宇宙的平衡状态,是天、地、雷、风、水、火、山、泽之间的相互作用。先天八卦强调的是天地初开、宇宙生成的规律,体现了静态的宇宙秩序。而后天八卦则由文王所创,更加关注事物的变化与动态发展的规律,常用于实际的预测和分析。

image.png

代码部分

电子罗盘部分

代码流程从系统初始化开始,通过调用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_InitLIS2DW12_InitForSingleConversion对磁力计和加速度计进行初始化,确保它们进入工作模式,并分配用于存储传感器数据的缓冲区。然后进行椭球矫正参数采集,系统读取指定数量的磁力计数据点,计算其统计参数,并构建一个系数矩阵和非齐次向量,通过矩阵求逆和矩阵乘法计算出椭球拟合参数。拟合参数用于求解椭球的中心和半径,这些矫正参数被写入EEPROM以便后续使用。在主循环中,程序持续读取磁力计和加速度计数据,利用椭球矫正参数对磁力计读数进行校正,并根据校正后的数据进行进一步处理,例如后续的方向感知或状态监测功能。

背板装饰

使用1mm亚克力或1mmpcb可以绘制背板,蛇年了,当然得是Python咯!

微信图片_20250112153234.jpg

外壳设计

外壳打印请不要使用尼龙材料!

image.png

image.png

磁力计为什么要椭球矫正

磁力计在测量地磁场时,通常会受到各种因素的影响,如传感器的偏置、比例因子误差和非正交误差等。这些误差会导致测量结果偏离真实值,形成一个椭球形的误差分布。为了提高测量精度,需要对这些误差进行矫正,使得测量结果更加接近一个理想的球形分布。这一过程被称为椭球矫正。椭球矫正的主要目的是消除或减少系统误差,磁矢量在空间中尽可能呈现出一个球心在原点处的单位球体。

那么问题来了,如何进行椭球的矫正呢?我们能够拿到的数据是若干个在三维空间中测量到的磁矢量的值,我们需要通过这些数据来估计出椭球的参数,然后对测量结果进行矫正。这个过程通常可以通过最小二乘法来实现。具体来说,我们可以将椭球模型表示为一个椭球的标准方程,通过最小二乘法来拟合这个方程,从而得到椭球的参数。

在矩阵分析中,超定方程的最小二乘解为Am×nx=bA_{m \times n}x=b,其中AAm×nm \times n的矩阵,m>nm>nxxn×1n \times 1的未知向量,bbm×1m \times 1的已知向量。最小二乘解为x=(ATA)1ATbx=(A^TA)^{-1}A^Tb。在椭球矫正中,我们可以将磁矢量的测量值表示为一个m×1m \times 1的向量bb,椭球模型表示为一个m×nm \times n的矩阵AA,其中nn为椭球的参数个数。通过最小二乘法,我们可以得到椭球的参数,从而对测量结果进行矫正。但是在单片机的计算中,解的参数涉及到了矩阵的乘法和求逆运算,十分消耗内存和算力。单片机在求解加法运算是十分迅速的,我们可以通过提前求极值的方式来预处理降低运算的复杂度。

最小二乘解的形式等价为minxAxb22min_x||Ax-b||_2^2,其中2||\cdot||_2表示二范数。

证明:

minxAxb22=minx(Axb)T(Axb)=minx(xTATAxbAxxTATb+bTb)\begin{aligned} min_x||Ax-b||_2^2 &= min_x(Ax-b)^T(Ax-b) \\ &= min_x(x^TA^TAx-bAx-x^TA^Tb+b^Tb) \\ \end{aligned}

对其求偏导可以得到

x(xTATAxbAxxTATb+bTb)=2ATAx2ATb=0 \frac{\partial}{\partial x}(x^TA^TAx-bAx-x^TA^Tb+b^Tb) = 2A^TAx-2A^Tb=0

也就是

x=(A1A)1ATb x=(A^{-1}A)^{-1}A^Tb

证明完毕。(注意这里不是真正的等价,但是通常解出现在极值点处)

那么我们可以开始考虑一个三维空间中的标准球体

xi2+gxiyi+cyi2+dxi+eyi+f=ϵi x_i^2+gx_iy_i+cy_i^2+dx_i+ey_i+f=\epsilon _i

其中xix_iyiy_i是磁矢量的测量值,ϵi\epsilon _i是误差,g,c,d,e,fg,c,d,e,f是椭球的参数。

2i=1nϵixiyi=0=2i=1n(xi2+gxiyi+cyi2+dxi+eyi+f)xiyi=2i=1n(xi3yi+gxi2yi2+cxiyi3+dxi2yi+exiyi2+fxiyi)\begin{aligned} &2\sum_{i=1}^{n}\epsilon _ix_iy_i=0\\ &=2\sum_{i=1}^{n}\left(x_i^2+gx_iy_i+cy_i^2+dx_i+ey_i+f\right)x_iy_i\\ &=2\sum_{i=1}^{n}\left(x_i^3y_i+gx_i^2y_i^2+cx_iy_i^3+dx_i^2y_i+ex_iy_i^2+fx_iy_i \right) \end{aligned}

考虑一个标准的椭圆方程

(xab)2+(ycd)2+(zef)2=0 (\frac{x-a}{b})^2+(\frac{y-c}{d})^2+(\frac{z-e}{f})^2=0

等价为

x2+Ay2+Bz2+Cx+Dy+Ez+F=0 x^2+Ay^2+Bz^2+Cx+Dy+Ez+F=0

我们令

x2+Ay2+Bz2+Cx+Dy+Ez+F=ϵ x^2+Ay^2+Bz^2+Cx+Dy+Ez+F=\epsilon

最小化目标为

J=ϵi2 J=\sum \epsilon_i^2

对其求偏导可以得到

JA=2ϵiy2=0JB=2ϵiz2=0JC=2ϵix=0JD=2ϵiy=0JE=2ϵiz=0JF=2ϵi=0\begin{aligned} &\frac{\partial J}{\partial A}=2\sum \epsilon_i y^2=0\\ &\frac{\partial J}{\partial B}=2\sum \epsilon_i z^2=0\\ &\frac{\partial J}{\partial C}=2\sum \epsilon_i x=0\\ &\frac{\partial J}{\partial D}=2\sum \epsilon_i y=0\\ &\frac{\partial J}{\partial E}=2\sum \epsilon_i z=0\\ &\frac{\partial J}{\partial F}=2\sum \epsilon_i =0\\ \end{aligned}

推出

(x2y2+Ay4+By2z2+Cxy2+Dy3+Ey2z+Fy2)=0(x2y2+Ay2z2+Bz4+Cxz2+Dyz2+Ez3+Fz2)=0(x3+Axy2+Bxy2+Cx2+Dxy+Exz+Fx)=0(x2y+Ay3+Byz2+Cxy+Dy2+Eyz+Fy)=0(x2z+Ay2z+Bz3+Cxz+Dyz+Ez2+Fz)=0(x2+Ay2+Bz2+Cx2+Dy+Ez+F)=0\begin{aligned} &\sum(x^2y^2+Ay^4+By^2z^2+Cxy^2+Dy^3+Ey^2z+Fy^2)=0\\ &\sum(x^2y^2+Ay^2z^2+Bz^4+Cxz^2+Dyz^2+Ez^3+Fz^2)=0\\ &\sum(x^3+Axy^2+Bxy^2+Cx^2+Dxy+Exz+Fx)=0\\ &\sum(x^2y+Ay^3+Byz^2+Cxy+Dy^2+Eyz+Fy)=0\\ &\sum(x^2z+Ay^2z+Bz^3+Cxz+Dyz+Ez^2+Fz)=0\\ &\sum(x^2+Ay^2+Bz^2+Cx^2+Dy+Ez+F)=0\\ \end{aligned}

那么我们只需要求解一次六维矩阵的逆就可以得到最小二乘法的解——但是标准的求逆运算太麻烦了,在单片机中同样会消耗大量的资源,使用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)用于程序烧录和调试操作。

功能介绍

  1. 磁力计指北,在任何开机状态下北向灯常亮
  2. 电量检测,按下按钮,循环灯的数量表示当前的电量
  3. 自动休眠,30s无动作进入休眠状态,休眠电流100uA
  4. 摇晃唤醒,在休眠状态任意摇晃可以唤醒设备

烧录说明

  1. 首先需要烧录P1部分的代码,烧录完成后一个灯会自动是闪烁,请大范围旋转设备,直到灯光不闪烁为止;
  2. 一部分完成后,烧录P2部分的代码,如果开机后灯光停滞,说明磁力计焊接有问题;

采购说明

电池规格为601230,螺丝规格为m1.6*10,smt表贴螺丝为M1.6ϕ30.5+ϕ20.8M1.6*\phi 3*0.5+\phi 2*0.8

制作注意事项

已知问题:休眠电流过大,100uA只能待机90天(200mAh电池);

PCB顶层1.6mm板厚,指定位置丝印,沉金;

PCB底层1.6mm板厚,指定位置丝印,彩色丝印沉金色;

LDO的RT9013-33GB请替换为TPS70933DBVR,该LDO具有超低静态电流;

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
椭球矫正.zip
9
2
罗盘.zip
12
3
P1_椭球矫正.axf
6
4
P2_罗盘.axf
7
5
演示视频1.mp4
5
6
演示视频2.mp4
3
7
支架.STL
8
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航