Como crear una imagen con el comando DD

[singlepic id=19 w=320 h=240 float=right]Ya hemos visto como instalar una imagen a un dispositivo conectado a nuestro ordenador con el comando de Linux «DD». Ahora vamos hacer el paso contrario, como crear nuestras propias imágenes con el mismo comando. Con el comando «DD», podemos crear imágenes tanto en formato ISO como en BIN. Este proceso están fácil, como cuando copiamos una imagen, solo le tendremos que indicar:

  1. donde esta montado el disco, partición o dispositivo que queremos hacer la imagen.
  2. ruta y nombre del fichero donde vamos ha guardar la imagen.
  3. el tamaño del bloque de datos que vamos ha utilizar. Como en el caso anterior esto es opcional. 

El comando quedaría de la siguiente manera:

sudo dd if=/dev/hda of=/ruta/donde/guardamos/fichero.iso bd=1M

Explicaión del comando:

  • «if=» Ruta donde esta montada la unidad o particion que queremos hacer la imagen.
  • «of=» Ruta donde vamos a grabar nuestro fichero de imagen ISO o BIN
  • «bd=» Tamaño del bloque de datos en que se va hacer la copia. 

Por ejemplo, si queremos hacer un copia de nuestro disco (/dev/sda1) y copiarlo a un dispositivo usb, solo tendremos que escribir

sudo dd if=/dev/sda of=/media/ruta/montaje/usb/fichero.iso db=1M

Para hacer una imagen de un cd o dvd (/dev/sr0).

sudo dd if=/dev/sr0 of=/home/usuario/Ficheros_Iso/fichero.iso db=1M

Y así con cualquier otro disco, partición o dispositivo que tengamos instalado en nuestro equipo.

Ejecutar Android en un Raspberry Pi

Actualizado el 4 de Junio de 2014, leer hasta el final del post.

[singlepic id=18 w=320 h=240 float=right]Como era lógico, alguien ya ha conseguido ejecutar Android, el sistema de Google para moviles en un Raspberry Pi. Aunque de momento esta en una fase muy precaria, nos permita a mucha gente poder probarlo he intentar mejorarlo.

Ejecutar Android en un Raspberry Pi

Para poder instalar y ejecutar Android en un Raspberry Pi solo tenemos que descargar el fichero de imagen que queramos instalar, para ello, tenemos disponible 3 versión de la imagen en los siguientes enlaces:

Una vez descargada la imagen que queramos probar, solo tendremos que copiar la imagen en nuestra tarjeta SD mediante el comando DD, en Linux, o desde cualquier otro programa tanto ya sea en  Windows, como Linux o en Mac que nos permita instalar imágenes en un USB o disco duro, y una tarjeta SD de al menos 2 Gb.

Una vez instalada la imagen en nuestra tarjeta SD (Samsung Evo MB-MP16DA/EU – Tarjeta de memoria Micro SDHC de 16 GB (UHS-I Grade 1 Clase 10, con adaptador SD)), solo tenemos que insertar la tarjeta el la ranura SD del Raspberry Pi.

Encendemos nuestro Raspeberry Pi y ya tendremos un sistema Android ejecutándose en nuestro Raspberri Pi.

Solo una aclaración  tendremos que tener nuestro Raspberry Pi enganchado a una pantalla mediante el conector HDMI, ya que si lo tenemos conectado mediante el conector de RCA, no nos funcionara, mejor dicho, si funcionara, pero en cuanto entre el entorno gráfico no veremos nada.

Por lo demás, siempre teniendo en cuenta que es una versión muy básica y reciente, tendremos un sistema Android corriendo en nuestro Raspberry Pi, lo que nos permitirá trastear con el , y empezar  a realizar nuestros propios proyectos con estos dos sistemas.

En este es un vídeo grabado por los creadores de la imagen donde se  ve el Raspberry Pi corriendo el Android.

ACTUALIZACIÓN

Varia gente me a comentado que no funcionaba que, que la pantalla se queda con la mensaje de «Sin señal». Lo he revisado y en principio funciona correctamente. Yo he probado a ejecutar android con una SD del tipo SDHC de 8Gb ( comprada en un chino, así que la calidad de la tarjeta no es muy buena).  La imagen la creado en un Ubuntu 14.04, con el siguiente comando.

sudo dd if=Gingerbread+EthernetManager.img of=/dev/sdf bs=1M

Probé a ejecutar android y sin problemas, para comprobar por que había gente que no le funcionada, lo probé con otra tarjeta esta es de 2Gb de tipo SD de SanDisk, y utilizando el mismo comando. Y aquí fallo, pero no es problema de la imagen, ni del Raspberry, el problema debe ser que la tarjeta no es suficiente para grabar la imagen en ella, con la de 8Gb, el Ubuntu la abre como un unidad que tiene 3 particiones. En cambio con la de 2Gb, el Ubuntu ni la reconoce.

Así que para probar instarla la imagen en una tarjeta superior a 2 Gb, no igual, sino superior.

La versión CyanogenMOD 9 (versión con Android 4.0) no esta disponible, por lo que podido leer en varias paginas, el proyecto esta suspendido.

No esperéis milagros, es una cosa muy básica, lo único que podréis sacar de ello, es que habéis conseguido instalar y ejecutar Android 2.3 en un Raspberry Pi, y nada mas. Tenia muy buena pinta al principio, pero si han parado el proyecto se ha quedado en una cosa muy básica.

Como actualizar Ubuntu 12.10 a Ubuntu 13.10

Para actualizar la versión de nuestro Ubuntu 12.10 Quantal Quetzal,  a la ultima versión, en la actualidad Ubuntu 13.04 Raring Ringtail, podemos hacerlo de dos formas.

1º Forma de actualizar Ubuntu 12.10 a Ubuntu 13.03

Para ello solo tendremos que ir al aplicaciones instaladas. Ejecutar el programa «Actualización de Software» en el escritorio del Unity, o escribir lo siguiente en un terminal.

update-manager -d

Esto nos abrirá el programa de actualización de software, buscara si hay nuevas versiones y nos dirá si queremos actualizarnos a la nueva versión. En el caso de que no nos muestre que hay una nueva versión, pulsaremos sobre el botón de «Configuración», y en pestaña de «Actualizaciones», en la opción de «Notificarme una versión nueva de Ubuntu» seleccionamos la opción de «Para cualquier versión nueva», y tecleamos la clave de root. Pulsamos el botón de «Cerrar», y cerramos el programa de «Actualización de software». volvemos ha ejecutar el programa, y ahora si, nos tiene que aparecer que ha encontrado una nueva versión. Pulsamos sobre le botón de «Actualizar», nos identificamos como root, introduciendo la clave, y seguimos las instrucciones que se nos muestra en pantalla.

2º Forma de actualizar Ubuntu 12.10 a Ubuntu 13.04

Este método se basa en utilizar comandos  de consola, es el recomendado para actualizar servidores que estén basados en Ubuntu. Aunque si en una versión de escritorio, tenemos problemas para actualizar de la 1º forma, podemos utilizar esta.

Para empezar abrimos un terminal y ejecutamos el siguiente comando.

do-release-upgrade -d

Si no tenemos instalado este programos lo podemos instalar de la siguiente manera

sudo apt-get install update-manager-core

 

Como instalar una imagen con el comando DD

[singlepic id=19 w=320 h=240 float=right]Para instalar una imagen ISO o BIN, en linux podemos utilizar el comando que viene por defecto «DD».

Este comando nos permite copiar imágenes ISO o BIN en cualquier dispositivo que tengamos montado en nuestro sistema, ya sea un disco duro, CD/DVD, como unidades USB o tarjetas de memoria.

Para utilizar este comando solo tendremos que pasarle como parámetros la ruta donde se encuentra el fichero que vamos a instalar, la ruta donde se encuentra el dispositivo donde vamos ha instalar la imagen, y el tamaño del bloque de los datos, esto ultimo no es obligatorio pero si recomendable.

Ejemplo de copia de una imagen en un dispositivo USB:

sudo dd if=/ruta/del/Fichero.iso of=/dev/sdh bs=4M

