Raspberry Pi – Drivers TL-WN725N

Como ya hemos hablado en este blog, una de las maneras mas practicas de conectar nuestra Raspberry a la red y a internet es mediante WiFi, ya que así tenemos esa libertad de movernos sin problemas de cables. Existe muy poca variedad de adaptadores USB compatibles con el sistema de nuestra tarjeta y es probable que algunos de estos no los encontremos ni en la tienda mas popular de nuestra ciudad, por lo que recurrimos a comprar cualquier modelo que al llegar a casa no nos servirá.

En esta entrega veremos como agregar algunos drivers, para lograr expandir la compatibilidad de nuestra Raspi, específicamente para TL-WN725N de TP-LINK, que suele ser uno de los mas fáciles de encontrar.

c26-TL-WN723N-1-l

El primer paso es revisar la version de Linux que tenemos instalada, el comando uname -a devuelve una descripción similar a:

Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l GNU/Linux

De esta información lo que tomaremos para mas adelante es la parte 3.12.28+ #709, tengamos en cuenta que este dato puede variar para cualquiera.

En el siguiente paso debemos conectar el adaptador y mostrar el listado de los dispositivos conectados con el comando lsusb, encontraremos la descripción similar a:

Bus 001 Device 005: ID 0bda:8179 Realtek Semiconductor Corp.

Que corresponde al index y ID del adaptador USB que conectamos, el driver que instalaremos esta limitado a dispositivos con los siguientes IDs:

ID 2001:3310
ID 2001:330F
ID 07B8:8179
ID 0BDA:0179
ID 0BDA:8179

y para versiones de linux superiores a  3.12.28:

ID 056E:4008
ID 2001:3311
ID 0DF6:0076

Una vez que se tenga esta información tendremos que encontrar la relación con el archivo que tenemos que instalar en el siguiente listado:

Para mi caso  3.12.28+ #709, #710 – 8188eu-20140908.tar.gz hace match con la version de linux que tengo instalada por lo que 8188eu-20140908.tar.gz es el archivo que tendré que instalar.

La serie de comandos anteriores indica la forma de descargar e instalar, recuerden cambiar 8188eu-201xyyzz.tar.gz por el del archivo correcto para su version, 8188eu-20140908.tar.gz en mi caso.

Si llegamos hasta aquí sin ningún problema, solo restaría configurar las credenciales de nuestra red como hemos visto anteriormente (WiFi Setup) y reiniciar la Raspberry Pi, espero les sirva :).

Referencia: Raspberrypi.org (ingles)

Advertisements

Raspberry Pi – Multiples redes WiFi

En uno de nuestros post anteriores hablamos de como configurar nuestra Raspi para conectarse de manera automática a la red utilizando un adaptador USB-WiFi (ver aqui), así como hablamos de acceder de manera remota desde otro equipo utilizando herramientas como VNC o SSH (ver aqui), lo cual nos facilita la vida al no tener que comprar un monitor y accesorios solo para usarlos con nuestra tarjeta.

Hasta aquí todo es felicidad, la Raspi se conecta al iniciar, entramos a ella por SSH o al modo gráfico por VNC y trabajamos en casa u oficina sin ningún problema, pero ¿que pasa cuando me tengo que mover? si necesito conexión tengo que volver a configurar la raspberry para la nueva red ¿cierto? y ocupare monitor y accesorios nuevamente, ¿tendré que llevarlo conmigo a todo lados?.

Bueno pues una de las soluciones mas simples y rápidas es configurar nuestra tarjeta para que recuerde el mayor numero de redes o puntos de acceso a los que posiblemente se podría conectar, la casa, la oficina, la escuela, la casa de un amig@, etc.

Para que esto funcione el primer archivo a editar es:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

y tendríamos que dejarlo similar a:

como vemos tenemos que crear un objeto “network” por cada red que nuestra Raspi recordara, así como un alias para cada una dentro del parametro id_str.

Y el segundo archivo es:

sudo nano /etc/network/interfaces

y tendría que quedar como sigue:

es muy similar al que teníamos anteriormente la única diferencia es que se agrega la referencia al archivo donde configuramos los datos de acceso y como manejara cada una de las redes. Y eso es todo! en teoría cada que nuestra Raspi encienda tratara de conectarse a cada una de las redes que hayamos listado en el archivo en el mismo orden en el que se pusieron, Red1, Red2, etc. hasta que logre una conexión. Sin duda para nosotros ha sido de gran ayuda puesto que ya no necesitamos de monitor y accesorios cada que hay que moverse, procuramos llevar listadas todas las posibles redes para conectarnos sin problema, incluso la de nuestro telefono para cuando las redes fallan y tenemos que compartir el internet, ojala les sirva tambien 🙂

 

EzTemp&RH: Easy Temperature and Humidity for Raspberry Pi

Nos gustaría mucho compartir esta campaña de indiegogo que nos parecio muy interesante. Se trata de un sensor de temperatura y humedad digital diseñado para Raspberry Pi. Este proyecto está siendo desarrollado por unos increibles Hackers del sur de España y se trata de EzTemp&RH.

Dicho sensor no solo es compatible con Raspberry Pi sino que cuenta con un puerto serial que lo hace compatible con más tarjetas de desarrollo. El dispositivo ha sido diseñado con un sensor de humedad HIH5030 de Honeywell el cual es muy popular en usos industriales, además cuenta con un termistor para medir la temperatura. Si bien existen otros sensores que hace lo mismo pero de una forma análoga o con protocolo propio, al parecer este sensor tiene mucha más estabilidad que los otros.

Este proyecto es Open Source y puedes ver los archivos en Github. Te invitamos a apoyar esta campaña en Indiegogo.

Raspberry Pi B+ agrega más puertos y caracteristicas consumiendo menos energía

Hoy por la mañana fue presentado el nuevo modelo Raspberry Pi B+ de la mano de Eben Upton (CEO de Raspberry Pi Foundation). Este nuevo modelo incorpora grander mejoras al modelo B del cual todos estamos enamorados. Este nuevo modelo integra el mismo procesador BCM2835 como su antecesor, corre el mismo software y mantiene sus 512 MB de RAM. Entre las mejoras de este modelo se encuentran las siguientes:

  • Más puertos GPIO: Este “header” ha crecido un poco ya que ahora cuenta con 40 pines manteniendo el mismo pinout de los 26 pines que tiene el modelo B.
  • Más puertos USB: Ahora contamos con 4 puertos USB 2.0 comparados con los 2 puertos del modelo anterior. Al parecer no habrá problemas de corriente al conectar 4 dispositivos a estos puertos.
  • Micro SD: El socket de la tarjeta SD fue remplazado por un comodo socket push-push micro SD.
  • Menos consumo de energía: Mediante la sustitución de reguladores lineales se ha reducido el consumo de energía entre 0.5 W y 1.0 W.
  • Mejor Audio: El circuito de audio incorpora una fuente de alimentación de bajo ruido por lo que esto no afectará la calidad de audio.

Al parecer las mejoras son significativas auque nos hubiera gustado ver mejoras más internas tanto de procesador como de memoria RAM. Raspberry Pi Foudation ha hecho una buena jugada ya que empezaban a aparecer muy buenos competidores. Esperaremos un poco antes de tener la nuestra.

 

Raspberry Pi – Lección 14 – Raspberry Pi como iBeacon

iBeacon

Introducción
A estas alturas es muy probable que ya hayan escuchado hablar sobre iBeacons, y probablemente tengan una idea de lo que son y del como funcionan. En esta entrega hemos decidido adentrarnos en el tema y abordarlo con un caso practico!. Estoy seguro que ahora que Apple libero sus especificaciones sobre estos dispositivos, escucharemos de ellos con mayor frecuencia.

 Que es?
