开发者学堂课程【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 通信。
左侧图为六轴传感器 右侧图为 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
3.I2C 速度影响因素
跳片跳跃时间与电容大小有关
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 |
所有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 标志)
6.I2C 协议应答/非应答的标志
ACK:数据传输正常则接收方回复 ACK 给发送方
NACK 的几种情况:
(1)I2C 总线上没有挂载目标地址的从设备
(2)接收方正在进行其他实时操作,没有准备好和对方进行通信
(3)接收方接收到了未知数据
(4)数据传输过程中,接收方没办法再继续接收更多数据
在发生 NACK 后,主设备可以结束发送,也可以不结束发起重复开始(和开始信号一样)的标志
7.写操作详解
目的:主设备需要给从设备发送数据(进行写操作)
步骤:
a.主设备发送 START 信号和寻址数据(从设备地址和写标志);从设备应答(未处于 busy 状态)
b.主设备发送数据,从设备发送应答/非应答
c.主设备发送 STOP 信号
主设备发送2字节数据给从设备的传输过程描述:
8.读操作详解
目的:主设备需要从从设备接收数据(进行读操作)步骤:
(1)主设备发送 START 信号和寻址数据(从设备地址和读标志);从设备应答(当主设备发生 ACK 的指令,从设备也会发送 ACK,当主设备读完后则发送 stop 结束整个流程)
(2)从设备发送数据,主设备发送应答/非应答(当两个设备之间出现错误,主设备则会发出 NACK 的指令,从设备也不会继续运行,做出等待 stop 的动作)
(3)主设备发送 STOP 信号
主设备从从设备读取两个字节时候的传输过程描述:
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 模式
首先一个 start 的指令,后跟着7个字节地址,后为读操作的标志位,从设备在 ACK 后做一个数据回复
10bit 模式
因为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 的最大时钟频率将有可能制约其传输速率。
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 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。
数据交换
SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)"或者"接收者(Receiver)"。
在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于该设备有一个bit 大小的数据被交换了。一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master设备进行访问(Access)。
因此,在程序中一般都会在 SPI 传输完数据后,再读取 SPI 设备里的数据,即使这些数据在程序里是无用的,从而保证即使是无效的也能保证数据传输继续。
SPI 只有主模式和从模式之分
SPI 没有读和写的说法,因为实质上每次 SPI 是主从设备在交换数据,也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
工作机制
SSPBUF:泛指SPI设备里面的内部缓冲区,一般在物理上是以FIFO的形式,保存传输过程中的临时数据;
SSPSR:泛指 SPI 设备里面的移位奇存器,它的作用是根据设置好的数据位宽(bit-width)把数据移入或者移出 SSPBUF;可以做到高速传输,在同硬件中节省成本
Controller:泛指 SPI 设备里面的控制寄存器,可以通过配置它们来设置 SPI 总线的传输模式。
极性与相位
极性,会直接影响 SPI 总线空闲时的时钟信号是高电平还是低电平。
CPOL=1:表示空闲时是高电平;
相位,直接决定 SPI 总线从那个跳变沿开始采样数据。
CPOL=0:表示从第一个跳变沿(上升点)开始采样;
CPOL=0:表示空闲时是低电平。
CPHA=1:表示从第二个跳变沿开始采样。(由图可见跳变数据为1)
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 管脚(拉高),结束通信。
传输过程如下:
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则传输的为指令
16.SPI 与I2C 对比
SPI(存在四线) |
I2C |
全双工串行通信 |
半双工串行通信 |
高速数据传输速率,2/1时钟 |
最高1.3Mbps(100kbps—400kbps) |
简单的软件配置 |
|
极其灵活的数据传输,不限于8位,它可以是任意大小的字 |
严格的数据格式 (每次传输只为8个字节) |
非常简单的硬件结构,从站不需要唯一地从设备需要唯一的地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与 UART 不同)。不需要收发器(与 CAN 不同)。 |
从设备需要唯一的地址 |
没有硬件从机应答信号 |
有硬件从机应答信号 |
单主多从 |
多主多从 |
没有定义硬件级别的错误检査协议只能支持非常短的距离 |
|
更多的 IO 占用,4线或者更多 |
2线 |
17.HaaS Python 开发环境搭建
【参考链接】
快速搭建 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
/quickstart ide haasstudio.html#quickref-python-
ide-haasstudio
选取的 demo 为 python_gpio
与之对应的驱动代码为:
/data/lib/micropython/i2c.py
/data/lib/micropython/spi.py
注意:固件烧录为 python 轻应用之后,驱动文件会默认被打包,及时将烧录模式结束防止每次都重新下载
如上图所示创建
18.I2C 实验
温湿传感器 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
组成:湿度模块、温度模块、ADC(读取数值)、校转部分
测试寄存器介绍-user Register
验证读写功能
【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 实验-接口介绍
右侧图 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 总线技术
加速度计与陀螺仪传感器原理
实验技术点:
加速度传感器:通常由质量块、阻尼器、弹性元件、敏感元件和适调电路等部分组成。传感器在加速过程中,通过对质量块所受惯性力的测量,利用牛顿第二定律获得加速度值。根据传感器敏感元件的不同,常见的加速度传感器包括电容式、电感式、应变式、压阻式、压电式等。
陀螺仪传感器:一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。现代陀螺仪可以精确地确定定位物体的方位,它在现代航空,航海,航天和国防工业中广泛使用的一种惯性导航仪器。陀螺仪分为机械式的陀螺仪、光纤陀螺仪及环式激光陀螺仪等。
陀螺仪传感器:
陀螺仪由1850年法国物理学家莱昂·傅科在研究地球自传中获得灵感而发明出来的,类似把一个高速旋转的陀螺放到一个万向支架上,靠陀螺的方向来计算角速度,现在小巧的芯本片造型和机械陀螺仪相比起来差别就太大了。
以 HaaSEDUK1使用的 MPU-6050为例,它属于传感 MEMS 分支 传感 MEMS 技术是指用微电子微机械加工出
来的、用敏感元件如电容、压电、压阻、热电耦、谐振、隧道电流充等来感受转换电信号的器件和系统。
>MPU6050是一款经典的 MEMS 陀螺仪,即硅微机电陀螺仪>MEMS(Micro-Electro-MechanicalSystem)是指集机械结
构、微型传感器、微型执行器、信号处理和控制电路、通信接口电路及电源于一体的完整微型机电系统。
>绝大多数的 MEMS 陀螺仪依赖于相互正交的振动和转动引起的交变科里奥利力。
>在MPU-6050内部,存在一质量块,当器件上电后,会触发质量块以固定频率横向运动(横向震荡不会影响电容差值)。当器件遭受外力具备加速度时,就会触发质量块的纵向运动,从而改变四周梳齿之间的距离,改变输出的电容,再通过 ADC 将模拟信号转换为数字信号,输出给外部。
2.硬件介绍
a.原理图及外观
支持 INT 中断功能,当数据到来时可以在该引脚上触发中断
(MPU6050 INT-- HaaS1000 GPIO P41)
特别注意:
AD0引脚决定了器件地址的第0bit。当 AD0连接高电平,即
AD0=1,此时器件地址为0x69(采用了I2C 通信,可直接使用不用外扩)
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。
下图为芯片特性图
组成部分:最左侧为自检模块,通过 ADC 读取
d.MPU6050寄存器介绍
MPU6050芯片可配置选项很丰富,主要包括以下几类:
>配置寄存器(加速度、角速度、FIFO)
>12C 主从设备控制及状态寄存器(可支持读取和外扩第三方设备,作为 master 外接)
>中断控制及状态寄存器
>加速度、角速度及扩展传感器数据寄存器
>低功耗设定寄存器
Power Management 1
Type:Read/Write
DEVICE RESET:写入1,复位芯片
SLEEP:写入1,芯片进入低功耗模式(主控寄存器)
CYCLE:SLEEP 为0的时候,CYCLE 设置为1,设备进入周期性工作模式,可以通过对 PowerManagement2进行配置来控制器设定其工作周期
TEMP-DIS:写入1,关闭芯片的测温功能
CLKSEL:选择芯片工作使用的时钟源
Power Management 2
Type:Read/Write
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
XG ST:写入1,X 轴陀螺仪传感器进入自测模式
YG ST:写入1,Y 轴陀螺仪传感器进入自测模式
ZG ST:写入1,Z 轴陀螺仪传感器进入自测模式
FS SEL:设置陀螺仪传感器的满量程范围
Accelerometer Configuration
Type: Read/Write
XA ST:写入1,X 轴加速度传感器进入自测模式
YA_ST:写入1,Y 轴加速度传感器进入自测模式
ZA ST:写入1,Z 轴加速度传感器进入自测模式
AFS SEL:设置加速度传感器的满量程范围
Sample Rate Divider
Type:Read/Write
传感器寄存器、FIFO 输出及 DMP 采样都是基于此 SampleRate 设定
Sample Rate=Gyroscope Output Rate/(1+SMPLRT_DIM)
SMPLRT DIV:设置加速度采样频率
对于加速度传感器,输出频率固定是1k,如果想要设定采样频率为50,则此寄存器目标值的计算方法为:SMPLRTDIV=1000/50-1
MPU6050寄存器介绍
Config Register
Type: ReadWrite
用于设定外部帧同步引脚的采样频率及数字低通滤波器(DigitalL ow Pass Filter)的设定值,设定对加速度及陀螺仪传感器同时生效
对比上图对应频率
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 轻应用之后,驱动文件会默认被打包进去,如果路径冲突可以选择新的路径
Python 轻应用开发工具 HaaS-Studio
注意:如果开发者已经安装了 alios-studio 插件,使用 HaaS-Studio 之前需要先卸载 alios-studio.
前言
HaaSStudio 集 C/JS/Pvthon 三种语言开发干一体,实现了一个插件完成三种应用开发的功能。这里我们重点介绍一下Python 轻应用操作。
下面详细介绍一下插件的原理,操作方式及新增特色功能。
1 操作介绍
1.1安装 VS Code
开发者首先需要到微软的官方网站上下载 VSCode 安装包并进行安装,VSCode 安装包要求不低于版本1.57
VSCode 安装包下载网站为:https://code.visualstudio.com/
系统推荐
推荐 Windows 系统版本为 win10,MacOS 版本不低于10.15
1.2安装插件
安装完VSCode之后,开发者按照下图的指示完成 haas-studio 插件的安装。
1.3按钮介绍
插件安装完成后,如果你当前的 VSCode 未打开任何工作台,则 VSCode 左下角的状态栏只会显示新建工程的图标:
最后如下图所示:
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 不需要编流程,只需审查代码
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 驱动介绍
MPU6050测试代码介绍
MicroPython-board.json
首先确认 board.json 是否存在
然后确认里面是否存在 mpu6050的元素