您的位置:首页 > 产品设计 > UI/UE

GY-30数字光强传感器通过I²C接入Arduino

2016-06-17 16:39 295 查看

作者:颜哲锟

GY-30数字光强传感器通过I²C通信协议接入Arduino过程中的一些问题和解决方案

前言

刚拿到GY-30数字光强传感器的时候,真心感觉比原来的模拟输出的光强传感器要精确好几倍。

没被拆封的GY-30模块,排针是需要自己焊的。

注:I²C,这是正确的写法,但也有简写成IIC或I2C。

1.单个GY-30接入Arduino UNO

焊完用杜邦线和Arduino板子相连即可,淘宝商家提供的手册是基于UNO板的,GY-30的VCC接Arduino的5v,GND接GND,SDA接A4,SCL接A5,ADD是地址引脚,单个sensor工作时不用接。一个UNO板子和一个GY-30传感器连接起来很容易就调试成功了。

附上代码

附上代码

#include <Wire.h> //IIC库

#include <math.h>

int BH1750address = 0x23;//芯片地址为16位23

byte buff[2];

void setup()

{

Wire.begin();

Serial.begin(9600);

}

void loop()

{

int i;

uint16_t val=0;

BH1750_Init(BH1750address);

delay(1000);

if(2==BH1750_Read(BH1750address))

{

val=((buff[0]<<8)|buff[1])/1.2;

Serial.print(val,DEC);

Serial.println("[lx]");

}

delay(150);

}

int BH1750_Read(int address) //

{

int i=0;

Wire.beginTransmission(address);

Wire.requestFrom(address, 2);

while(Wire.available()) //

{

buff[i] = Wire.read();  // read one byte

i++;

}

Wire.endTransmission();

return i;

}

void BH1750_Init(int address)

{

Wire.beginTransmission(address);

Wire.write(0x10);//1lx reolution 120ms

Wire.endTransmission();

}


2.尝试让多个GY-30接入Arduino MEGA2560

我需要让4个GY-30同时接入,所以尝试更换成接口更多的MEGA2560,以实现将串口模拟成IIC接口并实现通信,但Arduino的串口监视器没有数据读出。

此坑略去几百字,附上总结:

我理解成“SDA接A4,SCL接A5”是通过Arduino的模拟口传输的,所以把UNO换成其他型号的板子也应该是A4和A5口,但MEGA2560的串口监视器上的光强数据不再读出,翻墙找到UNO和MEGA的电路图,秒懂错误原因。这I²C压根不是通过A4A5口的模拟输出口传输的,而是UNO的A4A5口还是有SDA和SCL功能。

附上翻墙拿到的2个电路图。





3.GY-30数字光强传感器的地址问题的解决方案以及在IIC协议下的总结发现

3.1GY-30的地址解决方案

解决了串口引脚接线问题,接下来需要解决一下基于Arduino利用IIC协议和GY-30通行时的地址问题。

我起先对IIC地址的理解是像IP地址那样可以自己设置,最后发现并不全对,这需要看芯片是否支持更改地址。

此坑略去几千字,附上总结:

对于这个GY-30数字光强传感器,内置BH1750FVI,sensor外接有5个引脚,GND ADD SDA SCL VCC。通过阅读芯片技术手册(英文版淘宝自取或中文版http://wenku.baidu.com/link?url=rXMAHAejMui15JWn20Rr8pR-came8Oo5WA3N5H29PGOLh_YL5a7_YUsKtuFk6dqHCpnxoMbfPNx52yJt8sOL2m6-FQyPYZsIjlQoQt_eMBe)遗憾地发现,这芯片只支持2个I²Cslave地址

,1011100是高电平地址为0x5c,0100011为低电平,地址是0x23。不用ADD引脚或者接GND时,芯片默认为低电平即0x23,当ADD接5V或者3.3V时,芯片为高电平即0x5c。

3.2 IIC协议下的地址解决方案

3.2.1

其实本来考虑的是想更改sensor的地址,然后让4个sensor同时连接在I²C总线上,但内置BH1750FVI只能实现2个地址,所以方案最终改成了用2个Arduino板子分别控制横向和纵向方向上的2个sensor。

在寻找更改芯片地址的技术资料和初始化命令的时候,找到过这种思路的先例,一般sensor的技术手册、数据手册会有详细的地址和引脚接线信息,这是一个普遍的寻址思路。

3.2.2

当然还有一种设置地址的方法。比如,BLinkM(有I²C功能的已装配完毕的彩色LED模块),它的地址是需要自己设置的,需要从http://code.google.com/p/blinkm-projects/下载BlinkMTester的测试程序。编译并上传BlinkMTester测试程序,将每个BlinkM模块逐一连接到Arduino,使用BlinkMTester测试程序的扫描命令S显示当前连接模块的地址,并使用A命令来给每个模块设置不同的地址。

3.3总结

I²C Bus 的通信协议对于多个不同传感器的接入有很大方便,能减少大量线路。

但对于接多个相同的传感器,问题变得复杂,上限数量需要看sensor的内置芯片是否支持重置地址;如果不能重置,则上限要看芯片支持分配几个地址。

附上示意图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息