Zigbee 3.0 和 BLE 通信,具备长距离连接能力,非常适用于楼宇自动化、工业监测和智能能源管理
A
A
硬件概览
它是如何工作的?
XBee 4 Click 基于 XBRR-24Z8,这是一款来自 DIGI International 的强大 Zigbee 3.0 模块,专为各种工业和商业应用中的无线通信而设计。该模块在 2.4GHz 频段运行,集成了 Silicon Labs EFR32MG 收发芯片,确保可靠的数据传输。其最大射频数据速率为 250Kbps,串行通信速度可达 1Mbps,能够在各种智能应用中实现无线连接。它支持 Zigbee Mesh 网络,可用于楼宇自动化、智能能源管理、数字健康解决方案和智能照明系统等应用。 该模块的主要优势之一是其出色的通信范围。在理想条件和最小干扰的情况下,室内和城市范围可达 60 米(200 英尺),而户外视距范围可达 1200 米(4000 英尺)。此外,该模块在正常模式下的发射功率为 +8dBm,接收灵敏度为 -103dBm,即使在复杂环境中也能保持强大稳定的信号接收能力。 除了 Zigbee 连接,该模块还支持 Bluetooth 低功耗(BLE)4.2,并可与支持 1M PHY 模式的 BLE 5.0 设备兼容。在 BLE 模式下,室内通
信范围可达 15 米(49 英尺),户外视距范围可达 300 米(984 英尺),发射功率同样为 +8dBm,接收灵敏度为 -95dBm。 该模块配备 1MB 闪存和 96kB RAM,为固件和应用数据提供充足的存储空间。其对 Zigbee 3.0 的兼容性确保了与广泛的 Zigbee 认证设备的互操作性,使其成为大规模无线网络的理想解决方案。此外,该模块已获得北美和欧洲的监管认证,可在多个地区无缝部署,无需额外的认证要求。 该 Click 板通过 UART 接口在 XBRR-24Z8 模块和主 MCU 之间建立通信,使用标准的 UART RX 和 TX 引脚,并通过 CTS 和 RTS 引脚进行硬件流控制。此外,它还支持 SPI 通信(仅从模式)。RTS 引脚与 SEL 引脚上的 SPI 片选(CS)引脚复用,可通过 COM 引脚选择其功能,设置为 1 时启用 RTS 功能,设置为 0 时启用 CS 功能。默认情况下,UART 通信速率设置为 115200bps。 除了接口引脚,该板还使用了一个 Sleep(SLP)引脚(高电平有效)来
管理模块的低功耗模式,以及一个 Reset(RST)引脚(低电平有效),允许用户在必要时复位模块。 该 Click 板还包括多个 LED 指示灯,以提供实时状态反馈。红色 ATT LED 是 SPI 注意指示灯,当模块需要与主 MCU 进行 SPI 通信时点亮。绿色 ON LED 作为设备状态指示灯,确认模块的运行状态。此外,黄色 ASC LED 充当设备关联指示灯,可与板载调试按钮配合使用,以简化新 Zigbee 设备的部署和网络集成。设备调试按钮用于配置设备,使其能够与其他节点进行通信,确保 Zigbee Mesh 网络的稳定性和功能性。 该板配备一个 u.Fl 连接器,可连接 MIKROE 提供的 Sub-GHz 天线,例如 868MHz 直立橡胶天线,并可通过 IPEX-SMA 线缆实现灵活高效的连接选项。 该 Click 板仅支持 3.3V 逻辑电压。如果使用不同逻辑电平的 MCU,需进行适当的电平转换。此外,它还配备了包含函数和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
Flip&Click PIC32MZ 是一款紧凑型开发板,设计为一套完整的解决方案,它将 Click 板™的灵活性带给您喜爱的微控制器,使其成为实现您想法的完美入门套件。它配备了一款板载 32 位 PIC32MZ 微控制器,Microchip 的 PIC32MZ2048EFH100,四个 mikroBUS™ 插槽用于 Click 板™连接,两个 USB 连接器,LED 指示灯,按钮,调试器/程序员连接器,以及两个与 Arduino-UNO 引脚兼容的头部。得益于创
新的制造技术,它允许您快速构建具有独特功能和特性的小工具。Flip&Click PIC32MZ 开发套件的每个部分都包含了使同一板块运行最高效的必要组件。此外,还可以选择 Flip&Click PIC32MZ 的编程方式,使用 chipKIT 引导程序(Arduino 风格的开发环境)或我们的 USB HID 引导程序,使用 mikroC、mikroBasic 和 mikroPascal for PIC32。该套件包括一个通过 USB 类型-C(USB-C)连接器的干净且调
节过的电源供应模块。所有 mikroBUS™ 本身支持的 通信方法都在这块板上,包括已经建立良好的 mikroBUS™ 插槽、用户可配置的按钮和 LED 指示灯。Flip&Click PIC32MZ 开发套件允许您在几分钟内创建新的应用程序。它由 Mikroe 软件工具原生支持,得益于大量不同的 Click 板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作的许多方面。
微控制器概述
MCU卡片 / MCU

