31 de octubre de 2014

Arduino Halloween

Pues para divertirnos en HalloWeen se me ha ocurrido hacer una ArduinoCalabaza con los trastos que tengo por casa: un Led RGG que cambie de color, el medidor de distancia ultrasónica para que detecte si alguien o algo se acerca, un buzzer para hacer sonido y arduino.
De momento no he conseguido que diga "trick-or-treat".

Materiales:
Arduino Nano Rev3 ó Arduino UNO Rev3
Altavoz piezoeléctrico
Led RGB de cátodo comun.
3 resistencias de 100 Ohmnios
Modulo medidor ultrasónico HC-SR04
Unos Cables.
Fuente de alimentación o mediante usb de ordenador.

Esquema:



Código Arduino:


/* ## ARDUINO-HALLOWEEN ###################################### -- by www.misnotaslinux.blogspot.com - 2014 -- Led RGB que cambia de color cada tiempo. Detector de proximidad que activa el buzzer.
Programado con un condicional con millis()
para que simule interrupciones. Para meterlo dentro de una calabaza de Halloween.
########################################################### */ #include const int Trig = 3; // pin "Trig" del HC-SR04 conectado al pin digital 3 de arduino const int Echo = 2; // pin "Echo" del HC-SR04 conectado al pin digital 3 de arduino long cm = 1000; // variable que almacena la medicion de distancia del sensor. Le doy un valor inicial alto para que no suene Ultrasonic HCSR04(Trig,Echo); int pinLedR = 11; // pin Rojo del led RGB int pinLedV = 10; // pin Verde del led RGB int pinLedA = 9; // pin Azul del led RGB long lapso = 2000; // Milisegundos que cambiará de color el led RGB long cuenta = millis() + lapso; // Control del tiempo int dist = 100; // distancia en cm a la que se activa la calabaza int frec = 2500; // frecuencia inicial del sonido void setup(){ pinMode(pinLedR, OUTPUT); // pone el pinLedR como output pinMode(pinLedV, OUTPUT); // pone el pinLedV como output pinMode(pinLedA, OUTPUT); // pone el pinLedA como output } void loop(){ delay(10); // damos un tiempo para que mida el sensor ultrasónico y por efecto sonido cm = HCSR04.convert(HCSR04.timing(), 1); // medimos distnacia frente al sensor if (cm < dist) { tone(8, frec-(cm*20)); } // si hay algo cerca, hace sonar el buzzer con un frecuencia segun la distancia else { noTone(8); } // si no hay nada o nadie callamos el buzzer if ( millis() - cuenta > lapso) { // vemos si el contador ha llegado al tiempo para cambiar color del led analogWrite(pinLedR, 255 * random(0,2)); // colores básicos 0 o 255 al azar en cada canal RGB analogWrite(pinLedV, 255 * random(0,2)); analogWrite(pinLedA, 255 * random(0,2)); cuenta = millis(); // actualizamos el contador } }


La Calabaza:
Hecho esto, el prototipo, el programa ... ahora queda lo mas difícil: "Hacer la La Calabaza".

... y este es el resultado:




En el código se puede cambiar la frecuencia (variable frec) para conseguir diferentes sonidos y el delay( ) para cambiar los efecto de sonido. Con delays de unos 15-20ms se consiguen sonidos parecidos a los de R2D2!!.


Una mente ociosa es el taller del diablo.
Northern Exposure, Temporada 6, Cap.: 5.

Terrorífico!!!!



30 de octubre de 2014

Instalar y configurar ZoneMinder en Debian 7 Wheezy

En mi caso se trata de un sistema Debian 7 Wheezy, con apache2, MySQL, V4L2, y los módulos
necesarios para que funcione la cámara web.

Ahora, vamos instalar y configurar ZoneMinder:

1) Actualizamos la base de datos de paquetes y el sistema:
# aptitude update
# aptitude upgrade

2) Instalamos Zoneminder y sus dependencias:
# aptitude install zoneminder

