Ya vimos en un artículo anterior sobre la conexión de Xbee con Arduino. Ahora nos interesa conectar Arduino con Xbee y al otro extremo del enlace el Xbee con Beaglebone.
Eso es lo que se muestra en la figura a la izquierda.
Ya contamos con los XBee configurados, ellos los usaremos nuevamente. La lista de elementos despues del salto.
Elementos
- Beaglebone con Angstrom Linux A6, o la ultima versión disponible
- Fuente de poder 5V @1500 mA
- USB explorer
- 2 x XBee series2
- Arduino Uno
- XBee Shield
- Sensor de Temperatura LM35
- Protoboard
- Cables para protoboard
- Cable de Red
- PC con programa X-CTU y Arduino
Procedimiento
Software parte 1
Primero verificamos la versión de Angstrom instalada
root@beaglebone:~# lsb_release -a Distributor ID: Angstrom Description: Angstrom GNU/Linux v2012.05 (Core edition) Release: v2012.05 Codename: Core edition root@beaglebone:~#
Instala la ultima version de Sw disponible desde http://circuitco.com/support/index.php?title=BeagleBone#Image_Files . Para esta prueba nosotros usamos la imagen Angstrom A6 que se encuentra en este link
Ahora se ejecutan los siguientes comandos
opkg update opkg upgrade opkg install python-pyserial opkg install python-distutils
En BeagleBone hay 5 puertos UART (Universal Asynchronous Receiver/Transmitter) disponibles, todos ellas con soporte de 3.3V, segun se indica en GigaMegaBlog
Veremos la configuración de UART01 donde UART1_TXD esta en P9.24 y UART01_RXD en P9.26
Verificamos el status del pin de Rx
root@beaglebone:~# cat /sys/kernel/debug/omap_mux/uart1_rxd name: uart1_rxd.gpio0_14 (0x44e10980/0x980 = 0x0037), b NA, t NA mode: OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE7 signals: uart1_rxd | mmc1_sdwp | d_can1_tx | i2c1_sda | NA | pr1_uart0_rxd| NA | gpio0_14
Verificamos el status del pin de Tx
root@beaglebone:~# cat /sys/kernel/debug/omap_mux/uart1_txd name: uart1_txd.gpio0_15 (0x44e10984/0x984 = 0x0037), b NA, t NA mode: OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE7 signals: uart1_txd | mmc2_sdwp | d_can1_rx | i2c1_scl | NA | pr1_uart0_txd_mux1 | NA | gpio0_15 root@beaglebone:~#
Ambos pines tienen el valor 0x37, que en binario es 110111. Cambiamos la configuracion de UART1 _RXD a 0x20 (que en binario es 100000) y UART1_ TXD a 0, para ello usamos los comandos, que se indican en ElectricStitches
echo 20 > /sys/kernel/debug/omap_mux/uart1_rxd echo 0 > /sys/kernel/debug/omap_mux/uart1_txd
Para la definicion de los valores anteriores tomar como referencia la tabla 9-60 que aparece en el Manual de referencia ARM.
La explicación de los valores es como se indica: para habilitar la funcionalidad de los UART Tx y Rx se debe configurar el MODO 0 (ver tabla 12 del Manual de referencia de Beaglebone) definidos en los 3 bits menos significativos. El bit 5 se configura como 1 en Rx y como 0 en Tx
Con esto Beaglebone esta preparado para conectar un modulo XBee
En el caso de Arduino, es bastante simple: cargamos el siguiente sketch, que ya hemos usado en otras ocasiones.
// Declaración de variables float tempC; int tempPin = 0; // Definimos la entrada en pin A0 void setup() { // Abre puerto serial y lo configura a 9600 bps Serial.begin(9600); } void loop() { // Lee el valor desde el sensor tempC = analogRead(tempPin); // Convierte el valor a temperatura tempC = (5.0 * tempC * 100.0)/1024.0; // Envia el dato al puerto serial Serial.print(tempC); Serial.print(" grados Celsius\n"); // Espera cinco segundo para repetir el loop delay(5000); }
Y conectamos el sensor de temperatura en las puerta A0 del Arduino . Puedes probar con otro sketch y otro sensor mientras habilites la puerta serial para transmitir esos datos no tendras problemas para completar la actividad.
Seccion de Hardware
Ante todo los XBee deben estar configurados, uno como Coordinator AT y el otro como Router AT, si no sabes como se hace esto puedes revisar nuestro articulo anterior sobre el tema.
Conectamos el XBee Coordinator al USB Explorer y usamos los siguientes pines
PIN9.26, Rx de BeagleBone al Tx de USB Explorer (DOUT)
PIN9.24, Tx de BeagleBone al Rx de USB Explorer (DIN)
PIN9.3 , 3,3 Volts (3.3V)
PIN9.1 , tierra o referencia (GND)
Esto se muestra en la siguiente foto
Por el lado de Arduino se debe conectar el XBee shield y el XBee tal como se ve aquí
Software parte 2: Codificando en Python
Para codificar nos basamos en el programa que se indica a continuacion, https://github.com/mrstitch/XBeeBeagleBone/blob/master/listen.py en el realizamos varios cambios para facilitar la lectura y extender la funcionalidad
Este es el código que implementamos
#!/usr/bin/env python # www.InternetDeLasCosas.cl # # Nombre: XBeeBeaglebone.py # Lenguaje: Python # # Funcionalidad: Leer el puerto serial UART01 en el Beaglebone conectado a un XBee # imprime en pantalla la linea completa recibida. # Autor: Manuel Carrasco @mcarrasco # Fecha: 2012-09-04 # contacto@internetdelascosas.cl # Basado en: https://github.com/mrstitch/XBeeBeagleBone/blob/master/listen.py import serial, os import sys from datetime import * os.system("echo 20 > /sys/kernel/debug/omap_mux/uart1_rxd") os.system("echo 0 > /sys/kernel/debug/omap_mux/uart1_txd") PORT = '/dev/ttyO1' #set tty port NOTE: On Beaglebone O1 is the letter O BAUD_RATE = 9600 #set baud rate ser = serial.Serial(PORT, BAUD_RATE) #open serial port log = open("/var/log/xbeebbone.log","a") # Open log file while True: try: a = ser.readline() # Read complete line, ended with /n # print a # Uncomment this if you want so see lines on screen log.write(str(datetime.today())[:-7] + ' ') log.write(a + '\n') except KeyboardInterrupt: break log.close() ser.close()
Este script lo puedes bajar de
wget http://pastebin.com/raw.php?i=1mgrJgjQ cp raw.php?i=1mgrJgjQ XBeeBeaglebone.py
Si tienes dudas o consultas pueden usar los comentarios al final de este artículo. No olvides seguirnos en twitter en @InternetDLC
Comentarios
La configuración que hemos visto abre múltiples posibilidades, si creamos una red en malla podremos recibir información de distintos sensores distribuidos en un edificio. Si nos aventuramos a probar el modo directo de XBee podremos prescindir del Arduino para sensar.
Esta es la ventaja de contar con un equipo como Beaglebone, que se conecta de modo nativo a Internet
Algunas de estas opciones seguiremos viendo en los proximos tutoriales.
Bibliografía
[ARM9TRM] http://www.ti.com/lit/ug/spruh73f/spruh73f.pdf
[DANWATTS] http://www.gigamegablog.com/2012/01/22/beaglebone-coding-101-using-the-serial-and-analog-pins/
[EMMANUEL] http://emmanuel.pouly.free.fr/beagle1.html
[STITCH] http://electricstitches.com/blog/2012/03/22/xbee-beaglebone-communication/
[PySerial] Documentación oficial de PySerial http://pyserial.sourceforge.net/index.html
Podrias indicarme como se conecta la beagle al ordenador por tarjeta de red ethernet, pues la uso pero solo via USB y la velocidad no es la adecuada y no he podido establecer la conexion ethernet
Gracias
Estimado,
Ante todo la conexión del BeagleBone directo hacia un computador (sin usar un switch) es un tema del sistema operativo.
En mi caso uso Windows 7 lo que hago es compartir internet desde la opción de configuración de red.
Ahora si te refieres al programa de conexión, @joniuz te da las recomendaciones apropiadas 🙂
Saludos
Julio
La conexión mediante terminal USB debería ser tan rápida como la de red.
Si deseas conectarte mediante la tarjeta de red, debes utilizar un software que utilice el protocolo SSH. El Beaglebone es un servidor Linux y como tal puedes acceder remotamente usando SSH, desde otro Linux debes ejecutar la instruccion «ssh usuario@ip_del_beaglebone», si utilizas Windows puedes instalar el software gratuito Putty desde http://www.putty.org/
Saludos
Me olvidaba de agradeceros.
Lo que ustedes me han recomendado ha funcionado correctamente.
Ahora ya puedo avanzar mas en beagle.
Son muy amables. Gracias
De nada Julio, nos alegra que te sirva la informacion que publicamos.
Si tienes una idea o necesidad donde podamos aportar puedes escribirnos via formulario de contacto o al correo contacto@internetdelascosas.cl
Saludos
Manuel
Hola Manuel, joniuz.
Otra vez estoy por aqui, estoy cacharreando con la beagle.
ya he configurado los módulos y los comunico de dos ordenadores con usb explorer y veo esos datos tanto por hyperteminal como por X-CTU.
Ahora quiero ver lo que mando desde el ordenador en la beagle, y viceversa.
En la Beaglebone:
Ya se ha mandado al modo 0 a Tx y Rx con la palabra 0 y 20.
Podrías indicarme como se envían y leen datos es que solamente reviso:
cat /sys/kernel/debug/omap_mux/uart1_rxd y veo los datos????? o al escribir:
echo «dato» > /sys/kernel/debug/omap_mux/uart1_txd ?????
y puedo visualizar los datos que mando en el otro XBee conectado en el ordenador o es mas difícil que eso.
No lo he podido hacer
He visto un link que tienes por arriba y dicen que se debe configurar también spi0_d1 y spi0_sclk? Es cierto??