Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Puertos de Arduino

Arduino UNO es una placa impresa con un microcontrolador ATmega3281.

Los pines digitales 0-13 son de entrada y salida (digitalRead(HIGH/LOW); digitalWrite(pin, HIGH/LOW)).
Los puertos PWM (Pulse-Width Modulation) permiten simular una salida analógica (analogWrite(pin, valor)) escribiendo valores entre [0-255].
El puerto 13 incluye una resistencia de 220 Ω y está conectado al único actuador programable de la placa, el LED ‘L’.
Los puertos 0 y 1 se usan para comunicaciones RX (recepción) y TX (transmisión) -actividad indicada por los correspondientes LEDs- por lo que no se recomienda su uso para nada más. Cuando se usan los puertos 0 y 1 para comunicaciones se recomienda desconectar el USB -que se usa para lo mismo- para evitar problemas.

Los puertos con particularidades son: 0 y 1 (Rx,Tx); 2 y 3 (interrupciones); 3, 5, 6, 9, 10 y 11 (PWM); 10, 11, 12 y 13** (SPI); A4 y A5 / SDA* y SCL* (TWI); AREF (Voltaje de referencia); Reset; IOREF (V. referencia IC); No conectado*.
(*) Puertos aparecidos en UNO R3, y que no están etiquetados en la placa.
(**) Incluye una resistencia de 220 Ω.

Los pines analógicos 0-5 son de entrada (analogRead()) y leen valores entre [0-1023].
El voltaje de entrada es de 5V (USB) o 7V-12V (pin Vin y conector jack). El GND de arriba es digital (DGND). Generalmente se usan un GND analógico (AGND) para la BreadBoard.

Comenzando con Arduino

Tras mucho tiempo queriendo hacerlo, por fin me he iniciado en el mundo de Arduino.

Arduino es una placa de Hardware libre que te permite iniciarte en el mundo de los microcontroladores para hacer todo tipo de proyectos, entre ellos (mi primer “gran” objetivo) un robot. La placa se programa en una versión reducida de C, con un IDE propio (libre).
El IDE viene con un montón de ejemplos que permiten aprender a programar la placa.

Recomiendo el Arduino Starter Kit.
Hay quien opina que no es una buena opción básicamente porque puedes obtener lo mismo en e-bay a mitad de precio.
Sin embargo esto solo es cierto si:
1. Sabes lo que tienes que comprar (tienes experiencia en electrónica)
2. Tienes tiempo suficiente para pasar en e-bay buscando cada componente y esperando a que llegue
El paquete tiene una presentación estupenda, un montón de componentes variados y un magnífico libro.
Obviamente el libro se puede bajar de la red, pero me parece que vale la pena tenerlo en formato árboles muertos ya que es una gran guía para dar los primeros pasos y me resulta cómodo tenerlo encima de la mesa y poder ver los diagramas con mis hijos.
En todo caso es un libro muy recomendable para los que como yo no tengáis una gran experiencia con la electrónica.

Cuando se va aprendiendo a manejar el arduino entonces ya uno sabe qué es lo que quiere exactamente comprar y entonces e-bay es una gran opción.

Por otra parte, recomiendo el uso de Fritzing para diseñar “el mundo real”. Los dibujos que incluyo están realizados con esta herramienta.

Para instalar en GNU/Linux hacemos:

aptitude install arduino
aptitude install fritzing libqt4-sql-sqlite1

Hay muchísima documentación al respecto así que me limitaré a poner los ejemplos más básicos que he ido realizando.
El equivalente al “Hola Mundo” se llama “Blink” y es un programa que hace parpadear un LED (procedente de los ejemplos del IDE):

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13; // Cambiar a 12 para utilizar el led del BB

