lunes, septiembre 14, 2015

tl;dr: Python 2 vs Python 3

$ cat main.py
print (u"Hello " + b"World!");

$ python2 main.py
Hello World!

$ python3 main.py
Traceback (most recent call ast):
  File "main.py", line 1, in <module>
    print (u"Hello " + b"World!");
TypeError: Can't convert 'bytes' object to str implicitly

domingo, marzo 29, 2015

Aprendiendo a programar: eligiendo un lenguaje

Si querés aprender a programar y querés elegir un lenguaje, usá uno que te permita aprender los conceptos básicos de programación: Variables, uso de memoria, estructuras de control, flujo de ejecución, expresiones, abstracción, programación modular y reuso de código, recursión, estructuras de datos, algoritmos, eficiencia, programación genérica. Punteros es un tema que todos deberían conocer y estudiar, conocer de su existencia y de su razón.

lunes, enero 19, 2015

12v UPS para Raspbery Pi

Raspberry Pi UPS

Andaba necesitando una forma de mantener mi Raspbery Pi funcionando aún con cortes de luz. Mi circuito está basado en este otro regulador de MRE con la diferencia que lo armé con lo que tenía en mi caja de herramientas. Los materiales son:

  • Batería de gel de 12v 7Ah
  • Cargador de batería de 12v de flote, 1A.
  • Regulador 5V switching (¡una joyita!)
  • Raspberry Pi
  • Relés, Op Amps, resistencias, transistor, etc.
La idea del circuito es muy simple: conmutar entre 12v de un transformador y 12v de una batería de gel en el momento en que el transformador pierde energía. Para esto usamos el circuito de MRE que con un op-amp en modo comparador contra un diodo zener abre o cierra los relés.

La primer modificación importante al circuito de MRE es reemplazar el diodo zener con un LM336Z-5.0 que, a diferencia de un zener, el LM336Z es un integrado para usar como referencia de voltaje, por ejemplo en un instrumento de medifición. 

Este integrado es el mismo recomendado por XQ2FOD en su circuito de regulación de energía solar (muy interesante y vale la pena leerlo), y los que lean con atención verán que tanto el circuito de MRE como de XQ2FOD funcionan con el mismo principio: un op-amp como comparador de tensión.

Mi primer circuito no tenía un comparador de tensión, sino que se conectaban los 12v del transformador directo a los relés. El problema con hacer esto es que los relés necesitan mucha menos corriente que el regulador de 5V, y permanecían cerrados durante un segundo de más, por lo que la Rasperry Pi se reiniciaba. 

El comparador de tensión lo que hace entonces es cortar los relés antes que la tensión caiga por debajo de lo que el regulador de 5V necesita; esto se ajusta manualmente con el preset de 100k R1. Hice la prueba de cortar intermitentemente la tensión de los 12v del transformador y la Raspberry Pi nunca se reinició.

Otra diferencia con el circuito de MRE es que mi circuito usa dos relés en lugar de uno. El primer relé conmuta entre los 12v del transformador de 220v-12v, y el segundo conmuta el cargador de batería hacia la batería cuando hay 220v en la línea. El segundo relé existe para que el cargador no esté conectado a la batería al momento de cortarse los 220v de línea.

El componente importante y final es el regulador switching de 5V. De mi parte usé el RECOM R-78B5.0-1.0 que posee una de conversión eficiencia del 97%, por lo que a diferencia del clásico regulador lineal 7805 no necesita disipador de calor: a 12v 1A el 7805 posee una eficiencia del ~45%.


jueves, enero 08, 2015

oggdec lame pipe: converting ogg to mp3

If this command shows "Warning: unsupported audio format":
oggdec -o - file.ogg | lame - file.mp3
Try using raw mode:
oggdec -R -o - file.ogg | lame -r - file.mp3
Or, if the generated mp3 file is pure noise, swap the bytes with -x:
oggdec -R -o - file.ogg | lame -rx - file.mp3
To convert a batch of multiple ogg files:
for x in *.ogg; do oggdec -R -o - "$x" | lame -rxh - "$x.mp3"; done