J'ai un Arduino qui est parfois lié à d' /dev/ttyUSB0
autres fois /dev/ttyUSB1
, faisant échouer mon script.
Je ne veux pas énumérer toutes les possibilités de l'emplacement de mon appareil, mais je préférerais qu'il soit lié à un endroit statique, par exemple /dev/arduino
.
Comment puis-je y arriver?
linux
arch-linux
usb
serial-port
arduino
k0pernikus
la source
la source
Réponses:
Comme suggéré, vous pouvez ajouter des règles udev. J'ai édité le
/etc/udev/rules.d/10-local.rules
pour contenir:Vous pouvez vérifier les variables de votre appareil en lançant
Il existe un guide plus détaillé que vous pouvez lire sur http://www.reactivated.net/writing_udev_rules.html
la source
udevam
? Et il est important de noter quemy_uart
crée le lien symbolique sous/dev/my_uart
. J'ai écrit/dev/arduino
la première fois pour la première fois et ça a échoué tant quearduino
c'est suffisant.udevadm
devrait sortir par lui-même quand c'est fait.La syntaxe de la règle ci-dessus peut fonctionner sur certaines distributions, mais pas sur la mienne (Raspbian). Comme je n'ai jamais trouvé un seul document qui explique tous les tenants et les aboutissants, j'ai écrit le mien, à retrouver ici . C'est ce que cela revient à.
1. Découvrez ce qu'il y a sur ttyUSB:
2. liste tous les attributs de l'appareil:
(avec votre numéro de périphérique (s) au lieu de x, bien sûr). Choisissez un ensemble d'identifiants uniques, par exemple idVendor + idProduct. Vous aurez peut-être également besoin du numéro de série si vous avez plusieurs périphériques avec les mêmes idVendor et idProduct. Les numéros de série doivent être uniques pour chaque périphérique.
3. Créez un fichier
/etc/udev/rules.d/99-usb-serial.rules
contenant quelque chose comme cette ligne:(en supposant que vous n'avez pas besoin d'un numéro de série, et bien sûr des numéros pour idVendor et idProduct que vous avez trouvés à l'étape 2.
4. Chargez la nouvelle règle:
5. Vérifiez ce qui s'est passé:
montrera quel numéro ttyUSB le lien symbolique est allé. Si c'est le cas
/dev/ttyUSB1
, vérifiez ensuite à qui appartient ce groupe et à quel groupe il appartient:Alors juste pour le plaisir:
la source
idVendor
etidProduct
sont exactement les mêmes? (deux capteurs attachés sur des modules USB à UART de modèle identique)udevadm info --name=/dev/ttyUSB1 --attribute-walk
comme suit pour les deux périphériques et recherchez les numéros de série. Ils doivent être uniques pour chaque périphérique. Si vos capteurs n’ont pas de numéro de série, pouvez-vous les préciser?Le problème de plusieurs périphériques USB identiques
J'ai un Rasperry Pi avec quatre caméras. Je prends pix avec
fswebcam
qui identifie les caméras comme/dev/video0
..video3
. Parfois , la caméra estvideo0
,vide02
,video4
etvideo6
mais nous pouvons oublier que pour l' instant.J'ai besoin d'un identifiant persistant pour identifier un numéro de caméra, par exemple,
video0
c'est toujours la même caméra car je sous-titrai les images. Malheureusement, cela n’arrive pas de façon fiable: au démarrage, les caméras sont énumérées de la manière suivantevideo0
…video3
mais pas toujours de la même manière.Les caméras ont toutes le même ID et le même numéro de série.
La solution à ce problème implique des règles udev, mais il y a aussi beaucoup d'hameçons.
Si vous lancez la commande
vous obtenez une table de sortie, mais les éléments saillants sont
Le bit KERNELS est un port hub USB. Avec quatre caméras, il y en a quatre - elles ne changent pas au redémarrage, mais le
video{x}
port associé à un port peut changer.Nous avons donc besoin d’une règle udev pour lier un numéro de vidéo à un port de hub USB - quelque chose comme:
Ça a l'air simple - accéder à la caméra avec
Sauf que cela ne fonctionne pas - si vous mettez cela dans une règle udev et que le système a alloué video0 (au démarrage) à un autre port, la règle udev est ignorée. Le lien symbolique
/dev/camera0
dit en grosno such device
. Carré un.Ce que nous voulons, c'est lier un lien symbolique à une adresse de concentrateur USB, pas à un
video{x}
numéro. Il a fallu un programme Python.La première étape a été de courir
pour
x
entre 1 et 8. L'existence detst.jpg
après chaque appel identifie s'il y a une caméra sur ce numéro de vidéo. À partir de cela, faites une liste des numéros de vidéo actifs. Mon expérience a été que c'est soit0,1,2,3
ou0,2,4,6
pour les appareils photo que j'ai utilisés.D'autres peuvent bien sûr construire cette liste en utilisant un processus différent.
Puis pour chaque numéro de vidéo dans la liste
et extraire le
KERNELS= line
dedd
. A partir de ce processus, vous obtenez une liste d'adresses de ports USB pour les caméras. Triez cette liste de manière à la traiter toujours dans le même ordre à l'étape suivante. Appelez cela la "liste d'adresses".Exécutez la
udevadm … > dd
chose à nouveau et faites une liste qui ressemble àParcourez maintenant la liste d'adresses - pour chaque entrée, recherchez l'entrée correspondante dans la liste de vidéos. Créez une nouvelle liste qui ressemble à une collection de lignes comme
Le x (numéro de lien symbolique) est remplacé par le numéro de séquence dans la liste d'adresses.
Maintenant, vous avez une règle udev qui fonctionne. Un lien symbolique lié à une adresse de concentrateur USB, quel que soit le numéro de vidéo attribué à ce port au démarrage.
Écrivez la liste finale dans un fichier
/etc/udev/rules.d/cam.rules
. Exécuterudevadm trigger
pour l'activer et le travail est terminé./dev/camera2
sera la même caméra (port USB) quel que soit son numéro de vidéo.la source
J'ai également pu trouver un appareil unique dans
/dev/serial/by-id
. Je n'ai pas encore essayé de redémarrer, mais les fichiers de ce répertoire étaient simplement des liens vers le fichier de périphérique approprié (ttyACM[0-9]
) .`Je suis en train de lancer arch linux sur Raspberry Pi, mais je suis tombé sur eux simplement en faisant un
find
pour les noms de fichiers contenant "Arduino". Mes programmes python fonctionnent correctement en utilisant ces fichiers comme périphériques pour lire / écrire des données vers / depuis mes Arduinos (jusqu'à présent, deux sur un seul Pi).la source
Juste pour dire que ce qui précède a fonctionné pour moi et a également monté automatiquement le périphérique pour moi après avoir placé une entrée dans / etc / fstab (et cela appelle également umount après le retrait du stick)
c'est à dire
/ etc / fstab
cat /etc/udev/rules.d/5-usb-stick.rules
Donc, après avoir inséré ma clé USB, je reçois:
la source