Transmisor de 2.4Ghz con Arduino

Como vieron hace un par de semanas, estuve diseñando un transmisor de radio control de 4 canales, de 2.4Ghz de frecuencia, para actualizar mi transmisor básico (un Hobbyking de 6 canales).

La idea es que el Arduino se encargue de todo lo que concierne a la lectura de los potenciómetros, inversión de la dirección de los servos (en los casos que se requiera), ajuste de máximos y mínimos, y la generación de la señal PPM, que se enviará al módulo de RF original del transmisor donante.

Actualmente, el programa simple que hice, mantiene memoria para 5 modelos (almacenados en la eeprom del microcontrolador), controla la dirección de los servos, y dual rates para cada canal.

El circuito del transmisor es el siguiente:

tx

 

Como podemos observar, el circuito es bastante simple. El arduino va conectado a un shield de LCD+teclado para la visualización y comando de los menus; los 4 potenciómetros son los que van en las palancas de mando, los 2 interruptores son los de Throtle Cut (apaga los motores directamente) y para el Dual Rate, y la señal PPM es generada en el pin 9 del Arduino, desde donde se la conecta al módulo de 2.4Ghz.

El transmisor funciona a la perfección. Hoy hice un pequeño vuelo de prueba, y no hubo interferencias ni pérdidas de señal.

El código fuente, y la librería RC, necesaria para el cálculo y generación de los pulsos PPM, los pueden descargar de los siguientes enlaces:

El código puede ser mejorado, pero para desoxidarme un poco en la programada de microcontroladores, funciona bién.

Les dejo un video de las últimas pruebas, antes del vuelo.

[HTML1]

 

Transmisor RC con Arduino – Actualización

Este fin de semana que tuve un poco de tiempo libre, pude depurar un poco el código del arduino, y conectarlo al módulo de radiofrecuencia del transmisor que tengo para actualizar.

Estos son los resultados

[HTML1]

El transmisor funciona correctamente, así como las memorias de los modelos (por ahora, en RAM), el dual rate, y la reversa de servos. Voy a programar la grabación en memoria flash de los valores, y una función exponencial básica, y estaremos listos.

Acceso a dispositivos de almacenamiento USB desde el Raspberry Pi

De pronto le haya sucedido a alguien, les dejo este tip.

Al conectar una memoria usb o un hdd portable a su raspberry pi, puede darse el caso de que cuando quieran grabar un archivo sobre el mismo, les devuelva un error de escritura por falta de permisos. Para solucionar esto hay que instalar la librería ntfs-3g, con el siguiente comando:

 

sudo apt-get install ntfs-3g

Con esto, basta con reiciar el Pi, y tendrán acceso de lectura y escritura en sus dispositivos USB…… se ahorrarán un dolor de cabeza 🙂

Arduino + Radiocontrol = Diversión !!

Bueno, como todos saben, soy un «poquitín» fan del Radio Control (fan si, pero exageradamente fan no…. este es un hobby que puede quebrar bancos si no se lo lleva con mesura).

En lo que respecta a aviones de control remoto, soy bastante «cheap» (con los carros, es otra historia jeje). Hace un par de años, compré un radio de 6 canales en hobbyking, un manojo de servos, motores y baterías, todo por $100 incluido el envío. Con eso me ha bastado para, a través del tiempo y de las pruebas, armar un par de avioncitos decentes de espumaflex (si, la misma de los platos desechables) que han resistido el abuso y el aprendizaje del vuelo por radio control.

Pero este post no es sobre aviones o carros, sino sobre arduinos y transmisores. Yo uso este transmisor de hobbyking.

HK-T6XV2-M1(2)

que la verdad, para el precio, dudo que se pueda conseguir algo mejor. 6 canales, 2.4Ghz, 1 receptor super liviano; para iniciarse, los $50 mejor invertidos jejeje. El único pero de este radio es su relativa falta de programación. Digo relativa, porque usando la aplicación para PC y el cable de conexión USB, podemos programarlo como queramos (incluso tiene un modo para helicóptero CCPM), pero cuando tienes 2 aviones, con configuraciones de servo diferentes, se vuelve algo «engorroso» llevar la laptop a todo lado para programar el radio.