Explicación del ejemplo:

  • «if=» : ruta donde se encuentra el fichero ISO o BIN que vamos ha instalar en el dispositivo deseado.
  • «of=» : Ruta donde esta montado el dispositivo donde vamos ha copiar la imagen ISO o BIN.
  • «bs=» : tamaño del bloque de datos que se va ha utilizar, no es obligatorio, pero en algunos copias, da problemas el no utilizarlo.

En este ejemplo el dispositivo USB esta montado en «/dev/sdh» pero en cada caso puede ser diferente. Para saber donde tenemos nuestras unidades montadas, solo tenemos que utilizar el comando «fdisk» como root:

sudo fdisk -l

Este comando nos muestra la ruta y mas información de como están montadas nuestras unidades.

Para copiar la imagen a un disco duro lo haríamos de la siguiente forma:

Para un Ata:

sudo dd if=/ruta/del/Fichero.Iso of=/dev/hdb bs=1M

Para un serial Ata

sudo dd if=/ruta/del/Fichero.Iso of=/dev/sdb bs=1M

En los dos ejemplos copiaríamos el fichero Iso a la unidad montada en «/dev/hdb/ para el Ata y en «/dev/sdb» para el Serial Ata, con un tamaño de bloque de datos de 1M.

Para copiarla en una unidad  de cd, lo haríamos de la siguiente forma:

sudo dd if=/Ruta/del/Fichero.Iso of=/dev/cdrom

Y esto seria todo lo que necesitamos para copiar nuestras imágenes en cualquier unidad montada en nuestro sistema.

Problemas con el puerto de Arduino en Ubuntu (Linux)

[singlepic id=1 w=320 h=240 float=right]En un sistema linux, no todos los usuario pueden tender acceso a poder manejar los puertos. Solo los usuarios que estén en el grupo «dialout» tiene permiso para manejar los puertos. Lo normal es que nuestro usuario no este dentro de ese grupo, por lo que tendremos problemas para poder acceder al puerto que crea el arduino. Para solucionar este problema solo tendremos que añadir nuestro usuario al grupo «dialout» de la siguiente manera.

sudo usermod -a -G dialout <NombreDeUsuario>

Nos pedirá la contraseña de root. y con esto, nuestro usuario ya sera miembro del grupo «dialout».

Ya solo nos queda cerrar la sesión para que los cambios efectuados tenga efecto y podamos acceder al puerto del Arduino desde nuestro usuario.

Obtener la temperatura con Arduino y un termistor

En este proyecto vamos ha ver como podemos obtener la temperatura mediante la utilización de un termistor. Lo primero, que es un termistor, esta es una simple resistencia que varia según la temperatura que tenga, con el valor devuelto por la resistencia y una pequeña formula podemos calcular que temperatura hace.

Esquema del circuito:

El esquema de este circuito es muy sencillo, esta basado en un simple divisor de tensión, en este caso quedaría de la siguiente manera.

[singlepic id=3 w=320 h=240 float=center]

Este esquema es el utilizado en la mayoría de sensores, simplemente cambiando el termistor, por un lcr, por ejemplo, tendríamos un sensor para detectar la luminosidad.

En mi caso el termistor no es de 10 k, como se muestra en el esquema, sino que es de 100k (NJ28 NTC Thermistor,2.8mm,100K,1%), esto no varia mucho lo fundamental del sistema, ya que en el código para el arduino , le diremos tanto el valor de resistencia del termistor, como el valor de la resistencia secundaria.

Esquema de la conexión en al arduino:

[singlepic id=10 w=320 h=240 float=center]

Para calcular la temperatura necesitamos saber el valor beta de nuestro termistor, normalmente, este valor lo suele facilitar el fabricante de la resistencia, pero si el fabricante no nos lo da o no sabemos el fabricante, lo podremos calcular sabiendo la temperatura a la que esta el termistor, apuntamos el valor de resistencia ha esa temperatura y la temperatura en grados Kelvin, después elevamos la temperatura y volvemos a puntar la resistencia y la temperatura. Cuanto mas diferencia de temperatura mas fiable sera el calculo.

