如何驱动一个传感器?|学习笔记

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 快速学习如何驱动一个传感器?

开发者学堂课程【HaaS 智能硬件开发训练营:】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/832/detail/13959


如何驱动一个传感器?

 

内容介绍:

一、 HaaS 资源介绍

二、 硬件常用接口 SPI/I2C 的介绍

三、如何从零扩展一个传输器

 

一.HaaS 资源介绍

HaaS EDU K1是 HaaS Education Kit1的缩写,是基于四核高性能 HaaS1000芯片打造的、集颜值和内涵于一身的物联网教育开发板。

HaaS EDU K1接口资源丰富,自带了一个1.3寸、分辨率128*64的 OLED 显示屏,通过 SPI 驱动,同时还配备了多款传感器,通过I2C 通信。

image.png

image.png

左侧图为六轴传感器 右侧图为 SPI 接口(可通过接插线接到 OID 显示屏并通过 SPI 驱动)

 

二、硬件常用接口 SPI/I2C 的介绍

1.I2C 介绍

I^2C 的正确读法为"I方C"。 C ( Inter - Integrated Circuit )是一种串行通信总线,使用多主从架构,由飞利浦公司在80年代为了让 CPU 可以连接低速周边设备而设计的。

常用场景(一般为低速外设):

Ø 保存用户的设置所用的 NVRAM 芯片

Ø DAC (数字模拟转换器)和 ADC (模拟数字转换器)

Ø 小型液晶或 OLED 屏幕  注意:分辨率不能太高

Ø 各种监控器(电池监控、键盘监控、 CPU 的温度及风扇转速状态监控)模块

Ø RTC(实时时钟)I2C 最频繁的场景

Ø GPI0扩展芯片 当 CPU 的资源足够丰富的时候,此时可以通过扩展,但注意I2C 扩展不适应做高速模拟,如果I2C扩展的 GPR 芯片上模拟 SPI,可能会造成I2C 的紊乱

Ø 温湿度、光感、加速度、陀螺仪、接近、触控、燃气检测等各种类型的低速传感器

2.I2C 特点

I2C 有两根总线 SDA(串行数据线)和 SCL(串行时钟线)两条双向漏极开路,需要外接上拉电阻才能正常工作

基于地址(当一个总线的量多的则会产生地址冲突)

地址模式:7-bit 或10-bit(由地址冲突衍生)

多主从模式(支持多个主设备访问且在一个标准数据中不会被其他干扰)

半双工数据传输:同一时间点只能发或收(区别于全双工:一条数据线用于发送,一条数据包线用于接收,即同一时间点可以发和收)

速度模式:低速(10kbps)、标准(100kbps)、快速(4000kbps)、快速+(1Mbps)、高速(3.4Mbps)

多数I2C 速率为100kbps—400kbps

image.png

3.I2C 速度影响因素

image.png

跳片跳跃时间与电容大小有关

4.I2C 重要概念

I2C 总线是由菲利普公司开发的一种总线系统。12C 总线系统问世后,迅速在彩电等家电产品中得到广泛的应用,尤其是在新型彩电中应用最多。12C 总线(12C BUS , Inter Integrated - circuit Bus )常见的中文译名有集成电路间总线或内部集成电路总线。下面简要介绍一下作为彩电维修人员应掌握的一些关于12C 总线的基本概念。

Term

Description

Transmitter(发送器)

 the device which sends data to the bus

Receiver(接收器)

 the device which receives data from the bus

Master(主设备)

作用:控制总线;同步信号;触发传输;

 the device which initiates a transfer , generates clock signals and terminates a transfer

Slave(从设备)

作用:接收指令;数据交互

the device addressed by a master

Multi-master(多主同)

more than one master can attempt to control the bus at the same time without corrupting the message

Arbitration(仲裁)

Procedure to ensure that , if more than one master simultaneously tries to control the bus , only one is alowed to do so and the winning message is not corrupted

Synchronization(同步)

主设备向从设备发生仲裁,为了保证电路的稳定性的一种规范

procedure to synchronize the clock signals of two or more devices

image.png

所有I2C 的传输都是基于 start 到 stop

当两个总线处于高电平即空闲状态时,在时钟线处于高电平时地址线有一个下拉式跳变被认为 start 开始的标志,到最后 SCL 处于高电平,SDA 有一个上升的状态时被认为是结束的标志。

