一、项目介绍
手上有一个超迷你的超声波测距的探头,一直想把它驱动起来。于是就动手制作了一个超小巧的超声波测距仪。可以满足对犄角旮旯空间的距离测量的需求。
二、硬件介绍
主控:AtomS3。AtomS3 是一款基于 ESP32-S3 主控的高集成度可编程控制器,内部集成了 ESP32-S3 主控,集成 Wi-Fi 功能、8 MB 片上 Flash、0.85 寸 IPS 屏幕。屏幕下方具有可编程按键功能,内置 5V 转 3.3V 电路、6 轴陀螺仪传感器 MPU6886 。板载 USB Type-C 接口,用于供电及固件下载,还有一个 HY2.0-4P 扩展端口 。底部预留 6 个 GPIO 以及电源引脚,方便扩展应用。产品大小为 24.0 x 24.0 x 13.0mm。
传感器:ICU-10201 超声波飞行时间传感器。这是一个非常小巧的超声波传感器,它非常适合测量 10 厘米至 1.2 米之间的物体范围,并提供高达 180° 的可定制视野 (FoV)。它采用 3.5 mm × 3.5 mm × 1.26 mm LGA 封装,并包含用于信号处理的集成 DSP。ICU-10201 通过其超低功耗(17 µA 至 320 µA)延长电池寿命。由于具有大量嵌入式程序和数据内存,因此它具有高度的灵活性。
这款超声波传感器使用电压为1.8V,而主控AtomS3 只提供了5V、3.3V两种电压的输出,所以这里使用ADI出品的一颗ADPL40502AUJZ-1 .8-R7电源LDO芯片,来将3.3V调整为1.8V,给超声波传感器供电。

参考着网上寻来的资料绘制好转接电路图。ICU-10201 超声波飞行时间传感器与主机通讯使用SPI总线。使用fpc座做接口,12P的,其中3、4管脚可以用来接一个外部晶振,但是还没看太明白是做什么用的。电路图设计上,先预留了这部分元器件,但是没有焊接,先留空。AtomS3开发板背面有6个GPIO输出,通过排针与转接板连接。






三、系统实现
AtomS3使用背面外接的5个GPIO管脚与转接板连接,通过SPI管脚映射,通过SPI总线与ICU-10201模块通讯,将获取到的超声波测距信号通过屏幕进行展示。使用Arduino进行开发,开发工具为Vscode+platformIO。

ICU-10201在arduino下有开源的库,可以直接使用。AtomS3不知为什么,使用最新的espressif32编译会报错,所以使用了旧版“espressif32@5.3.0”
[env]
; platform = espressif32
platform = espressif32@5.3.0
board = esp32-s3-devkitc-1
framework = arduino
; change microcontroller
board_build.mcu = esp32s3
board_build.f_cpu = 240000000L
board_build.f_flash = 80000000L
board_build.flash_mode = dio
monitor_speed=115200
build_flags =
-DCORE_DEBUG_LEVEL=3
-Iinclude
-DARDUINO_USB_CDC_ON_BOOT=1 ; Serial Monitor on Serial0 串口可 用Serial正常输出到USB口
; -DARDUINO_USB_MODE=0 ; Serial on USBCDC
; -DLEGACY_RMT_DRIVER=1
; -DCONFIG_RMT_ENABLE_LEGACY_DRIVER=y
; -DCONFIG_ARDUINO_HAL_I2C_ENABLE_LEGACY=y
lib_deps =
m5stack/M5Unified @ ^0.2.13
fastled/FastLED @ ^3.10.3
tdk-invn-oss/ICUX0201 @ ^1.0.6
[platformio]
default_envs=04_icu10201_dist
src_dir = src/${platformio.default_envs}
[env:04_icu10201_dist]

超喜欢ESP32系列的管脚重映射功能。这里将SPI总线映射到AtomS3背面引出的GPIO口上,即可实现SPI驱动。
#define ICU_SCK 5
#define ICU_MOSI 6
#define ICU_MIS0 7
#define ICU_CS 8
#define ICU_INT1 39
// #define ICU_INT2 38
……
SPI.begin(ICU_SCK, ICU_MIS0, ICU_MOSI, ICU_CS);
ICU-10201 超声波传感器探测距离并不算远,按官方说明是在120cm内(实际测试能够超出这个范围),当距离过大,无法探测时,就在屏幕上显示“---”。当正常探测到距离信息,就在屏幕上显示距离,单位为毫米。
void loop()
{
int dist;
if (ICU.data_ready())
{
/* Get range to target computed by sensor */
dist = int(ICU.get_range());
Serial.print(" D=");
Serial.print(dist);
Serial.println("mm");
M5.Display.clear();
M5.Display.setTextSize(4);
M5.Display.setCursor(10, 40);
M5.Display.print(int(dist));
M5.Display.setTextSize(2);
M5.Display.print(" mm");
}else{
M5.Display.clear();
M5.Display.setTextSize(4);
M5.Display.setCursor(10, 40);
M5.Display.print("---");
}
}
四、效果展示
传感器贴在AtomS3的侧面,测量距离墙体的距离。


距离过远,探测失败,显示---

五、心得体会:
学习单片机,常见到的电源电压5V、3.3V。这次遇到这个超声波传感器是1.8V,查看资料应该是为了低功耗而设计的。通过本项目,学习了电源电路中的LDO芯片的使用。感谢得捷和硬禾科技共同举办的FastBond活动,能够成功地将这些模块驱动起来,成就感满满!