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

树莓派3B点灯(1)-- 四种方法

先做个简单一丢丢的吧。。。正好最近工作也要用这个。这次直接给够四种方法,给好给满。分别是Python点,用户空间配置GPIO点,设备树配置内核Leds驱动点,自己写驱动点。

用的板子是树莓派3B,GPIO 26口,蓝光LED,串联了一个1000欧电阻限流。LED长脚是正极,电阻要串在正极上。

1 Python点

先用Python试了下,很简单就亮了。

代码如下:

import RPi.GPIO as GPIO
import time# 设置 GPIO 引脚编号模式 (BCM 模式)
GPIO.setmode(GPIO.BCM)# 设置 GPIO 26 为输出引脚
led_pin = 26
GPIO.setup(led_pin, GPIO.OUT)# LED 闪烁的循环
try:while True:GPIO.output(led_pin, GPIO.HIGH)  # 点亮 LEDtime.sleep(1)                    # 延迟 1 秒GPIO.output(led_pin, GPIO.LOW)   # 熄灭 LEDtime.sleep(1)                    # 延迟 1 秒
except KeyboardInterrupt:pass
finally:GPIO.cleanup()  # 清理 GPIO 状态

当然,今天的关键不是PY。而且内核。

==================================================

2 用命令点

换第二种方法,经常看别人驱动大神的方法。先看了GPT,给的答案如下:

# 导出GPIO26
echo 26 | sudo tee /sys/class/gpio/export# 设置为输出
echo out | sudo tee /sys/class/gpio/gpio26/direction# 打开LED
echo 1 | sudo tee /sys/class/gpio/gpio26/value# 关闭LED
echo 0 | sudo tee /sys/class/gpio/gpio26/value

但是实际上这样不行,一直报write error: Invalid argument,真的要郁闷了。后面到处找,才在一篇文章中找到答案。解决 sh:write error:Invalid argument_sh: write error: invalid argument-CSDN博客

说是GPIO号不匹配,在本机查了,如下:

pi@raspberrypi:/sys/class/gpio$ cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 512-565, parent: platform/3f200000.gpio, pinctrl-bcm2835:gpio-512 (ID_SDA              )gpio-513 (ID_SCL              )gpio-514 (GPIO2               )gpio-515 (GPIO3               )gpio-516 (GPIO4               )gpio-517 (GPIO5               )gpio-518 (GPIO6               )gpio-519 (GPIO7               |spi0 CS1            ) out hi ACTIVE LOWgpio-520 (GPIO8               |spi0 CS0            ) out hi ACTIVE LOWgpio-521 (GPIO9               )gpio-522 (GPIO10              )gpio-523 (GPIO11              )gpio-524 (GPIO12              )gpio-525 (GPIO13              )gpio-526 (GPIO14              )gpio-527 (GPIO15              )gpio-528 (GPIO16              )gpio-529 (GPIO17              )gpio-530 (GPIO18              )gpio-531 (GPIO19              )gpio-532 (GPIO20              )gpio-533 (GPIO21              )gpio-534 (GPIO22              )gpio-535 (GPIO23              )gpio-536 (GPIO24              )gpio-537 (GPIO25              )gpio-538 (GPIO26              )gpio-539 (GPIO27              )gpio-540 (NC                  )gpio-541 (LAN_RUN_BOOT        )gpio-542 (CTS0                )gpio-543 (RTS0                )gpio-544 (TXD0                )gpio-545 (RXD0                )gpio-546 (SD1_CLK             )gpio-547 (SD1_CMD             )gpio-548 (SD1_DATA0           )gpio-549 (SD1_DATA1           )gpio-550 (SD1_DATA2           )gpio-551 (SD1_DATA3           )gpio-552 (PWM0_OUT            )gpio-553 (PWM1_OUT            )gpio-554 (ETH_CLK             )gpio-555 (WIFI_CLK            )gpio-556 (SDA0                )gpio-557 (SCL0                )gpio-558 (SMPS_SCL            )gpio-559 (SMPS_SDA            )gpio-560 (SD_CLK_R            )gpio-561 (SD_CMD_R            )gpio-562 (SD_DATA0_R          )gpio-563 (SD_DATA1_R          )gpio-564 (SD_DATA2_R          )gpio-565 (SD_DATA3_R          )gpiochip1: GPIOs 566-567, parent: platform/soc:firmware:virtgpio, brcmvirt-gpio, can sleep:gpio-566 (                    |ACT                 ) out higpiochip2: GPIOs 568-575, parent: platform/soc:firmware:expgpio, raspberrypi-exp-gpio, can sleep:

原来GPIO26对应的是gpio-538,换成538之后,可以顺利通过命令行点灯了。

# 导出GPIO26
echo 538 | sudo tee /sys/class/gpio/export# 设置为输出
echo out | sudo tee /sys/class/gpio/gpio538/direction# 打开LED
echo 1 | sudo tee /sys/class/gpio/gpio538/value# 关闭LED
echo 0 | sudo tee /sys/class/gpio/gpio538/value

关于GPIO编号不同的问题,查了一下,在树莓派上,GPIO引脚通常有两种编号方式:物理引脚编号和BCM(Broadcom)引脚编号。一般来说高层次编程(如Python的RPi.GPIO库):通常使用BCM引脚编号或物理引脚编号。在这种情况下,你会使用26(BCM编号)或物理引脚编号。低层次编程(如直接操作设备树或内核配置):可能会使用内部编号(如538)。

