提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
最近在做一个项目,需要用到超声波传感器HC-SR04,经过一些摸索终于在OrangePi上成功用起来了。
一、关于HC-SR04
这款超声波传感器可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到的非接触式距离感测功能,模块包括超声波发射器、接收器与控制电路。
HC-SR04共有4个针脚分别是VCC(接5V/3.3V),GND(接地),Trig(输出/SCL/TX),Echo(输入/SDA/RX);需要注意的是最好把机器断电再接线,然后多检查几次防止接错短路烧毁设备。
这里我接的是5V,GND,SDA,SCL分别对应OrangePi的2,6,3,5,共4个GPIO插针。
二、使用步骤
不同的设备,像树莓派和OrangePi可能有着不同的GPIO排列,这篇文章是适用于OrangePi的,也是适用于树莓派和其它拥有GPIO接口的设备。代码采用Python3编写,通俗易懂,如果用在单片机上可能要使用C语言编写。
1.确保驱动已经安装
这篇文章不过多地描述驱动,如果驱动没有安装请按照官方提供的方法安装下驱动,如果已经安装请忽略。
2.安装GPIO工具
打开一个shell输入以下命令,如果正常显式,就说明工具已经安装。
#读取所有gpio插口状态
gpio readall
+------+-----+----------+------+---+OrangePi 4+---+---+--+----------+-----+------+
| GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |
+------+-----+----------+------+---+----++----+---+------+----------+-----+------+
| | | 3.3V | | | 1 || 2 | | | 5V | | |
| 64 | 0 | I2C2_SDA | IN | 0 | 3 || 4 | | | 5V | | |
| 65 | 1 | I2C2_SCL | IN | 0 | 5 || 6 | | | GND | | |
| 150 | 2 | PWM1 | IN | 0 | 7 || 8 | 1 | IN | I2C3_SCL | 3 | 145 |
| | | GND | | | 9 || 10 | 1 | ALT2 | I2C3_SDA | 4 | 144 |
| 33 | 5 | GPIO1_A1 | IN | 0 | 11 || 12 | 1 | IN | GPIO1_C2 | 6 | 50 |
| 35 | 7 | GPIO1_A3 | IN | 0 | 13 || 14 | | | GND | | |
| 92 | 8 | GPIO2_D4 | IN | 0 | 15 || 16 | 0 | IN | GPIO1_C6 | 9 | 54 |
| | | 3.3V | | | 17 || 18 | 0 | IN | GPIO1_C7 | 10 | 55 |
| 40 | 11 | SPI1_TXD | ALT2 | 1 | 19 || 20 | | | GND | | |
| 39 | 12 | SPI1_RXD | ALT2 | 1 | 21 || 22 | 0 | IN | GPIO1_D0 | 13 | 56 |
| 41 | 14 | SPI1_CLK | ALT3 | 1 | 23 || 24 | 1 | ALT3 | SPI1_CS | 15 | 42 |
| | | GND | | | 25 || 26 | 0 | IN | GPIO4_C5 | 16 | 149 |
| 64 | 17 | I2C2_SDA | IN | 0 | 27 || 28 | 0 | IN | I2C2_SCL | 18 | 65 |
| | | I2S0_RX | | | 29 || 30 | | | GND | | |
| | | I2S0_TX | | | 31 || 32 | | | I2S_CLK | | |
| | | I2S0_SCK | | | 33 || 34 | | | GND | | |
| | | I2S0_SI0 | | | 35 || 36 | | | I2S0_SO0 | | |
| | | I2S0_SI1 | | | 37 || 38 | | | I2S0_SI2 | | |
| | | GND | | | 39 || 40 | | | I2S0_SI3 | | |
+------+-----+----------+------+---+----++----+---+------+----------+-----+------+
| GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |
+------+-----+----------+------+---+OrangePi 4+---+---+--+----------+-----+------+
如果命令正常出结果说明GPIO工具已经安装,可以进行下一步了,如果没有需要先安装GPIO工具。
sudo apt update
sudo apt install git
git clone https://github.com/orangepi-xunlong/wiringOP
cd wiringOP
./build clean
./build
编译完成输入gpio readall来测试下是否成功了,如果成功了就进入下一步,没有成功就检查错误原因。
3.安装GPIO的Python支持
这篇文章演示代码是在Python3上实现的,所以需要GPIO的Python支持。执行以下命令就可以在OrangePi设备上安装GPIO包了
sudo pip3 install --upgrade OPi.GPIO
安装完成后就可以编写Python代码测试了。
4.Python3代码
import time
import OPi.GPIO as GPIO
import orangepi.pi4
BOARD = orangepi.pi4.BOARD
GPIO.setmode(BOARD)
# 需要操作的针脚
trig = 5 # out 对应针脚5 SCL
echo = 3 # in 对应针脚3 SDA
# 设置输入输出PIN,trig输出,echo输入
GPIO.setup(trig, GPIO.OUT)
GPIO.setup(echo, GPIO.IN)
def start_test():
# 发送trig信号,持续20us的方波脉冲,说明书说至少10us的脉冲时间,实际上机测试会出bug,改为20us就ok
GPIO.output(trig, True)
time.sleep(0.00002)
GPIO.output(trig, False)
# 等待低电平结束,然后记录时间
while GPIO.input(echo) == 0:
pass
start_stamp = time.time()
# 等待高电平结束,然后记录时间
while GPIO.input(echo) == 1:
pass
end_stamp = time.time()
pulse_duration = end_stamp - start_stamp
# V=331+0.607T T是一个标准大气压下温度(这里采用室温25℃,其它温度有一定差别,可根据实际需求定制)
#实际上音速的计算远比上面的方法复杂,特别是温度和大气压都是不小的影响因素,这里我们不需要那么高精度
#在一个标准大气压下,25℃室温足够了,也可以依据自身所处环境量身定制。
distance = pulse_duration * 346.175 * 100 / 2
distance = round(distance, 2)
# print("Distance:{}cm".format(distance))
return distance
try:
while True:
distance = start_test()
print("Distance:{}cm".format(distance))
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()
测试结果打印:
Distance:268.95cm
Distance:268.94cm
Distance:265.98cm
Distance:270.97cm
Distance:271.63cm
Distance:268.18cm
Distance:272.24cm
Distance:268.65cm
Distance:273.08cm
Distance:266.97cm
Distance:266.9cm
以上是对着天花板的时候测出的实际距离。我用手遮挡的话结果如下:
Distance:16.63cm
Distance:11.34cm
Distance:11.2cm
Distance:5.15cm
Distance:11.46cm
Distance:6.37cm
Distance:5.03cm
Distance:6.3cm
Distance:10.78cm
Distance:5.41cm
Distance:6.17cm
Distance:5.45cm
Distance:5.74cm
Distance:10.87cm
Distance:10.78cm
Distance:11.69cm
Distance:6.13cm
Distance:5.95cm
Distance:6.13cm
Distance:6.07cm
Distance:6.26cm
Distance:5.67cm
Distance:5.08cm
Distance:10.9cm
Distance:11.37cm
Distance:6.3cm
Distance:5.03cm
Distance:10.83cm
Distance:37.39cm
整体还是蛮准的,至少用在扫地机器人上足够了。
总结
1、这里树莓派的GPIO插针和OrangePi的GPIO插针排列差不多,他俩的配置是差不多的。
2、理论上不一定非得SDA和SCL,只要支持GPIO输入输出的插针都可以。