作者
颜哲锟
简介
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的内置芯片是否支持重置地址;如果不能重置,则上限要看芯片支持分配几个地址。
附上示意图