Showing posts with label raspbian. Show all posts
Showing posts with label raspbian. Show all posts

Sunday, November 21, 2021

udev events, making an udev rule and debugging rules.



udev is a device manager for the linux kernel.

when you connect some device (pendrive, camera, microphone) on a linux machine, you have a daemon listen to events that are fired when the kernel register a new device. All devices are mapped to a file on /dev so you could check some info about the device with this command:

udevadm info -a -n  /dev/DEVICE_NAME

i.e.: udevadm info -a -n  /dev/ttyUSB2

udevadm info -a -n  /dev/ttyUSB2 | grep '{devpath}' | head -n 1
udevadm info -a -n  /dev/ttyUSB2 | grep '{idVendor}' | head -n 1
udevadm info -a -n  /dev/ttyUSB2 | grep '{idProduct}' | head -n 1
udevadm info -a -n  /dev/ttyUSB2 | grep '{serial}' | head -n 1


knowing the device info we could make a rule based in the information and execute a new action: make a file, make a symlink or execute a script. For example I want to create a rule that match with the attributes devpath, idVendor, idProduct, serial and generate a new symlink.

we need to create a file into:

/etc/udev/rules.d/99-some-rule.rules

- in this file we need to use "" in the values.
- each line is a rule.
- each line has many or one attribute and one action. When the attributes matched  the action is executed, that's all.
- if you edit or create a new rule, you need to load and trigger all rules again.

udevadm control --reload-rules && udevadm trigger


- so sometimes is tricky check why some rule is not executed. For debug you have:

    - udevadm test /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0

      the devices path you could obtain with the comand udevadm info.

    - udevadm monitor

      show the events that are fired.
    
    - udevadm control --log-priority=debug

      set the environment on debug mode.

    - udevadm test $(udevadm info --query=path --name=ttyUSB0)
      
      test all rules associated to the device name ttyUSB0

- when you have an syntax error on some rules file, this will appear in the logs:
    - journalctl -f

- restart service:
    - systemctl restart systemd-udevd
 

- kernel messages
    - dmesg

- example: file called 99-new-rule.rules:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{devpath}=="1.2", ATTRS{bcdDevice}=="0264", SYMLINK+="FANCY_NAME"

The 99 number indicated the priority for execution. in this case would be the last one to execute.

It's important to put double quotes instead single quote.

Saturday, April 27, 2019

octoprint y raspberry pi

Recientemente compré una raspberry con el objetivo de instalarle octoprint, en este post quedan mis apuntes de como configurarlo y utilizar en cosas básicas.

Cuando busqué que raspberry buscar lo primero fue leer que viniese con wifi y bluetooth integrado, ya que por cada uno de estos servicios procesos consume un puerto usb.
Así que la compra terminó decantando en la versión 3B plus
y fue amor ♥
solo queda agregar disipadores unir con el case y listo para usar. La imagen la descargue en específico de:
Luego de revisar la integridad de la imagen con el comando md5sum la pasé a la memoria sd mediante el comando dd y sync, fue bastante rápido ya que la imagen no pesa tanto. Una vez hecho esto inicié la imagen de octoprint e ingresé por login, esta imagen no tiene interfaz gráfica por lo que vas a encontrar que es una terminal con login, por defecto esta imagen viene con un login preestablecido que puede ser cambiado con el comando passwd

Datos por defecto.
default username is "pi",
default password is "raspberry"
Una vez haces login editas el archivo octopi-wpa-supplicant.txt que se encuentra en /boot (de la raspberry) Es importante cambiar la contraseña ya que está habilitado ssh! así si lo conectas a una impresora está expuesto.

>> ssh pi@192.168.0.23

o mediante su acceso web

>> http://octopi.local


Cuando ingresas por primera vez al acceso web, octopi te solicita llenar la configuración para limitar el acceso e incluso cambiar las contraseñas.




También por comodidad se puede asignar en el router que siempre le asigne la misma IP de esta forma siempre será accesible y la dirección memorizada.





Cuando ya todo está instalado, te muestra unas recomendaciones

Algo importante es no apagarla desconectando la fuente de poder porque podría tener problemas en un futuro, y requeriría instalar de nuevo la imagen. siempre apagar en el botoncito y esperar a que el led de booteo se muestre en rojito o apagado.
Otro punto importante, tener este comando en mente para cambiar alguna configuración.
>> sudo raspi-config
    Octo print te permite utilizar la raspberry como slicer el tema es que si tienes configuraciones muy especificas que hiciste en el slicer de máquina con algun software particula, conviene sólo usar octoprint enviando el gcode, es muy sencillo te permite organizar todo en carpetas.


así que eso es todo por hoy.
chau




UPDATE: agregando reglas udev para que reconozca que impresora se conectó a cual puerto.

Algo común al reiniciar la raspberry, apagar una impresosora, o dependiendo de la secuencia en la que detecta a la impresora, si tienes más de una impresora conectada cambia el puerto de conexión por la impresora que encendió primero o la que detectó primero.

Para evitar eso es necesario crear un regla udev, que no te dejará de asignar el puerto random tty, pero al menos puedes crear un duplicado apuntando al mismo dispositivo en este caso la impresora.

En el directorio:


/etc/udev/rules.d/

van a conseguir todas las reglas por defecto que realiza el sistema o distribución. en nuestro caso vamos agregar una más con la siguiente nomeclatura

99-usb-serial1.rules
99-usb-serial.rules

donde el contenido de la regla es el siguiente:


SUBSYSTEM=='tty', ATTRS{idVendor}=="0403", ATTRS{idProducto}=="6001", ATTRS{serial}=="A96H17RV", SYMLINK+="TTYUSBTORNADO"

Y eso es todo! 

esto sirve para la impresora tornado, estos numeros de idVendor y idProducto lo obtienes mediante varios comandos como:



udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
 
dmesg | grep tty
 
lsusb

lsusb -v | grep -iE '(^bus|idvendor|idproduct)'  
 
udevadm info -a -n  /dev/ttyUSB0 | grep '{serial}' | head -n 1
 



y comparando, desconectando y conectando leyendo lsusb y dmesg lo identificas mas rapido.