Convirtiendo un programa de Python en un servicio

Hace no mucho necesite que un programa en escrito en python se ejecutara en una Raspberry Pi al inicio, es decir, ni bien booteara el sistema operativo iniciara el programa.

La forma mas adecuada fue hacerlo por medio de systemctl definiendo algunos parámetros.

Por supuesto que el programa debe tener algún tipo de bucle que mantenga el hilo activo; de lo contrario se va a ejecutar una sola vez y concluirá.

Para los fines del ejemplo, voy a utilizar ServerHotKeys.py que escucha el puerto serie y si llega ciertos caracteres reproduce un archivo mp3.

Este programa lo pueden encontrar en el siguiente repositorio: https://github.com/gsampallo/hotkeys_server

El ejemplo lo realizo sobre una raspberry pi 3 con rasbian. El primer paso será clonar el repositorio:

git clone https://github.com/gsampallo/hotkeys_server

Nos quedara el proyecto en la ruta /home/pi/hotkeys_server.

El siguiente paso será crear un archivo bash, al cual llamaremos start.sh que ejecute el programa:

#!/bin/bash
cd /home/pi/hotkeys_server
python3 ServerHotKeys.py

Debemos dar permiso de ejecución sobre el archivo, lo hacemos con:

chmod +x start.sh

Luego debemos crear un archivo al que llamaremos ServerHotKeys.service, que contendrá las características del servicio, su contenido sera el siguiente:

[Unit]
Description=ServerHotKeys Service
After=multi-user.target
 
[Service]
Type=idle
ExecStart=bash /home/pi/hotkeys_server/start.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=ServiceHotKeys

[Install]
WantedBy=multi-user.target

Luego debemos crear un nuevo archivo con la configuración, al cual llamaremos ServerHotKeys.conf que contendra lo siguiente:

if $programname=='ServiceHotKeys' then /home/pi/hotkeys_server/log/ServiceHotKeys.log & stop

De modo de ir almacenando en la carpeta log dentro de hotkeys_server los archivos de log del servicio; no olvidar de verificar que exista este directorio, en caso que no este crearlo.

Copiamos ambos archivos a la ruta correspondiente:

sudo cp ServiceHotKeys.service /lib/systemd/system/
sudo cp ServiceHotKeys.conf /etc/rsyslog.d/

Cambiamos los permisos sobre el service:

sudo chmod 644 /lib/systemd/system/ServiceHotKeys.service

Luego debemos recargar el demonio para que tome el nuevo servicio, habilitarlo y por ultimo iniciarlo para que quede corriendo.

sudo systemctl daemon-reload

sudo systemctl enable ServiceHotKeys.service
sudo systemctl restart rsyslog

sudo systemctl start ServiceHotKeys.service

De esta forma queda habilitado el servicio para que siempre se ejecute al iniciarse la Raspberry Pi.

Tener en cuenta que el programa que tome de ejemplo, utiliza el puerto serie de la pc y tiene algunas dependencias, por lo que puede que no funcione; pero es posible tomarlo como ejemplo y construir su propio servicio en base a este.

Construyendo PanoramicCam

En una entrada anterior comente como trabaja el software de PanoramicCam, pueden encontrarlo aquí.

En este punto me quiero enfocar un poco sobre el hardware utilizado, el cual fue auspiciado por DigitSpace, los links de cada uno de los componentes están debajo:

Comencé cortando una pieza de pcb ligeramente superior al tamaño del ESP32-CAM:

Utilice el soporte impreso para marcar donde irían los agujeros para sujetar el pcb al soporte; cuidado al performar, el pcb puede quebrarse.

Luego posicionamos el ESP32-CAM junto con los headers y lo soldamos en la posición, de manera que quede de la siguiente manera:

Debemos soldar 6 cables sobre el ESP32-CAM; dos son la alimentación que van a 5V y GND, y los cuatro restantes es la comunicación con el ULN2003, van soldados a
GPIO 12,13,15 y 14.

Se utiliza el siguiente esquema de conexiones:

Noten que en la alimentación del ESP32-CAM utilice un condensador, usualmente no lo requiere y funciona correctamente, pero ayudo mucho a prevenir brownout. En mi caso utilice un condensador electrolítico, que era lo que tenia disponible en el momento.

Una vez soldados los cables, podemos comenzar a montar la base del soporte;

El soporte impreso tiene una mueca donde entra el breakout usb, antes de pegarlo a la base, es necesario soldar cuatro cables, dos para los 5V, en mi caso utilice dos tipos de conectores diferentes: uno para conectar la alimentación del ESP32-CAM y otro para conectar el ULN2003.

El pcb del ULN2003 lo atornille al soporte, aunque podría ir simplemente pegado. Si lo pegan tengan cuidado de no aplicar mucho pegamento derretido junto, el calor puede deformar el soporte.

El motor paso a paso va montado sobre el soporte con dos tornillos y tuercas; las tuercas las puse en la parte interior de manera que se sujeten contra el mismo motor y sea sencillo de ajustar.

El soporte impreso no tiene 100% la coincidencia de donde van los tornillos, los volvi a hacer con un taladro y quedo bien. Decidi que el STL no tenga las perforaciones de los tornillos sino que cada uno las haga por su cuenta, de esa manera permite reemplazar el motor por otro.

El link de thingiverse para descargar los modelos es el siguiente:
https://www.thingiverse.com/thing:4270344

El pcb donde tenemos el ESP32-CAM va montado sobre el soporte vertical utilizando un precinto; en mi caso no tenia ningún tornillo de ese diámetro y también previene de sumar mas peso al cabezal.

También utilice un precinto para mantener juntos los cables.

Es importante pasarlos por el orificio del soporte impreso antes de soldar los conectores. Luego sera imposible.

Luego solo resta poner los conectores a los cables, en mi caso emplee de diferente color y los agrupe por bobina con una cinta:

De esta manera tenemos para la bobina 1 en IN1 y IN2 y para la bobina 2 en IN3 y IN4.

Por ultimo debemos organizar un poco los cables y colocar la tapa inferior con dos tornillos.