=================================================

3 修改设备树点

最后还是打算用DTS来点,主要还是对环境不很熟悉,所以折腾了很久。最开始还是去看GPT。给的答案大体是对的,但是驱动死活加载不起来,也不知道怎么调试。

test_led.dts GPT版

/dts-v1/;
/plugin/;/ {compatible = "brcm,bcm2835";fragment@0 {target = <&gpio>;__overlay__ {led_gpio26 {compatible = "gpio-leds";gpios = <&gpio 26 0>; // GPIO26, active highdefault-state = "off";label = "my_led";};};};
};

回头看看这个设备树,有几个问题,1是设备,(TODO)

后面发现树莓派其实开发效率还是不错,因为设备树的编译工具可以直接在设备上装,这样就可以直接在设备上修改,不用来回拷贝。改完之后直接在板子上编译设备树,然后做成自启动。

sudo dtc -I dts test_led.dts -o test_led.dtbosudo cp test_led.dtbo /boot/overlays/
sudo nano /boot/firmware/config.txt
在后面增加
dtoverlay=test_led

这样其实也算略麻烦了,因为拷贝之后还要重启设备才能看到结果。更快速的是编译完直接用dtoverlay加载,就可以立马看到设备树是否能加载,开发效率直接拉满。但是这个时候就算加载成功,GPIO口还是没有输出。也就是说只能验证设备树的写法是不是对了,后面还是要自启动来验证。

sudo dtc -I dts test_led.dts -o test_led.dtbo
sudo dtoverlay test_led.dtbo
sudo dtoverlay -l
ls /proc/device-tree

弄清楚怎么把设备树搞上去之后,就到处找怎么配置设备树,翻了好久,没多少靠谱的。最后还是在树莓派官方论坛找到的:https://forums.raspberrypi.com/viewtopic.php?t=346863&hilit=led

 test_led.dts(可用版)

/dts-v1/;
/plugin/;/ {compatible = "brcm,bcm2837";fragment@0 {target = <&leds>;__overlay__ {my_led: myled {label = "pwrbtnled";gpios = <&gpio 26 0>;linux,default-trigger = "heartbeat";};};};
};

照着贴文上的设备树,用了这个确实就可以了(要在启动的时候加载,动态加载可以加载但是不生效)。

对于这部分实现的分析,可以参考这篇:树莓派3B点灯(2)-CSDN博客

4 自建驱动点

TODO

最后,致敬一下伟大的蓝光LED。

蓝色发光二极管,即蓝光LED,是能发出蓝光的发光二极管,其发明获誉为“爱迪生之后的第二次照明革命”。蓝光LED的发明,使得人类凑齐能发出三原色光的LED,得以用LED凑出足够亮的白光。白光LED灯的发明,大幅提高了人类的照明效率。

2014年,日本名古屋大学和名城大学教授赤崎勇、名古屋大学教授天野浩和美国加利福尼亚大学教授中村修二因“发明高亮度蓝色发光二极管,带来了节能明亮的白色光源”共同获得当年的诺贝尔物理学奖。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 利士策分享时间管理:驾驭生活的艺术
  • 【Redis】主从复制 - 源码
  • 构建安全畅通的道路网络:EasyCVR视频汇聚平台在道路监控中的创新应用
  • Spark 集群进行 ETL 的架构介绍
  • appium历史版本地址链接
  • k8s集群部署:建立第一个微服务-注册中心Eureka
  • udp网络通信 socket
  • 简单说说关于shell中zsh和bash的选择
  • Linux之ansible的playbook剧本(yaml文件)
  • VMwareWorkstation安装UOS系统(1070版本)教程
  • 如何识别和防范跨站请求伪造(CSRF)?
  • YOLO改进模块后不出现Glops参数问题
  • 【408 数据结构】第2章 线性表
  • PHP-SER-libs靶场通关(1-9)
  • 数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储
  • Google 是如何开发 Web 框架的
  • CentOS 7 防火墙操作
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Django 博客开发教程 16 - 统计文章阅读量
  • Docker下部署自己的LNMP工作环境
  • k个最大的数及变种小结
  • MYSQL 的 IF 函数
  • 分布式熔断降级平台aegis
  • 关于springcloud Gateway中的限流
  • 前端性能优化--懒加载和预加载
  • 设计模式 开闭原则
  • 探索 JS 中的模块化
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 如何正确理解,内页权重高于首页?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ## 1.3.Git命令
  • ###STL(标准模板库)
  • (04)odoo视图操作
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)逆序输出字符串
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (回溯) LeetCode 77. 组合
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原)Matlab的svmtrain和svmclassify
  • (转) Face-Resources
  • (转)负载均衡,回话保持,cookie
  • (转载)从 Java 代码到 Java 堆
  • .gitignore文件使用
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET gRPC 和RESTful简单对比
  • .Net OpenCVSharp生成灰度图和二值图
  • .net wcf memory gates checking failed
  • .net 调用php,php 调用.net com组件 --
  • .NET 事件模型教程(二)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net6使用Sejil可视化日志
  • .NetCore项目nginx发布
  • .NET的数据绑定
  • .NET学习全景图