Como controle os LEDs do sistema usando meu software?

64

Existem 5 LEDs no RPi: OK, PWR, FDX, LNK, 10M.

Eu gostaria de saber se é possível controlar qualquer um deles a partir do software, por exemplo, ativá-los ou alterar a intensidade (ou até mesmo alterar o suspiro de cores ).

E se sim, onde posso ler sobre isso? Os LEDs podem ser uma maneira bastante útil de sinalizar o status do aplicativo do usuário quando não são necessários para o uso original.

Maria Zverina
fonte
2
E sim - eu sei que posso adicionar LEDs facilmente nas saídas GPIO - mas estou curioso para saber o que pode ser feito sem hardware externo.
Maria Zverina
11
LEDs são de cor geralmente única (especialmente quando necessário para um propósito), então você pode esquecer essa parte :)
Jivings
2
@Jivings Concordo que eles são, provavelmente, única cor dado custo da RPI ... mas nunca é demais para perguntar :)
Maria Zverina

Respostas:

57

O LED OK pode ser controlado a partir do software de espaço do usuário. Detalhes aqui: Re: Podemos controlar os leds de bordo

Resumido do exposto (todo o crédito para BrianW):

O LED OK está disponível como /sys/class/leds/led0/.

O driver do LED do kernel possui "gatilhos" que permitem que outra parte do kernel controle o LED. O gatilho padrão para o LED é ' mmc0', que acende quando o cartão SD é acessado.

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

Você pode desativar o mmc0gatilho da seguinte maneira:

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

O LED pode ser ligado e desligado usando o brightnessarquivo ' '. O brilho mínimo é 0 e o máximo é 255. Como não há suporte para brilho variável, qualquer valor maior que 0 acenderá o LED.

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

Definir o brilho para 0 define automaticamente o gatilho para "nenhum".

Se você deseja que o LED volte à sua função padrão:

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

Existem alguns módulos do kernel que você pode carregar ( ledtrig_timere ledtrig_heartbeat) que piscarão o LED para você.

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

Depois de desligar o mmc0gatilho, você pode usar o GPIO16 para controlar o LED. Como ativo-baixo, é necessário definir o pino baixo para ligar o LED e alto para desligá-lo.

No Python, você pode usar o módulo RPi.GPIOpara controlar o pino 16. Há também um driver C #.

Código de amostra

#!/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)
Cara
fonte
3
Olá cara! Para evitar a podridão do link, você pode resumir os pontos principais da discussão aqui? Obrigado!
Isso nem é um hack!
Alex Chamberlain
Está certo. Certamente, a Ethernet e os pwr leds não podem, mas se você precisar de mais, eles podem ser adicionados (como hardware) aos pinos GPIO expostos. Existem muitos exemplos de adição de LEDs aos pinos GPIO. Parece ter substituído o cristal como eletrônica 101 hoje em dia :) Meu LED OK pisca cada vez que uma sentença NMEA é recebida no UART.
Guy
4
Para sua informação no Raspberry Pi 2, você também pode finalmente controlar o LED PWR! Alterne para o modo GPIO com e echo gpio | sudo tee /sys/class/leds/led1/trigger, em seguida, ligue ou desligue com echo [0|1] | sudo tee /sys/class/leds/led1/brightness.
geerlingguy
2
Para quem quiser saber como fazer isso na linha de comando (sem privilégios de super usuário para gravar em / sys / class ...), primeiro defina o LED para disparar no gpio e instale o WiringPi learn.sparkfun.com/tutorials/ raspberry-gpio / c -iringpi-setup depois disso, você pode simplesmente "$ gpio -g mode 16 output && gpio -g write 16 0" para ligar o led (e 1 para desligar)
joonas.fi
20

Nenhum dos LEDs embutidos pode ser controlado em software - todos eles são usados ​​para outras coisas.

  • OK - indica acesso ao cartão SD
  • PWR - indica energia para a conexão micro USB
  • FDX - LAN Full Duplex
  • LNK - Atividade da LAN
  • 10M - 10M / 100M de velocidade de conexão - se estiver aceso, o RPi está conectado a 100M.

Agora, essa é a resposta oficial ... Vamos estudar o esquema .