// the setup routine runs once when you press reset:
void setup() {   
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Y el diseño para el mundo real sería este (realizado con Fritzing):

Otra versión:

Manejo de cadenas y funciones en scripts bash (bash strign functions)

Dejo aquí un pequeño script con ejemplos de uso de funciones de cadenas y funciones de script.

#!/bin/bash
#
# bash_string_functions.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

# Declaración sin la palabra 'function'
muestra_texto () {
	# Esta asignación no es necesaria
	# La realizo en esta primera función por claridad, en las siguientes trabajaremos con $1
	string_recibida=$1
	echo "La longitud de '$string_recibida' es '${#string_recibida}'"
	echo "A partir del caracter 3 tenemos '${string_recibida:3}'"
	echo "A partir del caracter 3, los siguientes 4 caracteres son '${string_recibida:3:4}'"
}

# Declaración con la palabra 'function'
function muestra_substring () {
	[[ $1 =~ "uno" ]] && echo -n "uno SÍ está en la cadena -- " || echo -n "uno NO está en la cadena -- "
	echo $1
}

# Declaración con la palabra 'function' sin ()
function prueba_substring {
	# Con ${string#substring} recortamos (eliminamos) de string lo que aparece ANTES de LA PRIMERA aparición de substring, empezando por el principio.
	muestra_substring ${1#*.}
	# Con ${string##substring} recortamos (eliminamos) de string lo que aparece ANTES de LA ULTIMA aparición de substring, empezando por el principio.
	muestra_substring ${1##*.}
	# Con ${string%substring} recortamos (eliminamos) de string lo que aparece ANTES de LA PRIMERA aparición de substring, empezando por el final.
	muestra_substring ${1%.*}
	# Con ${string%%substring} recortamos (eliminamos) de string lo que aparece ANTES de LA ULTIMA aparición de substring, empezando por el final.
	muestra_substring ${1%%.*}
}

prueba_reemplazar () {
	# Reemplazamos la PRIMERA aparición de '.' por '#'
	echo ${1/./-}
	# Reemplazamos TODAS las apariciones de '.' por '#'
	echo ${1//./-}
}

datos_script () {
	# Mostramos directorio, nombre y la extensión
	directorio=$(dirname $1)
	nombre_base=$(basename $1)
	extension="${nombre_base##*.}"
	nombre_base="${nombre_base%.*}"
	echo  "$directorio / $nombre_base . $extension"
}

# Función que devuelve un resultado
existe_string_demo () {
	if [ -n "$string_demo" ]
	then
		echo "SÍ"
	else
		echo "NO"
	fi
}

# Generamos una cadena
string_demo="uno.dos.tres.cuatro.cinco"
# Lanzamos las funciones
muestra_texto $string_demo && echo ""
prueba_substring $string_demo && echo ""
prueba_reemplazar $string_demo && echo ""

respuesta=$(existe_string_demo) && echo "La variable string_demo $respuesta existe"
unset string_demo
respuesta=$(existe_string_demo) && echo "La variable string_demo $respuesta existe" && echo ""

# Pasamos el nombre del script ($0) como parámetro
datos_script $0

# Terminamos
exit 0

Prueba de ejecución del script:

La longitud de 'uno.dos.tres.cuatro.cinco' es '25'
A partir del caracter 3 tenemos '.dos.tres.cuatro.cinco'
A partir del caracter 3, los siguientes 4 caracteres son '.dos'

uno NO está en la cadena -- dos.tres.cuatro.cinco
uno NO está en la cadena -- cinco
uno SÍ está en la cadena -- uno.dos.tres.cuatro
uno SÍ está en la cadena -- uno

uno-dos.tres.cuatro.cinco
uno-dos-tres-cuatro-cinco

La variable string_demo SÍ existe
La variable string_demo NO existe

. / bash_string_functions . sh

Modifica metadatos de libros-e

Aquí dejo un script para modificar/consultar los metadatos de una biblioteca de libros-e.
La idea base es que puedo partir de una biblioteca organizada con subdirectorios y modificar/consultar todos los libros-e.
Para casos más sencillo basta con ebook-meta del que este script es tan solo un ‘wrapper’.

#!/bin/bash
#
# libros-e_metadata.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

####################################
# REQUISITOS
# calibre -> ebook-metadata


####################################
#### ERRORES
E_PARAMINVAL=64     # Parametro invalido

####################################
#### AYUDA
muestra_ayuda ()
{
  echo "Use `basename $0` -h para ver la ayuda" >&2
}

muestra_ayuda_larga ()
{
  more << EOF

libros-e_metadata.sh
(c) 2013 Guimi (http://guimi.net)
This software is under the GNU Public License (GPL) v.2

Este script utiliza ebook-meta (calibre) para modificar y mostrar metadatos de ficheros epub de forma recurrente (subdirectorios)

Options:
---------
  -a
  --auto
	Utiliza el nombre del fichero para escribir el autor y titulo del libro en los metadatos
	Presupone el siguiente formato de nombre de archivo: autor-titulo.epub
	Ademas presupone que [autor] es: [1er apellido]_[resto] o [solo una palabra]

	Ejemplos:
		Platon-Escritos_completos.epub
		Sagan_Carl-Cosmos-ed.aniversario.epub

  -h
  --help
    Muestra esta ayuda

  -l
  --limpia
	Borra los metadatos de los campos comentarios, titulo de orden, productor y publicación

  -m [metadatos]
  --metadatos [metadatos]
	Escribe los metadatos dados, utilizando ebook-meta (ver ebook-meta --help)
	La cadena de metadatos debe estar entrecomillada

	Ejemplo:
		libros-e_metadata.sh -m "-l es -c 'Excelente libro'"

  -v
  --verbose
    Muestra todos los metadatos

EOF
}


####################################
# PARAMETROS

# Parámetros por omisión
string_parametros=""

# Comprobacion de parametros
while [ $# -gt 0 ]; do    # Mientras tenemos parámetros...
  case "$1" in
    -a|--auto) # Escribe metadatos a partir del nombre de fichero
      AUTO='0'
      ;;
    -h|--help) # Muestra la ayuda larga
	  muestra_ayuda_larga
      exit 0
      ;;
    -l|--limpia) # Limpia algunos metadatos
	  LIMPIA='0'
      ;;
    -m|--metadatos) # Escribe metadatos
      # Comprobando si hay mas parámetros
      if [ -z "$2" ]
      then
        echo "Error: Falta la cadena de metadatos" >&2
        muestra_ayuda
        exit $E_PARAMINVAL
      else
        string_parametros="$2"
        shift
      fi
      ;;
    -v|--verbose) # Muestra todos los metadatos
      VERBORREICO='0'
      ;;
    -*) # Parametro desconocido
      echo "Error: Parametro desconocido $1" >&2
      muestra_ayuda
      exit $E_PARAMINVAL
      ;;
  esac
  shift # Pasar al siguiente parámetro
