树莓派版本:raspberry pi zero W
超声波模块:KS102
接口:如下图红色方框位置
实验步骤:
1、wiringPi的安装可以参考此处。
2、安装wiringPi库之后,我们要使用其IIC接口。需要查看API方法的说明
3、查看传感器的技术文档,购买了该传感器的童鞋可以找老板要,我在这里就不发了。购买链接
最终的测试代码:
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define SlaveAddress 0x74
#define Address 0xe8
#define Reg 0x02
#define Command 0xB0
#define Read_high 0x02
#define Read_low 0x03
int csb_fd;
//初始化超声波
void init_csb(){
wiringPiSetup();
csb_fd = wiringPiI2CSetup(SlaveAddress);
if(csb_fd > 0){
printf("fd = %d\n", csb_fd);
}
else{
printf("IIC初始化失败");
}
}
//获得数据
int getData(){
int range;
wiringPiI2CWrite(csb_fd, Address);
wiringPiI2CWriteReg8(csb_fd, Reg, Command);
delay(100);
range = (wiringPiI2CReadReg8(csb_fd, Read_high) << 8) + wiringPiI2CReadReg8(csb_fd, Read_low);
return range;
}
int main(){
init_csb();
for(;;){
printf("distance : %d\n", getData());
delay(2000);
}
return 0 ;
}
注意事项:
1、编译时一定要链接wiringPi库,不然会出现找不到库函数方法的错误,如下:
undefined reference to `gertboardSPISetup'
解决方法:编译时加上-lwiringPi。
gcc csb.c -o csb -lwiringPi
2、使用printf需要等很久才打印出来,那是因为:printf函数是行缓冲式的输出,当printf遇到\n时,或者缓冲区满时,才会将缓冲区里的内容刷新到标准输出(stdout)。详情参考此处
解决方法:打印每一句话时后面加上\n,如:
printf("distance : %d\n", getData());