我正在制造无线设备来测量基于HMC5983磁阻传感器和ESP8266(NodeMCU ESP-12e模块)的磁场。
传感器连接到I2C接口上的ESP8266。该 ESP8266轮询传感器并将其发送到数据收集器(Raspberry Pi)。
对我来说,在一秒钟内实现尽可能多的计算是非常重要的,因为后续处理所获得的数据的质量取决于它。
HMC5983支持标准,快速和高速模式下的I2C接口。但NodeMCU I2C模块仅支持i2c.SLOW速度。
常见的I²C总线速度为100 kbit / s标准模式, 10 kbit / s低速模式 https://en.wikipedia.org/wiki/I%C2%B2C
然后我通过I2C将HMC5983直接连接到Raspberry Pi。在单次测量模式下,我可以实现每秒约500次测量(通过监视DRDY中断引脚),在连续测量模式下可以实现每秒200次测量(数据输出速率为220 Hz - 可以)。 该程序是用Python编写的,这里是代码:
#!/usr/bin/python
import smbus #for i2c use
import time
import os
bus = smbus.SMBus(1) #use i2c port 1 on Rasspberry Pi
addr = 0x1e #address HMC5983 0x1E
bus.write_byte_data(addr,0x00,0b00011100) #Write to CRA Speed 220Hz
bus.write_byte_data(addr,0x01,0b00100000) #Write to CRB Gain 660 +-2.5Ga 1.52mG/Lsb
print "Start measuring.....
while True: #if we need infinity cycle
bus.write_byte_data(addr,0x02,0b00000001) #Write to Mode single-measurement mode
while bus.read_byte_data(addr,0x09) == 0b11: #Wait RDY in Status Register
()
#DATA READY
data = bus.read_i2c_block_data(addr,0x03,6)#Take data from data registers
#convert three 16-bit 2`s compliment hex value to dec values and assign x,y,z
x = data[0]*256+data[1]
if x > 32767 :
x -= 65536
y = data[2]*256+data[3]
if y > 32767 :
y -= 65536
z = data[4]*256+data[5]
if z > 32767 :
z -= 65536
print "X=",x, "\tY=",y, "\tZ=",z
当我将HMC5983连接到ESP8266时,我在单次计算模式下每秒只能实现约140次计算。
----------THIS IS FOR SINGLE-MEASUREMENT MODE-------------
--init i2c
function H_init(sda,scl)
i2c.setup(id, sda, scl, i2c.SLOW)
print("I2C started...")
end
-- reads 6byte from the sensor
function read_axis()
i2c.start(id)
i2c.address(id, dev_addr, i2c.RECEIVER)
data = i2c.read(id, 6)
i2c.stop(id)
return data
end
--set register
function set_reg(reg_addr,val)
i2c.start(id)
i2c.address(id, dev_addr, i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.write(id,val)
i2c.stop(id)
end
--------GPIO INITILIZATION-------
drdyn_pin=3
gpio.mode(drdyn_pin, gpio.INPUT)
-------I2C INITILIZATION-------
id = 0
i2c = i2c
local i=0
dev_addr = 0x1e
H_init(1,2)
set_reg(0x00,0x1c) --set speed 220Hz
set_reg(0x01,0x20) --set gain
print("Start measurement...")
while true do
set_reg(0x02,0x01) --single-measurement mode
while(gpio.read(drdyn_pin) == 1) do
end
data = read_axis()
tmr.wdclr()
end
之后,我将传感器配置为连续测量模式,并且每秒接收相同的200次测量。
NodeMCU中的I2C接口是否可以高速运行?有人可以告诉我如何加速传感器轮询吗?
答案 0 :(得分:1)
当然有可能,ESP8266比奔腾更快:-)只需几千甚至几十万次测量,对于如此巨大的处理能力来说真的会令人失望。在这里,您可以链接到汇编编写的ESP8266 I2C库,并使用Arduino工具链进行测试。这样,您可以以每秒 800000
消息的速率@ 80 MHz或每秒 100万消息@ 160 MHz进行通信。我相信这对你所描述的项目来说已经绰绰有余了,在80 kHz I2C速度下你可以每秒几万次测量 - 如果从设备可以处理这样的速度。
对于任何未来的疑问,如果ESP8266可以或不能完成某些事情,我会说this is more than enough to get a picture - 在这种情况下,我的意思是字面意思: - )