当前位置: 首页 > news >正文

地磁传感器(学习笔记上)

在咱们地磁传感器里的开发板:

开发板上的地磁传感器型号是QMC5883L,它也是使用I2C与ESP32通信,I2C地址为0X0D。这个项目,我们使用地磁传感器QMC5883L计算方位角,最终,把开发板放平到桌子上,旋转开发板一周,输出0~359°的数值到串口终端

在这个项目里,我们首先写的是编写QMC5883L驱动程序,我们还是使用sample project作为模板,我们复制esp-idf-v5.1.3\examples\get-started\sample_project这个工程到我们的实验文件夹,然后把这个文件夹的名称修改为azimuth,azimuth是方位角的意思哈,在VSCode软件,然后打开azimuth文件夹

第一步还像我们往常一样,我们先打开azimuth工程目录下的CMakeList.txt文件,修改工程的名称为azimuth,然后保存关闭此文件

project(azimuth)

在这个项目中我们需要用到I2C通信,现在我们把温湿度例程里面的myi2c.h和myi2c.c文件复制到Attitude工程中的main目录下,这个是在电脑上完成复制和粘贴

我们点开main目录下的CMakeLists.txt文件,可以看到myi2c.c文件已经添加到编译路径,然后我们在main目录下新建2个文件,分别是qmc5883l.c和qmc5883l.h文件

idf_component_register(SRCS "myi2c.c" "main.c"INCLUDE_DIRS ".")

然后我们再点开main目录下的CMakeLists.txt文件,确认一下qmc5883l.c文件有没有被添加到路径

idf_component_register(SRCS "qmc5883l.c" "myi2c.c" "main.c"INCLUDE_DIRS ".")

点击打开qmc5883l.h文件,在最上面添加#pragma once

#pragma once

点击打开qmc5883l.c文件,在最上面添加包含qmc5883l.h文件

#include "qmc5883l.h"

点击打开main.c文件,添加头文件

#include "myi2c.h"
#include "qmc5883l.h"

在app_main函数中,先调用I2C初始化函数

void app_main(void)
{ESP_ERROR_CHECK(i2c_master_init());ESP_LOGI(TAG, "I2C initialized successfully");
}

函数里使用到了ESP_LOGI,需要包含esp_log.h头文件

#include "esp_log.h"

还需要给ESP_LOGI里面的TAG定义一下

static const char *TAG = "MAIN";

接下来,开始写qmc5883l的驱动函数,我们先写两个读取qmc5883l寄存器的函数和写入qmc5883l寄存器的函数。写入函数用于配置传感器的参数,读取函数用于读取传感器的寄存器数据,例如ID号,状态等。把这两个函数放到qmc5883l.c文件中

