用TinyWireM替换Wire Library(使库ATtiny兼容)

时间:2017-01-27 00:02:34

标签: arduino sensor i2c attiny

[我在Arduino Stack Exchange上问了这个问题,我等了一会儿却没有回答,所以我想我会在这里问这个问题!]

我想将Pololu的vl53l0x Time of Flight distance传感器整合到我的项目中。他们通过I2C创建了一个library与vl53l0x接口,这在我的Uno上运行良好。唯一的问题是Wire.h不能在ATtiny85上运行。

TinyWireM是Wire的替代库,我认为它是兼容的。我的问题是:如何用TinyWireM替换Wire?是否像使用TinyWireM替换Wire的所有实例一样简单?还有什么我需要做的才能使库ATtiny85兼容吗?

我确实尝试将“Wire”重新定义为TinyWireM,如下所示:

#include "TinyWireM.h"
#define Wire   TinyWireM

所有内容编译并上传到我的ATtiny85就好了。但是,传感器似乎只能始终输出大约7600mm的值。

谢谢!

1 个答案:

答案 0 :(得分:1)

Wire Library不适用于ATTiny,因为它只有一个USI(通用串行接口),它与Arduino Uno中的硬件不同。 TinyWireM库显示与Uno上的Wire库几乎相同的行为,但不是移植到ATTiny的相同库。 我完全不明白,为什么要将TinyWireM库重命名为Wire。如果你只是想要说明一下,它真的是Wire库,这可能不是一个好的编码实践,因为这有点隐藏了你的代码中的事实,你不是使用Wire库,而是使用不同的库。如果您想创建可在Uno和ATTiny上重用的代码,那么我建议使用#define#ifdef#ifndef#endif指令的组合,因此,根据定义的标志,只编译相应的代码。据我所知,ArduinoIDE也使用这些来包含每个目标的正确头文件。如果您可以在头文件中找到相应的定义,则可以使用它。但是在文件开头使用您自己的定义会更容易。

作为提示:如果您曾尝试通过I2C与TinyWireM建立多主控通信(这对我来说非常适用),则必须在传输后释放总线,以便其他主设备可以使用它。我这样做是为了禁用USI硬件 USICR&= 0b11001111; pinMode(0,INPUT); pinMode(2,INPUT); 图书馆不会为你做这件事。(如果你不这样做,公共汽车将被占用,没有其他主人可以通信)要直接使用USICR注册,你还必须#include <USI_TWI_Master.h>