建筑
PIC32
MCU 内存 (KB)
2048
硅供应商
Microchip
引脚数
100
RAM (字节)
524288
你完善了我!
配件
868MHz 直角橡胶天线是一款紧凑且多功能的无线通信解决方案。它在 868-915MHz 的频率范围内运行,确保最佳的信号接收和传输。天线具有 50 欧姆的阻抗,兼容多种设备和系统。其 2dB 的增益增强了信号强度并扩展了通信范围。垂直极化进一步提高了信号的清晰度。设计能够处理高达 50W 的输入功率,使其成为各种应用的坚固选择。这款天线长度仅为 48mm,既低调又实用。其 SMA 公头连接器确保与您的设备建立安全可靠的连接。无论您是在处理物联网设备、远程传感器,还是其他无线技术,868MHz 直角天线都能为您提供无缝通信所需的性能和灵活性。

IPEX-SMA 电缆是一种射频 (RF) 电缆组件。"IPEX" 指的是 IPEX 连接器,这是一种常用于小型电子设备的微型同轴连接器。"SMA" 代表 SubMiniature Version A,是另一种常用于射频应用的同轴连接器。IPEX-SMA 电缆组件的一端是 IPEX 连接器,另一端是 SMA 连接器,使其能够连接使用这些特定连接器的设备或组件。这些电缆常用于 WiFi 或蜂窝天线、GPS 模块以及其他需要可靠且低损耗连接的射频通信系统。

使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图

