00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 __author__ = "astambler@willowgarage.com (Adam Stambler)"
00035
00036
00037 import serial
00038 import yaml
00039 import sys
00040 import time
00041
00042 from optparse import OptionParser
00043
00044
00045
00046 help = """
00047 %prog [options] port my_adr
00048
00049 setup_xbee.py is a configuration script for Xbees. It takes
00050 factory fresh xbee and programs it to work with your rosserial network.
00051 If XBee is not factory fresh, use Digi's X-CTU software to program it.
00052
00053 port : serial port of port of the xbee (/dev/ttyUSB0)
00054 my_adr: MY address is the 16 bit address of this xbee in the
00055 network. This must be a unique address in the network.
00056 This address is always 0 for the coordinator. """
00057 parser = OptionParser(usage=help)
00058
00059
00060 parser.add_option('-P', '--pan_id', action="store", type="int", dest="pan_id", default=1331, help="Pan ID of the xbee network. This ID must be the same for all XBees in your network.")
00061 parser.add_option('-c', '--channel', action="store", type="string", dest="channel", default="0D", help="Frequency channel for the xbee network. The channel value must be the same for all XBees in your network.")
00062 parser.add_option('-C', '--coordinator', action="store_true", dest="coordinator", default=False, help="Configures the XBee as Coordinator for the network. Only make the XBee connected to the computer a coordiantor.")
00063
00064
00065
00066 def send(port, cmd):
00067 for c in cmd+'\r':
00068 port.write(c)
00069 time.sleep(0.06)
00070
00071 def setAT(port, cmd):
00072 port.flushInput()
00073 send(port, 'AT'+cmd)
00074 rsp = port.readline()
00075 print rsp
00076 if 'OK' in rsp:
00077 return True
00078 else :
00079 return False
00080
00081 baud_lookup= { 1200 : 0,
00082 2400 : 1,
00083 4800 : 2,
00084 9600 : 3,
00085 19200 : 4,
00086 38400 : 5,
00087 57600 : 6,
00088 115200 : 7}
00089
00090
00091
00092 def beginAtMode(port):
00093
00094 for i in range(0,3):
00095 port.write('+')
00096 time.sleep(0.05)
00097 time.sleep(1)
00098 if port.read(2) == 'OK':
00099 return True
00100 else :
00101 return False
00102
00103 if __name__ == '__main__':
00104
00105 opts, args = parser.parse_args()
00106
00107 if len(args) < 2:
00108 print "Not enough arguments!"
00109 exit()
00110
00111 baud = 9600
00112 port_name = args[0]
00113 my_address = int(args[1])
00114
00115 port = serial.Serial(port_name, baud, timeout=1.5)
00116
00117 if beginAtMode(port):
00118 print "Connected to the XBee"
00119 else:
00120 print "Failed to connect to the XBee"
00121 exit()
00122
00123
00124 cmd = ''
00125 if (opts.coordinator):
00126 cmd += 'AP2,CE1,'
00127
00128 cmd += 'MY%d,'%int(args[1])
00129 cmd += 'BD%d,'%baud_lookup[57600]
00130 cmd += 'ID%d,'%opts.pan_id
00131 cmd += 'CH%s,'%opts.channel
00132 cmd += 'DL0,'
00133 cmd += 'RN1,'
00134 cmd += 'RO5,'
00135 cmd += 'WR'
00136
00137
00138 if setAT(port, 'RE'):
00139 print "XBee reset"
00140 else:
00141 print "Reset failed"
00142 exit()
00143 beginAtMode(port)
00144 time.sleep(1)
00145 print "Sending command : ", cmd
00146
00147 if setAT(port, cmd):
00148 print "XBee sucessfully programed!"
00149 else:
00150 print "XBee programming failed. Try again and then investigate using X-CTU"
00151
00152
00153