Jak sterować diodami LED systemu za pomocą mojego oprogramowania?


64

Na RPi znajduje się 5 diod LED: OK, PWR, FDX, LNK, 10M.

Chciałbym wiedzieć, czy jest możliwe, aby kontrolować każdy z nich z oprogramowaniem tj je włączyć, zmienić intensywność (lub nawet zmienić kolor westchnienie ).

A jeśli tak, to gdzie mogę o tym poczytać? Diody LED mogą być bardzo przydatnym sposobem sygnalizowania statusu aplikacji użytkownika, gdy nie są wymagane do pierwotnego użycia.


2
I tak - wiem, że mogę łatwo dodawać diody LED do wyjść GPIO - ale jestem ciekawy, co można zrobić bez zewnętrznego sprzętu.
Maria Zverina,

1
Diody LED są zazwyczaj jednokolorowe (szczególnie gdy są wymagane w jednym celu), więc możesz zapomnieć o tej części :)
Jivings

2
@ Jivings Zgadzam się, że prawdopodobnie są one jednokolorowe, biorąc pod uwagę koszt RPi ... ale nigdy nie boli pytać :)
Maria Zverina

Odpowiedzi:


57

OK LED może być sterowane z oprogramowania przestrzeni użytkownika. Szczegóły tutaj: Re: Czy możemy kontrolować diody LED na pokładzie

Podsumowując z powyższego (wszystkie podziękowania dla BrianW):

Dioda OK jest dostępna jako /sys/class/leds/led0/.

Sterownik LED jądra ma „wyzwalacze”, które pozwalają innej części jądra kontrolować diodę LED. Domyślnym wyzwalaczem dla diody LED jest „ mmc0”, co powoduje, że włącza się ona po uzyskaniu dostępu do karty SD.

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

Możesz wyłączyć mmc0spust w następujący sposób:

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

LED można włączać i wyłączać za pomocą brightnesspliku „ ”. Minimalna jasność wynosi 0, a maksymalna wynosi 255. Ponieważ brak obsługi zmiennej jasności, każda wartość większa od 0 spowoduje włączenie diody LED.

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

Ustawienie jasności na 0 powoduje automatyczne ustawienie wyzwalacza na „brak”.

Jeśli chcesz, aby dioda LED powróciła do domyślnej funkcji:

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

Istnieje kilka modułów jądra, które można załadować ( ledtrig_timeri ledtrig_heartbeat), które sflashują diodę LED za Ciebie.

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

Po wyłączeniu mmc0spustu możesz użyć GPIO16 do sterowania diodą LED. Jest aktywny-niski, więc musisz ustawić pin niski, aby włączyć diodę LED, i wysoki, aby ją wyłączyć.

Z Pythona możesz użyć modułu RPi.GPIOdo sterowania pinem 16. Istnieje również sterownik C #.

Przykładowy kod

#!/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
Witaj kolego! Aby zapobiec gniciu linków, czy możesz tutaj streścić główne punkty wątku? Dzięki!

To nawet nie hack!
Alex Chamberlain,

Zgadza się. Upewnij się, że diody ethernet i pwr nie mogą, ale jeśli potrzebujesz więcej, można je po prostu dodać (jako sprzęt) do odsłoniętych styków GPIO. Istnieje wiele przykładów dodawania diod LED do pinów GPIO. Wygląda na to, że w dzisiejszych czasach zastąpił zestaw kryształów jako elektronika 101 :) Mam diodę OK, która miga za każdym razem, gdy na UART odbierane jest zdanie NMEA.
Guy

4
FYI na Raspberry Pi 2, możesz wreszcie kontrolować diodę PWR! Przełącz go w tryb GPIO za pomocą echo gpio | sudo tee /sys/class/leds/led1/trigger, a następnie włącz lub wyłącz za pomocą echo [0|1] | sudo tee /sys/class/leds/led1/brightness.
geerlingguy

2
Dla każdego, kto zastanawia się, jak to zrobić z wiersza poleceń (bez uprawnień superużytkownika wymaganych do zapisu do / sys / class ...), najpierw ustaw diodę LED, aby wyzwalała się na gpio, a następnie zainstaluj WiringPi learn.sparkfun.com/tutorials/ raspberry-gpio / c-wiringpi-setup po tym możesz po prostu "$ gpio -g tryb 16 wyjść i & gpio -g napisać 16 0", aby włączyć
diodę

20

Żadna z wbudowanych diod LED nie może być sterowana programowo - wszystkie są używane do innych celów.

  • OK - wskazuje dostęp do karty SD
  • PWR - wskazuje moc połączenia micro USB
  • FDX - Full Duplex LAN
  • LNK - aktywność LAN
  • Szybkość połączenia 10M - 10M / 100M - jeśli świeci, RPi jest podłączone do 100M.

To oficjalna odpowiedź ... Przestudiujmy schemat .