3) Modificamos el inicio de Zoneminder:
# nano /etc/init.d/zoneminder

          Añadir el sleep de la siguiente forma:

          start() {
              sleep 15
           echo -n "Starting $prog: "

          Salvar (ctrl+o) y salir (ctrl+x).

Con esto zoneminder esperará 15 segundos para aseguarar que la red esta activa.


4) Creamos enlaces simbólicos en apache2:
# ln -s /etc/zm/apache.conf /etc/apache2/conf.d/zoneminder.conf
# ln -s /etc/zm/apache.conf /etc/apache2/mods-enabled/zoneminder.conf

5) Activamos CGI:
# a2enmod cgi

6) Creamos el nuevo usuario:
# adduser www-data video

7) Reiniciamos apache2 y zoneminder
# service apache2 restart
# service zoneminder restart

8) Accediendo a ZM con el navegador web:
http://[tu dirección o ip]/zm/

...ok, con esto debemos ver la partalla de zone minder desde nuestro navegador.



9) Conectar la web cam al USB del ordenador:
Para ver si se ha conectado:
     # lsusb
     Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
     Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
     Bus 001 Device 002: ID 0951:162f Kingston Technology
     Bus 001 Device 004: ID 18e8:6238 Qcom
     Bus 002 Device 002: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)
     Bus 001 Device 005: ID 0c45:62c0 Microdia Sonix USB 2.0 Camera

ok, aqui la tenemos.

Para ver el dev que le ha asignado debian:
     # ls /dev
     ...
     ...
     video0

En mi ordenador es /dev/video0.

10) Configurar cámara en ZoneMinder:
Desde el panel de ZM en el navegador web: Add New Monitor.



Instalar y configurar Zoneminder en Xubuntu 14.04

Instalando ZpneMinder en Xubuntu 14.04:

1) Instalacion:
# aptitude install zoneminder

2) Post instalacion:
http://www.zoneminder.com/wiki/index.php/Ubuntu_Server_14.04_64-bit_with_Zoneminder_1.26.5_the_easy_way

3) Acceso a zoneminder: http://host/zm
Ok, ahora ya se puede acceder

4) Configuración y cámaras
No detecta camaras usb ?
http://www.zoneminder.com/forums/viewtopic.php?p=63801

Ok!; funciona.
v4l ya lo tenia instalado, añadiendo la linea en /usr/bin/zmcd.pl
y reiniciando zoneminder.

5) Reiniciando zoneminder:
# service zoneminder restart

6) Añadiendo camaras ip:
http://www.linux-party.com/index.php/53-privacidad/9048-instrucciones-de-uso-para-espiar-con-zoneminder-en-linux-parte-1

7) Activado autentificacion para acceder:
Desde el navegador accedemos al panel de ZoneMInder
http://yourip/zm
- Options
- Pestaña System.
- activar: OPT_USE_AUTH
- Salvar, cerrar.

Reiniciar ZoneMinder:
# service zoneminder restart

8) Crear y cambiar contraseña de usuarios:
Por defecto la contraseña y password de acceso es admin/admin.
Esto conviene cambiarlo.

Desde el navegador accedemos al panel de ZoneMInder
http://yourip/zm
- Options
- Pestaña Users.
- Hacer click en el usuario.
- Modificar el formulario del susuario donde esta su password.
- Salvar.

Comandos para buscar las cámaras:
# v4l2-ctl --list-devices

Comado para ver si zm puede comunicar con la cámara.
Ref.: http://forums.fedoraforum.org/showthread.php?t=154003)

#  zmu -d /dev/video0 -q -v

Ref.:
http://www.tuxradar.com/content/build-your-own-surveillance-zoneminder
http://www.zoneminder.com/wiki/index.php/Add_a_user_to_ZoneMinder

10 de octubre de 2014

Raspbian en VirtualBox


Se recomienda leer el punto 6 antes del punto 1.
Para no perder el tiempo.


1) Descargamos Raspbian:
de http://www.raspberrypi.org/downloads/

en mi caso es el fichero: 2014-09-09-wheezy-raspbian.zip

2) Descomprimimos:
... y obtenemos el ficehro imagen 2014-09-09-wheezy-raspbian.img

3) Pasamos .img a .vdi
Linux:
# VBoxManage convertdd 2014-09-09-wheezy-raspbian.img 2014-09-09-wheezy-raspbian.vdi

Windows:
VBoxManage.exe convertdd 2014-09-09-wheezy-raspbian.img 2014-09-09-wheezy-raspbian.vdi

4) En VirtualBox configuramos una nueva maquina virtual:
linux, debian con el discoduro virtual: 2014-09-09-wheezy-raspbian.vdi

5) Arranamos la nueva maquina virtual Raspbian y ...




... veo todo negro, muy negro.

6) No funciona.

7) Explicación: VirtualBox solo emula procesadores x86 y Raspberry Pi tiene un procesador ARM, por lo que la imagende Raspbian NO FUNCIONA en VirtualBox.

8) Borrar ficheros y maquinas virtuales.

19 de septiembre de 2014

Copiar un Disco Duro a un USB y hacerlo bootable con Debian 7

Con mi antiguo pero incombustible FitPC (micra), se me ocurrió aprovechar una de las memorias USB que
tenia por casa y utilizarla como disco duro.

Con esto reduciría el consumo eléctrico, reduciría ruido del disco duro y pasaría un buen rato configurándolo todo.

También es un método de copiar un sistema en un disco duro (HD) de diferente tamaño, siendo especialmente útil cuando se nos ha quedado un HD pequeño y queremos transferir todo el sistema otro de mayor capacidad.

Con la clonación no podemos hacer esto directamente ya que crea una copia exacta,un espejo del sistema.

En el HD tengo un sistema debian 7 con XFCE.

Revisando, revisando,... no me acordaba que esto ya lo hice long long time ago ...
http://misnotaslinux.blogspot.com.es/2010/06/full-copy-hd-micra-server.html
Pero veo que esta algo obsoleto y lo actualizo con este post.

PROTOCOLO:

1) Arrancamos el sistema con un liveUSB
Como mi FitPC tiene un AMD sin PAE, solo puedo utilizar Xubuntu 12.04, ya que las siguietes versiones solo funcionan con microprocesdores con PAE.

2) Tenemos el disco duro interno (HD) a clonar en un USB.
Pues pinchamos el USB.

2) Hacemos las particiones en el USB:
- Usaremos Gparted.
- Borramos la partición del USB, será seguramente una FAT.
- Creamos una partición formateada con ext4.
- Creamos una mas pequeña tipo Linux-Swab, esto es opcional.

3) Montamos el disco duro a clonar HD y el USB:
# mkdir /mnt/HD
# mkdir /mnt/USB

# mount /dev/hda1 /mnt/HD
# mount /dev/sdb1 /mnt/USB

4) Copiamos todo el sistema raiz del HD al USB:
La copia debe ser de todo el árbol de directorios y todos los archivos con sus propietarios y permisos.
# cp -av /mnt/HD/* /mnt/USB/


5) Instalar Grub2 en el nuevo USB para que arranque.

- Arrancar el sistema desde el HD
- Pinchar el USB.

- Montar el USB en /mnt:
# mount /dev/sd(xx) /mnt

- Montar el resto de dispositivos:
# mount --bind /dev /mnt/dev

- Damos privilegios de root al sistema USB montado en /mnt:
# chroot /mnt
Ahora estamos trabajando con la riaz del sistema de archivos del usb (ojo)

- Ver en que nueva /dev/sd(xx) está ahora el usb:
# df -h

- Instalamos Grub2 en el USB:
# grub-install --recheck /dev/sd(x)

Importante: Hay que poner el /dev/sd(x) actual del USB, en su raiz.

- Actualizamos Grub:
# update-grub

- Reiniciamos el sistema.

- Cambiar en la bios pra que arranque desde el USB.

6) Comprobar que ha arrancado bien y que estamos en el USB.
Si !!!

7) Pues a celebrarlo

Conviene revisar que todo funciona correctamente.
Revisar el archivo /etc/fstab ya que es fácil que no se monte la partición swab, actualizar con las nuevas UUID si fuera el caso.

