Mam Arduino, do którego czasami się przywiązuję, /dev/ttyUSB0
a innym razem do /dev/ttyUSB1
, przez co mój skrypt nie działa.
Nie chcę wyliczać wszystkich możliwości miejsca, w którym mogłoby znajdować się moje urządzenie, ale wolę, aby było ono związane gdzieś statycznie, np /dev/arduino
.
Jak to osiągnąć?
linux
arch-linux
usb
serial-port
arduino
k0pernikus
źródło
źródło
Odpowiedzi:
Zgodnie z sugestią możesz dodać kilka reguł udev. Zredagowałem,
/etc/udev/rules.d/10-local.rules
aby zawierał:Możesz sprawdzić zmienne swojego urządzenia, uruchamiając
Bardziej szczegółowy przewodnik można przeczytać na stronie http://www.reactivated.net/writing_udev_rules.html
źródło
udevam
? I ważne jest, aby pamiętać, żemy_uart
tworzy dowiązanie symboliczne pod/dev/my_uart
. Pierwszy raz napisałem/dev/arduino
po raz pierwszy i nie udało się, dopókiarduino
jest wystarczające.udevadm
powinien zakończyć się sam po zakończeniu.Powyższa składnia reguły może działać w niektórych dystrybucjach, ale nie działała w mojej (Raspbian). Ponieważ nigdy nie znalazłem ani jednego dokumentu wyjaśniającego wszystkie tajniki, napisałem swój własny, który można znaleźć tutaj . Do tego się sprowadza.
1. dowiedz się, co jest na ttyUSB:
2. wypisz wszystkie atrybuty urządzenia:
(oczywiście z numerami urządzeń zamiast x). Wybierz unikalny zestaw identyfikatorów, np. IdVendor + idProduct. Możesz także potrzebować SerialNumber, jeśli masz więcej niż jedno urządzenie z tym samym idVendor i idProduct. Numery seryjne powinny być unikalne dla każdego urządzenia.
3. Utwórz plik
/etc/udev/rules.d/99-usb-serial.rules
zawierający coś takiego jak ten wiersz:(zakładając, że nie potrzebujesz tam numeru seryjnego i oczywiście z numerami idVendor i idProduct, które znalazłeś w kroku 2.
4. Załaduj nową regułę:
5. Sprawdź, co się stało:
pokaże, na jaki numer ttyUSB poszedł dowiązanie symboliczne. Jeśli tak
/dev/ttyUSB1
, sprawdź, kto jest jego właścicielem i do której grupy należy:Więc dla zabawy:
źródło
idVendor
iidProduct
są dokładnie takie same? (dwa czujniki podłączone do identycznych modeli modułów USB i UART)udevadm info --name=/dev/ttyUSB1 --attribute-walk
dla obu urządzeń i poszukaj numerów seryjnych, powinny być one unikalne dla każdego urządzenia. Jeśli twoje czujniki nie mają numeru seryjnego, czy możesz podać, jakie są?Problem z wieloma identycznymi urządzeniami USB
Mam Rasperry Pi z czterema kamerami. Biorę pix z
fswebcam
którym identyfikuje kamery jak/dev/video0
..video3
. Czasami kamera jestvideo0
,vide02
,video4
avideo6
jednak możemy zapomnieć o tym teraz.Potrzebuję stałego identyfikatora, aby zidentyfikować numer kamery, aby np.
video0
Zawsze był tym samym aparatem, ponieważ podpisuję zdjęcia. Niestety nie dzieje się to niezawodnie - przy starcie kamery są wyliczane jakovideo0
...video3
ale nie zawsze w ten sam sposób.Wszystkie kamery mają ten sam identyfikator i numer seryjny.
Rozwiązaniem tego problemu są reguły udev, ale jest tam również wiele haczyków na ryby.
Jeśli wydasz polecenie
dostajesz wyrzutek wyjściowy, ale najważniejsze są
Bit KERNELS jest portem koncentratora USB. Przy czterech kamerach są cztery z nich - nie zmieniają się przy ponownym uruchomieniu, ale
video{x}
powiązanie z portem może się zmienić.Potrzebujemy więc reguły udev, aby powiązać numer wideo z portem koncentratora USB - coś takiego:
Wygląda prosto - dostęp do kamery za pomocą
Tyle że to nie działa - jeśli umieścisz to w regule udev, a system przydzieli wideo0 (podczas rozruchu) do innego portu, reguła udev zostanie zignorowana. Symlink do w
/dev/camera0
zasadzie mówino such device
. Punkt wyjścia.Chcemy powiązać dowiązanie symboliczne z adresem koncentratora USB, a nie
video{x}
liczbą. Zajęło to program w języku Python.Pierwszym krokiem było biec
dla
x
między 1 i 8. Istnienietst.jpg
po każdej rozmowie Określa, czy tam jest kamera wideo na ten numer. Z tego stwórz listę aktywnych numerów wideo. Moje doświadczenie jest takie, że jest to albo0,1,2,3
lub0,2,4,6
kamer użyłem.Inni mogą oczywiście zbudować tę listę przy użyciu innego procesu.
Następnie dla każdego numeru wideo na liście uruchom
i wyodrębnij
KERNELS= line
zdd
. Z tego procesu powstaje lista adresów portów USB kamer. Posortuj tę listę, aby w następnym kroku zawsze przetwarzać ją w tej samej kolejności. Nazwij to „listą adresów”.Uruchom program
udevadm … > dd
ponownie i stwórz listę, która wyglądaTeraz przejdź przez listę adresów - dla każdego wpisu znajdź odpowiedni wpis z listy filmów. Utwórz nową listę, która wygląda jak zbiór linii takich jak
X (numer dowiązania symbolicznego) zostaje zastąpiony numerem kolejnym na liście adresów.
Teraz masz regułę udev, która działa. Dowiązanie symboliczne powiązane z adresem koncentratora USB bez względu na numer wideo przypisany do tego portu podczas uruchamiania.
Napisz ostateczną listę do pliku
/etc/udev/rules.d/cam.rules
. Uruchom,udevadm trigger
aby go aktywować, a zadanie zostanie wykonane./dev/camera2
będzie tą samą kamerą (port USB) niezależnie od numeru wideo.źródło
Udało mi się także znaleźć unikalne urządzenie
/dev/serial/by-id
. Nie próbowałem jeszcze restartu, ale pliki w tym katalogu były tylko linkami do odpowiedniego pliku urządzenia (ttyACM[0-9]
) .`Korzystam z arch. Linuxa na Raspberry Pi, ale natknąłem się na nie, wykonując a
find
dla nazw plików zawierających „Arduino”. Moje programy w Pythonie działają poprawnie, używając tych plików jako urządzeń do odczytu / zapisu danych do / z moich Arduinos (jak dotąd dwa na jednym Pi).źródło
Wystarczy powiedzieć, że powyższe działało dla mnie, a także automatycznie zamontowało urządzenie dla mnie po tym, jak umieściłem wpis w / etc / fstab (a także wywołuje umount po usunięciu pendrive)
to znaczy
/ etc / fstab
cat /etc/udev/rules.d/5-usb-stick.rules
Po włożeniu pamięci USB otrzymuję:
źródło