【问题标题】:NodeMCU ESP8266 I2C Module High-SpeedNodeMCU ESP8266 I2C 模块高速
【发布时间】:2016-12-11 17:11:13
【问题描述】:

我正在制作一个无线设备来测量基于 HMC5983 磁阻传感器和 ESP8266(NodeMCU ESP-12e 模块)的磁场。

传感器通过 I2C 接口连接到 ESP8266。这 ESP8266 轮询传感器并将其发送到数据收集器(Raspberry Pi)。

对我来说,在一秒钟内实现尽可能多的计算量是极其重要的,因为用于后续处理的所获得数据的质量取决于它。

HMC5983 在标准、快速和高速模式下支持 I2C 接口。但是NodeMCU I2C Module只支持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 接口是否可以高速运行?谁能告诉我如何尝试加速传感器轮询?

【问题讨论】:

  • 如果你知道NodeMCU只支持低速I2C,看来,errm,乐观,问NodeMCU是否支持高速I2c。你达到什么阅读率?
  • @barny 对不起,我可能没有正确表达。我的意思是 未来 是否可以使用 NodeMCU 的快速 i2c?或者现在可以吃一种我不知道的方法吗?我需要每秒至少 250 次测量,但越多越好。
  • 由于芯片规格说明连续模式下的“快速 220 Hz 最大输出速率”和单次读取模式下的 160 个读数/秒,我不确定您认为通过制作/尝试会实现什么比每秒更多的读取次数-您将受到芯片批次/命运/运气/温度/....的摆布。为了从NodeMCU中获得最大速度,我建议使用SPI(即硬件驱动)而不是而不是 I2C,它通常是软件 bit-banging 驱动的,可能是您看到的速度限制的原因。

标签: raspberry-pi i2c esp8266 nodemcu


【解决方案1】:

当然有可能,ESP8266 比 Pentium 快 :-) 对于如此强大的处理能力来说,每秒只有几千甚至几万次测量真的令人失望。在这里,您是 ESP8266 I2C 库的链接,该库以汇编语言编写并使用 Arduino 工具链进行测试。这样,您就可以以每秒 800000 条消息@80 MHz 或每秒一百万 条消息@160 MHz 的速率进行通信。我相信这对于您所描述的项目来说已经足够了,在 80 kHz I2C 速度下,您可以每秒进行几万次测量 - 如果从设备可以处理这样的速度。

如果将来怀疑 ESP8266 是否可以做某事,我会说 this is more than enough to get a picture - 在这种情况下,我的意思是字面意思 :-)

【讨论】:

  • 感谢您的回答!你说的是哪个模块? NodeMCU I2C Module?你能写出如何用普通模块构建 NodeMCU 固件,但用另一个高速替换 I2C 模块吗?
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2023-01-05
  • 2019-01-18
  • 2021-05-25
  • 2021-07-28
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多