¿Cómo controlo los LED del sistema con mi software?

64

Hay 5 LED en el RPi: OK, PWR, FDX, LNK, 10M.

Me gustaría saber si es posible controlar cualquiera de estos desde el software, es decir, encenderlos o cambiar la intensidad (o incluso cambiar el jadeo de color ).

Y si es así, ¿dónde puedo leer sobre esto? Los LED podrían ser una forma bastante útil de indicar el estado de la aplicación del usuario cuando no son necesarios para el uso original.

Maria Zverina
fuente
2
Y sí, sé que puedo agregar LED fácilmente en las salidas GPIO, pero tengo curiosidad por saber qué se puede hacer sin hardware externo.
Maria Zverina
1
Los LED son generalmente de un solo color (especialmente cuando se requieren para un propósito), por lo que puede olvidarse de esa parte :)
Jivings
2
@Jivings De acuerdo en que probablemente sean de un solo color dado el costo de RPi ... pero nunca está de más preguntar :)
Maria Zverina

Respuestas:

57

El LED OK puede controlarse desde el software de espacio del usuario. Detalles aquí: Re: ¿Podemos controlar los leds a bordo?

Resumido de lo anterior (todo crédito a BrianW):

El LED OK está disponible como /sys/class/leds/led0/.

El controlador de LED del núcleo tiene "disparadores" que permiten que otra parte del núcleo controle el LED. El disparador predeterminado para el LED es ' mmc0', lo que hace que se encienda cuando se accede a la tarjeta SD.

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

Puede desactivar el mmc0activador de la siguiente manera:

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

El LED se puede encender y apagar usando el brightnessarchivo ' '. El brillo mínimo es 0, y el máximo es 255. Como no hay soporte de brillo variable, cualquier valor mayor que 0 encenderá el LED.

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

Establecer el brillo en 0 establece automáticamente el disparador en "ninguno".

Si desea que el LED vuelva a su función predeterminada:

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

Hay un par de módulos del núcleo que puede cargar ( ledtrig_timery ledtrig_heartbeat) que parpadearán el LED por usted.

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

Una vez que haya apagado el mmc0gatillo, puede usar GPIO16 para controlar el LED. Está activo bajo, por lo que debe establecer el pin bajo para encender el LED y alto para apagarlo.

Desde Python, puede usar el módulo RPi.GPIOpara controlar el pin 16. También hay un controlador C #.

Código de muestra

#!/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)
Chico
fuente
3
¡Hola chico! Para evitar la pudrición del enlace, ¿puede resumir los puntos principales del hilo aquí? ¡Gracias!
¡Eso ni siquiera es un truco!
Alex Chamberlain el
Eso es correcto. Claro que los leds ethernet y pwr no pueden, pero si necesita más, simplemente se pueden agregar (como hardware) a los pines GPIO expuestos. Hay muchos ejemplos de agregar LED a los pines GPIO. Parece haber reemplazado el conjunto de cristal como electrónica 101 en estos días :) Tengo mi LED OK parpadeando cada vez que se recibe una oración NMEA en el UART.
Chico
44
Para su información en el Raspberry Pi 2, ¡finalmente también puede controlar el LED PWR! Cambie al modo GPIO con echo gpio | sudo tee /sys/class/leds/led1/trigger, luego encienda o apague con echo [0|1] | sudo tee /sys/class/leds/led1/brightness.
geerlingguy
2
Para cualquiera que se pregunte cómo hacerlo desde la línea de comandos (sin que se requieran privilegios de superusuario para escribir en / sys / class ...), primero configure el LED para que se active en gpio y luego instale WiringPi learn.sparkfun.com/tutorials/ raspberry-gpio / c-cableadopi-setup después de eso puede simplemente "$ gpio -g modo 16 salida && gpio -g escribir 16 0" para encender el led (y 1 para apagarlo)
joonas.fi
20

Ninguno de los LED integrados puede controlarse en el software; todos se utilizan para otras cosas.

  • OK: indica acceso a la tarjeta SD
  • PWR: indica alimentación a la conexión micro USB
  • FDX - LAN dúplex completa
  • LNK - Actividad LAN
  • 10M - Velocidad de conexión de 10M / 100M: si está encendido, el RPi está conectado a 100M.

Ahora, esa es la respuesta oficial ... Estudiemos el esquema .

