当前位置: 首页 > ops >正文

树莓派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()

视频效果

http://www.xdnf.cn/news/10362.html

相关文章:

  • IT技术文章汇总
  • 美业+智能体,解锁行业转化新密码(2/6)
  • 大白话 Seata 分布式事务浅析,详解TCC模式
  • 腾讯位置商业授权行政区划开发指南
  • Codeforces Round 1028 (Div. 2) B. Gellyfish and Baby‘s Breath
  • Nginx反向代理
  • NodeJS全栈开发面试题讲解——P12高性能场景题
  • Chorme如何对于youtube视频进行画中画背景播放?
  • 多模态AI的企业应用场景:视觉+语言模型的商业价值挖掘
  • 8天Python从入门到精通【itheima】-62~63
  • 结合源码分析Redis的内存回收和内存淘汰机制,LRU和LFU是如何进行计算的?
  • 深度学习|pytorch基本运算-乘除法和幂运算
  • 初识PS(Photoshop)
  • 【Oracle】安装单实例
  • 【Go】2、Go语言实战
  • python打卡day42@浙大疏锦行
  • 动态库导出符号与extern “C“
  • 2025年05月总结及随笔之家电询价及以旧换新
  • 剪枝中的 `break` 与 `return` 区别详解
  • APM32主控键盘全功能开发实战教程:软件部分
  • 【论文解读】Deformable DETR | Deformable Transformers for End-to-End Object Detection
  • 题单:最大公约数(辗转相除法)
  • 安全漏洞修复导致SpringBoot2.7与Springfox不兼容
  • 爬虫工具链的详细分类解析
  • 力扣刷题Day 66:分割回文串(131)
  • 【Redis】数据类型补充
  • t018-高校宣讲会管理系统 【含源码!】
  • 浅谈简历制作的四点注意事项
  • NLP学习路线图(十四):词袋模型(Bag of Words)
  • Go语言中的数据类型转换