En gran resumen, los iBeacons son pequeños dispositivos Bluetooth Low Energy (BLE) que proporcionan información especifica, como su posición y su respectivo indicador único (UUID), que incluso en cantidad, pueden usarse para obtener información sobre la navegación en espacios cerrados como tiendas o museos. Una de sus grandes y tan aplaudidas ventajas es la interacción con dispositivos sin necesidad de que el usuario realice alguna acción.

Caso Practico
Ademas de ser parte de la estandarización del Bluetooth 4.0, iBeacon incorpora un protocolo de comunicación que lo valida como tal, consiste básicamente en un único pulso de 128-bit (UUID) para catalogar una entidad u organización, y dos valores de 16-bit conocidos como “Major” y “Minor” para identificar a cada elemento de una misma entidad.
Un poco mejor explicado lo que necesitaría un BLE para convertirse en iBeacon es un set de bytes con los siguientes datos:
  • ID (uint8_t) – Siempre es 0x02
  • Data Length (uint8_t) – El numero de bytes en el resto del payload = 0x15 (21 en decimal)
  • 128-bit UUID (uint8_t[16]) – El ID de 128-bit que identifica la entidad u organización.
  • Major (uint16_t) – El valor “Major” (para determinar ubicaciones de la misma entidad)
  • Minor (uint16_t) – El valor “Minor” (para determinar los nodos dentro de una misma ubicacion)
  • TX Power (uint8_t) – Este valor se utiliza para estimar la distancia basado en el valor de RSSI 
Por ejemplo, la siguiente serie es valida para el standard iBeacon, separada por “pipes” solo para hacerlo mas entendible:
02 | 15 | B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D | 00 00 | 00 00 | C8
 
A esta señal solo le tendría que preceder el identificador de la compañía, 0x004c para el caso de Apple.

Configurando la RasPi
Como es de saberse, en estos momentos es un poco complicado conseguir un dispositivo iBeacon, y como Hackers curiosos estoy seguro que alguien ya se ha interesado en adquirir alguno para empezar a jugar.
Bueno pues navegando un poco en Internet hemos encontrado suficiente información para convertir nuestra Raspberry Pi en un iBeacon 100% funcional, veamos paso a paso como hacerlo:

1.- Lo primero que necesitaremos es instalar algunas dependencias.

sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev

iB001

2.- Seguido instalaremos Bluez, que es una de las mejores opciones como driver Bluetooth para sistemas Linux.

sudo mkdir bluez
cd bluez
sudo wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.11-tar.xz

iB002

como se ha descargado del repositorio oficial, habrá que compilar el Source Code, esta parte probablemente tome algo de tiempo, pero seamos pacientes y si todo ha ido bien hasta aquí, se instalara sin problema.

sudo unxz bluez-5.11.tar.xz
sudo tar xvf bluez-5.11.tar
cd bluez-5.11
sudo ./configure –disable-systemd
sudo make
sudo make install

iB003

Suponiendo que todo se instalo correctamente 🙂 , apagamos la RasPi (sudo shutdown -h now).

3.- Adaptador USB .

Como tal, la Rapberry no proporciona ningún tipo de comunicación Bluetooth, por lo que será necesario adquirir algún adaptador que nos ayude con esta tarea, no olvidemos que en esta ocasión no seria cualquier adaptador Bluetooth, tendría que ser versión 4.0.
iB007
En nuestro caso hemos conseguido uno de IOGEAR (GBU521) y nos ha funcionado muy bien, aunque hemos visto algunos otro ejemplos con el CSR8510 disponible en tiendas como Adafruit (ver aquí).