Ref.:
http://rootear.com/ubuntu-linux/como-reparar-grub2

3 de agosto de 2014

Google Charts Tips

Unos de las apis más completos para la presentación gráfica de datos en páginas web es
Google Charts.

https://developers.google.com/chart/

Su manejo es muy sencillo y hay numerosos ejemplos, documentación, y muchos post de usuarios (muchos de ellos erróneos, que no funcionan!!) lo que ayuda y a veces dificulta su uso.

Con los ejemplos y documentación la curva de aprendizaje es muy rápida y pronto tendremos gráficas realmente impresionantes en nuestra web.

Aquí dejo un borrador de las notas de las configuraciones que he tenido que hacer y como lo he conseguido:

0) Ejemplo y opciones de una Gráfica con GoogleCharts:
https://developers.google.com/chart/interactive/docs/gallery/linechart


1) Max / Min del eje Y:
vAxis: { minValue: 0, maxValue: 100 },

Si hay algún valor de los datos superior o inferior a minValue o maxValue, no seran tenidos en cuenta.
Para que no se rendericen valores superiores o inferiores a unos max/min hay que hacerlo con:
vAxis: { viewWindow:{max:"value", min: "value"},

https://developers.google.com/chart/interactive/docs/gallery/areachart


2) Fechas en el eje X:
Representar datos con fechas.
Hay que usar new Date( "date", "valor);
La fecha se puede indicar de muchas maneras, tambien se puede usar directamente un TimeStamp.


https://groups.google.com/forum/#!searchin/google-visualization-api/haxis$20date/google-visualization-api/E3XyVBLz8kc/IUOBrgEPxxEJ


3) Formatear fechas en el eje X:
Yo quería que en el eje x indicara la hora, seguido de la letra "h", día y mes: 12h02/04
El código para conseguir esto:
                    hAxis: { format: "HH'h'dd/MM/yy" }

https://developers.google.com/chart/interactive/docs/reference#dateformatter


4) Quitar separador decimal en el eje Y:
vAxis: {format: '0'}

http://stackoverflow.com/questions/15154226/setting-vaxis-format-in-google-line-chart


5) Centrar titulo del gráfico
        ???

6) Quitar leyendas o fijar su posición:
http://stackoverflow.com/questions/14341673/change-color-of-data-title-google-visualization


7) Recopilación de opciones de configuración:

var chart = new google.visualization.LineChart(document.getElementById('visualization'))
.draw(data, {
    legend: { position: "none" }, // turn off the legend
    curveType: "function",
    width: 900, height: 300,
    vAxis: {minValue:0},
    colors: ['#769dbb'], //Line color
    backgroundColor: '#1b1b1b',
    hAxis: { textStyle: {color: '#767676'  , fontSize: 11} },
    vAxis: { minValue: 0, textStyle: {color: '#767676'} },
});

http://stackoverflow.com/questions/14341673/change-color-of-data-title-google-visualization


8) Color y grosor de la lineas de la serie
http://stackoverflow.com/questions/6977877/how-to-change-the-appearance-of-the-google-line-chart


9) Borde y color del grafico:
backgroundColor: { stroke: '#000000', strokeWidth: 1, fill: 'color'}

https://developers.google.com/chart/interactive/docs/gallery/areachart_old?csw=1

10) Determinar color del area de la grafica y color del borde todo junto:
chartArea: { {backgroundColor: {stroke:'black', fill:'#eee', strokeSize: 1}}

https://developers.google.com/chart/interactive/docs/gallery/areachart_old?csw=1



11) Google Chars Wizart !!!!:
https://code.google.com/apis/ajax/playground/?type=visualization

Hay ejemplos y un editor de codigo en el que se pueder ver el resultado y debug


12) Determinar el número de lineas horizontales.
Todavia no he descubierto como hacer una division cada vg 50 puntos.

Se puede poner una matriz con la posición de cada linea.
vAxis: { ticks: [5,10,15,20] }

Y se pueden fijar el número de divisiones
vAxis: gridlines: { count: 4}

Fijar  el numero de lineas secundarias entre dos principales:
vAxis: {minorGridlines: { count:1 } }