done


####################################
# BUCLE PRINCIPAL
# Listamos los ficheros, incluidos subdirectorios
#

# Modificamos el separador de archivos (IFS), por si algun fichero contiene espacios en el nombre
SAVEIFS=$IFS
IFS=$'\n'
# Realizamos el bucle
for x in `find . -type f -iname "*.epub" | sort`
do
	# Limpiamos la cadena de comando del bucle anterior (si lo hubiere)
	string_comando=""

	# COMPROBAMOS SI HEMOS DE ESCRIBIR AUTOR Y TITULO A PARTIR DEL NOMBRE DEL FICHERO
	if [ -n "$AUTO" ]
	then
		# Tomamos los datos del nombre del fichero
		nombre_base=$(basename "$x")
		nombre_base="${nombre_base%.*}"
		libro_autor="${nombre_base%%-*}"
		libro_autor_esp="${libro_autor//_/ }"
		libro_autor_apellido="${libro_autor_esp%% *}"
		libro_autor_resto="${libro_autor_esp#* }"
		libro_autor_largo="$libro_autor_resto $libro_autor_apellido"
		libro_autor_orden="$libro_autor_apellido, $libro_autor_resto"
		libro_titulo="${nombre_base#*-}"
		libro_titulo_esp="${libro_titulo//_/ }"
		#echo  "[$libro_autor_largo] [$libro_autor_orden] [$libro_titulo]"

		# Anotamos los parametros para el conversor
		string_comando="-a '$libro_autor_largo' --author-sort '$libro_autor_orden' -t '$libro_titulo_esp' --title-sort ''"
	fi

	# COMPROBAMOS SI HEMOS DE LIMPIAR METADATOS
	if [ -n "$LIMPIA" ]
	then
		# Anotamos los parametros para el conversor
		string_comando=$string_comando" -c '' -p '' -k '' -d '' --title-sort ''"
	fi

	# COMPONEMOS LA ORDEN E INDICAMOS POR QUÉ FICHERO VAMOS
	if [ -n "$VERBORREICO" ]
	then
		comando="ebook-meta $string_comando $string_parametros '$x'"
		echo  "----------- $x ----------"
	else
		if [ "$string_comando" == "" ] && [ "$string_parametros" == "" ]
		then
			comando="ebook-meta '$x' | grep -e Title -e Author -e Language"
			echo  "----------- $x ----------"
		else
			comando="ebook-meta $string_comando $string_parametros '$x' > /dev/null"
			echo  "$x ..."
		fi
	fi

	# LANZAMOS EL CONVERTIDOR
	eval $comando