5.数据传输格式

每个有效数据传输都为8个字节(有效数据遵循高位在前,低位在后);最后会跟一个 ACK/NACK 标志(ACK 表 示0,NACK 表示1)

上述设计意义:当左侧未响应时,中部低电平仍默认为1

8bit 数据,MSB 在前

1bit ACK/NACK

SDA 数据切换发生在 SCL 低电平期间

SCL 高电平期间,SDA 应保持不变

一次数据传输过程中支持连续传输模式(中间无停顿,直到主设备发出 stop 信号或者 ACK 标志)

image.png

image.png

6.I2C 协议应答/非应答的标志

ACK:数据传输正常则接收方回复 ACK 给发送方

NACK 的几种情况:

1I2C 总线上没有挂载目标地址的从设备

2接收方正在进行其他实时操作,没有准备好和对方进行通信

3接收方接收到了未知数据

4数据传输过程中,接收方没办法再继续接收更多数据

在发生 NACK 后,主设备可以结束发送,也可以不结束发起重复开始(和开始信号一样)的标志

7.写操作详解

目的:主设备需要给从设备发送数据(进行写操作)

步骤:

a.主设备发送 START 信号和寻址数据(从设备地址和写标志);从设备应答(未处于 busy 状态)

b.主设备发送数据,从设备发送应答/非应答

c.主设备发送 STOP 信号

主设备发送2字节数据给从设备的传输过程描述:

image.png

8.读操作详解

目的:主设备需要从从设备接收数据(进行读操作)步骤:

1主设备发送 START 信号和寻址数据(从设备地址和读标志);从设备应答(当主设备发生 ACK 的指令,从设备也会发送 ACK,当主设备读完后则发送 stop 结束整个流程)

2从设备发送数据,主设备发送应答/非应答(当两个设备之间出现错误,主设备则会发出 NACK 的指令,从设备也不会继续运行,做出等待 stop 的动作)

3主设备发送 STOP 信号

主设备从从设备读取两个字节时候的传输过程描述:

image.png

7bit 模式

-8个预留地址

-有效地址为120个

10bit 模式

-有效地址1024

Slave address

R/W bit

Description

0000000

0

General call address

0000000

1

START byte

0000001

X

Reserved for future purposes

0000010

X

reserved for future purposes

0000011

X

reserved for future purposes

00001XX

X

reserved for future purposes

11111XX

X

reserved for future purposes

11110XX

X

10-bit slave addresSing

7bit 模式

image.png

首先一个 start 的指令,后跟着7个字节地址,后为读操作的标志位,从设备在 ACK 后做一个数据回复

10bit 模式

image.png

因为10bit 无法凑足两个周期,因此前边由两个标识前面的预留与11110XX 一致,11110为5字节的地址表示,后为从设备高2-bit 地址,代表此为10bit 的标识;通过这种预留既可以兼容7bit 也可以兼容10bit

9.SPI 简介

SPI 是串行外设接口(Serial PeripheralInterface)的缩写,是一种高速的,全双工,同步的通信总线,总线它是由Motorola公司推出的。

SPI 采用主从方式工作。主机通常为 FPGA、MCU 或 DSP 等可编程控制器,从机通常为 EPROM、Flash AD/DA,音视频处理芯片等设备。一般由 SCLKCSMOSIMISO 四根线组成,有的地方可能是:SCK SSSDLSDO 等名称,都是一样的含义。当有多个从机存在时,通过 CS 来选择要控制的从机设备。和标准 SPI 类似的协议,还有卫的 SSP 协议,区别主业在片选信号的时席上。

10.使用场景

SPI 协议主要用于短距离的通信系统中,特别是嵌入式系统,比如以下芯片:

存储器:RAM,EEPROM,Flash 等(运用于大量存储)

数模转换:A/D,D/A 转换器等

驱动接口:LED 显示驱动器、I/O 接口芯片、UART 收发器等。

11.SPI 特点

SPI 至少需要4根线,分别为:MISO(主设备输入,从设备输出),MOSI(主设备输出,从设备输入),SCLK(主时钟), CS(片选)。