Es aquí donde entra el Arduino, y más específicamente un clon de Arduino, el Freaduino Uno, que puede ser comprado en internet por unos cuantos dolares (22,80 para ser exactos). La idea es que el arduino, reemplace todo el CPU del radio transmisor, y nos permita programarlo a nuestra manera.

Actualmente, el arduino tendrá las siguientes tareas:

  1. Leer la posicion de las palancas usando sus ADC
  2. Tomar dichos valores y procesarlos según los parámetros seleccionados (direccion de servos, ajustes de punto máximo, exponenciales, etc)
  3. Generar una señal PPM en función de los valores procesados
  4. Hacer todo esto, mientras se comandan los parámetros de control desde un LCD con un teclado

Realmente, luego de haber programado por muchos años en el micro 8051, y muchas variedades de Pics de Microchip, me doy cuenta el por qué el arduino ha pegado tanto en los hobbistas de electrónica. Al no necesitar programador adicional, se vuelve una herramienta plug-and-play para cualquier proyecto electrónico; su interfaz de programación es fácil de usar, y existen librerias prediseñadas casi para todo…… el sueño de todo estudiante de electrónica. Volviendo al tema, el uso del arduino en este proyecto, resultó una grán ventaja, ya que primero, las librerías para manejo de los ADC, LCD y teclado están ya listas, solo de incluirlas y usar.

Luego de unas pocas líneas de código, pude generar un menú de opciones, para seleccionar los valores de la dirección del servo, y los dual rates para cada canal. esto lo podemos ver en las siguientes imágenes.

2013-01-26_10-13-53_126

 

2013-01-26_10-14-13_468

 

Realmente, uno se ahorra tiempo y plata, tomando en cuenta que acá un PIC 18F4550 bordea los $10 sin los componentes adicionales para hacerlo funcionar, creo que facil el arduino que he comprado resulta más barato que la placa de comando de servos que diseñé hace algun tiempo, basada en Pic.

Hasta ahora todo va bien, tenemos el ADC y algunas opciones básicas funcionando en el nuevo CPU de nuestro radio, pero viene la parte fuerte, tomar los valores procesados y convertirlos en una señal PPM, la cual será alimentada al módulo de 2.4Ghz del radio, para transmitirla al aire.

Luego de algunas pruebas, he logrado generar dicha señal, y va bastante bién. El siguiente paso es montar todo en la caja del radio y probar si realmente funciona. Les dejo una imágen de mi pantalla (estoy usando un osciloscopio de tarjeta de sonido para verificar las señales) para que observen la señal generada a la salida del nuevo CPU.

Apenas existan más avances, se los haré saber 😉

2013-03-09_23-02-09_575

 

 

Configura tu Raspberry Pi para acceder remotamente usando No-IP

Bueno, poco a poco el Raspberry Pi va teniendo más funciones a su cargo. Luego de convertirse en cámara IP, y servidor de Airplay, y luego de instalar apache y mysql (algo tan trivial como poner sudo apt-get install apache2 y sudo apt-get install mysql), llegó la hora de darle acceso al PI al mundo exterior.

Primero, debemos tomar en cuenta, que la mayoría de nosotros, tenemos una conexión casera de internet, que no tiene una dirección IP estática. Por esta razón, necesitamos alguna manera de conocer la dirección IP de nuestro modem de banda ancha, para tener una dirección de acceso a nuestra red.

Existe el servicio de www.no-ip.com, que nos permite crear un dominio virtual (o si tenemos un nombre de dominio libre, lo pueden configurar también ahí), y este dominio virtual, asignarlo a una dirección IP donde esté conectado nuestro servidor (el PI en este caso). Entonces, el primer paso obligado, es ingresar en www.no-ip.com y crear una cuenta nueva, para escoger un subdominio de los varios que se tienen disponibles en dicho servicio.