Lo conectamos y volvemos a iniciar la RasPi… desde consola y ubicándonos en la carpeta donde instalamos “bluez-5.11” podemos verificar que todo este instalado y configurado correctamente con el comando:
tools/hciconfig
tendríamos que ver una serie de mensajes similares a los de la imagen.
iB004
Podríamos encontrarnos con dos casos, que el servicio este inactivo (DOWN) o en modo escáner (PSCAN), pero nada de que preocuparnos, para que funcione como iBeacon tendríamos que arrancarlo de la siguiente manera:
sudo tools/hciconfig hciO up
sudo tools/hciconfig hci0 leadv
sudo tools/hciconfig hci0 noscan
echo esto, volvemos a verificar el servicio:
iB005
Entre lineas aparecera “UP RUNNING” lo que significa que el adaptador esta listo para funcionar como queremos.

Prueba Final

Para esta prueba hemos tomado la aplicación de Estimote, una de las empresas pioneras en la construcción de iBeacons  y que esta disponible de forma gratuita en la App Store.
Buscando un poco, encontramos el UUID que esta empresa esta manejando, así que solo tendríamos que asignarlo para que la aplicación lo detecte, seria un caso parecido para aplicaciones de cualquier otro proveedor.
El comando a ejecutar seria:
sudo tools/hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D 00 00 00 00 C8 00
Donde, 4C 00 corresponde al ID de Apple, seguido de la serie de bytes requeridos para la especificación iBeacon hasta C8.
En la aplicación básicamente observaremos que nuestra RasPi funcione como iBeacon, para el ejemplo seleccionamos la opción “Distance Demo” y tendríamos que ver como detecta posición de nuestra RasPi sin problema.
iB006

Espero les sea de mucha ayuda esta guía rápida, sobre todo si alguien por aquí hace Software y empieza a meterse con esta nueva tendencia. No prometo nada pero esperamos mas adelante mostrarles un poco el lado de la programación de Apps para interactuar con dispositivos iBeacon 🙂 .

Raspberry Pi – Leccion 13 – USO DE TELEGRAM DESDE LA TERMINAL

telegram

Hola, tras la recién adquisición de Facebook, se ha difundido el temor del cambio en el rumbo del servicio acostumbrado de WhatsApp. Afortunadamente la dependencia de este servicio está siendo cubierta por novedosas aplicaciones como lo es Telegram. Por suerte la página nos ofrece versiones no oficiales que podemos instalar en diferentes sistemas operativos.

Instalación

Para instalar en Raspbian ejecutamos desde la terminal:

1

telgram1

Después de haber clonado el repositorio de GitHub instalamos lo siguiente:

1
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev

Ejecutamos el archivo de configuración y copilamos el programa:

1
2
./configure
make

telegram2

telegram3

¡ A ponerlo en marcha!

Para ejecutar el programa simplemente debemos ejecutar en la terminal:

1
./telegram -k tg.pub

telegrama4

Nota: Como primera vez la aplicación nos pide nuestro numero telefónico incluyendo el signo + y el área del país. Después  si aún no estamos registrados nos preguntará si queremos registrarnos, pedirá nuestro nombre y apellido. Posteriormente enviará un código de verificación a nuestro celular.

COMANDOS COMPATIBLES

Ejecutando el comando help, nos muestra un listado de todos los comandos que admite, sus parámetros y para qué sirve cada uno de ellos.

telegram5

MENSAJERÍA

  • msg <contacto> texto – envía un mensaje.
  • chat_with_peer <contacto> comienza una en una sesión de chat con este contacto. / Salida o / quit para finalizar con este modo.
  • add_contact <phone-number> <first-name> <last-name> – intenta agregar el contacto a contacto-lista por teléfono.
  • rename_contact <usuario> <first-name> <last-name> – intenta cambiar el nombre de contacto.
  • mark_read <contacto> – marca como leídos todos los mensajes con el contacto.

MULTIMEDIA

  • send_photo <contacto> <photo-file-name> – envía la foto.
  • send_video <contacto> <video-file-name> – envía vídeo.
  • send_text <contacto> <text-file-name> – envía un archivo de texto en forma de mensajes sin formato.
  • load_photo / load_video / load_video_thumb <msg-seqno> – cargas de foto / vídeo para descargar.
  • view_photo / view_video / view_video_thumb <msg-seqno> – carga de fotos / video para descargar y empieza visor predeterminado del sistema.