Por ejemplo, ponemos el termistor sobre un hielo, con otro termómetro miramos la temperatura, por ejemplo T1 = 3º + 273,15 y resistencia R1 = 34500 Ohm. Luego lo metemos el agua caliente y hacemos la misma comprobación T2 = 80º + 273,15 y R2 = 134 Ohm. Con esos datos aplicamos la siguiente formula:

beta=(log(RT2/RT1))/((1/T2)-(1/T1))

Quedando de la siguiente manera:

beta = (log(143 / 345000)) / ((1/353,15)-(1 / 276,15))

beta = 4283,9970482988 = 4284

Código para el Arduino.

#include <stdio.h>
#include <math.h>

int analogPin=0;     // Pin donde esta conectado el divisor de tension en el Arduino

float Vin=5.0;       // [V]       Voltage de entrada en el divisor de tension
float Raux=10000;    // [ohm]     Valor de la resistencia secundaria del divisor de tension
float R0=100000;     // [ohm]     Valor de resistencia nominal del termistor (NTC) a 25ºC
float T0=298.15;     // [K] (25ºC)

float Vout=0.0;      // [V]        Voltage given by the Voltage-Divider
float Rout=0.0;      // [ohm]      Resistencia actual del Termistor (NTC)

// Valores para calcular el valor Beta, si no lo sabemos
// float T1=273;     // [K]        Temperatura del 1º punto del test (en grados Kelvin)
// float T2=373;     // [K]        Temperatura del 2º punto del test (en grados Kelvin)
// float RT1=19750;  // [ohms]     Resistencia a 273K grados Kelvin (0ºC)
// float RT2=2150;   // [ohms]     Resistencia a 373K grados Kelvin (100ºC)

float beta=0.0;      // [K]        Parametro Beta
float Rinf=0.0;      // [ohm]      Parametros Rinf
float TempK=0.0;     // [K]        Temperatura de salida en grados Kelvin
float TempC=0.0;     // [ºC]       Temperatura de salida en grados Celsius

int iCont;            // Contador de ciclos, par el calculo de la temperatura media
float cTemp1;         // Variable temporal para acumular las temperaturas leidas 

void setup() {
  // Configuramos el puerto Serie
  Serial.begin(9600);

  // Configuramos el pin del Arduino en entrada
  pinMode(analogPin, INPUT);

  // Parametros generales para el calculo
  // Formula para calcular el valor beta si no disponemos de el
  // beta=(log(RT1/RT2))/((1/T1)-(1/T2));
  // Valor beta, los fabricantes suelen disponer ya de este valor, 
  // mirar en la tabla de carateristicas del termistor
  beta = 4380;
  Rinf=R0*exp(-beta/T0);
}

void loop()
{
  cTemp1=0;  
  for (iCont = 1; iCont <= 500; iCont ++)
  {
    // Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
    Vout=Vin*((float)(analogRead(analogPin))/1024.0); 
    Rout=(Raux*Vout/(Vin-Vout));

    // Calculo de la temperatura en grados Kelvin
    TempK=(beta/log(Rout/Rinf));
    // Calculo de la temperatura en grados Celsius
    TempC=TempK-273.15; 
    // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
    cTemp1 = cTemp1 + TempC; 
    // Hacemos una pausa de 10 milisegundos    
    delay(10);
  }

  // Calculamos la temperatura media
  TempC = cTemp1/iCont;

  // Mostramos la temperatura media en grados Celsius
  Serial.println(TempC);

  // Hacemos una pausda de 1 seg.
  delay(1000);
}

Y con esto ya tendríamos un termómetro digital con nuestro Arduino.

Problema con el USB y VirtualBox en Ubuntu 12.10