无地址模式;当主设备想要和某从设备进行通信时候,主设备需要先向对应从设备的片选线(CS)上发送使能信号表示选中该从设备

一般为一主多从模式串行全双工数据传输

速度模式:一般情况下,SPI 模块的最大时钟频率为系统时钟频率的1/2,虽然 SPI 的传输速率主要受限干 CPU 处理 SPI 数据的能力,但在同另一个非常高速率的 SPI 设备通讯时,SPI 的最大时钟频率将有可能制约其传输速率。

image.png

12.SPI 重要概念(区分与四种传输模式)

名词

解释

CKPOL

( Clock Polarity )/ CPOL / POL / Polarity ,时钟极性

CKPHA

( Clock Phase )/ CPHA / PHA / phase ,时钟相位

scK / scLK

SPI 的时钟

Edge

边沿,即时钟电平变化的时刻,即上升沿( rising edge )或者下降沿( falling edge )对于一个时钟周期内,有两个 edge 。

Leading edge

前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成的时候,对于开始电压是0,那么就是0变成1的时候;

Trailing edge :

后一个边沿=第二个边沿,对于开始电压是1,那么就是变成1的时候(即在

第一次1变成之后,才可能有后面的0变成1),

对于开始电压是0,那么就是1变成 O 的时候;

13.SPI 协议特点

主-从模式(Master-Slave)的控制方式

SPI 规定了两个 SPI 设备之间通信必须由主设备(Master)来控制次设备(Slave)。一个 Master 设备可以通过提供 Clock以及对 Slave 设备进行片选(SlaveSelect)来控制多个 Slave 设备,

Slave 设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。(下图为主设备控制从设备的流程)

同步方式传输

Master 设备会根据将要交换的数据来产生相应的时钟脉冲,时钟脉冲组成了时钟信号,时钟信号通过时钟极性和时钟相位控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。

image.png

数据交换

SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)"或者"接收者(Receiver)"。

在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于该设备有一个bit 大小的数据被交换了。一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master设备进行访问(Access)。

因此,在程序中一般都会在 SPI 传输完数据后,再读取 SPI 设备里的数据,即使这些数据在程序里是无用的,从而保证即使是无效的也能保证数据传输继续。

SPI 只有主模式和从模式之分

SPI 没有读和写的说法,因为实质上每次 SPI 是主从设备在交换数据,也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

工作机制

image.png

SSPBUF:泛指SPI设备里面的内部缓冲区,一般在物理上是以FIFO的形式,保存传输过程中的临时数据;

SSPSR:泛指 SPI 设备里面的移位奇存器,它的作用是根据设置好的数据位宽(bit-width)把数据移入或者移出 SSPBUF;可以做到高速传输,在同硬件中节省成本

Controller:泛指 SPI 设备里面的控制寄存器,可以通过配置它们来设置 SPI 总线的传输模式。

极性与相位

极性,会直接影响 SPI 总线空闲时的时钟信号是高电平还是低电平。

CPOL=1:表示空闲时是高电平;

image.png

相位,直接决定 SPI 总线从那个跳变沿开始采样数据。

CPOL=0:表示从第一个跳变沿(上升点)开始采样;

image.png

CPOL=0:表示空闲时是低电平。

image.png

CPHA=1:表示从第二个跳变沿开始采样。(由图可见跳变数据为1)

image.png

14.四种传输模式

CPOL 和 CPHA 的不同组合,形成了 SPI 总线的不同模式。

时钟极性 CPOL 是用来配置 SCLK 的电平出于哪种状态时是空闲态或者有效态,时钟相位 CPHA

是用来配置数据采样是在第几个边沿: CPOL=0,表示当 SCLK=0时处于空闲态,所以有效状态就是 SCLK 处于高电平时。 CPOL=1,表示当 SCLK=1时处于空闲态,所以有效状态就是 SCLK 处于低电平时。 CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿。

CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿。

SPI Mode

CPOL

CPHA

0 [00]

0

0

1[01]

0

1

2[10]

1

0

3[11]

1

1

15.数据传输举例

目的:主设备与从设备同步通信步骤:

1配置 CPOL=0,CPHA=1

2主设备使能 CS 管脚(拉低),主设备发送数据0x10,0x11,0x13到从设备

3从设备发送数据0x11,0x12,0x13到主设备

