USB-Gerätepersistenz über Reboots hinweg
Von (#547) Theoi-Meteoroi auf Github:
Die Verwendung von USB-Geräten, wie z. B. USB-zu-Seriell-Schnittstellen, zum Anschluss eines Sensors ist zwar praktisch, wirft aber ein Problem auf, wenn mehrere Geräte vorhanden sind und das System neu gestartet wird. Nach einem Neustart gibt es keine Garantie dafür, dass das Gerät mit demselben Namen bestehen bleibt.
Wenn beispielsweise Sensor A /dev/ttyUSB0 und Sensor B /dev/ttyUSB1 ist, kann nach einem Neustart Sensor A /dev/ttyUSB1 und
Sensor B kann /dev/ttyUSB0 sein. Dies führt dazu, dass das falsche Gerät für eine Messung abfragt wird, was möglicherweise zu
eine Fehlmessung oder schlimmer noch, eine falsche Messung, weil die Antwort nicht vom richtigen Sensor stammt (ich habe gesehen, dass mein
Temperatursensor aus diesem Grund 700+ Grad Celsius angezeigt!). Befolgen Sie die folgenden Anweisungen, um dieses Problem zu beheben.
Ich verwende udev, um einen dauerhaften Gerätenamen ('/dev/dust-sensor') zu erstellen, der mit dem /dev/ttyUSBn verknüpft wird, das
bei der Start des Geräts im Kernel zugeordnet wird. Die einzige Voraussetzung ist ein vom USB-Gerät zurückgegebenes Attribut, das eindeutig ist. Der
übliche Fall ist, dass keines der Attribute eindeutig ist und man nur mit VID und PID dasteht, was in Ordnung ist, solange
Sie keine anderen Adapter haben, der die gleiche VID und PID meldet. Wenn Sie mehrere Adapter mit der gleichen VID
und PID haben, dann haben sie hoffentlich ein anderes eindeutiges Attribut. Mit diesem Befehl können Sie alle Attribute ermitteln. Führen Sie ihn für jedes USB-Gerät aus
und vergleichen Sie dann die Unterschiede, um möglicherweise ein zu verwendendes Attribut zu finden.
pi@raspberry:~ $ lsusb
Bus 001 Device 008: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
In diesem Fall lautet die Hersteller-ID 10c4 und die Produkt-ID ea60.
Da ich das Feld für die Seriennummer geändert habe, wird diese eindeutig sein.
pi@raspberry:~ $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep serial
SUBSYSTEMS=="usb-serial"
ATTRS{serial}=="ZH03B180904"
ATTRS{serial}=="3f980000.usb"
Jetzt habe ich ein Attribut, mit dem ich udev sagen kann, was es tun soll. Ich erstelle eine Datei in /etc/udev/rules.d mit einem Namen wie "99-dustsensor.rules". Unter dieser Datei sage ich udev, welchen Gerätenamen es erstellen soll, wenn es dieses Gerät angeschlossen sieht:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="ZH03B180904"
SYMLINK+="dust-sensor"
Zum Testen:
pi@raspberry:/dev $ sudo udevadm trigger
pi@raspberry:/dev $ ls -al dust-sensor
lrwxrwxrwx 1 root root 7 Oct 6 21:04 dust-sensor -> ttyUSB0
Jetzt wird der Staubsensor jedes Mal, wenn er eingesteckt wird, unter /dev/dust-sensor angezeigt
Setup für Borgmann Aquaponik Hydroponik
USB-Port finden: lsusb
Bus 001 Device 014: ID 2a03:0043 dog hunter AG Arduino Uno Rev3
Konfiguration in: /etc/udev/rules.d/99-sensor_a.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0043", SYMLINK+="ponik-sensor-a"
Test mit:
udevadm trigger && ls -l /dev/ponik-sensor-a
root@raspberrypi:/dev# ls -al ponik-sensor-a
lrwxrwxrwx 1 root root 7 17. Jul 04:29 ponik-sensor-a -> ttyACM0
ID: 79