树莓派3B小练习
PWM驱动LED灯
3B引脚图
PWM通道 GPIO号 物理引脚 复用功能
PWM0 GPIO12 32 Alt Fun 0
PWM1 GPIO13 33 Alt Fun 0
PWM0 GPIO18 12 Alt Fun 5
PWM1 GPIO19 35 Alt Fun 5
第一步
启用pwm(默认情况下未启用)
简而言之,你无法通过Linux内核API获取到PWM资源,因为在树莓派官方的设备树配置(/boot/config.txt)里并没有通知内核要启用pwm。因此第一步自然是让内核支持pwm驱动,使用如下命令:
vim打开/boot/config.txt在最后一行加入: dtoverlay=pwm保存退出,重启philon@rpi:~ $ sudo vim /boot/config.txt
philon@rpi:~ $ sudo reboot#重启之后,有两种方式确认pwm已启用
philon@rpi:~ $ lsmod | grep pwm
pwm_bcm2835 16384 1 # 方式1: 加载了官方pwm驱动philon@rpi:~ $ ls /sys/class/pwm/
pwmchip0 # 方式2: sysfs里可以看到pwmchip0目录
第二步
连接引脚
根据之前的硬件接线,LED与树莓派的PWM0通道相连,所以使能pwm0即可点亮led,大体步骤为:
请求pwm0资源
设置脉冲周期
设置占空比
打开pwm0
命令行控制pwm其实和gpio大同小异,都是通过sysfs这个虚拟文件系统完成的。
philon@rpi:~ $ cd /sys/class/pwm/pwmchip0/ # 进入pwm资源目录philon@rpi:~ $ echo 0 > export # 加载pwm0资源
philon@rpi:~ $ echo 10000000 > pwm0/period # 设置脉冲周期为10ms(100Hz)
philon@rpi:~ $ echo 8000000 > pwm0/duty_cycle # 设置占空比为8ms
philon@rpi:~ $ echo 1 > pwm0/enable # 开始输出#可以自行调整脉冲周期和占空比,得到不同的亮度如果玩够了,记得释放资源
philon@rpi:~ $ echo 0 > pwm0/enable # 关闭输出
philon@rpi:~ $ echo 0 > unexport # 卸载pwm0资源
经过上面这番犀利操作,只要你够虔诚,就会看见一束绿光闯入你的眼里,心里,脑海里。但是这时只是实现了固定占空比的PWM灯,灯的强弱不会改变
第三步
编写代买
import RPi.GPIO as GPIO
import time# 配置 GPIO 模式和引脚
PWM_PIN = 18 # 使用 BCM 编号的 GPIO 18(需与设备树配置一致)
FREQUENCY = 100 # PWM 频率 (Hz)# 初始化 GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)# 创建 PWM 实例并启动
pwm = GPIO.PWM(PWM_PIN, FREQUENCY)
pwm.start(0) # 初始占空比为 0%try:while True:# 亮度逐渐增加(0% -> 100%)for duty_cycle in range(0, 101, 5):pwm.ChangeDutyCycle(duty_cycle)time.sleep(0.05) # 间隔时间(可调整)# 亮度逐渐减少(100% -> 0%)for duty_cycle in range(100, -1, -5):pwm.ChangeDutyCycle(duty_cycle)time.sleep(0.05)except KeyboardInterrupt:# 捕获 Ctrl+C 中断,释放资源print("程序已终止")pwm.stop()GPIO.cleanup()
最后运行此代码,就能看见呼吸灯了
视频效果链接
HC-SR04 超声波传感器
接线方式
4 个引脚由 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)组成
Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行
Trig 引脚用来接收来自树莓派的控制信号。接任意 GPIO 口
Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口
注意:Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路
HC-SR04 的测距过程
树莓派向 Trig 脚发送一个持续 10us 的脉冲信号
HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波 (start sending ultrasoun),并把 Echo置为高电平。 然后准备接收返回的超声波
当 HC-SR04 接收到返回的超声波 (receive returned ultrasound) 时,把 Echo 置为低电平
从上述过程可以看出, Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔
#导入 GPIO库
import RPi.GPIO as GPIO
import time#设置 GPIO 模式为 BCM
GPIO.setmode(GPIO.BCM)#定义 GPIO 引脚
GPIO_TRIGGER = 23
GPIO_ECHO = 24#设置 GPIO 的工作方式 (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)def distance():# 发送高电平信号到 Trig 引脚GPIO.output(GPIO_TRIGGER, True)# 持续 10 us time.sleep(0.00001)GPIO.output(GPIO_TRIGGER, False)start_time = time.time()stop_time = time.time()# 记录发送超声波的时刻1while GPIO.input(GPIO_ECHO) == 0:start_time = time.time()# 记录接收到返回超声波的时刻2while GPIO.input(GPIO_ECHO) == 1:stop_time = time.time()# 计算超声波的往返时间 = 时刻2 - 时刻1time_elapsed = stop_time - start_time# 声波的速度为 343m/s, 转化为 34300cm/s。distance = (time_elapsed * 34300) / 2return distanceif __name__ == '__main__':try:while True:dist = distance()print("Measured Distance = {:.2f} cm".format(dist))time.sleep(1)# Reset by pressing CTRL + Cexcept KeyboardInterrupt:print("Measurement stopped by User")GPIO.cleanup()
视频效果