Una vez que hemos creado y configurado la cuenta, vamos a trabajar en nuestro Raspberry Pi. La idea es que periódicamente, el PI detecte la dirección IP pública a la que está conectado el modem, y la envíe al servicio no-ip para actualizar el dominio virtual. Para esto, debemos instalar el paquete no-ip en nuestro Raspberry, usando los siguientes comandos:

mkdir no-ip
cd no-ip
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar -zxvf noip-duc-linux.tar.gz
cd noip-2.1.9-1/
make
sudo make install

Al empezar la instalación, nos solicitará nuestros datos de la cuenta de no-ip, verificará el dominio virtual creado y nos preguntará el tiempo de actualización de la dirección ip externa. Podemos dejar todos los valores por defecto tal cual, y continuar hasta finalizar la instalación.

Podemos iniciar el servicio ejecutando «sudo /usr/local/bin/noip2» pero lo ideal sería que inicie automáticamente en el arranque del PI. Para esto debemos crear el archivo /etc/init.d/noip2 con el comando

sudo nano /etc/init.d/noip2

y colocamos esto dentro del contenido del mismo

#! /bin/bash
### BEGIN INIT INFO
# Provides: Servicio No-IP
# Required-Start: $syslog
# Required-Stop: $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: arranque automatico para no-ip
# Description:
#
### END INIT INFO
sudo /usr/local/bin/noip2

Guardamos el archivo, y finalmente damos permisos de ejecución, y lo colocamos en la cola de arranque

sudo chmod +x /etc/init.d/noip2
sudo update-rc.d noip2 defaults

Así garantizamos que el dominio virtual creado en no-ip tenga siempre asignada nuestra dirección IP externa de nuestro modem. Ahora si podemos configurar nuestros servidores virtuales en nuestro router y listo! acceso externo a nuestro PI.

En mi caso, tengo un modem Huawei, y configurar los servidores virtuales no es ninguna ciencia. Se crea el nombre del servicio, se asignan los rangos de puertos y la IP interna a la que se redireccionará el servicio y listo.

rpi_ports

Con esto, tengo acceso VNC, SSH y HTTP a mi Raspberry Pi. Cero seguridad (no se recomienda nunca abrir un SSH, pero bueno, esto se hizo para probar) pero cualquier cosa que pase con mi Pi la puedo revisar desde la oficina o desde mi teléfono celular

 

Airplay con el Raspberry Pi

Luego de que la cámara de video ha grabado sin problema muchas imágenes, utilizando Motion, con una webcam conectada al Raspberry Pi, y dado que mi esposa se ha vuelto fan del TuneIn Radio en su iPhone, se me ocurrió la brillante idea de instalar el paquete Shairport, para que el Raspi reproduzca el audio en nuestro minicomponente desde el teléfono, usando WiFi.

La instalación es bastante sencilla. Primero es necesario actualizar todos los paquetes del Raspbian instalado, con los siguientes comandos.

sudo su

aptitude update

aptitude upgrade

Con esto garantizamos que todo se encuentre al día, para poder continuar. Luego de esto, instalamos los prerequisitos para el paquete Shairport, con el siguiente comando:

aptitude install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils

Además, es necesario (al menos en mi caso) instalar la librería SDP para Perl. Esto lo hacemos con los siguientes comandos:

aptitude install libmodule-build-perl
git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp
cd perl-net-sdp
perl Build.PL
./Build
./Build test
./Build install

 

Y con todo esto instalado, procedemos a descargar y compilar Shairport, con los siguientes comandos:

cd
git clone https://github.com/hendrikw82/shairport.git shairport
make

Si no tenemos ningún error, en la compilación, podremos probarlo, iniciando la aplicación desde la consola, con el comando

./shairport.pl -a ShairPi

Ahora pueden tomar su equipo favorito de la marca de la manzana (iPhone, iPod, iPad) o cualquier equipo compatible con Airplay, y verificar el funcionamiento. En este caso, deberá mostrar un dispositivo Airport con nombre ShairPi el momento de redireccionar el audio.

Si todo funciona correctamente, procedemos con Ctrl+C a cerrar la aplicación, e instalarla como servicio, para que se inicie automáticamente al arrancar nuestro Pi. Esto lo realizamos con los siguientes comandos:

make install
cp shairport.init.sample /etc/init.d/shairport
cd /etc/init.d
chmod a+x shairport
update-rc.d shairport defaults

Adicionalmente, es necesario editar el archivo DAEMON_ARGS, en la línea DAEMON_ARGS=”-w $PIDFILE para que quede de esta manera:

DAEMON_ARGS=”-w $PIDFILE -a ShairPi

donde ShairPi puede ser reemplazado por el nombre que quieran ponerle a su Airplay. Luego iniciamos el servicio con el comando:

./shairport start

Y tendremos el servicio levantado cada vez que iniciemos nuestro RasPi.

El Airplay funciona bastante bien. Simplemente existen momentos, especialmente cuando se pausa y reinicia muy seguido la reproducción desde el teléfono, que el módulo de WiFi instalado en el Raspberry se desconecta. Quizás con una conexión con cable no tengan ese inconveniente.

Pruebenlo y me cuentan.

Video Vigilancia con el Raspberry Pi

Dado que mi pequeño Raspberry Pi se encontraba algo desatendido, decidí darle una prueba al paquete Motion, que es utilizado para la captura y detección de movimiento para ambientes Linux.

La instalación de Motion es bastante sencilla. Para esto, previamente debemos tener instalado Raspbian en nuestro Pi (es con lo que lo he venido probando desde hace algún tiempo), y bajo la consola de terminal, simplemente ejecutamos los siguientes comandos (asegurándonos de estar conectados al internet)

sudo apt-get update

sudo apt-get motion

El primer comando se encargará de actualizar todos los paquetes nuevos de nuestro Linux, y luego descargará el paquete Motion, directamente.

Para la captura de video, estoy usando la PS3 Eye Cam, que utilicé en la Plataforma Stewart presentada anteriormente. Esta cámara fué detectada por el Raspberry sin problema, y de lo que he leído por ahí, existe gran compatibilidad con distintas cámaras, así que la configuración de la misma sobre el Raspbian es algo trivial.

Una vez instalado  Motion, hay que proceder a configurarlo. Para esto, es necesario editar el archivo motion.conf ubicado en /etc/motion.

En este archivo, vamos a editar algunos parámetros que nos van a ayudar a cumplir nuestro objetivo, que será (al menos en mi caso) capturar una imágen cada minuto y almacenarla en Google Drive, y además, el momento que se detecte un movimiento, así mismo subir dicha imágen  a la nube, y enviar un email de aviso.

Lo primero que debemos configurar es el tamaño de la captura. Como el Raspberry Pi no es lo suficientemente potente para procesar imágenes de alta resolución, vamos a cambiar el tamaño de la imágen a 320×240, editando estas líneas en el archivo motion.conf

width 320
height 240

Otro parámetro con el que debemos jugar, es el threshold, que es el umbral de cambio de la imágen para que se pueda hacer una llamada a la detección de movimiento. El valor default es 1500, pero yo lo subí un poco, para evitar falsos disparos (sobre todo por la mascota nuestra, que siempre ronda la casa)

threshold 3000

Para nuestra aplicación, vamos a necesitar guardar una captura de imagen cada 60 segundos, esto lo logramos usando el parámetro snapshot_interval, que permite configurar el tiempo en segundos en el que se va a guardar una imágen de captura de video.

snapshot_interval 60

Ahora, a lo importante del asunto. Motion permite disparar comandos, dependiendo del evento que sea lanzado por la aplicación. Para nuestra aplicación, vamos a utilizar 2 eventos: on_picture_save  que se lanzará al guardar una imágen cada 60 segundos (configurados en el parámetro anterior), y on_motion_detected que nos lanzará el evento al detectarse movimiento en la cámara.

Previo a esto, vamos a necesitar 3 archivos adicionales, que debemos crear (o descargar) para poder finalizar nuestra aplicación.

El archivo uploader.py (creado por Jeremy Blythe), se encarga de conectarse con los servicios de google drive, y almacena las imágenes guardadas dentro de una carpeta de GDrive. Este archivo, necesita del archivo de configuración uploader.cfg, donde se incluirá todos los datos de conexión de la cuenta de gmail a usar.

El archvo envia_email.py es una modificación realizada por mi, para que únicamente se envíe un email a una dirección determinada, lo que usaremos cuando se haya detectado movimiento frente a la cámara

Con lo comentado anteriormente, deberemos editar los parámetros del archivo motion.conf, modificando las siguientes líneas (puede que los parámetros indicados a continuación estén comentados, así que será necesario quitar el # para que funcione correctamente)

on_picture_save /etc/motion/uploader.py /etc/motion/uploader.cfg %f

on_motion_detected /etc/motion/envia_email.py

el %f en el primer parámetro, se refiere al nombre del archivo grabado ese instante.

Con los archivos guardados correctamente, debemos darles los respectivos permisos de ejecución, así que debemos ejecutar el siguiente comando:

sudo chmod +x /etc/motion/*.py

y luego, podremos iniciar Motion ejecutando

sudo motion

De esta manera, se empezarán a cargar las imágenes en nuestro GDrive, y recibiremos notificaciones de detección de movimiento. Nada mal para un sistema de video seguridad por menos de $100.

Captura

Hackeando al Raspberry Pi

El famoso Raspberry Pi, que no ha tenido mayor uso desde que está en mis manos (más por falta de tiempo, que por falta de ganas), necesitaa un upgrade básico: un conexión WIFI.

El tener un puerto ethernet en la microcomputadora, de hecho que es una ayuda gigantezca, pero resulta poco práctico si el único chance de obtener una conexión por cable a la red, es dejarlo conectado debajo de mi escritorio, al router de internet. Es por esto que se volvió justo y necesario, darle una conexión wireless, para poder seguir con las pruebas y los experimentitos.

Por si no lo sabían, el Pi tiene 2 puertos USB, pero con un pequeño limitante. Estos tienen un fusible que limita a 140mA la corriente máxima de cada uno, y ciertos dispositivos USB no funcionan correctamente con ese límite (de hecho un teclado flexible que pensaba usarlo ahi no se enlaza 🙁 ), así que frente a esto quedan 2 opciones:

  • La primera, que es la más común entre los dueños de este bicho, es utilizar un hub usb energizado, que aunque no lo crean, resultó bastante escazo por acá (el único que encontre buscando un poco, pedían $40, así que negado). Por seguridad creo que voy a buscar un hub chinito en ebay, y esperar que llegue; pero…..
  • La segunda opción es meterle mano al Pi, con la pérdida de garantía que eso conlleva, y eliminar los límites de corriente.

Para no perder la costumbre, me fuí por la segunda opción, pero a medias, ya le realicé un puente únicamente en el puerto usb superior, quedando el inferior con protección (ahí tengo conectado un mini hub usb para el teclado y el mouse), así que el wireless irá en el puerto de arriba.

2012-08-29 20.34.07

Como se puede ver en la foto (mirenla en flickr, para verla en detalle), pueden ver el cablecito de puente sobre el fusible que se encuentra a un costado del conector…… cero garantía contra daños y 100% conexión!

Ahora, una vez que logramos alimentar correctamente el usb, tenemos que instalar el módulo en el sistema operativo del RPi.

El módulo usado es un TP-Link 723n que para mi buena suerte, costó $18 y es compatible 100% con Debian Wheezy pero para facilitar aún más las cosas, encontré un script que se encarga de toda la instalación de drivers, y configuración de la red wireless. Este script lo pueden encontrar en esta url http://dl.dropbox.com/u/80256631/install-rtl8188cus-latest.sh y lo deben ejecutar con el siguiente comando, desde el terminal de su RPi:

sudo ./install-rtl8188cus-latest.sh

Es cuestión de seguir los pasos (ojo, no se debe conectar el módulo USB hasta que el script lo solicite), colocar el nombre de la SSID y la contraseña, y voilá! tenemos wifi en el Pi.

Les dejo algunas imágenes del hack, y hasta ahora está funcionando sin problema. Además, me olvidaba. El Pi está overclockeado a 900Mhz (viene a 700Mhz de fabrica) y hasta ahora está super estable.

Les dejo algunas fotitos adicionales.

 

2012-08-29 20.43.43

2012-08-29 20.42.24

2012-08-29 20.34.07

Controlador para servomotores USB, con entradas y salidas digitales

Para mi proyecto de tesis (recuerdan la Plataforma Stewart?), realizado con mi compañera Natalia Gonzalez, tuvimos la necesidad de diseñar una tarjeta controladora de servos, que nos permita controlar simultáneamente hasta 8 servos, con entradas y salidas digitales adicionales, y controlado por puerto USB. Para esto, hemos utilizado un microcontrolador PIC 18F4550, que tiene el hardware para conexión USB integrado dentro del microcontrolador, y dicho puerto USB puede ser configurado como un puerto serial emulado, lo que facilita muchísimo la interfaz con el PC, al no necesitar programar drivers específicos para nuestra tarjeta electrónica.

Como conocemos, cada servomotor necesita un pulso, cuyo ancho debe variar entre 1.25 y 1.75ms (siendo 1.5ms el ancho de pulso necesario para llegar a la posición central), que debe ser refrescado cada 20ms para mantener su posición. Controlar un servo por medio de interrupciones no presenta mayor inconveniente, pero para controlar 8 simultáneos, hay que poner un poco a trabajar el cerebro.

Usando una sola interrupción para controlar los 8 servomotores, lo que debemos hacer es multiplexar al timer 0, de tal manera, que aproximadamente cada 4ms, se dispara una nueva interrupción, que indicará que salida de servo se debe activar, y el tiempo que estará activa, de acuerdo a los valores de posición que asignemos a cada servo.

Los datos de la posición de cada servo, se los enviará via comunicación serial por el puerto USB, para esto se ha definido un pequeño protocolo de comunicación con la tarjeta electrónica, que responde a los siguientes comandos:

// comandos:
// 's' muestra ok para verificar conexion
// 'd'x escribe dato de 8 bits. espera dato de salida
// 'q'x activa salida x (0-7)
// 'w'x desactiva salida x (0-7)
// 'r' devuelve un dato de 8 bits de entrada del puerto D
// 'p'xy asigna al servo x (caracter entre 0 y 7) el valor y (caracter con un código ASCII entre 0 y 255)

Con estos comandos, además de poder controlamos los servos, tenemos la posibilidad de usar las entradas y salidas digitales programadas para la tarjeta.

El esquema del circuito es bastante sencillo, tal como lo mostramos a continuación:

Algo a tomar en cuenta en el diseño de la tarjeta electrónica, es la alimentación del circuito. El microcontrolador, puede ser alimentado directamente con los +5V del puerto USB, pero los servos, dependiendo del tipo, pueden consumir mucha mas corriente de los 1000mA que puede entregar el puerto USB de un computador personal. Es por esto, que tenemos 2 lineas de alimentación: Vdd que alimenta el microcontrolador (y está enlazado a +5V del puerto USB) y V+ que es una alimentación externa para los servos (que incluso, para darles mayor torque, puede subir hasta 6V, o más, si usamos servos HV).

Para el diseño del PCB, se utilizó una placa de doble lado, con un diseño bastante sencillo. El diseño como tal no es crítico, ya que se manejan señales de baja frecuencia.

El software que corre en el microcontrolador, fué realizado en C, usando el compilador propio de Microchip. El código fuente, con todas sus librerías, puede ser descargado en este enlace y el link del driver para el puerto serie (en sí es un archivo inf, con las definiciones del puerto USB) puede ser descargado aquí.

Podemos decir que se puede mejorar un poco el software (podrían agregarse entradas analógicas únicamente cambiando el código fuente, sin modificar el hardware), pero para nuestro proyecto, esta tarjeta electrónica funcionó perfectamente.

Les dejo un video del robot, que utiliza servos 6 estandard, cuyo control es realizado por la tarjeta electrónica que presentamos acá.

[HTML1]

Y el video final de la plataforma (el que fué presentado en la sustentación final de la tesis)

[HTML2]