一步一步来
项目组装
实时跟踪您的结果
应用程序输出
1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程。

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持
库描述
XBee 4 Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。
示例描述
此示例演示了 XBee 4 Click 的使用方式,展示了在透明模式下两块 Click 板之间的通信。
关键功能:
xbee4_cfg_setup
- 配置对象初始化函数。xbee4_init
- 初始化函数。xbee4_get_serial_number
- 发送获取序列号命令的函数。xbee4_set_device_name
- 设置设备名称(节点标识符)的函数。xbee4_set_destination_address
- 设置目标地址高字节和低字节的函数。
应用初始化
初始化驱动程序,并通过执行出厂重置、设置设备名称、目标地址、透明模式 API 以及根据应用模式选择加入或创建网络的设备角色来配置 Click 板。
应用任务
根据所选的应用模式,读取所有接收到的数据,或每 3 秒发送一次指定消息。
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief XBEE 4 Click Example.
*
* # Description
* This example demonstrates the use of an XBEE 4 Click board by showing
* the communication between the two Click boards configured in transparent mode.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver and configures the Click board by performing a factory reset,
* and setting the device name, destination address, api mode to transparent,
* and a device role to join or form network depending on the application mode.
*
* ## Application Task
* Depending on the selected application mode, it reads all the received data or
* sends the desired message every 3 seconds.
*
* ## Additional Function
* - static void xbee4_clear_app_buf ( void )
* - static void xbee4_log_app_buf ( void )
* - static err_t xbee4_process ( xbee4_t *ctx )
* - static err_t xbee4_read_response ( xbee4_t *ctx, uint8_t *rsp, uint32_t timeout )
*
* @author Stefan Filipovic
*
*/
#include "board.h"
#include "log.h"
#include "xbee4.h"
// Device name (Node identifier).
#define DEVICE_NAME "XBEE 4 Click"
// Enter here the specific serial number high and low bytes of the remote device as a hex string or
// leave it set to broadcast addresses for forwarding messages to all devices
#define DESTINATION_ADDRESS_HIGH XBEE4_BROADCAST_DEST_ADDRESS_HIGH
#define DESTINATION_ADDRESS_LOW XBEE4_BROADCAST_DEST_ADDRESS_LOW
// Comment out the line below in order to switch the application mode to receiver
#define DEMO_APP_TRANSMITTER
// Text message to send in the transmitter application mode
#define DEMO_TEXT_MESSAGE "MIKROE - XBEE 4 Click board\r\n"
// Application buffer size
#define APP_BUFFER_SIZE 400
#define PROCESS_BUFFER_SIZE 200
static xbee4_t xbee4;
static log_t logger;
static uint8_t app_buf[ APP_BUFFER_SIZE ] = { 0 };
static int32_t app_buf_len = 0;
/**
* @brief XBEE 4 clearing application buffer.
* @details This function clears memory of application buffer and reset its length.
* @note None.
*/
static void xbee4_clear_app_buf ( void );
/**
* @brief XBEE 4 log application buffer.
* @details This function logs data from application buffer to USB UART.
* @note None.
*/
static void xbee4_log_app_buf ( void );
/**
* @brief XBEE 4 data reading function.
* @details This function reads data from device and concatenates data to application buffer.
* @param[in] ctx : Click context object.
* See #xbee4_t object definition for detailed explanation.
* @return @li @c 0 - Read some data.
* @li @c -1 - Nothing is read.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t xbee4_process ( xbee4_t *ctx );
/**
* @brief XBEE 4 read response function.
* @details This function waits for a response message, reads and displays it on the USB UART.
* @param[in] ctx : Click context object.
* See #xbee4_t object definition for detailed explanation.
* @param[in] rsp : Expected response.
* @param[in] timeout : Response timeout in milliseconds.
* @return @li @c 0 - OK response.
* @li @c -1 - Command error.
* @li @c -2 - Timeout error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t xbee4_read_response ( xbee4_t *ctx, uint8_t *rsp, uint32_t timeout );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
xbee4_cfg_t xbee4_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
xbee4_cfg_setup( &xbee4_cfg );
XBEE4_MAP_MIKROBUS( xbee4_cfg, MIKROBUS_1 );
if ( UART_ERROR == xbee4_init( &xbee4, &xbee4_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
xbee4_hw_reset ( &xbee4 );
xbee4_process ( &xbee4 );
xbee4_clear_app_buf( );
log_printf( &logger, " - Enter command mode -\r\n" );
xbee4_enter_command_mode ( &xbee4 );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Factory Reset -\r\n" );
xbee4_factory_reset ( &xbee4 );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Get serial number -\r\n" );
xbee4_get_serial_number ( &xbee4 );
xbee4_read_response ( &xbee4, XBEE4_RSP_NEW_LINE, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Set Device Name -\r\n" );
xbee4_set_device_name ( &xbee4, DEVICE_NAME );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Set Destination Address -\r\n" );
xbee4_set_destination_address ( &xbee4, DESTINATION_ADDRESS_HIGH, DESTINATION_ADDRESS_LOW );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Set API mode -\r\n" );
xbee4_set_api_mode ( &xbee4, XBEE4_MODE_TRANSPARENT );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Set Device Role -\r\n" );
#ifdef DEMO_APP_TRANSMITTER
xbee4_set_device_role ( &xbee4, XBEE4_DEVICE_ROLE_JOIN_NETWORK );
#else
xbee4_set_device_role ( &xbee4, XBEE4_DEVICE_ROLE_FORM_NETWORK );
#endif
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Apply changes -\r\n" );
xbee4_apply_changes ( &xbee4 );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Save changes -\r\n" );
xbee4_save_changes ( &xbee4 );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
log_printf( &logger, " - Exit command mode -\r\n" );
xbee4_exit_command_mode ( &xbee4 );
xbee4_read_response ( &xbee4, XBEE4_RSP_OK, XBEE4_TIMEOUT_3S );
xbee4_clear_app_buf ( );
#ifdef DEMO_APP_TRANSMITTER
log_printf( &logger, " Application Mode: Transmitter\r\n" );
#else
log_printf( &logger, " Application Mode: Receiver\r\n" );
#endif
log_info( &logger, " Application Task " );
}
void application_task ( void )
{
#ifdef DEMO_APP_TRANSMITTER
xbee4_generic_write( &xbee4, DEMO_TEXT_MESSAGE, strlen( DEMO_TEXT_MESSAGE ) );
log_printf( &logger, "%s", ( char * ) DEMO_TEXT_MESSAGE );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
#else
if ( XBEE4_OK == xbee4_process( &xbee4 ) )
{
xbee4_log_app_buf ( );
xbee4_clear_app_buf ( );
}
#endif
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
static void xbee4_clear_app_buf ( void )
{
memset( app_buf, 0, app_buf_len );
app_buf_len = 0;
}
static void xbee4_log_app_buf ( void )
{
for ( int32_t buf_cnt = 0; buf_cnt < app_buf_len; buf_cnt++ )
{
log_printf( &logger, "%c", app_buf[ buf_cnt ] );
}
}
static err_t xbee4_process ( xbee4_t *ctx )
{
uint8_t rx_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
int32_t overflow_bytes = 0;
int32_t rx_cnt = 0;
int32_t rx_size = xbee4_generic_read( ctx, rx_buf, PROCESS_BUFFER_SIZE );
if ( ( rx_size > 0 ) && ( rx_size <= APP_BUFFER_SIZE ) )
{
if ( ( app_buf_len + rx_size ) > APP_BUFFER_SIZE )
{
overflow_bytes = ( app_buf_len + rx_size ) - APP_BUFFER_SIZE;
app_buf_len = APP_BUFFER_SIZE - rx_size;
memmove ( app_buf, &app_buf[ overflow_bytes ], app_buf_len );
memset ( &app_buf[ app_buf_len ], 0, overflow_bytes );
}
for ( rx_cnt = 0; rx_cnt < rx_size; rx_cnt++ )
{
if ( rx_buf[ rx_cnt ] )
{
app_buf[ app_buf_len++ ] = rx_buf[ rx_cnt ];
}
}
return XBEE4_OK;
}
return XBEE4_ERROR;
}
static err_t xbee4_read_response ( xbee4_t *ctx, uint8_t *rsp, uint32_t timeout )
{
uint32_t timeout_cnt = 0;
xbee4_clear_app_buf ( );
xbee4_process ( ctx );
while ( ( 0 == strstr( app_buf, rsp ) ) &&
( 0 == strstr( app_buf, XBEE4_RSP_ERROR ) ) )
{
xbee4_process ( ctx );
if ( timeout_cnt++ > timeout )
{
xbee4_log_app_buf( );
log_error( &logger, " Timeout!" );
return XBEE4_ERROR_TIMEOUT;
}
Delay_ms ( 1 );
}
Delay_ms ( 100 );
xbee4_process( ctx );
xbee4_log_app_buf( );
if ( strstr( app_buf, XBEE4_RSP_ERROR ) )
{
log_error( &logger, " CMD!" );
return XBEE4_ERROR;
}
log_printf( &logger, "--------------------------------\r\n" );
return XBEE4_OK;
}
// ------------------------------------------------------------------------ END