OPCIONES DE CHAT DE GRUPO

  • chat_info <chat> – imprime información sobre el chat.
  • chat_add_user <chat> <usuario> – añadir un usuario para chatear.
  • chat_del_user <chat> <usuario> – eliminar usuario de chat.
  • rename_chat <chat> <new-name>

BÚSQUEDA

  • buscar <contacto> patrón – patrón de búsquedas en los mensajes con los compañeros.
  • global_search patrón – patrón busca en todos los mensajes.

CHARLA SECRET

  • create_secret_chat <usuario> – crea charla secreta con este usuario.
  • visualize_key <secret_chat> – impresiones de visualización de la clave de cifrado.

ESTADÍSTICAS Y VARIOS INFO

  • USER_INFO <usuario> – imprime información sobre el usuario.
  • history <contacto> [límite] – historia impresiones (y la marca como leído). Límite predeterminado = 40.
  • dialog_list – imprime información acerca de sus diálogos.
  • contact_list – imprime información acerca de los usuarios en su lista de contactos.
  • suggested_contacts – información impresa acerca de los contactos.
  • show_license – imprime el contenido de GPLv2.
  • help – imprime esta ayuda.

EJEMPLO:

Para crear una conversación con algún contacto basta con ejecutar telegram y teclear el comando chat_with_peer <contacto> , se habré un chat interactivo. Para poder salir simplemente ejecutamos /exit

telegram8

telegram9

En este ejemplo usé Telegram desde mi ordenador y desde la Raspberry Pi. Otra ventaja de esta aplicación es que te permite registrar varios dispositivos e incluso chatear entre ellos sin ningún problema con un sólo número telefónico.

Para mandar una imagen es igual de sencillo. Sólo ejecutamos el comando send_photo <contacto> <ruta del la foto> y enseguida se empezará a cargar la imagen o foto.

telegram10

telegram11

Estoy buscando la manera de poder ejecutarlo desde Python para poder hacerlo interactivo con los pines de la Raspberry Pi pero por el momento es muy agradable chatear desde nuestra terminal de la Raspbian.

Raspberry Pi – Lección 12 – Uso de PiCamera con Python

picamerahk

 Hay muchas formas de usar nuestra Pi Camera con Python, sin embargo, siempre era con subprocesos, ejecutando un programa distinto a Python dentro de este. Hasta que hace pocos días salio la noticia en Raspberrypi.org  de una librería para controlar nuestra Pi Camera, nativa de Python. Con esta librería podemos controlar desde un preview hasta el control del led que incluye la Pi Camera. Todo esto gracias a  Dave Hughes.

Instalemos

Para instalar como todo programa es recomendable casi necesario actualizar nuestra Raspberry Pi, para que pueda encontrar la librería en los repositorios, usamos los típicos comandos para la terminal;

 
 
sudo apt-get update
sudo apt-get upgrade

y para descargar e instalar la librería basta con ejecutar esto en el Terminal.

sudo apt-get install python-picamera

Vista previa

Esta opción nos permite visualizar en tiempo real la imagen dela cámara, ademas de poder ajustar los parámetros como brillo y ver los resultados inmediatamente en la vista previa. Crearemos un ejemplo que nos permita ver la vista previa.

#!/usr/bin/python
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    time.sleep(10)
    picam.stop_preview()
    picam.close()

Lo guardamos y lo ejecutamos como cualquier otro programa de python mediante consola.

Tomar una Foto

Tomar una foto con esta librería basta con una función, como lo muestra el siguiente ejemplo:

#!/usr/bin/python
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    time.sleep(5)
    picam.capture(‘nombre.jpg’)
    picam.stop_preview()
    picam.close()

En el ejemplo fue guardada una captura con el formato ‘jpg’ pero de la misma forma podemos guardar la captura en ‘png’, ‘gif’, ‘bmp’, ‘yuv’, ‘rgb’ y ‘raw’. Lo que es bastante cómodo para poder guardar directamente al formato que ocupemos.

