Eu tenho um sensor de luz USB que uso há quase um ano sem problemas em um Raspberry Pi 3. Agora estou tentando usá-lo em um Raspberry Pi Zero Wireless.
Segui a documentação do fabricante do sensor para criar uma regra udev no Pi Zero (que era idêntica à regra que eu tinha no Pi3) para dar ao usuário "pi" permissões para usar o dispositivo USB (pois não quero para usá-lo como root):
sudo nano /etc/udev/rules.d/51-yoctopuce.rules
Adicionadas as seguintes linhas no arquivo:
# udev rules to allow write access to all users for Yoctopuce USB devices
SUBSYSTEM=="usb", ATTR{idVendor}=="24e0", MODE="0666"
Reiniciei e executei o comando do fabricante para usar o sensor:
YModule inventory
É neste ponto que recebo uma mensagem de erro:
ERR: Não é possível registrar usb: o usuário não tem permissões suficientes para acessar dispositivos USB (ypkt_lin:406)
Se eu conectar o mesmo sensor ao meu RPi3 e executar o mesmo comando, obterei uma lista dos números de série dos sensores enviados para o terminal (a saída esperada deste comando).
Se eu executar o comando (no Pi Zero) como root, ou seja, sudo ./bin/YModule Inventory , o comando será executado corretamente e a saída será o número de série do sensor (a saída esperada para o comando).
Então, claramente, há um problema de permissão em jogo. Só não sei como consertar.
Estou assumindo que há um erro em algum lugar nas minhas regras do udev, mas não sei onde, dado que o arquivo de regras no Pi Zero é idêntico ao arquivo de regras no meu Pi 3 (de trabalho) (que é idêntico ao que é no site do fabricante).
Saída de lsusb:
Bus 001 Device 002: ID 24e0:0050
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
O primeiro dispositivo é o sensor de luz Yoctopuce (24e0 é definitivamente o ID correto do fornecedor).
Saída de sudo lsusb -v -d 24e0:0050 :
Barramento 001 Dispositivo 002: ID 24e0:0050
Descritor do dispositivo:
bComprimento 18
bDescritor Tipo 1
bcdUSB 2.00
bDeviceClass 0 (definido no nível da interface)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x24e0
idProduto 0x0050
bcdDispositivo 0.01
iFabricante 1 Yoctopuce
iProduct 2 Yocto-Light-V3
iSerial 3 LIGHTMK3-1136C5
bNumConfigurações 1
Descritor de configuração:
bComprimento 9
bDescritor Tipo 2
wComprimento Total 41
bNumInterfaces 1
bConfigurationValue 1
iConfiguração 0
bmAtributos 0x80
(Bus Powered)
Potência máxima 100mA
Descritor de Interface:
bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 29 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1
Status do dispositivo: 0x0000
(alimentado por ônibus)
O conteúdo do meu diretório /etc/udev/rules.d/ é: 51-yoctopuce.rules 99-com.rules
Também tentei renomeá-lo para 100-yoctopuce.rules, caso algo no arquivo 99-com.rules estivesse causando o problema, mas isso resultou no mesmo erro.
Meu entendimento é que depois de editar o arquivo de regras, tudo o que preciso fazer para aplicá-lo é reiniciar o sistema. É isso mesmo, ou está faltando algum comando?
Alguma sugestão, por favor, sobre como proceder para corrigir isso? Desde já, obrigado.
Conteúdo do arquivo /etc/udev/rules.d/99-com.rules (no Pi Zero):
SUBSYSTEM=="input", GROUP="input", MODE="0660"
SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"
SUBSYSTEM=="spidev", GROUP="spi", MODE="0660"
SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\
chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\
chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\
chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\
'"
KERNEL=="ttyAMA[01]", PROGRAM="/bin/sh -c '\
ALIASES=/proc/device-tree/aliases; \
if cmp -s $ALIASES/uart0 $ALIASES/serial0; then \
echo 0;\
elif cmp -s $ALIASES/uart0 $ALIASES/serial1; then \
echo 1; \
else \
exit 1; \
fi\
'", SYMLINK+="serial%c"
KERNEL=="ttyS0", PROGRAM="/bin/sh -c '\
ALIASES=/proc/device-tree/aliases; \
if cmp -s $ALIASES/uart1 $ALIASES/serial0; then \
echo 0; \
elif cmp -s $ALIASES/uart1 $ALIASES/serial1; then \
echo 1; \
else \
exit 1; \
fi \
'", SYMLINK+="serial%c"
Acabei de resolver o problema colocando as duas linhas de /etc/udev/rules.d/51-yoctopuce.rules no final do arquivo de regras pré-existente (em /etc/udev/rules.d/99-com. rules), deletei o arquivo 51-yoctopuce.rules e reiniciei.