4主设备释放 CS 管脚(拉高),结束通信。

传输过程如下:

image.png

4线/3线模式

SPI 比较混乱,主要是没有标准的协议,只有 moto 的的事实标准。所以衍生出多个版本,但没有本质的差异。SPI 分4线和3线,4线接口:包括 SCLK、SDO、SDI、SS;3线接口:包括 SCLK、SDA、SS。

DCX 命令数据选择的3/4线模式

4线串口由 SCL、SI,A0(代表标志位,高时传输命令词,低时传输数据从而区分传输的是数据还是命令)以及 CS 组成。

在 SCL 的每个上升沿,将 D7、D6、…D0移入9位寄存器,每隔8个时钟对 A0采样,并将数据读出。

3线串口由 SCL、SI 以及 CS 组成。(通过人为添加一位 DC)

在 SCL 的每个上升沿,将 D7、D6、… D0移入8位寄存器,DC 位将确认本条数据传输的数据还是指令。DC=0则传输的为数据,DC=1则传输的为指令

image.png

16.SPI 与I2C 对比

SPI(存在四线)

I2C

全双工串行通信

半双工串行通信

高速数据传输速率,2/1时钟

最高1.3Mbps(100kbps—400kbps)

简单的软件配置


极其灵活的数据传输,不限于8位,它可以是任意大小的字

严格的数据格式

(每次传输只为8个字节)

非常简单的硬件结构,从站不需要唯一地从设备需要唯一的地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与 UART 不同)。不需要收发器(与 CAN 不同)。

从设备需要唯一的地址

没有硬件从机应答信号

有硬件从机应答信号

单主多从

多主多从

没有定义硬件级别的错误检査协议只能支持非常短的距离


更多的 IO 占用,4线或者更多

2线

17.HaaS Python 开发环境搭建

image.png

【参考链接】

快速搭建 Python 开发境:

https://blog.csdn.net/HaaSTech/article/details/118281822

文档库:

https://q.alicdn.com/HaaSAI/PythonDoc/quickstart/index.html#

技术社区:https://blog.csdn.net/HaaSTech

HaaSEDUK1的下载方式

a.点击右侧链接https://g.alicdn.com/HaaSAI/PythonDoc/quickstart/quickstart_haaseduk1.html

b.在环境搭建中点击 HaaSEDUK1固件(随后进入安装目录)

c.安装页面代码如下所示

>>>  

(ash:/data)#(ash:/data)#(ash:/data)#

(ash:/data)# cd /data/python-apps/driver/i2c/

(ash:/data/python-apps/driver/i2c/)# ls

README.md main.py

test_ap3216c.py test_mpu6050.py test_qmc5883.py test_si7006.py test_sp106.py

(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)# cmd not found

(ash:/data/python-apps/driver/i2c/)#(ash:/data/python-apps/driver/i2c/)# Terminating...

Skipping tty reset... Thanks for using picocom

haaseduk1

haaseduk1 ls

20210719 aos.bin flash_program.py littlefs.bin ymodem.py ymodem.pyc

haaseduk1

d.将 EDU 接入电脑即可下载

【相关命令】

MAC烧录命令:python flash-programpy--bin=./aosbin--bin=/littlefsbin#0xB32000

串口:picocom-b1500000 /dev/cu.usbserial-AU03ON5E

a.打开上述搭建链接

创建工程

本实验的应用代码入口主要是通过 HaaS studio

https://q.alicdn.com/HaaSAl/PythonDoc/quickstart

image.png

/quickstart ide haasstudio.html#quickref-python-

ide-haasstudio

选取的 demo 为 python_gpio

与之对应的驱动代码为:

/data/lib/micropython/i2c.py

/data/lib/micropython/spi.py

注意:固件烧录为 python 轻应用之后,驱动文件会默认被打包,及时将烧录模式结束防止每次都重新下载

image.png

如上图所示创建

18.I2C 实验

image.png

温湿传感器 Si7006介绍

Si7006是 SiliconLabs 公司推出的,其内部集成了温度传处理器、相对湿度传感元件、模拟/数字转换器、信号处理器以及一个I2C 接口控制器。

I2C 接口,从设备为7-bit 地址:0x40

相对湿度传感器

