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

news2024/11/14 16:11:43

先做个简单一丢丢的吧。。。正好最近工作也要用这个。这次直接给够四种方法,给好给满。分别是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)  # 点亮 LED
        time.sleep(1)                    # 延迟 1 秒
        GPIO.output(led_pin, GPIO.LOW)   # 熄灭 LED
        time.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 LOW
 gpio-520 (GPIO8               |spi0 CS0            ) out hi ACTIVE LOW
 gpio-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 hi

gpiochip2: 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 high
                default-state = "off";
                label = "my_led";
            };
        };
    };
};

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

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

sudo dtc -I dts test_led.dts -o test_led.dtbo

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境基础开发工具使用(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 Linux…

Java实现常见的工厂模式(包含在Springboot中实战开发)

Java实现工厂模式 文章目录 Java实现工厂模式1. 概念2. 工厂模式的三种实现方式2.1 简单工厂模式1.定义产品接口2. 实现具体产品类3. 实现简单工厂类4. 客户端代码5.运行结果 2.2 工厂方法模式1. 定义产品接口2. 实现具体产品类3. 创建工厂接口4. 实现具体工厂类5. 客户端代码6…

Django日志

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django 5框…

构建安全畅通的道路网络:EasyCVR视频汇聚平台在道路监控中的创新应用

随着城市化进程的加速和交通流量的不断增加&#xff0c;道路监控已成为确保交通安全、维护社会秩序的重要手段。道路上的监控摄像头多种多样&#xff0c;大致可以分为这几类&#xff1a;交通道路监控、治安监控、路口违章监控&#xff0c;以及车辆测速监控等。基于智慧交通的需…

YoloV8修改分类(Classify)的前处理(记录)

修改原因 yolo自带的分类前处理对于长方形的数据不够友好&#xff0c;存在特征丢失等问题修改后虽然解决了这个问题但是局部特征也会丢失因为会下采样程度多于自带的&#xff0c;总之具体哪种好不同数据应该表现不同我的数据中大量长宽比很大的数据所以尝试修改自带的前处理&a…

怎么做静态码一物一码?批量制作静态码的简单方法

静态二维码是日常很常见的一种二维码类型&#xff0c;一会用来展示文本或者链接跳转等用途使用&#xff0c;比如在很多的物品包装上&#xff0c;扫描二维码就可以查看物品对应的商品编码&#xff0c;就是静态二维码应用的一种。那么静态二维码批量生成的方法是什么样的呢&#…

干货 | Selenium+chrome自动批量下载地理空间数据云影像

1.背景介绍 1.1地理空间数据云 由中国科学院计算机网络信息中心科学数据中心成立的地理空间数据云平台是常见的下载空间数据的平台之一。其提供了较为完善的公开数据&#xff0c;如LANDSAT系列数据&#xff0c;MODIS的标准产品及其合成产品&#xff0c;DEM数据&#xff08;SR…

客户需求挖掘的三个步骤

本文将介绍客户需求挖掘的三个关键步骤&#xff0c;帮助企业更好地理解客户&#xff0c;并提供个性化的服务。通过分析客户需求&#xff0c;可以更好地满足客户期望&#xff0c;提升客户满意度和忠诚度。 前言 本文将介绍客户需求挖掘的三个关键步骤&#xff0c;帮助企业更好地…

ZooKeeper--分布式协调服务

文章目录 ZooKeeperzk的由来zk解决了什么问题 ZK工作原理ZK数据模型zk功能1.命名服务2.状态同步3.配置中心4.集群管理 zk部署单机启动zk验证zk zk集群集群角色选举过程1.节点角色状态2.选举ID3.具体过程4.心跳机制5.ZAB协议 ZooKeeper 选举示例1.第一轮投票&#xff1a;2.节点收…

Flutter学习之一搭建开发环境

Flutter学习之一:搭建ununtu系统开发环境 一.背景 随着企业发展跟环境的变化&#xff0c;目前大前端开发越来越火&#xff0c;在国内应该是一个趋势&#xff1b;个人的技术栈主要还是在原生安卓开发上&#xff1b;长江后浪推前浪&#xff0c;如果不及时学习新知识&#xff0c…

中文文本分类详解及与机器学习算法对比

一.文本分类 文本分类旨在对文本集按照一定的分类体系或标准进行自动分类标记&#xff0c;属于一种基于分类体系的自动分类。文本分类最早可以追溯到上世纪50年代&#xff0c;那时主要通过专家定义规则来进行文本分类&#xff1b;80年代出现了利用知识工程建立的专家系统&…

首届云原生编程挑战赛总决赛冠军比赛攻略_greydog.队

关联比赛: 首届云原生编程挑战赛【复赛】实现一个 Serverless 计算服务调度系统 一、初赛赛道一&#xff08;实现一个分布式统计和过滤的链路追踪&#xff09; 赛题分析 1、数据来源 采集自分布式系统中的多个节点上的调用链数据&#xff0c;每个节点一份数据文件。数据格式…

系统架构师考试学习笔记第四篇——架构设计实践知识(21)安全架构设计理论与实践

本章考点&#xff1a; 第21课时主要学习信息系统中安全架构设计的理论和工作中的实践。根据考试大纲,本课时知识点会涉及案例分析题和论文题(各占25分),而在历年考试中,综合知识选择题目中也有过诸多考查。本课时内容侧重于知识点记忆;,按照以往的出题规律,安全架构设计基础知识…

工具知识 | Linux常用命令

参考 linw7的github《鸟哥的Linux私房菜》 一.文件管理 1.文件查找&#xff1a;find2.文件拷贝&#xff1a;cp3.打包解包&#xff1a;tar 二.文本处理 1.(显示行号)查看文件&#xff1a;nl2.文本查找&#xff1a;grep3.排序&#xff1a;sort4.转换&#xff1a;tr5.切分文本&…

Web 基础——Apache

Event Worker 的升级版、把服务器进程和连接进行分析&#xff0c;基于异步 I/O 模型。 请求过来后进程并不处理请求&#xff0c;而是直接交由其它机制来处理&#xff0c;通过 epoll 机制来通知请求是否完成&#xff1b; 在这个过程中&#xff0c;进程本身一直处于空闲状态&am…

【目标检测数据集】铁轨表面缺损检测数据集4789张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4789 标注数量(xml文件个数)&#xff1a;4789 标注数量(txt文件个数)&#xff1a;4789 标注…

只有IP地址没有域名怎么实现HTTPS访问?

&#x1f510; 实现IP地址HTTPS访问 &#x1f310; 确认公网IP地址 公网IP&#xff1a;确保你拥有一个公网IP地址&#xff0c;或者内网映射公网&#xff0c;这是实现HTTPS访问的前提。 &#x1f4dd; 选择证书颁发机构&#xff08;CA&#xff09; 选择CA&#xff1a;选择一个…

【Qt】Qt音频

Qt 音频 在 Qt 中&#xff0c;⾳频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只⽀持播放 wav 格式的⾳频⽂件。也就是说如果想要添加⾳频效果&#xff0c;那么⾸先需要将 ⾮wav格式 的⾳频⽂件转换为 wav 格式。 【注意】使⽤ QSound 类时&#xff0c;需要添加模…

【C#Mutex】 initiallyOwned错误引起的缺陷

临界区只能对同一个进程的不同线程同步&#xff0c;互斥量可以跨进程同步。典型应用场景&#xff1a;两个exe会操作同一个注册表项。 错误代码 封装类 public class CMutexHelp : IDisposable {public CMutexHelp(){s_mutex.WaitOne();} private static Mutex s_mutex …

深度学习-目标检测(二)Fast R-CNN

一&#xff1a;Fast R-CNN Fast R-CNN 是一篇由Ross Girshick 在 2015 年发表的论文&#xff0c;题为 “Fast R-CNN”。这篇论文旨在解决目标检测领域中的一些问题&#xff0c;特别是传统目标检测方法中存在的速度和准确性之间的矛盾。 论文摘要&#xff1a;本文提出了一种基于…