如何使用我的软件控制系统LED?


64

RPi上有5个LED:OK,PWR,FDX,LNK,10M。

我想知道,如果有可能,从软件控制任何这些即打开它们,或者改变强度(甚至改变颜色GASP)。

如果是这样,我在哪里可以读到它?当原始用途不需要LED时,它们可能是通知用户应用程序状态的便捷方式。


2
是的-我知道我可以轻松地将LED添加到GPIO输出上-但是我很好奇没有外部硬件该怎么办。
Maria Zverina 2012年

1
LED通常是单色的(特别是在出于某种目的需要时),因此您可以
忽略

2
@Jivings同意,考虑到RPi的成本,它们可能是单色的...但是问这个问题一点也没有::
Maria Zverina 2012年

Answers:


57

可以通过用户空间软件控制OK LED。详细信息在这里:Re:我们可以控制车载LED吗

综上所述(全部归功于BrianW):

OK LED可用为/sys/class/leds/led0/

内核LED驱动器具有“触发器”,可让内核的其他部分控制LED。LED的默认触发器为“ mmc0”,这将在访问SD卡时点亮。

root@raspberrypi:~# cat /sys/class/leds/led0/trigger
none [mmc0]

您可以mmc0按以下方式停用触发器:

echo none >/sys/class/leds/led0/trigger

可以使用' brightness'文件打开和关闭LED 。最小亮度为0,最大亮度为255。由于没有可变亮度支持,任何大于0的值都将打开LED。

echo 1 >/sys/class/leds/led0/brightness
echo 0 >/sys/class/leds/led0/brightness

将亮度设置为0会自动将触发器设置为“无”。

如果您希望LED返回其默认功能:

echo mmc0 >/sys/class/leds/led0/trigger

您可以加载(ledtrig_timerledtrig_heartbeat)几个内核模块,这些模块将为您闪烁LED。

modprobe ledtrig_heartbeat
echo heartbeat >/sys/class/leds/led0/trigger

一旦关闭mmc0触发器,就可以使用GPIO16来控制LED。它为低电平有效,因此您需要将引脚设置为低电平以打开LED,而将其设置为高电平以将其关闭。

在Python中,您可以使用该模块RPi.GPIO来控制引脚16。还有一个C#驱动程序。

样例代码

#!/usr/bin/python

import RPi.GPIO as GPIO
from time import sleep

# Needs to be BCM. GPIO.BOARD lets you address GPIO ports by periperal
# connector pin number, and the LED GPIO isn't on the connector
GPIO.setmode(GPIO.BCM)

# set up GPIO output channel
GPIO.setup(16, GPIO.OUT)

# On
GPIO.output(16, GPIO.LOW)

# Wait a bit
sleep(10)

# Off
GPIO.output(16, GPIO.HIGH)

3
小伙儿,你好!为了防止链接腐烂,您可以在这里总结线程的要点吗?谢谢!

那根本不是黑客!
亚历克斯·张伯伦

那就对了。当然,以太网和pwr led不能,但是如果您需要更多,可以将它们(作为硬件)添加到暴露的GPIO引脚中。有许多将LED添加到GPIO引脚的示例。这些天似乎已经取代了作为电子设备101的晶体:)每次在UART上收到NMEA语句时,我的OK LED都会闪烁。
盖伊2012年

4
仅供参考,在Raspberry Pi 2上,您最终也可以控制PWR LED!使用切换至GPIO模式echo gpio | sudo tee /sys/class/leds/led1/trigger,然后使用开启或关闭echo [0|1] | sudo tee /sys/class/leds/led1/brightness
geerlingguy 2015年

2
对于想知道如何从命令行执行此操作的人(无需具有写入/ sys / class的超级用户权限...),请首先将LED设置为在gpio上触发,然后安装WiringPi learning.sparkfun.com/tutorials/ raspberry-gpio / c-wiringpi-setup之后,您可以“ $ gpio -g模式16输出&& gpio -g写16 0”来打开led(和1代表关闭)
joonas.fi

20

板上的LED均无法通过软件进行控制-它们全部用于其他用途。

  • OK-表示可以访问SD卡
  • PWR-指示微型USB连接的电源
  • FDX-全双工LAN
  • LNK-LAN活动
  • 10M-10M / 100M连接速度-如果点亮,则RPi的连接速度为100M。