Filmar un Vídeo

Al igual que el anterior ejemplo basta con una función, en el siguiente ejemplo mostraremos con preview y gravaremos un vídeo al mismo tiempo de 20 segundos.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.start_recording(‘video.h264’)
        picam.wait_recording(20)
        picam.stop_recording()
    picam.stop_preview()
    picam.close()

Por el momento solo he podido grabar en formato H264,  es importante  agregar el wait_recording() ya que aparte de servir como el time.sleep(), hace un reconocimiento al mismo tiempo que va gravando y si por ejemplo ya no hay espacio en disco para la grabación.

Resolución

Como notaron al tomar la foto es de mayor resolución que el vídeo incluso que la vista previa. “En concreto, el sensor de la cámara tiene una resolución de 2592×1944 píxeles (aproximadamente 5 mega píxeles en el área), pero sólo los 1920×1080 píxeles en el centro del sensor se utilizan para las previsualizaciones o video” Dave Hughes. 

sensor_area

Por esta razón y muchas mas, la librería cuanta con una opción para seleccionar la resolución que queramos como en el siguiente ejemplo.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.resolution = (2592, 1944)
    picam.start_preview()
    time.sleep(3)
    picam.capture(‘foto.jpg’)
    picam.stop_preview()
    picam.close()

También debido a que entre mas resolución la imagen es mas pesada, así que también nos brindan un modo de reescalar la imagen, es decir que abarque todo lo que la cámara ve pero que se guarde en una resolución menor .

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.resolution = (2592, 1944)
    picam.start_preview()
    time.sleep(3)
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

 Led

Aveces queremos tomar fotos y que nadie se de cuenta por desgracia la cámara tiene un led que se enciende al usarla, ahora gracias a esta librería podemos desactivar este molesto led.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.led= False
    picam.start_preview()
    time.sleep(3)
    picam.stop_preview()
    picam.close()

Nota: Para poder ejecutar en caso de ajustar el led, tendremos que ejecutar como root, o bien con sudo python programa.py

ISO

Para aquellos que sepan un poco mas de fotografía les agradara saber que se puede ajustar el ISO, para poder sacar mejores fotografías y es muy sencillo, solo tenemos que llamar a la función ISO e igualarla a un valor, que pueden ser alguno de estos; 100, 200, 320, 400, 500, 640, 800.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.ISO =500
    time.sleep(3)
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

Velocidad de Obturación

Otra característica que me gusto mucho es que puedes controlar la velocidad de obturación, lo que te permite sacar fotografías a un mas profesionales. Los valores de dan en micro segundos.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.ISO =100
    time.sleep(3)
    picam.shutter_speed= 300000
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

Brillo

Ademas de todas las anteriores igual se puede ajustar el brillo basta con asignar un valor del 0 al 100 .

#!/usr/bin/python
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.brightness= 60
    picam.ISO =100
    time.sleep(3)
    picam.shutter_speed= 300000
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

Efectos de imagen

Como toda buena cámara, la Picam cuenta con efectos de cámara, ahora mismos solo he probado'negative' , 'solarize' y 'gpen'

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.led = False
    picam.start_preview()
    picam.image_effect = ‘negative’
    time.sleep(20)
    picam.stop_preview()
    picam.close()

Nota:  Los parámetros como brillo, ISO, contraste, efectos de imagen , saturación y nitidez se pueden ajustar cuando la vista previa esta activada.

Se pueden ajustar infinidad de cosas mas, como saturacion, nitidez, rotar imagen, hacer streaming, time lapse, ráfagas de fotos muy rápidas. Los invito a que ustedes mismos experimenten con toda esta librería, encontraran toda la documentación en PICAMERA .

Este es un TimeLapse que hice cuando estaba probando la librería, espero y les guste. Gracias por su tiempo, les mando un saludo y suerte en sus proyectos…

portada