[singlepic id=7 w=320 h=240 float=right]Normalmente trabajo con Ubuntu, y cuando necesito probar algún otro sistema, o necesito trabajar con Windows, lo hago a través de un sistema virtual con VirtualBox, normalmente no tengo ningún problema con el, pero después de una actualización del programa, en los sistemas instalados dejo de funcionar la detención de los dispositivos conectados por usb, como el arduino, las impresoras, etc. Después de dar muchas vueltas por la configuración del VirtualBox, y no encontrar nada raro, me puse a buscar por Internet, y  encontré este mismo problema pero con la versión 11.10 del Ubuntu. Y como por probar no se pierde nada, lo probé en mi Ubuntu 12.10, y problema resuelto.

Por lo visto el fallo viene por no tener el usuario con el que se ha abierto la sesión dentro del grupo que crea el VirtualBox cuando se instala.

Para solucionar este problema solo tendremos que añadir nuestro usuario dentro del grupo «vboxusers» de la siguiente manera:

1º.- Abrimos una terminal de consola, seguramente se pueda hacer mediante algun programa grafico, pero cuando se trata de configuraciones me gusta hacerlo mediante una consola.

2º .- Comprobamos que el grupo «vboxusers» existe, una mandera fácil de hacerlo es tecleando «groupmod» y pulsamos varias veces la tecla tabulador, y esto nos mostrara la lista de grupos actuales.

3º.- Si no existe los creamos. Para crearlo solo tenemos que poner en la terminal de la consola «sudo addgroup vboxusers«. Nos pide la clave de root y listo. Ya tenemos el grupo «vboxusers» creado.

4º.- Para añadir nuestro usuario al grupo «vboxusers» tecleamos en la terminal de la consola «sudo usermod -a -G vboxusers NombreDeUsuario». Esto añadira nuestro usuario al grupo «vboxusers».

Después de estos paso, solo tendremos que reiniciar la sesión. Y los sistemas instalados con VirtualBox ya reconocerán nuestros dispositivos conectados por usb.

Un problema tonto, pero que te hace perder mucho tiempo. Espero que os haya servido de ayuda.

Mi primer contacto con Arduino

Ya me ha llegado mi placa de Arduino, me he decido por el modelo mas normal, el Arduino UNO, en la versión SMD, Entre las diferencias que he podido observar con respecto a la otra versión del arduino UNO rev. 3, es que esta, el procesador es la versión de soldadura en superficie, mucho mas pequeño en tamaño que el que viene en la versión normal, Arduino UNO Rev. 3, y la disposición de alguno componentes, como puede ser el botón del reset, pero ha efectos prácticos,  son iguales.

Imagen del Arduino UNO versión SMD[singlepic id=11 w=320 h=240 float=center]

Imagen del Arduino UNO versión Rev. 3[singlepic id=12 w=320 h=240 float=center]

Para tener un primer contacto con el, he probado el típico «Hola mundo» pero para un arduino, es decir, encender y apagar un led. Hay varias formas de hacer esta prueba.

1º.- Encender y apagar el led que trae la propia placa, este led esta conectado al pin 13, solo tendremos que hacer que nuestro programa mande la señal necesaria por ese pin y el led se encenderá o se apagara.

2º.- Instalar nuestro propio led al pin 13, solo tendremos que insertar la patilla del positivo (ánodo, la patilla más larga) en el pin 13 y la patilla del negativo (catado, la patilla más corta) en el pin de masa, el pin a la izquierda del pin 13, no hace falta poner la resistencia que se necesita para hacer funcionar cualquier led normalmente, este pin aprovecha la resistencia que tiene para el led que viene en la placa para hacerlo funcionar. Y ya estaría listo, ejecutamos el mismo programa que en el caso anterior y ya lo tendríamos funcionando. En este caso se encenderían los 2 leds, tanto el que acabamos de instalar nosotros, como el que trae la propia placa.

3º.- Instalar nuestro propio led en un pin que no sea el 13, en este caso la única diferencia que tenemos con respecto a los casos anteriores, es que tendremos que instalar junto al led la resistencia necesaria, en este caso, una resistencia de 220 oh. Cambiamos en nuestro programa el pin 13 por el pin donde tenemos conectado nuestro led y a funcionar.

Código para encender y apagar un led  cada 1 seg con el Arduino.