现在,这是官方的答案...让我们研究原理图

Page 4 PWR LED直接连接到电源,因此我们无法通过软件对其进行控制。

Page 3 FDX,LNK和10M都已连接到以太网芯片,因此我们再次无法通过软件对其进行控制(没有一些时髦的流量黑客……)。

Page 4 BUT OK实际上是由GPIO 16控制的,因此存在被黑客入侵的可能性。


1
@AlexChamberlain LED的定义不错。但是我们真的确定它们不能由软件控制吗?网络LED是在固件控制下还是在实际硬件下?而且,如果它们是由固件控制的,我们是否可以对此进行反向工程?
Maria Zverina 2012年

5
查看原理图 -PWR直接连接到电源,FDX,LNK和10M连接到以太网芯片。如我所说,您可能可以破解OK LED。
Alex Chamberlain 2012年

亚历克斯是正确的。BCM芯片无法控制这些LED(GPIO16除外);因此,没有软件可以访问它们,甚至没有低级内核代码。您将不得不修改LAN芯片或为这些LED灯创建自己的短路电路,这实际上不是一个好主意。为什么不添加自己的?
Piotr Kula 2012年

3
在我看来,这个其他答案至少表明该答案的至少一部分(和一些评论)是错误的。我看得对吗?也许只有OK(在我的Rev B.板上标有“ ACT”)可以被控制,但是似乎可以控制。(不过,我还没有实际尝试过。)
lindes


7

您可以控制所有指示灯(如其他答案所述,较旧的Pi型号中的PWR除外)。

但是对于以太网LED,您将需要修补驱动程序并重新编译内核。

有关如何重新编译的信息,请参见:http : //elinux.org/RPi_Kernel_Compilation

修补程序和更多信息,请点击此处(如有需要,请谷歌翻译):http : //everpi.tsar.in/2013/11/patch-para-controlar-os-leds-ethernet-do-raspberrypi.html

完成后,您可以控制:/ sys / class / smsc95xx_leds和eth_fdx,eth_lnk和eth_spd。

示例:echo 0> / sys / class / smsc95xx_leds / eth_fdx echo 1> / sys / class / smsc95xx_leds / eth_fdx


6

我可以确认,通过Raspberry Pi 2,也可以控制PWD LED!

电源指示灯由以下文件中的文件控制:

/sys/class/leds/led1

您可以像使用状态LED一样将其关闭:

echo 0 > /sys/class/leds/led1/brightness # Power LED
echo 0 > /sys/class/leds/led0/brightness # Status LED

有关更多控制LED的方法,请参见盖伊的答案


在树莓派零上,“回声0 ...”将其打开!不关
NilsB

6

我编写了一个用户空间程序,该程序可让您控制以太网LED。

该程序需要更新的版本libusb-1.0(而不是较旧的0.1)。它与LAN9512(例如,在较旧的Raspberry B上)以及LAN9514芯片(例如,在Raspberry B +或Raspberry 2上)一起使用

可以在这里找到详细信息:LAN951x LED控件


由于链接的内容很小,因此最好将其包含在您的答案中,并用引号引起来,因为该链接将来可能会消失。如果确实如此,那么您的答案将不会有太大用处。另外,在此处也提供github链接。
Greenonline

5

使用Pi 2,您可以控制板上的红色和绿色LED。

Windows 10 IoT文档分别列出了GPIO 35和47上的红色电源LED和绿色的OK LED。

https://ms-iot.github.io/content/zh-CN/win10/samples/PinMappingsRPi2.htm

我尝试在Raspbian上使用Windows 10 IoT和Python。两者都可以控制LED,尽管每当有人访问SD卡时Raspbian都会覆盖LED。大概清除触发器将消除此行为。)

这是一个样本。(请注意,这不会覆盖以前的帖子中提到的触发器)

print ("Program Start")
import RPi.GPIO as GPIO
import time

channels = [35, 47]

print ("Turning off LED's")
GPIO.setmode(GPIO.BCM)
GPIO.setup(channels, GPIO.OUT)
GPIO.output(channels, GPIO.LOW)
time.sleep(5)

print ("Turning on LED's")
GPIO.output(channels, GPIO.HIGH)
time.sleep(5)

GPIO.cleanup()

print ("Program End")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.