Page 4 El LED PWR está conectado directamente a la fuente de alimentación, por lo que no podemos controlarlo en el software.

Page 3 FDX, LNK y 10M están todos conectados al chip Ethernet, por lo que nuevamente no podemos controlarlos en el software (sin algún truco de tráfico funky ...).

Página 4 PERO OK está realmente controlado por GPIO 16, por lo que existe la posibilidad de un hack ...

Alex Chamberlain
fuente
1
@AlexChamberlain Buena definición de los LED. Pero, ¿estamos realmente seguros de que el software no puede controlarlos? ¿Están los LED de red bajo control de firmware o el hardware real? Y si están controlados por firmware, ¿podemos hacer ingeniería inversa de alguna manera?
Maria Zverina
55
Consulte el esquema : PWR está directamente conectado a la alimentación y FDX, LNK y 10M al chip de Ethernet. Como dije, es posible que pueda hackear el LED OK.
Alex Chamberlain
Alex tiene razón. el chip BCM no tiene control (excpet para GPIO16) sobre esos LED; por lo que ningún software puede acceder a ellos, ni siquiera el código de kernel de bajo nivel. Tendría que hackear el chip LAN o crear su propio circuito de cortocircuito para estos LED's-BUt que realmente no es una gran idea. ¿Por qué no solo agregar el tuyo?
Piotr Kula el
3
Me parece que esta otra respuesta muestra que al menos parte de esta respuesta (y algunos comentarios) son falsos. ¿Estoy leyendo las cosas correctamente? Puede ser exacto que solo OK (etiquetado "ACT" en mi placa Rev B.) pueda ser controlado, pero parece que sí. (Sin embargo, todavía no he intentado hacerlo).
lindes
7

Puede controlar todos los leds (excepto PWR en modelos Pi más antiguos, como se dijo en otras respuestas).

Pero para los leds de ethernet necesitará parchear el controlador y recompilar el kernel.

Información sobre cómo puede llegar la compilación aquí: http://elinux.org/RPi_Kernel_Compilation

Parche y más información aquí (traductor de Google si es necesario): http://everpi.tsar.in/2013/11/patch-para-controlar-os-leds-ethernet-do-raspberrypi.html

Una vez hecho esto, podrá controlar: / sys / class / smsc95xx_leds y eth_fdx, eth_lnk e eth_spd.

Ejemplo: echo 0> / sys / class / smsc95xx_leds / eth_fdx echo 1> / sys / class / smsc95xx_leds / eth_fdx

zar
fuente
6

¡Puedo confirmar que con la Raspberry Pi 2 también es posible controlar el LED PWD!

El LED de alimentación está controlado por los archivos en:

/sys/class/leds/led1

Puede apagarlo al igual que el LED de estado usando:

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

Vea la respuesta de Guy para más formas de controlar los LED

Patricio
fuente
¡En raspberry pi zero el "echo 0 ..." lo enciende! No fuera
NilsB
6

Escribí un programa de espacio de usuario que le permite controlar los LED de Ethernet.

El programa requiere el más reciente libusb-1.0(NO el antiguo 0.1). Funciona con LAN9512 (por ejemplo, en la Raspberry B más antigua) así como con chips LAN9514 (por ejemplo, en Raspberry B + o Raspberry 2)

Los detalles se pueden encontrar aquí: control LED LAN951x

punto luminoso en un radar
fuente
Como el contenido de su enlace es bastante pequeño, sería mejor incluirlo aquí en su respuesta, entre comillas, ya que el enlace puede morir en el futuro. Si lo hace, entonces su respuesta no será de mucha utilidad. Además, proporcione el enlace github aquí también.
Greenonline
5

Con el Pi 2, puede controlar los LED internos rojos y verdes.

La documentación de Windows 10 IoT enumera el LED rojo de encendido y el LED verde Ok en GPIO 35 y 47, respectivamente.

https://ms-iot.github.io/content/en-US/win10/samples/PinMappingsRPi2.htm

Intenté con Windows 10 IoT y con Python en Raspbian. Ambos pueden controlar los LED, aunque Raspbian anula el LED cada vez que algo accede a la tarjeta SD. Presumiblemente, borrar el gatillo eliminaría este comportamiento).

Aquí hay una muestra. (Tenga en cuenta que esto no anula el activador como se mencionó en publicaciones anteriores)

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")
TomXP411
fuente