■最大误差:士5%RH 量程范围:0-80%RH 工作范围:0-100%RH

温度感应器

■最大误差:+1.0℃

■量程范围:-10至+85℃

■工作范围:-40至+125℃

工作电压:19-3.6V

低功耗:33V每秒采样一次情况下22μW

image.png

组成:湿度模块、温度模块、ADC(读取数值)、校转部分

测试寄存器介绍-user Register

image.png

验证读写功能

【D7D0】:测量分辨率:

RH Temp

00: 12 bit 14 bit

01: 8 bit 12 bit

10:10 bit 13 bit

11:11 bit 11 bit

D6:VDD 状态,1=VDDOk,0=VDDlow.

D2:1,片上 heater 功能使能,0=片上 heater 功能关闭。(本次实验重点开关该分辨器)

D5,D4,D3,D1 :保留。

仅有 D7,D0,D2这三个 bit 可配置。

I2C Python 接口介绍

def open(type):

打开并根据 board.son 配置实例

def write(dataBuffer):(无组合其他操作)

发送数据,该函数为阻塞函数,I2C 发送完成后才会返

def read(dataBuffer):

主动读取指定 bytes 的I2C 数据。该函数为阻塞函数,会一直等待读取指定 bytes 的数据

def writeReg(addr dataBuffer):

向寄存器地址 memaddr 发送数据,该函数为阻塞函数,I2C 发送完成后才会返回

def readReg(addrdataBuffer):

主动向寄存器地址 memaddr 读取指定 bytes 的I2C 数据。该函数为阻塞函数,会一直等待读取指定 bytes 的数据

def close():

关闭实例

启动如下所示

i2c/ kv/led/       oled/

pwm /rtc/spi/timer/

uart /wdg/

( ash :/ data )# cat / data / python - apps / driver / board . json

