sábado, 30 de abril de 2011

Como tomar screenshots automáticamente y convertirlos en video

Primer paso: crear la secuencia de screenshots, usando la utilidad "scrot":

  • s=1; while /bin/true ; do scrot -q 80 "${s}.png" -e "convert -crop 800x600+0+24 ${s}.png ${s}.jpg" ; let s=s+1 ; sleep 1 ; done
Atención! Este comando sobrescribirá cualquier archivo preexistente! Para continuar una secuencia pre-existente, se puede cambiar el valor inicial de "s". Por ejemplo, si ya tenemos desde el archivo 1.png hasta el 71.png, podemos usar s=72:
  • s=72; while /bin/true ; do scrot -q 80 "${s}.png" -e "convert -crop 800x600+0+24 ${s}.png ${s}.jpg" ; let s=s+1 ; sleep 1 ; done
Segundo paso: generar un video con dicha secuencia de archivos, usando "ffmpeg":
  • ffmpeg -r 4 -b 512k -i %d.jpg OUTPUT.avi
Actualización: para que ffmpeg funcione, los nombres de los archivos deben ser secuenciales, y sin ningún archivo faltante. Por lo tanto, si antes de generar el video queremos borrar algunos archivos, vamos a tener problemas. Pero hay una forma muy fácil de crear una secuencia de archivos, arreglando los 'faltantes':
  • max=1000 ; ren=1 ;  for f in `seq 1 $max` ; do [ -e $f.jpg ] && { [ $f -ne $ren ] && { echo mv -i $f.jpg $ren.jpg ; } ; let ren=ren+1 ; } ; done
Ese pequeño script generará por pantalla todos los 'mv' que hace falta ejecutar para arreglar la secuencia. Si quitamos el 'echo', el script ejecutará directamente el comando 'mv'. Ajustar 'max' al número más grande dentro de la secuencia.

martes, 26 de abril de 2011

os.path.normpath() de Python y las //

No es la primera vez que me sucede! Otra vez caí en el extraño funcionamiento  de os.path.normpath()!

os.path.normpath('/esto') = '/esto'
os.path.normpath('/esto/') = '/esto'
os.path.normpath('//esto') = '//esto'
os.path.normpath('//esto/') = '//esto'
os.path.normpath('///esto') = '/esto'
os.path.normpath('///esto/') = '/esto'

Quizá las 2 barras se mantienen al suponer que es un path referenciando algún recurso como se hace en las redes Windows, al estilo //equipo/recurso_compartido.

Solución: usar strip('/') y concatenar un '/' al inicio (suponiendo que siempre trabajamos con path absolutos).


'/' + os.path.normpath('/esto').strip('/') = '/esto'
'/' + os.path.normpath('/esto/').strip('/') = '/esto'
'/' + os.path.normpath('//esto').strip('/') = '/esto'
'/' + os.path.normpath('//esto/').strip('/') = '/esto'
'/' + os.path.normpath('///esto').strip('/') = '/esto'
'/' + os.path.normpath('///esto/').strip('/') = '/esto'


lunes, 25 de abril de 2011

Para acceder Arduino desde Python y scripts shell

He creado una aplicación para acceder a Arduino desde Python. También incluyo unos ejempos para poder accederlos desde el shell. El proyecto está en https://github.com/hgdeoro/py-arduino-proxy

Utilizando un LM35 para medir la temperatura. Necesita 3 cables, 5V, masa, y la "señal".



En el Arduino, conecto los respectivos cables, y el de señal al puerto analógico 0.



El sensor lo dejo afuera, a pleno rayo de sol, y por ahora bajo la protección de un simple fondo de botella.




Agregar plugin de Munin

Sólo hacer un link del script al directorio de plugins:

root@eeepc:~# cd /etc/munin/plugins/
root@eeepc:/etc/munin/plugins# ln -s \
/usr/local/py-arduino-proxy/src/arduino_proxy/tests/analog_read_lm35_munin.py \
analog_read_lm35_munin_
root@eeepc:/etc/munin/plugins# mcedit ../plugin-conf.d/munin-node
## AGREGAR ESTO AL FINAL DEL ARCHIVO
[analog_read_lm35_munin]
user root
env.TTY_DEVICE /dev/ttyACM0
env.ANALOG_PORT 0

Y ahora sólo resta reiniciar munin-node.

root@eeepc:/etc/munin/plugins# service munin-node restart
munin-node start/running, process 22555
root@eeepc:/etc/munin/plugins# 

Y testear que todo haya quedado funcionando correctamente:

root@eeepc:/etc/munin/plugins# munin-run analog_read_lm35_munin
temp.value 10.11

Luego de dos días:







El circuito al que se conecta el LM35 sería así:

viernes, 15 de abril de 2011

Para zafar del problema con Arduino + Ubuntu

He armado un sketch para "zafar" de los problemas que hay con los Arduinos cuando queremos accederlos desde Ubuntu. Sucede que por un bug, tendremos problemas al intententar subir sketchs desde Ubuntu, si en ese momento el Arduino envía información por puerto serial (por ejemlpo usando usando Serial.println()).

La solución definitiva es actualizar el firmware. Otra (la que implementé) es "pausar" la ejecución del programa, hasta que se detecta un "LOW" en el pin 12.

El programa es:





Y la forma de generar le "LOW" en el pin 12 sería:

Lo que hago es dejar la resistencia conectada, así el Arduino funciona con normalidad. Cuando necesito subir un programa nuevo, le saco la resistencia y lo reinicio, y puedo comunicarme sin problemas.