Page 4 O LED PWR está conectado diretamente à fonte de alimentação, portanto não podemos controlar isso no software.

O FDX, o LNK e o 10M estão todos conectados ao chip Ethernet, então, novamente, não podemos controlá-los em software (sem algum truque de tráfego ...).

Page 4 MAS OK é realmente controlado pelo GPIO 16, então existe a possibilidade de um hack ...

Alex Chamberlain
fonte
11
@AlexChamberlain Ótima definição dos LEDs. Mas temos certeza de que eles não podem ser controlados por software? Os LEDs de rede estão sob controle de firmware ou o hardware real? E se eles são controlados por firmware, podemos fazer engenharia reversa de alguma forma?
Maria Zverina
5
Confira o esquema - o PWR está diretamente conectado à energia e o FDX, LNK e 10M ao chip ethernet. Como eu disse, você pode hackear o LED OK.
Alex Chamberlain
Alex está correto. o chip BCM não tem controle (exceto o GPIO16) sobre esses LEDs; portanto, nenhum software pode acessá-los, nem mesmo o código do kernel de baixo nível. Você precisaria hackear o chip da LAN ou criar seu próprio atalho para esses LEDs, mas isso não é realmente uma boa idéia. Por que não apenas adicionar o seu próprio?
Piotr Kula
3
Parece-me que esta outra resposta mostra pelo menos parte dessa resposta (e alguns comentários) ser falsa. Estou lendo as coisas corretamente? Pode ser preciso que apenas o OK (rotulado como "ATO" no quadro Rev B.) possa ser controlado, mas parece que esse pode ser. (Ainda não tentei realmente fazê-lo.) #
Lindes 28/10
7

Você pode controlar todos os leds (exceto o PWR nos modelos Pi mais antigos, como dito em outras respostas).

Mas para leds ethernet, você precisará corrigir o driver e recompilar o kernel.

Informações sobre como a recompilação pode chegar aqui: http://elinux.org/RPi_Kernel_Compilation

Correção e mais informações aqui (traduza se necessário): http://everpi.tsar.in/2013/11/patch-para-controlar-os-leds-ethernet-do-raspberrypi.html

Depois de concluído, você poderá controlar: / sys / class / smsc95xx_leds e eth_fdx, eth_lnk e eth_spd.

Exemplo: eco 0> / sys / class / smsc95xx_leds / eth_fdx eco 1> / sys / class / smsc95xx_leds / eth_fdx

czar
fonte
6

Posso confirmar que com o Raspberry Pi 2 também é possível controlar o LED PWD!

O LED de energia é controlado pelos arquivos em:

/sys/class/leds/led1

Você pode desligá-lo exatamente como o LED Status usando:

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

Veja a resposta de Guy para mais maneiras de controlar os LEDs

Patrick
fonte
No raspberry pi zero, o "eco 0 ..." o ativa! Não desligado.
NilsB 27/04
6

Eu escrevi um programa de espaço de usuário que permite controlar os LEDs da Ethernet.

O programa requer o mais recente libusb-1.0(e não o 0.1 mais antigo). Funciona com LAN9512 (por exemplo, no Raspberry B mais antigo) e com chips LAN9514 (por exemplo, em Raspberry B + ou Raspberry 2)

Os detalhes podem ser encontrados aqui: Controle de LAN951x LED

pontada
fonte
Como o conteúdo do seu link é muito pequeno, seria melhor incluí-lo aqui em sua resposta, entre aspas, pois o link poderá morrer no futuro. Se isso acontecer, sua resposta não será muito útil. Além disso, forneça o link do github aqui também.
Greenonline 17/08/2018
5

Com o Pi 2, você pode controlar os LEDs vermelho e verde a bordo.

A documentação da IoT do Windows 10 lista o LED vermelho de energia e o LED verde Ok no GPIO 35 e 47, respectivamente.

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

Eu tentei com o Windows 10 IoT e com Python no Raspbian. Ambos podem controlar os LEDs, embora o Raspbian substitua o LED sempre que algo acessar o cartão SD. Presumivelmente, limpar o gatilho removeria esse comportamento.)

Aqui está uma amostra. (Observe que isso não substitui o gatilho, como mencionado nas postagens 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
fonte