Usando XBee con Beaglebone

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.

Tabla 1. Son el significado de los pines para cada puerta

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

Foto 1. Conexion de XBee al Beaglebone

Por el lado de Arduino se debe conectar el XBee shield y el XBee tal como se ve aquí

Foto 2. Se muestra como se conecta arduino con Xbee shield y Xbee

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

Author: Manuel Carrasco

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

6 thoughts

  1. 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

    1. 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

    2. 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

  2. Me olvidaba de agradeceros.

    Lo que ustedes me han recomendado ha funcionado correctamente.
    Ahora ya puedo avanzar mas en beagle.
    Son muy amables. Gracias

  3. 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??

Responder a manuel Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *