
1. 核桃派1B开发板与超声波测距初探第一次拿到核桃派1B开发板时我就被它小巧的尺寸和丰富的接口所吸引。这块基于全志H3处理器的开发板虽然只有信用卡大小却集成了WiFi、蓝牙、GPIO、USB等丰富接口特别适合物联网和嵌入式开发场景。而超声波测距作为最基础的传感器应用之一自然成为我上手测试的首选项目。HC-SR04超声波模块可以说是电子爱好者的老朋友了。这个单价不到10元的模块通过发射40kHz的超声波并接收回波能够实现2cm-400cm的非接触式距离测量。在智能小车避障、液位检测、停车辅助等场景中都有广泛应用。将它与核桃派1B结合既能验证开发板的基本GPIO功能又能构建一个完整的测距系统。2. 硬件连接与工作原理详解2.1 HC-SR04模块引脚定义这个四针模块的接线非常简单VCC5V电源输入核桃派的5V引脚Trig触发信号输入接GPIO输出Echo回波信号输出接GPIO输入GND地线特别注意虽然Echo脚输出的是5V电平但核桃派的GPIO只能耐受3.3V需要分压电路。最简单的方案是用两个电阻如1kΩ和2kΩ组成分压器将5V降到约3.3V。2.2 测距原理剖析超声波测距的核心是时间差测量主控通过Trig脚发送至少10μs的高脉冲模块自动发射8个40kHz超声波脉冲当接收到回波时Echo脚输出高电平主控测量高电平持续时间t单位μs距离 (t × 声速)/2 常温下声速约343m/s即每μs对应0.0343cm这个过程中有几个关键点需要注意测量间隔建议大于60ms避免上一次回波干扰温度会影响声速精确测量需加入温度补偿最小测量距离约2cm过近物体可能无法检测3. 核桃派1B开发环境配置3.1 系统准备核桃派1B支持多种操作系统我选择官方的Walnut Pi OS基于Debian。烧录镜像后首次启动需要sudo apt update sudo apt install -y python3-gpiozero如果使用C语言开发还需要安装wiringPi库git clone https://github.com/WalnutPi/wiringPi cd wiringPi ./build3.2 GPIO编号对照核桃派1B使用40针GPIO接口但引脚定义与树莓派不同。超声波模块建议使用这些GPIO物理引脚7GPIO4作为Trig物理引脚11GPIO17作为Echo可以通过命令查看引脚映射gpio readall4. Python实现超声波测距4.1 基础测距代码使用Python的RPi.GPIO库实现import RPi.GPIO as GPIO import time TRIG 4 ECHO 17 GPIO.setmode(GPIO.BCM) GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) def get_distance(): GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) while GPIO.input(ECHO) 0: pulse_start time.time() while GPIO.input(ECHO) 1: pulse_end time.time() pulse_duration pulse_end - pulse_start distance pulse_duration * 17150 # 34300/2 return round(distance, 2) try: while True: dist get_distance() print(fDistance: {dist} cm) time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup()4.2 代码优化技巧滤波处理连续采样5次取中值避免突变值def median_filter(readings): sorted_readings sorted(readings) return sorted_readings[len(readings)//2]温度补偿使用DS18B20温度传感器获取环境温度def get_speed_of_sound(temp): return 331.4 0.6 * temp异常处理添加超时机制防止死循环timeout time.time() 0.1 # 100ms超时 while GPIO.input(ECHO) 0 and time.time() timeout: pulse_start time.time()5. C语言高效实现对于需要更高性能的场景可以使用C语言版本#include wiringPi.h #include stdio.h #include sys/time.h #define TRIG 4 #define ECHO 17 long getDistance() { digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); while(digitalRead(ECHO) LOW); struct timeval start, end; gettimeofday(start, NULL); while(digitalRead(ECHO) HIGH); gettimeofday(end, NULL); long duration (end.tv_sec - start.tv_sec) * 1000000 (end.tv_usec - start.tv_usec); return duration * 0.0343 / 2; } int main() { wiringPiSetup(); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); while(1) { printf(Distance: %ld cm\n, getDistance()); delay(100); } return 0; }编译命令gcc -o ultrasonic ultrasonic.c -lwiringPi6. 实际应用与进阶玩法6.1 智能避障小车将超声波模块安装在舵机上实现180°扫描from gpiozero import AngularServo servo AngularServo(18, min_angle-90, max_angle90) def scan_area(): distances [] for angle in range(-90, 91, 10): servo.angle angle time.sleep(0.3) distances.append((angle, get_distance())) return distances6.2 结合MQTT实现远程监控使用paho-mqtt库将数据上传到服务器import paho.mqtt.client as mqtt client mqtt.Client() client.connect(broker.hivemq.com, 1883) while True: distance get_distance() client.publish(walnutpi/ultrasonic, f{distance}) time.sleep(1)6.3 可视化界面开发用PyQt5创建实时距离显示界面from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget app QApplication([]) window QWidget() layout QVBoxLayout() label QLabel(Distance: -- cm) def update_display(): label.setText(fDistance: {get_distance()} cm) QTimer.singleShot(100, update_display) layout.addWidget(label) window.setLayout(layout) window.show() update_display() app.exec_()7. 常见问题排查指南持续返回最大值检查Echo脚是否接触良好确认分压电路工作正常尝试降低Trig脉冲宽度至10-20μs测量值波动大添加硬件滤波在Echo脚对地加0.1μF电容软件端采用滑动平均滤波确保被测物体表面平整绒布等吸音材料会影响测量GPIO操作报错检查用户是否在gpio组groups $USER临时解决方案sudo chmod 666 /dev/gpiomem永久解决方案将用户加入gpio组测量距离受限检查电源电压是否稳定建议5V 1A以上避免强光直射模块接收器高温环境下需增加温度补偿经过一周的实测核桃派1B驱动HC-SR04的稳定测量频率可达20Hz完全满足大多数应用场景。一个有趣的发现是当测量角度超过15°时回波信号会明显减弱。因此在实际安装时建议尽量保持模块与被测表面平行。