很开心参加“Let's design 第三期”活动,这次活动我选择的板子是:TDK EV_ICU-30201-00。TDK InvenSense EV_ICU-30201-00 是一款用于 ICU-30201 超声波 3D 飞行时间 (ToF) 传感器的评估板,支持 SPI 接口,工作电压为 1.71V 至 1.89V。


拿到板子,板子非常的小巧。这边板子只是将ICU-30201转接为FPC(12P)座。查看官方资料,这个芯片使用SPI方式通讯,但是驱动电压是1.8V。无法直接接单片机的3.3v电压。
制作PCB转接板
官方提供的资料里没有给出这个板子的电路图。ICU-30201又是个qnf封装的芯片,所以一直没搞清楚管脚的映射关系。最后在群里老师的指导下,找到一份资料。

找一颗LDO芯片,提供1.8V电压。参考着厂家另外一款芯片ICU-10201,网上的资料,绘制了一个转接板的电路图。本想着备一个晶振,以后方便扩展,但是最后晶振的引脚忘记连接了,所以晶振没有用上。开发板我使用AtomS3。AtomS3开发板背面有6个GPIO输出,通过排针与转接板连接。所有的FPC座都是下接。





系统实现
编程使用arduino,编程工具使用Vscode+platformIO。在Arduino的库中,找到ICUX0201库。使用这个库来驱动这个模块。

参考着例程,除了SPI需要使用的4线外,还需要使用一个中断引脚。这里将引脚预先定义好
#define ICU_SCK 5 #define ICU_MOSI 6 #define ICU_MIS0 7 #define ICU_CS 8 #define ICU_INT1 39 // #define ICU_INT2 38 ICUX0201_GeneralPurpose ICU(SPI, ICU_CS, ICU_INT1);
ICU-30201测距是通过芯片产生53K的超声波,发射出去,超声波遇到障碍物反弹回来,芯片接收到反弹回来的声波,通过实践计算声音在空气中传播的距离。

系统首先对ICU30201进行初始化
SPI.begin(ICU_SCK, ICU_MIS0, ICU_MOSI, -1);
ret = ICU.begin();
if (ret != 0)
{
Serial.print("ICUx0201 initialization failed: ");
Serial.println(ret);
while (1)
;
}
else
{
ICU.print_informations();
}
// Start ICU in free run mode
ret = ICU.free_run();
if (ret != 0)
{
Serial.print("ICUx0201 free run failed: ");
Serial.println(ret);
while (1)
;
}
else
{
ICU.print_configuration();
}ICUX0201库中已经帮忙集成了测距的方法,只需要调用即可,获得的结果单位为毫米,取整后直接显示在屏幕上。
void loop()
{
float range;
M5.Display.clear();
if (ICU.data_ready())
{
/* Get range to target computed by sensor */
range = ICU.get_range();
Serial.print("Range(mm):");
Serial.println(range);
M5.Display.clear();
M5.Display.setCursor(10, 30);
M5.Display.println(int(range));
}
delay(1000);
}效果展示
将模块用胶条粘在PCB板子上,然后插入ATOMS3上。

靠近墙壁的测量。

测量玻璃,无视透明物体。



测量功能正常。但是也发现个问题:就是虽然超声波具有较强的指向性,但是还是会发散射出。在室内有时数据会剧烈波动,应该是室内的回波干扰导致的。后续将该模块移植到正在设计的小车上,用来感知周边环境。
源码
我要赚赏金