Ok, pero no aparecen los numeros en los minorGridlines ???!!!!!

Mi ALGORITMO PARA DETERMINAR NUMERO DE LINEAS:
vAxis: { format: '0', minValue: $ymin, maxValue: $ymax, gridlines:{count:(($ymax-$ymin)/$div)+1} },


https://developers.google.com/chart/interactive/docs/gallery/areachart?csw=1


13) Unir dos series de datos indpendientes en un mismo grafico:
Cuando X es comun a las dos series no se hace con una matriz del tipo:
[x, y1, y2 ...]
Pero cuando los datos son independientes y no coinciden la variable X hay que unir los datos:
http://jsfiddle.net/asgallant/XF7JE/
Esto no me ha funconado, aunque tengo que revisar el código.

Otra forma seria hacruna consmta combinada en SQL,

14) Varios graficas en un pagina web:
https://groups.google.com/forum/#!topic/google-visualization-api/OaG0wS2k2N0

impo: si hay graficos gauge hay que cargar:
   google.load("visualization", "1" ackages:"corechart"]});
   google.load("visualization", "1", {packages:["gauge"]});



14) Dos escalas Y en un mismo gráfico:
Hay que tulizar el tipo de gráfico: ComboChart.

https://developers.google.com/chart/interactive/docs/gallery/combochart

http://stackoverflow.com/questions/11852711/google-visualization-api-format-secondary-y-axis-different-from-primary-y-axis


(  ) Continuará ...







Cambiar los metadatos del titulo de un archivo PDF con pdftk

Con algunos archivos pdf tengo el problema que el eBook toma el título de los metadatos del pdf y en algunos casos este titulo no es correcto.

Para solucionar esto hay que cambiar los metadatos del archivo pdf y corregir su título.

He probado varios métodos y este es el que me ha funcionado en Debian Linux.

1) Instalar pdftk
# aptitude install pdftk

2) Extraer metadaos del archivo pdf
 # pdftk archivo.pdf dump_data > data.txt

3) Revisar y modificar los metadatos
# nano data.txt

4) Crear nuevo archivo pdf copia del anterior con los metadatos actualizados
# pdftk archivo.pdf update_info data.txt output archivo02.pdf

Además con pdftk se pueden hacer muchas mas cosas con los documentos pdf ...

Ref.:
http://en.wikipedia.org/wiki/Pdftk
http://jkwiens.com/2010/01/04/changing-pdf-metadata-on-ubuntu/

1 de julio de 2014

Programación ANDROID: Capturar y formatear fecha y hora


Para capturar la hora y fecha del sistema Android y formatearla se puede hacer en MainActivity.java con el siguiente código java:


...
         long date = System.currentTimeMillis(); 
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss yyyy/MM/d");
        String dateString = sdf.format(date);

...

y ya tenemos la hora y fecha formateada como string.

y lo podemos usar en un TextView previamente definido:

...
              tvFECHA.setText("DatWIF: " + dateString);
...

apareciendo como 15:45:01 2014/06/13

Ref.:
http://developer.android.com/reference/java/text/SimpleDateFormat.html




26 de junio de 2014

Programación ANDROID: Bloquear apagado de pantalla

En algunas aplicaciones ANDROID es necesario que la pantalla permanezca encendida y so se atenúe ni
apague.

En el archivo MainActivity.java
poner:

...
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

...

Y la pantalla permanecerá encendida.

Programación ANDROID: Bloquear rotación de pantalla

En una app que he programada cuando cambia la orientación de la pantalla se reinicia el layout y borra todas
las variables.

Para evitarlo se puede bloquear que responda al cambio de posición.

Editar el archivo AndroidManifest.xml añadir dentro del tag activity

android:screenOrientation="portrait"
ó
android:screenOrientation="landscape"

También se puede hacer con programación en java, edita el dicheo ActivityMain.java y poner :

 ...
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);                   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
...

Cualquiera de estas dos maneras  funciona.

Ref.:
http://stackoverflow.com/questions/4675750/lock-screen-orientation-android