/* Blinking LED
 * ------------
 *
 * turns on and off a light emitting diode(LED) connected to a digital  
 * pin, in intervals of 2 seconds. Ideally we use pin 13 on the Arduino 
 * board because it has a resistor attached to it, needing only an LED

 *
 * Created 1 June 2005
 * copyleft 2005 DojoDave <http://www.0j0.org>
 * http://arduino.berlios.de
 *
 * based on an orginal by H. Barragan for the Wiring i/o board
 */

int ledPin = 13;                 // LED conectado al pin digital 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // Establecer el pin a modo salida
}

void loop()
{
                                // Este ciclo se repetira hasta que se apage el Arduino
  digitalWrite(ledPin, HIGH);   // Encender el LED
  delay(1000);                  // Esperar un segundo
  digitalWrite(ledPin, LOW);    // Apagar el LED
  delay(1000);                  // Esperar un segundo
}

Este programa esta en el menú de ejemplos del software del Arduino.

Y de momento es todo. Espero que te haya servido de ayuda.

Preguntar antes de cerrar un programa en C#

[singlepic id=5 w=320 h=240 float=right]Muchas veces cuando cerramos nuestro programa en C# necesitamos verificar que realmente se quiere cerrar el programa. Para hacer esto solo necesitamos utilizar la función «FormClosing»

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    DialogResult dialogo = MessageBox.Show("¿Desea cerrar el programa?",
               "Cerrar el programa", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (dialogo == DialogResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        e.Cancel = false;
    }
}

Para cancelar el cierre de la aplicación solo tenemos que poner a «true» la función «e.cancel», esto hará que se cancele el cierre del programa.

A si de fácil y sencillo o no?

Verificar en C# el formato de una dirección de e-mail

[singlepic id=4 w=320 h=240 float=right]Cuando queremos que el usuario introduzca una dirección de e-mail en nuestro programa en C#, siempre nos queda la duda si la dirección es correcta o no. El siguiente código en C# nos permite comprobar que la dirección de e-mail que se introduzca este por lo menos en su formato correcto, es decir, «nombre»@»Dominio».»extensión». Esta comprobación no asegura que la dirección sea valida, solo que el formato introducido es el correcto.

Para hacer la comprobación nos ayudamos de la clase Regex, esta función permite mediante un patrón verificar si una cadena cumple con ese patrón  Para poder utilizar la clase Regex tenemos que añadir el siguiente nombre de espacio

using System.Text.RegularExpressions;

Código  que comprueba el formato del e-mail introducido:

public static bool ComprobarFormatoEmail(string sEmailAComprobar)
{ 
    String sFormato; 
    sFormato = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    if (Regex.IsMatch(seMailAComprobar, sFormato)) 
    {
        if (Regex.Replace(seMailAComprobar, sFormato, String.Empty).Length == 0) 
        { 
            return true; 
        } 
        else
        { 
            return false; 
        } 
    } 
    else
    { 
        return false;
    }
}

La función nos devolverá «true», si el formato del email es correcto, o «false» si el formato del email es incorrecto. Ejemplo de como trabajar con la función.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// Para la función regex
using System.Text.RegularExpressions;

namespace Verificar_Correo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static bool ComprobarFormatoEmail(string seMailAComprobar)
        { 
            String sFormato; 
            sFormato = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(seMailAComprobar, sFormato)) 
            {
                if (Regex.Replace(seMailAComprobar, sFormato, String.Empty).Length == 0) 
                { 
                    return true; 
                } 
                else
                { 
                    return false; 
                } 
            } 
            else
            { 
                return false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (ComprobarFormatoEmail(tbEmail.Text) == false)
            {
                lEmailCorrecto.Text = "Dirección no valida";
                lEmailCorrecto.ForeColor = Color.Red;
            }
            else
            {
                lEmailCorrecto.Text = "Dirección valida";
                lEmailCorrecto.ForeColor = Color.Green;
            }
        }
    }
}

Puedes descargar todos los ficheros desde aquí.

 

Y esto es todo, sabiendo que el formato del email  es correcto, la siguiente comprobación seria saber si la dirección es valida, es decir, si pertenece a una cuenta real. Pero eso sera para otro post.