苏州建网站的公司一站式服务,洛可可设计公司logo,做网站公司名字推荐,品牌营销推广策划先做个简单一丢丢的吧。。。正好最近工作也要用这个。这次直接给够四种方法#xff0c;给好给满。分别是Python点#xff0c;用户空间配置GPIO点#xff0c;设备树配置内核Leds驱动点#xff0c;自己写驱动点。
用的板子是树莓派3B#xff0c;GPIO 26口#xff0c;蓝光L…先做个简单一丢丢的吧。。。正好最近工作也要用这个。这次直接给够四种方法给好给满。分别是Python点用户空间配置GPIO点设备树配置内核Leds驱动点自己写驱动点。
用的板子是树莓派3BGPIO 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号不匹配在本机查了如下
piraspberrypi:/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引脚通常有两种编号方式物理引脚编号和BCMBroadcom引脚编号。一般来说高层次编程如Python的RPi.GPIO库通常使用BCM引脚编号或物理引脚编号。在这种情况下你会使用26BCM编号或物理引脚编号。低层次编程如直接操作设备树或内核配置可能会使用内部编号如538。 3 修改设备树点
最后还是打算用DTS来点主要还是对环境不很熟悉所以折腾了很久。最开始还是去看GPT。给的答案大体是对的但是驱动死活加载不起来也不知道怎么调试。
test_led.dts GPT版
/dts-v1/;
/plugin/;/ {compatible brcm,bcm2835;fragment0 {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
在后面增加
dtoverlaytest_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?t346863hilitled test_led.dts可用版
/dts-v1/;
/plugin/;/ {compatible brcm,bcm2837;fragment0 {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年日本名古屋大学和名城大学教授赤崎勇、名古屋大学教授天野浩和美国加利福尼亚大学教授中村修二因“发明高亮度蓝色发光二极管带来了节能明亮的白色光源”共同获得当年的诺贝尔物理学奖。