Page 4 PWR LED jest podłączony bezpośrednio do zasilacza, więc nie możemy tego kontrolować w oprogramowaniu.

Page 3 FDX, LNK i 10M są podłączone do układu Ethernet, więc ponownie nie możemy kontrolować ich w oprogramowaniu (bez jakiegoś funky hack traffic ...).

Page 4 ALE OK jest faktycznie kontrolowany przez GPIO 16, więc istnieje możliwość włamania ...


1
@AlexChamberlain Ładna definicja diod LED. Ale czy naprawdę jesteśmy pewni, że nie mogą być kontrolowane przez oprogramowanie? Czy sieciowe diody LED są pod kontrolą oprogramowania układowego czy faktycznego sprzętu? A jeśli są one kontrolowane przez oprogramowanie układowe, czy możemy w jakiś sposób dokonać inżynierii wstecznej?
Maria Zverina

5
Sprawdź schemat - PWR jest bezpośrednio podłączony do zasilania, a FDX, LNK i 10M do układu Ethernet. Jak powiedziałem, możesz być w stanie zhakować diodę OK.
Alex Chamberlain

Alex ma rację. układ BCM nie ma kontroli (wyłączny dla GPIO16) nad tymi diodami LED; więc żadne oprogramowanie nie może uzyskać do nich dostępu, nawet kod jądra niskiego poziomu. Będziesz musiał zhakować układ LAN lub stworzyć własny obwód zwarcia do tych diod LED - BUt, co naprawdę nie jest świetnym pomysłem. Dlaczego po prostu nie dodać własnego?
Piotr Kula,

3
Wydaje mi się, że ta inna odpowiedź pokazuje, że przynajmniej część tej odpowiedzi (i niektórych komentarzy) jest fałszywa. Czy czytam wszystko poprawnie? Może być prawdą, że można kontrolować tylko OK (oznaczony „ACT” na mojej płycie Rev B.), ale wygląda na to, że tak. (Jednak nie próbowałem tego jeszcze robić).
Lindes


7

Możesz kontrolować wszystkie diody LED (oprócz PWR w starszych modelach Pi, jak powiedziano w innych odpowiedziach).

Ale w przypadku diod Ethernet konieczne będzie załatanie sterownika i ponowne skompilowanie jądra.

Informacje o tym, jak można ponownie skompilować tutaj: http://elinux.org/RPi_Kernel_Compilation

Patch i więcej informacji tutaj (w razie potrzeby tłumacz google): http://everpi.tsar.in/2013/11/patch-para-controlar-os-leds-ethernet-do-raspberrypi.html

Po zakończeniu możesz kontrolować: / sys / class / smsc95xx_leds i eth_fdx, eth_lnk e eth_spd.

Przykład: echo 0> / sys / class / smsc95xx_leds / eth_fdx echo 1> / sys / class / smsc95xx_leds / eth_fdx


6

Mogę potwierdzić, że dzięki Raspberry Pi 2 można również kontrolować diodę PWD!

Dioda LED mocy jest kontrolowana przez pliki w:

/sys/class/leds/led1

Możesz go wyłączyć tak jak diodę LED statusu, używając:

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

Zobacz odpowiedź Guy'a, aby uzyskać więcej sposobów sterowania diodami LED


Na raspberry pi zero „echo 0 ...” włącza! Nie wyłączony
NilsB

6

Napisałem program przestrzeni użytkownika, który pozwala kontrolować diody Ethernet.

Program wymaga nowszej wersji libusb-1.0(NIE starszej wersji 0.1). Działa z LAN9512 (np. Na starszym Raspberry B), a także z układami LAN9514 (np. Na Raspberry B + lub Raspberry 2)

Szczegóły można znaleźć tutaj: Sterowanie LED LAN951x


Ponieważ treść linku jest dość niewielka, lepiej umieścić go tutaj w odpowiedzi, w postaci cytatów blokowych, ponieważ link może umrzeć w przyszłości. Jeśli tak, twoja odpowiedź nie będzie zbyt użyteczna. Podaj również link github tutaj.
Greenonline,

5

Za pomocą Pi 2 możesz kontrolować zarówno czerwoną, jak i zieloną diodę LED na pokładzie.

Dokumentacja IoT systemu Windows 10 wymienia odpowiednio czerwoną diodę LED zasilania i zieloną diodę OK na GPIO 35 i 47.

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

Próbowałem z Windows 10 IoT i Python na Raspbian. Oba mogą sterować diodami LED, chociaż Raspbian zastępuje diodę LED za każdym razem, gdy coś uzyskuje dostęp do karty SD. Prawdopodobnie usunięcie wyzwalacza usunęłoby to zachowanie).

Oto próbka. (Pamiętaj, że nie zastępuje to wyzwalacza, jak wspomniano w poprzednich postach)

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")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.