{

" name ":" haasedu ",

" version ":"1.0.0",

“ io ":{

"mpu6050":{" type ":"I2C",

" port ":1,

“ addrWidth ":7,

" freq ":100000," mode ":" master ",

" devAddr ":105

}

"ap3216c":{

" type ":"I2C",

" port ":1,

" addrWidth ":7,"

freq ":100000,"

mode ":" master ",

" devAddr ":30

}

"si7006":{

" type ":"I2C",

“port”:1

" addrWidth ":7,

" freq ":400000,

" mode ":" master ",

" devAddr ":64

},

"sp106":{

" type ":"I2C",

I2C 读写实验演示环节

from driver import I2C

i2c=I2C()

i2c. open ("si7006")

ret =i2c. write ( bytearray ([0xE6,0xBF])) print ( ret )

ret =i2c. write ( bytearray ([0xE7])) print ( ret )

version = bytearray (1)

ret =i2c. read ( version )

print ( version )

i2c. close ()

SPI 实验-接口介绍

image.png

右侧图 DI0相当于 SMO,O 表示输出,0表示输入

SPI Python 接口介绍

def open(type):

打开并根据 board.json 配置实例

Def write(dataBuffer):

通过SPI发送数据,该函数为阻塞函数,SPI 发送完成后才会返回

def read(dataBuffer):

读取指定 bytes 的 SPI 数据,该函数为阻塞函数,读取到指定 bytes 的数据后才会返回

def sendRecv(writeDataBufferreadDataBuffer):

通过 SPI 发送数据阻塞发送数据,发送完后,再阻塞读取指定 bytes 的数据

def close():

关闭实例(防止其他接口接入时被占用)

19.SPI 读写实验演示环节

首先调出代码如下所示:

# coding=utf-8

# This is a sample python script. from driver import spi

print("-.-----------------Spi test--------------------") spi=sPI()

spi.open("SPIO")

readBuf=bytearray(3)

writeBuf=bytearray([0x9f]) print(writeBuf) print(readBuf)

value m spi.sendRecv(writeBuf, readBuf) print(value)

print(writeBuf) print(readBuf) spi.close()

print(*-------------------sp1 test--------------------")

(ash:/data)# MicroPython v1.15 on 2021-07-01; HaaS with Alios

Type "help()" for more information.

>>>

>>>

>>>

>>>

>>>

>>>

>>>

>>> # coding=utf-8

>>> # This is a sample Python script.

>>> from driver import spi>>>

>>> print("-------------------spi test--------------------")

.------------spi test---- --------

>>> spi = SPI()

>>> spi.open("SPI0")

1299407/py_engine | spi 0 open succ

>>> readBuf = bytearray(3)

>>> writeBuf = bytearray([0x9f])

>>> print(writeBuf) bytearray(b'\x9f')

>>> print(readBuf)

bytearray(b'\x00\x00\x00')

>>> value = spi.sendRecv(writeBuf, readBuf)

>>> print(value)

>>> print(writeBuf) bytearray(b'\x9f')

>>> print(readBuf)

bytearray(b'\x00\x00\x00')

>>> spi.close(

>>> print("-----. ------spi test--------------------")

.----spi test------- -----------

 

三、如何从零扩展一个传感器

1.实验背景及技术点

I2C 总线技术

加速度计与陀螺仪传感器原理

image.png

实验技术点:

加速度传感器:通常由质量块、阻尼器、弹性元件、敏感元件和适调电路等部分组成。传感器在加速过程中,通过对质量块所受惯性力的测量,利用牛顿第二定律获得加速度值。根据传感器敏感元件的不同,常见的加速度传感器包括电容式、电感式、应变式、压阻式、压电式等。

image.png

陀螺仪传感器:一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。现代陀螺仪可以精确地确定定位物体的方位,它在现代航空,航海,航天和国防工业中广泛使用的一种惯性导航仪器。陀螺仪分为机械式的陀螺仪、光纤陀螺仪及环式激光陀螺仪等。

陀螺仪传感器:

陀螺仪由1850年法国物理学家莱昂·傅科在研究地球自传中获得灵感而发明出来的,类似把一个高速旋转的陀螺放到一个万向支架上,靠陀螺的方向来计算角速度,现在小巧的芯本片造型和机械陀螺仪相比起来差别就太大了。

以 HaaSEDUK1使用的 MPU-6050为例,它属于传感 MEMS 分支 传感 MEMS 技术是指用微电子微机械加工出

来的、用敏感元件如电容、压电、压阻、热电耦、谐振、隧道电流充等来感受转换电信号的器件和系统。

image.png

>MPU6050是一款经典的 MEMS 陀螺仪,即硅微机电陀螺仪>MEMS(Micro-Electro-MechanicalSystem)是指集机械结

构、微型传感器、微型执行器、信号处理和控制电路、通信接口电路及电源于一体的完整微型机电系统。

>绝大多数的 MEMS 陀螺仪依赖于相互正交的振动和转动引起的交变科里奥利力。

>在MPU-6050内部,存在一质量块,当器件上电后,会触发质量块以固定频率横向运动(横向震荡不会影响电容差值)。当器件遭受外力具备加速度时,就会触发质量块的纵向运动,从而改变四周梳齿之间的距离,改变输出的电容,再通过 ADC 将模拟信号转换为数字信号,输出给外部。

image.png

2.硬件介绍

a.原理图及外观

image.png

支持 INT 中断功能,当数据到来时可以在该引脚上触发中断

(MPU6050 INT-- HaaS1000 GPIO P41)

特别注意:

AD0引脚决定了器件地址的第0bit。当 AD0连接高电平,即

AD0=1,此时器件地址为0x69(采用了I2C 通信,可直接使用不用外扩)

image.png

b.MPU6050芯片特性

12C 接口400kHz 快速模式

集成3轴 MEMS 陀螺仪、3轴MEMS 加速度计以及一个可扩展的数字运动处理器(作用:减轻运算负担)DMP(DigitalMotion Processor)

可用12C 接口扩展第三方的数字传感器,比如磁力计>陀螺仪和加速度计均使用16位的 ADC

陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps)>加速度计可测范围为±2,±4,±8,±16g

片内1024字节的 FIFO,有助于降低系统功耗

内嵌了一个温度传感器及精度范围在±1%内的振荡器>芯片尺寸4x4x0.9mm,QFN 封装(无引线方形封装)可承受最大10000g的冲击

c. MPU6050芯片特性

>对于一个物体来说,我们要描述它的运动姿态,除了用它在 xvz 三个轴方向的加速度之外,还会用

到它在三个轴的旋转运动状态(旋转方向)。

>欧拉角是表达旋转的最常用的方式之一。

>旋转运动姿态就是通过陀螺仪传感器来进行计算的,所以我们可以通过陀螺仪的测量结果并根据一定的

公式来计算 pitch、yaw 和 roll这三个指标。但计算过程设计到滤波、融合算法等等,会比较复杂。

>DMP 就是 MPU6050内部的运动引擎,全称 Digital Motion Processor(相当于协处理器),主要完成滤波和数据融合的操作,直接输出四元数,可以减轻外围微处理器的工作负。Motion Driver pitch 是 invensense 针对其运动传感器的软件包,并非全部开源,核心的算法部分用静态链接库的形式提供。

>DMP 对姿态运算频率最高200Hz。

image.png

下图为芯片特性图

image.png

组成部分:最左侧为自检模块,通过 ADC 读取

d.MPU6050寄存器介绍

MPU6050芯片可配置选项很丰富,主要包括以下几类:

>配置寄存器(加速度、角速度、FIFO)

>12C 主从设备控制及状态寄存器(可支持读取和外扩第三方设备,作为 master 外接)

>中断控制及状态寄存器

>加速度、角速度及扩展传感器数据寄存器

>低功耗设定寄存器

image.png

Power Management 1

Type:Read/Write

image.png

DEVICE RESET:写入1,复位芯片

SLEEP:写入1,芯片进入低功耗模式(主控寄存器)

CYCLE:SLEEP 为0的时候,CYCLE 设置为1,设备进入周期性工作模式,可以通过对 PowerManagement2进行配置来控制器设定其工作周期

TEMP-DIS:写入1,关闭芯片的测温功能

CLKSEL:选择芯片工作使用的时钟源

Power Management 2

Type:Read/Write

image.png

LP _ WAKE _ CTRL :设定 wake-up frequency

STBY_XA:写入1, X 轴加速度传感器进入 standby 模式

STBY_YA:写入1, Y 轴加速度传感器进入 standby 模式

STBY_ ZA:写入1, Z 轴加速度传感器进入 standby 模式

STBY_XG:写入1,× 轴陀螺仪传感器进入 standby 横式

STBY_YG:写入1, Y 轴陀螺仪传感器进入 standby 模式

STBY_ZG:写入1, Z 轴陀螺仪传感器进入 standby 模式

Accelrometer  Configurarion

Type: Read/Write

image.png

XG ST:写入1,X 轴陀螺仪传感器进入自测模式

YG ST:写入1,Y 轴陀螺仪传感器进入自测模式

ZG ST:写入1,Z 轴陀螺仪传感器进入自测模式

FS SEL:设置陀螺仪传感器的满量程范围

image.png

Accelerometer Configuration

Type: Read/Write

image.png

XA ST:写入1,X 轴加速度传感器进入自测模式

YA_ST:写入1,Y 轴加速度传感器进入自测模式

ZA ST:写入1,Z 轴加速度传感器进入自测模式

AFS SEL:设置加速度传感器的满量程范围

image.png

Sample Rate Divider

Type:Read/Write

image.png

传感器寄存器、FIFO 输出及 DMP 采样都是基于此 SampleRate 设定

Sample Rate=Gyroscope Output Rate/(1+SMPLRT_DIM)

SMPLRT DIV:设置加速度采样频率

对于加速度传感器,输出频率固定是1k,如果想要设定采样频率为50,则此寄存器目标值的计算方法为:SMPLRTDIV=1000/50-1

MPU6050寄存器介绍

Config Register

Type: ReadWrite

image.png

用于设定外部帧同步引脚的采样频率及数字低通滤波器(DigitalL ow Pass Filter)的设定值,设定对加速度及陀螺仪传感器同时生效

image.png

对比上图对应频率

3.软件介绍

本实验的应用代码入口主要是通过 HaaSstudio

https://g.alicdn.com/HaaSAl/PythonDoc/quickstart/quickstart ide haasstudio.html#quickref-python-ide-haasstudio

选取的 demo 为 python_gpio

与之对应的驱动代码为:

/data/lib/micropython/mpu6050.py

注意:固件烧录为 python 轻应用之后,驱动文件会默认被打包进去,如果路径冲突可以选择新的路径

image.png

Python 轻应用开发工具 HaaS-Studio

注意:如果开发者已经安装了 alios-studio 插件,使用 HaaS-Studio 之前需要先卸载 alios-studio.

前言

HaaSStudio 集 C/JS/Pvthon 三种语言开发干一体,实现了一个插件完成三种应用开发的功能。这里我们重点介绍一下Python 轻应用操作。

下面详细介绍一下插件的原理,操作方式及新增特色功能。

image.png

1 操作介绍

1.1安装 VS Code

开发者首先需要到微软的官方网站上下载 VSCode 安装包并进行安装,VSCode 安装包要求不低于版本1.57

VSCode 安装包下载网站为:https://code.visualstudio.com/

系统推荐

推荐 Windows 系统版本为 win10,MacOS 版本不低于10.15

1.2安装插件

安装完VSCode之后,开发者按照下图的指示完成 haas-studio 插件的安装。

image.png

1.3按钮介绍

插件安装完成后,如果你当前的 VSCode 未打开任何工作台,则 VSCode 左下角的状态栏只会显示新建工程的图标:

最后如下图所示:

image.png

1 #-*- coding:UTF-8 -*-

2 import utime

3 from mpu6050 import MPU6050

4

5 mpu6050Dev=MPU6050()

6 mpu6050Dev.open("mpu6050")

7 mpu6050Dev.init()

8 print("mpu6050 init finished")

9

0 ac = [ ]

1 gy = [ ]

12 while(True):

13 gy=mpu6050Dev.get_Gyroscope()

14print("mpu6050 gyro is:",gy[0],gy[1],gy[2])

15 ac=mpu6050Dev.get_Accelerometer()

16 print("mpu6050 acc is: f ,ac[0],ac[1],ac[2])

17 utime.sleep(1)

18 mpu6050Dev.close()

19 print("test mpu6050 success!")

Python 轻应用 mpu6050模块

注:Python 不需要编流程,只需审查代码

image.png

i2c.py 模块

defopen(type):

打开并根据 board.ison 配置实例

def write(dataBuffer):

发送数据,该函数为阻塞函数(发送单组数据),I2C 发送完成后才会返

def read(dataBuffer):

主动读取指定 bytes 的I2C 数据。该函数为阻塞函数,会一直等待读取指定 bytes 的数据(将读写同时完成,可以更快的读取数据)

i2c.py defwriteRea(addrdataBuffer):

向寄存器地址 memaddr 发送数据,该函数为阻塞函数,I2C 发送完成后才会返回

defreadReg(addrdataBuffer):

主动向寄存器地址 memaddr 读取指定 bytes 的I2C 数据。该函数为阻塞函数会一直等待读取指定 bytes 的数据

def close():

关闭实例

MPU6065 python 驱动介绍

image.png

MPU6050测试代码介绍

MicroPython-board.json

首先确认 board.json 是否存在

然后确认里面是否存在 mpu6050的元素

image.png

image.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
存储 芯片
SGM58031与单片机驱动实现
SGM58031与单片机驱动实现
420 0
|
7月前
|
存储 数据挖掘 数据处理
嵌入式中逻辑分析仪的基本使用方法
嵌入式中逻辑分析仪的基本使用方法
109 0
|
7月前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
62 0
|
存储 机器人 芯片
嵌入式 STM32 步进电机驱动,干货满满,建议收藏
嵌入式 STM32 步进电机驱动,干货满满,建议收藏
嵌入式 STM32 步进电机驱动,干货满满,建议收藏
|
C# Android开发 C++
c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
229 0
c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
|
传感器 前端开发 安全
(5)传感器驱动程序
(5)传感器驱动程序
173 0
|
传感器 Linux
linux驱动——dht11温湿度传感器驱动(5.4版本内核)
linux驱动——dht11温湿度传感器驱动(5.4版本内核)
778 0
CMOS摄像头驱动分析-i2c驱动
CMOS摄像头驱动分析-i2c驱动
195 0
LabVIEW控制Arduino驱动1602液晶显示屏(基础篇—10)
本篇博文将利用LIAT中的LCD显示函数库,驱动1602液晶显示屏。
|
传感器 存储 算法
嵌入式单片机智能手表实验之优秀
嵌入式单片机智能手表实验之优秀
204 0
嵌入式单片机智能手表实验之优秀