开始使用MicroPython
(http://www.bitconn.com/form_1/注册后,购买XBee模块,送USB评估底板及相关中文资料,或者免费申请借用评估套件)
本用户指南概述了如何将MicroPython与XBee3 Zigbee RF模块配合使用。 有关深入信息和更复杂的代码示例,请参阅“Digi MicroPython编程指南”。 继续本用户指南以获取简单示例,以便在XBee3 Zigbee RF模块上开始使用MicroPython
关于MicroPython
MicroPython是一种基于Python 3.0的开源编程语言,具有大部分相同的语法和功能,但经过修改,适用于硬件资源有限的小型设备,如XBee3 Zigbee RF模块.
有关MicroPython的更多信息, 请访问 www.micropython.org.
有关Python的更多信息, 请访问 www.python.org.
XBee3 Zigbee射频模块上的MicroPython
XBEE3 ZigBeeRF模块在设备本身上运行了Micro Python。 当您将XBee3 Zigbee RF模块安装在适当的开发板(XBDB或XBIB)中时,可以从MicroBy3 Zigbee RF模块访问MicroPython提示,并通过USB电缆将其连接到计算机.
注 MicroPython仅通过UART接口有效,不适用于SPI。设备上的MicroPython编程需要固件版本1003或更高版本。
此用户指南中的示例假定:
使用XCTU进入MicroPython环境
在MicroPython环境中使用XBee3 Zigbee RF模块:
注为了确保MicroPython响应输入,Digi建议将XBee UART波特率设置为115200波特。 要设置UART波特率,请在BD字段中选择115200 [7],然后单击写入按钮。 我们强烈建议使用硬件流控制来避免数据丢失,尤其是在粘贴大量代码或文本时。 有关更多信息,请参阅UART流控制。
在XCTU中使用MicroPython终端
在MicroPython模式下,您可以使用MicroPython终端与XBee3 Zigbee RF模块进行通信。 这需要XCTU 6.3.10或更高版本。 要进入MicroPython模式1,请按照使用XCTU中的步骤进入MicroPython环境。 使用MicroPython终端:
如果出现>>>提示,则说明您已正确连接。 您现在可以在终端中键入或粘贴MicroPython代码.
MicroPython示例
本节提供了如何使用XBee3 Zigbee RF模块使用MicroPython的一些基本功能的示例.
示例:hello world
示例:进入MicroPython粘贴模式(paste mode)
在以下示例中,了解MicroPython支持粘贴模式很有帮助,您可以从此用户指南中复制大量代码并粘贴它,而不是逐个字符地键入。 要使用粘贴模式:
print("Hello World")
注意您可以轻松复制和粘贴本指南在线版的代码。 请谨慎使用PDF版本,因为它可能无法保留必要的缩进
注意如果要在不运行代码的情况下退出粘贴模式,或者代码未正确复制,请按Ctrl + C取消并返回到正常的MicroPython >>>提示符。
示例:使用时间模块
时间模块用于时间敏感的操作,例如在例程或计时器中引入延迟。
XBee3 Zigbee RF模块支持以下时间功能:
注意无法使用标准的time.time()函数,因为此函数会生成自实时计时以来的秒数。 XBee3模块缺少实时时钟,无法提供任何日期或时间数据。
以下示例练习各种睡眠功能,并使用ticks_diff()来测量持续时间:
import time |
|
|
start = time.ticks_ms() |
#从毫秒计数器获取值 |
|
time.sleep(1) |
#睡眠1秒钟 |
|
time.sleep_ms(500) |
#睡眠500毫秒 |
|
time.sleep_us(1000) |
# 睡眠1000微秒 |
|
delta = time.ticks_diff(time.ticks_ms(), start)
print("Operation took {} ms to execute".format(delta))
示例:使用MicroPython的AT命令
AT命令控制XBee3 Zigbee RF模块。 “AT”是“注意”的缩写,前缀“AT”通知模块命令行的开始。 有关可在XBee3 Zigbee RF模块上使用的AT命令列表,请参阅AT命令.
MicroPython提供了一个atcmd()方法来处理AT命令,类似于如何使用命令模式或API帧.
atcmd()方法接受两个参数:
注意xbee.atcmd()方法不支持以下AT命令:IS,AS,ED,ND或DN。
以下是使用xbee.atcmd()查询和设置各种AT命令的示例代码:
import xbee
xbee.atcmd("DH", |
0x0013A200) |
# |
Hex |
xbee.atcmd("DL", |
b'\x12\x25\x89\xF5') |
# |
Bytes |
# 读取一些AT命令并显示值和数据类型:print(“\ nAT命令参数值:”)
commands =["DH", "DL", "NI", "OI"] for cmd in commands:
val = xbee.atcmd(cmd)
print("{}: {:20} of type {}".format(cmd, repr(val), type(val))
此示例代码输出以下内容:
AT command parameter values:
|
DH: b'\x00\x13\xa2\x00' |
of type |
|
DL: b'\x12%\x89\xf5' |
of type |
|
NI: 'XBee3 module' |
of type |
|
OI: 65535 |
of type |
|
|
|
注意存储长度大于16位的值的参数表示为字节。 Python会尽可能打印出ASCII字符,这会导致一些意外的输出(例如上面输出中的“%”)。 如果希望MicroPython的输出与XCTU匹配,可以使用以下示例将字节转换为十六进制:
dl_value = xbee.atcmd("DL")
hex_dl_value = hex(int.from_bytes(dl_value, 'big'))
MicroPython网络和通信示例
本节提供将MicroPython与XBee3 Zigbee RF模块配合使用的网络和通信示例.
使用MicroPython的Zigbee网络
对于小型网络,适合在每个节点上使用MicroPython。 但是,有一些继承限制可能会阻止您在某些流量较大的节点上使用MicroPython:
对于本节中的示例,我们使用MicroPython管理Zigbee网络并在模块之间发送和接收数据。 为了遵循即将到来的示例,我们需要配置第二个XBee3 Zigbee RF模块以使用MicroPython.
XCTU只允许一个MicroPython终端。 我们将在两个模块上运行示例代码,这需要第二个终端窗口.
打开XCTU的第二个实例,并按照Use XCTU to enter the MicroPython environment步骤为MicroPython配置不同的XBee3模块 。
警告! 即将到来的示例形成并加入未加密的Zigbee网络。 如果模块先前与网络关联,则它们将被取消关联。
示例:使用MicroPython形成并加入Zigbee网络
此示例使用MicroPython形成双节点Zigbee网络。 这是后续网络示例的先决条件。
此示例假设您为MicroPython配置了两个XBee3 Zigbee RF模块,并且两个终端打开,每个模块一个.
在第一台XBee模块上执行以下代码; 它将成为我们的网络协调员:
import xbee, time
network_settings = {"CE": 1, "ID": 0xABCD, "EE": 0, "NJ": 0xFF}
for command, value in network_settings.items(): xbee.atcmd(command, value)
xbee.atcmd("AC") # Apply changes time.sleep(1)
while xbee.atcmd("AI") != 0: time.sleep(0.1) print("Network Established")
operating_network = ["OI", "OP", "CH"] print("Operating network parameters:") for cmd in operating_network:
print("{}: {}".format(cmd, xbee.atcmd(cmd)))
在第二个XBee模块上运行以下代码,它将是一个将加入已建立网络的路由器:
import xbee, time
network_settings = {"CE": 0, "ID": 0xABCD, "EE": 0}
for command, value in network_settings.items(): xbee.atcmd(command, value)
xbee.atcmd("AC") # Apply changes time.sleep(1)
# Query AI until it reports success
print("Connecting to network, please wait...") while return xbee.atcmd("AI") != 0:
time.sleep(0.1) print("Connected to Network")
operating_network = ["OI", "OP", "CH"] print("Operating network parameters:") for cmd in operating_network:
print("{}: {}".format(cmd, xbee.atcmd(cmd)))
在两个XBee模块上执行代码后,模块报告操作网络参数。 确保两个无线电报告相同的值以确保它们位于同一网络上。
示例: 使用MicroPython进行网络发现
discover()方法返回一个迭代器,该迭代器在等待结果时阻塞,类似于执行ND请求。有关更多信息,请参见ND(网络发现)。每个结果都是一个基于ND响应的字段的字典。:
Note 打印字典时,device_type,sender_nwk和parent_nwk的字段以十进制形式显示。 您可以使用MicroPython hex()方法以十六进制格式打印整数。 从示例中检查format_eui64的功能代码:两个XBee3 Zigbee模块之间的通信主题代码,用于将sender_eui64字段转换为十六进制字符串,每个字节值之间带冒号.
使用以下示例代码执行网络发现:
import xbee, time
xbee.atcmd("AC")
time.sleep(.5)
nodes = list(xbee.discover())
if nodes:
for node in nodes:
print("\nRadio discovered:") for key, value in node.items():
print("\t{:<12} : {}".format(key, value))
# Set NO back to the default value xbee.atcmd("NO", 0) xbee.atcmd("AC")
这将从两个已发现的节点生成以下输出:
Radio discovered: |
: -63 |
|
|
Rssi |
|
node_id |
: Coordinator |
device_type |
: 1179648 |
parent_nwk |
: 65534 |
sender_nwk |
: 0 |
sender_eui64 |
: b'\x00\x13\xa2\xff h\x98T' |
node_type |
: 0 |
Radio discovered: |
: -75 |
rssi |
|
node_id |
: Router |
device_type |
: 1179648 |
parent_nwk |
: 65534 |
sender_nwk |
: 23125 |
sender_eui64 |
: b'\x00\x13\xa2\xffh\x98c&' |
node_type |
: 1 |
示例: 发送数据
本节提供使用MicroPython传输数据的示例。 这些示例假设您已按照上述示例进行操作,并且两个无线电在同一网络上。
示例:发送消息
使用XBEE3 ZigBee设备发送消息。函数的调用由以下参数组成:
16位寻址整数
64位寻址的8字节字节对象
常量xbee.ADDR_BROADCAST表示广播目的地
常量xbee.ADDR_COORDINATOR用于指示协调器
如果消息发送成功,则transmit()返回None。 如果由于ACK失败或接收器上没有空闲缓冲区空间而导致传输失败,则将静默丢弃发送的数据包.
示例:将消息发送到网络协调器
示例:将自定义消息发送到网络中的所有节点
该程序执行网络发现并发送消息“Hello
import xbee
# Perform a network discovery to gather destination address: print("Discovering remote nodes, please wait...")
node_list = list(xbee.discover()) if not node_list:
raise Exception("Network discovery did not find any remote devices")
for node in node_list:
dest_addr = node['sender_nwk'] # 'sender_eui64' can also be used dest_node_id = node['node_id']
payload_data = "Hello, " + dest_node_id + "!"
try:
print("Sending \"{}\" to {}".format(payload_data, hex(dest_addr))) xbee.transmit(dest_addr, payload_data)
except Exception as err: print(err)
print("complete")
接收数据
使用xbee模块中的receive()函数来接收消息。 当MicroPython在设备上处于活动状态(AP设置为4)时,所有传入的消息都将保存到MicroPython中的接收队列中。 此接收队列的大小有限,只能容纳4条消息。 为了确保数据不会丢失,重要的是不断迭代接收队列并处理其中的任何数据包。如果接收队列已满并且另一条消息被发送到设备,它将不会确认该数据包,并且发送方生成失败状态0x24(未找到地址).
receive()函数返回以下之一:
示例:持续接收数据
在此示例中,format_packet()帮助程序格式化字典的内容,format_eui64()格式化保存EUI-64的字节对象。 while循环显示如何持续轮询数据包以确保接收缓冲区不会变满.
def format_eui64(addr):
return ':'.join('%02x' % b for b in addr)
def format_packet(p):
type = 'Broadcast' if p['broadcast'] else 'Unicast' print("%s message from EUI-64 %s (network 0x%04X)" % (type,
format_eui64(p['sender_eui64']), p['sender_nwk']))
print(" from ep 0x%02X to ep 0x%02X, cluster 0x%04X, profile 0x%04X:" % (p['source_ep'], p['dest_ep'], p['cluster'], p['profile']))
print(p['payload'])
import xbee, time while True:
print("Receiving data...") print("Press CTRL+C to cancel.") p = xbee.receive()
if p:
format_packet(p)
else:
time.sleep(0.25) # wait 0.25 seconds before checking again
如果此节点先前已收到数据包,则输出如下:
Unicast message from EUI-64 00:13:a2:00:41:74:ca:70 (network 0x6D81) from ep 0xE8 to ep 0xE8, cluster 0x0011, profile 0xC105:
b'Hello World!'
Note Digi建议在循环中调用receive()函数,这样就不会丢失数据。 在存在大量网络流量的模块上,如果没有足够快地从队列中提取消息,则可能会丢失数据.
示例:两个XBee3 Zigbee模块之间的通信
此示例结合了前面的所有示例,并表示配置网络,发现远程节点以及发送和接收消息的完整应用程序。
首先,我们将一些实用程序功能上传到MicroPython的Flash空间中,以便以下示例更易于阅读.
完成以下步骤,在两个设备上使用闪存模式编译和执行实用程序功能:
import xbee, time
# Utility functions to perform XBee3 Zigbee operations def format_eui64(addr):
return ':'.join('%02x' % b for b in addr)
def format_packet(p):
type = 'Broadcast' if p['broadcast'] else 'Unicast' print("%s message from EUI-64 %s (network 0x%04X)" %
(type, format_eui64(p['sender_eui64']), p['sender_nwk'])) print("from ep 0x%02X to ep 0x%02X, cluster 0x%04X, profile 0x%04X:" %
(p['source_ep'], p['dest_ep'], p['cluster'], p['profile'])) print(p['payload'],"\n")
def network_status():
# If the value of AI is non zero, the module is not connected to a network return xbee.atcmd("AI"))
按Ctrl + R运行已编译的代码; 这为下一个示例提供了对这些实用程序功能的访问.
协调器模块上的示例代码
以下示例代码将Zigbee网络形成为协调器,执行网络发现以查找远程节点,并连续打印出任何传入数据。
print("Forming a new network as a coordinator...") xbee.atcmd("NI", "Coordinator")
network_settings = {"CE": 1, "ID": 0x3332, "EE": 0, "NJ": 0xFF} for command, value in network_settings.items():
xbee.atcmd(command, value) xbee.atcmd("AC") # Apply changes time.sleep(1)
while network_status() != 0: time.sleep(0.1) print("Network Established\n")
print("Waiting for a remote node to join...") node_list = []
while len(node_list) == 0:
# Perform a network discovery until the router joins node_list = list(xbee.discover())
print("Remote node found, transmitting data")
for node in node_list:
dest_addr = node['sender_nwk'] # using 16 bit addressing dest_node_id = node['node_id']
payload_data = "Hello, " + dest_node_id + "!"
print("Sending \"{}\" to {}".format(payload_data, hex(dest_addr))) xbee.transmit(dest_addr, payload_data)
# Start the receive loop print("Receiving data...") print("Hit CTRL+C to cancel") while True:
p = xbee.receive() if p:
format_packet(p)
else:
time.sleep(0.25)
在MicroPython >>>提示符下,右键单击并选择“粘贴”选项。 粘贴代码后,会立即执行.
路由器模块上的示例代码
以下示例代码加入了前一个示例中的Zigbee网络,并连续打印出任何传入数据。 该设备还每隔5秒将其温度数据发送到协调器地址.
print("Joining network as a router...") xbee.atcmd("NI", "Router")
network_settings = {"CE": 0, "ID": 0x3332, "EE": 0} for command, value in network_settings.items():
xbee.atcmd(command, value) xbee.atcmd("AC") # Apply changes time.sleep(1)
while network_status() != 0: time.sleep(0.1)
print("Connected to Network\n")
last_sent = time.ticks_ms()
interval = 5000 # How often to send a message
# Start the transmit/receive loop
print("Sending temp data every {} seconds".format(interval/1000)) while True:
p = xbee.receive() if p:
format_packet(p)
else:
# Transmit temperature if ready
if time.ticks_diff(time.ticks_ms(), last_sent) > interval:
temp = "Temperature: {}C".format(xbee.atcmd("TP")) print("\tsending " + temp)
try:
xbee.transmit(xbee.ADDR_COORDINATOR, temp) except Exception as err:
print(err) last_sent = time.ticks_ms()
time.sleep(0.25)
在MicroPython >>>提示符下,右键单击并选择“粘贴”选项。 粘贴代码后,会立即执行.
退出MicroPython模式
退出MicroPython模式:
其他终端程序
如果您不在XCTU中使用MicroPython终端,则可以使用其他终端程序与XBee3 Zigbee RF模块进行通信。 如果您使用Microsoft Windows,请按照Tera Term的说明进行操作; 如果您使用Linux,请按照picocom的说明进行操作。 下载这些程序:
Windows 系统使用Tera Term
使用MicroPython模式的XBee3 Zigbee RF模块(AP = 4),您可以使用终端访问MicroPython提示。
Port: Shows the port that the XBee3 Zigbee RF Module is connected on.
Baud rate: 15200
Data: 8 bit
Parity: none
Stop: 1 bit
Flow control: hardware
Transmit delay: N/A
MicroPython v1.9.3-716-g507d0512 on 2018-02-20; XBee3 Zigbee with EFR32MG Type "help()" for more information.
>>>
现在,您可以在>>>提示符下键入MicroPython命令.
Linux系统中使用 picocom
使用MicroPython模式的XBee3 Zigbee RF模块(AP = 4),您可以使用终端访问MicroPython提示。
Note 用户必须具有XBee3 Zigbee RF模块所连接的串行端口的读写权限才能与设备通信.
如果您确实连接了其他USB转串口设备:
再次检查目录,您应该看到一个额外的设备,即XBee3 Zigbee RF模块.
它连接并显示“终端就绪”。.
您现在可以在>>>提示符下键入MicroPython命令。
Micropython help ()
在提示符下键入help()命令时,它会提供指向联机帮助,控制命令和用法示例的链接.
>>> help()
Welcome to MicroPython!
For online docs please visit http://docs.micropython.org/. Control commands:
CTRL-A -- on a blank line, enter raw REPL mode CTRL-B -- on a blank line, enter normal REPL mode CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, reset the REPL CTRL-E -- on a blank line, enter paste mode
CTRL-F -- on a blank line, enter flash upload mode For further help on a specific object, type help(obj) For a list of available modules, type help('modules')
-------------------------------------------------------
------------------------------------------------------
在提示符下键入help('modules')时,它会显示所有可用的Micropython模块.
------------------------------------------------------ |
||||
|
>>> help('modules') |
sys |
umachine |
|
|
__main__ |
hashlib |
||
|
array |
io |
time |
uos |
|
binascii |
machine |
ubinascii |
ustruct |
|
builtins |
micropython |
uerrno |
utime |
|
errno |
os |
uhashlib |
xbee |
|
gc |
struct |
uio |
|
------------------------------------------------------
导入模块并键入以模块作为对象的help()时,可以查询该对象支持的所有函数.
------------------------------------------------------
object
path -- [''] argv -- [''] version -- 3.4.0
version_info -- (3, 4, 0)
implementation -- ('micropython', (1, 9, 4)) platform -- xbee3-zigbee
byteorder -- little maxsize -- 2147483647 exit --
print_exception --
-------------------------------------------------------