esp_err_t qmc5883L_register_read(uint8_t reg_addr, uint8_t *data, size_t len)
{return i2c_master_write_read_device(I2C_MASTER_NUM, QMC5883L_SENSOR_ADDR,  &reg_addr, 1, data, len, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
} //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功,reg_addr: 要读取的寄存器地址,data: 用于存储读取数据的缓冲区指针,len: 要读取的数据长度(字节数)
//i2c_master_write_read_device 函数实现读取操作;I2C_MASTER_NUM: I2C总线编号
//QMC5883L_SENSOR_ADDR: QMC5883L传感器的I2C地址;&reg_addr: 要读取的寄存器地址
//1: 寄存器地址的长度(1字节);data: 用于存储读取数据的缓冲区指针
//len: 要读取的数据长度(字节数);I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS: I2C操作的超时时间esp_err_t qmc5883L_register_write_byte(uint8_t reg_addr, uint8_t data)//该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功;reg_addr: 要写入的寄存器地址;data: 要写入寄存器的数据
{uint8_t write_buf[2] = {reg_addr, data};return i2c_master_write_to_device(I2C_MASTER_NUM, QMC5883L_SENSOR_ADDR, write_buf, sizeof(write_buf), I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
}
//i2c_master_write_to_device 函数实现写入操作;I2C_MASTER_NUM: I2C总线编号
//QMC5883L_SENSOR_ADDR: QMC5883L传感器的I2C地址;write_buf: 包含寄存器地址和数据的缓冲区
//write_buf[0] = reg_addr: 寄存器地址;write_buf[1] = data: 要写入的数据
//sizeof(write_buf): 缓冲区的长度(2字节);I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS: I2C操作的超时时间

然后我们在qmc5883l.c文件中添加这两个函数需要的头文件

#include "driver/i2c.h"
#include "myi2c.h"

函数里面用到了QMC5883L_SENSOR_ADDR,我们在qmc5883l.h文件中定义一下

#define  QMC5883L_SENSOR_ADDR    0x0D

接下来,我们需要写一个qmc5883l初始化函数,用于读取ID号,配置加速度、陀螺仪范围等参数。这个函数涉及到了qmc5883l的寄存器,所以我们先用枚举类型定义寄存器,放到qmc5883l.h文件中

enum qmc5883l_reg
{QMC5883L_XOUT_L,QMC5883L_XOUT_H,QMC5883L_YOUT_L,QMC5883L_YOUT_H,QMC5883L_ZOUT_L,QMC5883L_ZOUT_H,QMC5883L_STATUS,QMC5883L_TOUT_L,QMC5883L_TOUT_H,QMC5883L_CTRL1,QMC5883L_CTRL2,QMC5883L_FBR,QMC5883L_CHIPID = 13
};

结合QMC5883L的数据手册中的寄存器定义表格,写出这个枚举定义。枚举类型的第一个值默认是0,和寄存器XOUT_L的地址一样,所以不用标出,然后依次递增,遇到地址不连续的寄存器地址时,单独标出,最后的结果如上代码所示

接下来写qmc5883l初始化函数到qmc5883l.c文件

void qmc5883l_init(void)
{uint8_t id = 0; //用于存储从传感器读取的ID值qmc5883L_register_read(QMC5883L_CHIPID, &id ,1); //读取QMC5883L传感器的ID寄存器,并将结果存储在 id 变量中while (id != 0xff)  // 确定ID号是否正确{vTaskDelay(1000 / portTICK_PERIOD_MS); //延迟1000毫秒(1秒),然后再次读取IDqmc5883L_register_read(QMC5883L_CHIPID, &id ,1); //再次读取ID寄存器}ESP_LOGI(TAG, "QMC5883L OK!"); //如果ID值正确(等于0xff),打印一条信息,表示传感器初始化成功qmc5883L_register_write_byte(QMC5883L_CTRL2, 0x80); // 复位芯片 vTaskDelay(10 / portTICK_PERIOD_MS); //延迟10毫秒,等待复位完成qmc5883L_register_write_byte(QMC5883L_CTRL1, 0x05); //Continuous模式 50Hz qmc5883L_register_write_byte(QMC5883L_CTRL2, 0x00);  //向控制寄存器2写入0x00,清除复位标志qmc5883L_register_write_byte(QMC5883L_FBR, 0x01);  //向滤波器带宽寄存器写入0x01,配置滤波器带宽
}

初始化函数里面,首先读取qmc5883l的ID号,如果不正确,就继续读,如果正确,往下执行。确定qmc5883l没有问题,先复位芯片,然后进行配置。CTRL1,配置成了连续采集模式,输出速率50Hz。CTRL2,可以用来配置是否复位以及数据读取方式。FBR寄存器,数据手册推荐写入0x01

函数里面用到了ESP_LOGI,用来输出信息,这里的TAG,需要定义。我们把这个TAG定义,放到qmc5883l.c文件中的包含头文件的下面

static const char *TAG = "QMC5883L";

函数里面使用了freeRTOS的延时函数,所以需要包含freeRTOS头文件,放到qmc5883l.c文件中

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

函数里面也用到了ESP_LOGI,所以还需要添加log头文件

#include "esp_log.h"

现在我们把这个函数的声明写到qmc5883l.h文件

extern void qmc5883l_init(void);

接下来我们在main.c文件中的app_main函数中调用这个初始化函数

void app_main(void)
{ESP_ERROR_CHECK(i2c_master_init());ESP_LOGI(TAG, "I2C initialized successfully");qmc5883l_init();
}

相关文章:

地磁传感器(学习笔记上)

在咱们地磁传感器里的开发板: 开发板上的地磁传感器型号是QMC5883L,它也是使用I2C与ESP32通信,I2C地址为0X0D。这个项目,我们使用地磁传感器QMC5883L计算方位角,最终,把开发板放平到桌子上,旋转…...

使用 NumPy 和 Matplotlib 进行高级数据可视化:实践指南

使用 NumPy 和 Matplotlib 进行高级数据可视化:实践指南 数据科学和工程实践中,NumPy 和 Matplotlib 是强大的组合工具。本文将进一步展示如何借助这两个库进行更复杂的可视化任务,例如创建多曲线、叠加图、动态可视化等场景。 一、环境准备…...

mysql 启动报错 ‘/var/run/mysqld/mysqld.sock‘

问题描述: Docker 拉取 Ubuntu镜像,启动ubuntu容器后 在里边安装mysql 当容器启动时,不将/var/lib/mysql 目录映射到宿主机时,mysql可以正常启动使用当容器启动时,将/var/lib/mysql 目录映射到宿主机后,my…...

JAVA基础:常用类 (习题笔记)

1,验证键盘输入的用户名不能为空,长度大于6,不能有数字。 提示:使用字符串String类的相关方法完成 package packagingClass;import java.util.Scanner;public class Exercises1 {//程序入口public static void main(String[] arg…...

element 按钮变形 el-button样式异常

什么都没动,element UI的按钮变形了,莫名其妙,连官网的也变形了,换了其它浏览器又正常, 难道这是element UI的问题?NO,是浏览器的插件影响到了!去扩展插件里面一个个关闭扩展&#x…...

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi(适用于 NVIDIA 显卡)2. 使用 wmic 命令(Windows) 1. 使用 nvidia-smi(适用于 NVIDIA 显卡) 如果服务器上安装了 NVIDIA 驱动程序,可以使用 nvidia-smi 工具来查看…...

算法基础 - 时间复杂度和空间复杂度(万字长文详解)

文章目录 前言什么是算法效率时间复杂度定义作用类比理解 空间复杂度定义作用类比理解 大O表示法为什么需要?定义计算步骤1. 计算基本操作的执行次数 T(n)2. 确定 T(n) 的数量级(按规则)3. 使用大O表示法表示时间复杂度 常见复杂度O(1)说明案…...

【K8S系列】Kubernetes 中 Service IP 地址和端口不匹配问题及解决方案【已解决】

在 Kubernetes 中,Service 是实现 Pod 之间和 Pod 与外部之间通信的关键组件。Service 的 IP 地址和端口配置不当可能导致应用无法正常访问。本文将详细分析 Service IP 地址和端口不匹配的问题,常见原因及其解决方案。 一、问题描述 Service IP 地址和…...

10. 异常处理器

一、通过 注解 注册异常处理器 <?php namespace App\Exception\Handler;use App\Exception\FooException; use Hyperf\ExceptionHandler\ExceptionHandler; use Hyperf\HttpMessage\Stream\SwooleStream; use Swow\Psr7\Message\ResponsePlusInterface; use Throwable;use…...

python查询并安装项目所依赖的所有包

引言 如果需要进行代码的移植&#xff0c;肯定少不了在另一台pc或者服务器上进行环境的搭建&#xff0c;那么首先是要知道在已有的工程的代码中用到了哪些包&#xff0c;此时&#xff0c;如果是用人工去一个一个的代码文件中去查看调用了哪些包&#xff0c;这个工作甚是繁琐。…...

istio多主集群架构验证方法

istio单网格多集群架构搭建完成后&#xff0c;需要验证下当前集群是否可以发现对端集群&#xff0c;验证方法如下&#xff1a; 命名空间建议设置为&#xff1a;demo-dubbo deploy.yaml apiVersion: apps/v1 kind: Deployment metadata:finalizers:- kubebuilder.io/net.traf…...

Java全栈经典面试题剖析8】JavaSE高级 -- 线程同步、 线程通信、死锁、线程池

目录 面试题3.44 多线程的同步方式 面试题3.45 多线程安全问题怎么解决 面试题3.46 当一个线程进入一个对象的一个synchronized方法后&#xff0c;其它线程是否可进入此对象的其它方法? 面试题3.47 简述synchronized与java.util.concurrent.locks.Lock的异同&#xff…...

linux 驱动, struct file , struct node, private_data

首先是关于什么是 praviate_data : 来看看正点原子是怎么使用的。 网上找的一些资料&#xff1a; 总结一下&#xff1a; 1 私有数据 是 struct file特有的。 &#xff12;private_data 可以自己随便设置。 3 一般是在 open 函数中设置好&#xff0c;然后在 read, write 函…...

ubuntu 硬盘扩容

在 Linux 中&#xff0c;可以使用以下命令查看磁盘的使用情况和信息&#xff1a; 查看磁盘使用情况&#xff1a; df -h这个命令会显示所有文件系统的使用情况&#xff0c;以人类可读的格式&#xff08;例如 GB 或 MB&#xff09;。 查看磁盘分区和设备信息&#xff1a; lsblk这…...

cm211-1刷机教程镜像包

cm211-1刷机教程 包含镜像包酷看桌面 s905l3-l3b通用 镜像包&#xff1a;https://www.123684.com/s/WGAwjv-5tlv3 1.刷机教程 镜像为线刷镜像包&#xff0c;需要短接刷机 短接刷机&#xff0c;导入镜像包 开始即可。到100%就证明可以了。...

Android 15自定义设置导航栏与状态栏,EdgeToEdge适配

背景&#xff1a;android api 35&#xff0c;activity设置EdgeToEdge.enable((ComponentActivity) this)前提下 一、设置导航栏与状态栏颜色 设置的状态栏颜色&#xff0c;只需要设置fitsSystemWindows跟setOnApplyWindowInsetsListener xml设置&#xff1a; 代码&#xff1a;…...

设计模式概览

设计模式是一种在软件设计中被广泛使用的解决方案&#xff0c;旨在提高软件的可重用性、可维护性和可扩展性。设计模式可以分为三大类&#xff1a;创建型、结构型和行为型。 1、创建型模式 这些模式主要关注对象的创建过程&#xff0c;提供了不同的方式来创建对象&#xff0c…...

力扣每日一题打卡 684. 冗余连接

树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges &#xff0c;edges[i] …...

什么是微服务中的反应性扩展?

大家好&#xff0c;我是锋哥。今天分享关于【什么是微服务中的反应性扩展&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是微服务中的反应性扩展&#xff1f; Reactive Extensions 也称为 Rx。这是一种设计方法&#xff0c;我们通过调用多个服务来收集结果…...

【MyBatis】MyBatis-config标签详解

目录 MyBatis配置文件标签详解configuration标签properties标签typeAliases标签environments标签environment标签transactionManager标签dataSource标签mappers标签 MyBatis配置文件标签详解 我们在使用MyBatis框架的时候需要一个配置文件——MyBatis-config.xml来告诉MyBatis…...

使用AVPlayer进行音频播放开发基础设计

在使用AvPlayer进行设计之前&#xff0c;需要获取相应对象&#xff0c;后期围绕该对象展开操作 const player await media.createAVPlayer() 然后对播放器进行初始化设置&#xff1a; player.on(stateChange, (state) > {switch (state) {case initialized:player.prepar…...

API网关的作用--为什么微服务需要一个API网关?

微服务网关核心作用就是协议转换、安全隔离和流量控制 微服务架构中&#xff0c;API网关作为系统的入口点&#xff0c;可以统一处理所有客户端请求。 1&#xff09;协议转换&#xff1a;它能够支持多种通信协议&#xff08;如HTTP、gRPC等&#xff09;之间的相互转换&#xff…...

[0154].第5节:IDEA中创建Java Web工程

我的后端学习大纲 IDEA大纲 1.1.IDEA中配置Tomcat&#xff1a; 1.找打setting: 2.配置Tomcat Server的位置&#xff1a; 3.这里配置Tomcat的名称以及配置应用服务器的位置。根据自己Tomcat的安装位置决定 4.配置好后&#xff0c;如下图所示 1.2.创建Web工程&#xff1a; 1.建…...

React03 组件 Props

组件 & Props React 组件函数&#xff08; Function &#xff09;组件类&#xff08; Class &#xff09;组件 Props将 props 传递给子组件在子组件中读取 props给 prop 指定一个默认值使用 JSX 展开语法传递 props React 组件 组件本质上就是类和函数&#xff0c;但是与常…...

多线程——线程安全的集合类

目录 前言 一、多线程环境使用 ArrayList 1.进行加锁 2.使用 SynchronizedList 类 3.使用 CopyOnWriteArrayList 类 二、多线程环境使用队列 1.进行加锁 2.使用阻塞队列 三、多线程环境使用哈希表 1.Hashtable 2.ConcurrentHashMap &#xff08;1&#xff09;缩小锁…...

自动化数据库管理:如何通过存储过程动态创建 MySQL 对象

在当今数据驱动的世界中&#xff0c;高效的数据库管理至关重要。本文将展示如何通过存储过程自动化地创建各种 MySQL 数据库对象&#xff0c;包括数据表、视图、字段、索引、约束、存储过程、定时器和事件。通过这些方法&#xff0c;我们可以快速响应业务需求&#xff0c;提高数…...

480p 720p 1080p 2k 4k 8k 12k分辨率视频分别占用多大带宽?

技术背景 好多开发者&#xff0c;在设置视频编码参数的时候&#xff0c;对不同分辨率的带宽设置&#xff0c;缺乏相关的经验&#xff0c;实际上&#xff0c;视频分辨率与所需带宽之间的关系受到多个因素的影响&#xff0c;包括视频编码方式、帧率、视频内容的动态程度等。下面…...

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…...

洛谷——P8468 [Aya Round 1 C] 文文的构造游戏(01构造问题)

P8468 [Aya Round 1 C] 文文的构造游戏 题目描述 [Aya Round 1 C] 文文的构造游戏 - 洛谷 运行代码&#xff08;暴力枚举&#xff09;——超时 #include <stdio.h> #define ll long long const int N 1e6 5; // 计算数组元素的异或和 ll xorSum(ll arr[], int n) {l…...

双击热备和负载均衡的区别

区别&#xff1a; 双机热备 (heartbeat)&#xff1a;对同一应用来讲&#xff0c;永远是主机应用启动&#xff0c;备机应用停止的一主一备模式(两台通常叫双击热备&#xff0c;多台称为高可用) 负载均衡&#xff1a;两台/多台服务器 上同一个应用系统同时工作&#xff0c;分担负…...

为什么要建设学校网站/建材企业网站推广方案

模拟实现C智能指针shared_ptr和weak_ptr 仿写C的shared_ptr和weak_ptr 当强智能指针shared_ptr的引用计数为0时&#xff0c;析构资源 当弱智能指针weak_ptr的引用计数为0时&#xff0c;析构引用计数对象 #include<iostream> #include<new> #include<stdio.h&g…...

临沂网站建设那家好/win7怎么优化最流畅

文章目录1.CSS2.Id&ClassCSS的创建具体属性ref1.CSS CSS(Cascading Style Sheets)层叠样式表, 一种用于为结构化文档(HTML文档/XML应用)添加样式(字体, 间距, 颜色等)的计算机语言样式定义如何显示HTML元素, 通常存储在样式表, 样式添加到HTML4.0中是为了解决内容与表现分…...

平台流量排名/重庆百度快照优化

平台&#xff1a;VC 2005 测试通过&#xff01;.vcproj这是使用应用程序向导生成的 VC 项目的主项目文件。 它包含生成该文件的 Visual C 的版本信息&#xff0c;以及有关使用应用程序向导选择的平台、配置和项目功能的信息。StdAfx.h, StdAfx.cpp这些文件用于生成名为 twod.pc…...

谷歌浏览器wordpress证书不安全/合肥网络推广公司

除了USB方式连接Android终端设备&#xff0c;还有一种方法是通过adb connect命令利用TCP/IP协议来连接。毕竟&#xff0c;PC端的USB口也是有限的。Step1&#xff1a;设置手机和PC在同一网络下&#xff0c;即连接同一WIFI&#xff1b;用USB连接手机&#xff1b;在终端输入&#…...

惠州专业网站制作公司/seo营销技巧

中国银联是经同意&#xff0c;批准设立的中国银行卡组织。成立以来&#xff0c;顺应国家社会经济发展和人民群众用卡需要&#xff0c;牢记历史使命&#xff0c;履行社会责任&#xff0c;充分发挥银行卡组织的职能作用&#xff0c;推动我国银行卡产业实现了快速、健康发展&#…...

专业设计网站公司/官网建站多少钱

OO设计真得不能够解决在Motive中提到得例子吗&#xff1f;我认为AOP也是OO&#xff0c;或者至少是OO得延续。OO不只有inheritance and polymorphism。在设计模式中Module Method 就可以解决这个问题&#xff0c;难道设计模式不是为OO准备得&#xff1f;看到后面&#xff0c; 我…...