done
# Restauramos el separador de archivos (IFS)
IFS=$SAVEIFS

####################################
# Terminamos
exit 0

Convierte libros-e

Aquí dejo un script para convertir una biblioteca de libros-e al formato epub (o al que se quiera).
La idea base es que puedo partir de una biblioteca organizada con subdirectorios y convertir todos los libros-e al formato deseado sin alterar la estructura y guardando copia de los originales en una estructura nueva copiada de la antigua.
Para casos más sencillo basta con ebook-convert del que este script es tan solo un ‘wrapper’.

#!/bin/bash
#
# libros-e_convierte.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

############
# REQUISITOS
# calibre -> ebook-convert

# Extensiones a convertir
#extensiones="pdf epub txt png jpg jpeg bmp doc docx djvu"
extensiones="rtf lit fb2 mobi"

# Contadores estadísticos
contador_total=0
contador_ok=0
contador_no=0

# Tomamos el directorio inicial, ya que trabajaremos con subdirectorios
directorio_base=$(pwd)

# Generamos un directorio donde guardar los originales.
# Este directorio está fuera de nuestra ruta, así podemos ejecutar repetidas veces el script sin volver a convertir los archivos
mkdir ../originales

# Listamos los ficheros, incluidos subdirectorios
for x in `find . -type f | sort`
do
	# Incrementamos contador estadístico
	let contador_total=contador_total+1

	# Primero hemos de tomar el directorio, el nombre y la extensión
	directorio=$(dirname "$x")
	nombre_base=$(basename "$x")
	extension="${nombre_base##*.}"
	nombre_base="${nombre_base%.*}"
	#echo "$directorio | $nombre_base | $extension"

	# Comprobamos si la extensión del fichero es una de las buscadas
	[[ $extensiones =~ $extension ]] && reconocido=0 || reconocido=1
	# Convertimos el fichero
	if [ $reconocido -eq 0 ]
	then
		echo  -n "Convirtiendo $x..."
		# Cambiamos al directorio del fichero, si no ebook-convert no trabaja bien (!?)
		cd $directorio
		# Hacemos una conversión silenciosa y tomamos la salida (ejecución terminada con éxito o con error)
		ebook-convert $nombre_base.$extension $nombre_base.epub > /dev/null 2> /dev/null
      	SALIDA=$?
		# Volvemos al directorio de trabajo
		cd $directorio_base

		# Comprobamos si la conversión ha sido exitosa
      	if [ "$SALIDA" -gt 0 ]
      	then
			# Incrementamos contador estadístico
			let contador_no=contador_no+1
			echo " ERROR!!!"
		else
			# Incrementamos contador estadístico
			let contador_ok=contador_ok+1
			echo " ok"
			# Generamos el mismo arbol de directorios para lo originales y movemos el archivo
			mkdir ../originales/$directorio -p 2> /dev/null
			mv $directorio/$nombre_base.$extension ../originales/$directorio/$nombre_base.$extension
      	fi
	fi
done

# Mostramos unas pequeñas estadísticas
echo ""
echo "Total ficheros: $contador_total | Convertidos: $contador_ok | Con error: $contador_no"

# Terminamos
exit 0
 

Función para eliminar acentos en Python

def elimina_tildes(self, cadena):
    # http://guimi.net
    # Cambiamos caracteres modificados (áüç...) por los caracteres base (auc...)
    # Basado en una función de Miguel en
    # http://www.leccionespracticas.com/uncategorized/eliminar-tildes-con-python-solucionado/
    s = ''.join((c for c in unicodedata.normalize('NFD',unicode(cadena)) if unicodedata.category(c) != 'Mn'))
    return s.decode()

Ejemplo de uso

    cadena = self.elimina_tildes(self, cadena)