文章目录
前言
记录使用 Nordic nrf52840 + Semtech sx1262 跑通 sidework 的过程
摘要
sidework 也叫 Amazon Sidework,使用 Amazon 的服务器 配合 Amazon Sidewalk Gateways (网关中有支持 ble lora fsk 通信的硬件),使用 ble 进行近距离通信,使用 900Mhz 的 LoRa 和 FSK 进行远距离通信,从而实现低带宽的远程连接。目前 Amazon Sidework 仅可以在美国使用,在美国以外使用 Sidewalk 网关功能仅限于 Amazon Sidework 的开发和调试。注意在美国以外使用 Amazon Sidework 可能会违反当地法规。
前期准备
- AWS(Amazon Web Service) 账户(注意需要信用卡)作为云服务器使用
- 亚马逊开发者账户 用于使用 app 配置网关设备,每月 $100
- 安装 AWS CLI aws 命令行工具
- 支持 sidework 的网关
- 52840dk + SX1262 开发板或者 minewsemi 的 MS24SF1 模块
- NCS2.6.1 这里不再讲解环境配置
- sidiwork 代码 本文使用 v2.6.1 版本
- 科学上网的手机
- 科学上网的 wifi
配置
将设备添加到 AWS
添加 Destinations
这一步也可以使用 AWS CLI aws 命令行工具,这里不详细介绍
登录 AWS 账号后进入 sidework 配置界面,添加 Destinations
添加 sidework device
- 点击 Provision device
- 添加设备的 profile
随便起个名字点击确认即可
点击 Next
点击 Next
点击 Create 即可配置成功,配置成功如下
然后下载 Json 文件
下载后的文件叫 certificate.json 保存下,这个是配置生成 hex 文件使用的
生成 nordic_aws_nrf52840.hex
- 在 E:\ncs\ncs_v2.6.1\v2.6.1\sidewalk\tools\provision 路径下打开 cmd
根据实际来,我的路径是这个
我这里已经生成了 bin 和 hex 文件
- 将 certificate.json 拷贝到此文件夹下输入以下命令生成 bin 和 hex 参考链接
python provision.py nordic aws --output_bin mfg.bin --certificate_json certificate.json --addr 0xFF000
sidework 作为 ncs 的存储库
- 打开命令行
- 进入 sidework 文件夹
这个时候有人会有对 v2.6.0-rc2 版本有疑问,这个是到后面 west update 后自动切换到了这个路径
实际我下载的是 v2.6.1 版本
为了方便叙述我这里切回到 V2.6 版本
- 确保清单路径指向 nrf 中的 west.yml, 输入以下命令
west manifest --path
- 如果清单路径指向不同的文件,用下面命令指向 nrf 中的 west.yml
west config manifest.path nrf
- 启用 sidework 组过滤器
west config manifest.group-filter “+sidewalk”
- 检查 sidework 是否存在
west list sidewalk
这里已经指向了 V2.6.0-rc2 分支了
- 更新存储库
这里有看到分支直接切换,不用怀疑
west update
- 安装 sidework 的 python 要求
注意使用这个命令关闭科学上网
pip install -r sidewalk/requirements.txt
设置使用内部 flash 升级
由于历程使用了 mcuboot 并使用外部 flash 升级这会导致即使修改了引脚 minewsemi 的模块也无法使用,所以我们这里先修改为内部 flash 升级
- 删除 boards/nrf52840dk_nrf52840.overlay 和 child_image/mcuboot/boards/boards/nrf52840dk_nrf52840.overlay 中 下面的配置
chosen {
nordic,pm-ext-flash = &mx25r64;
};
- 修改 configuration/nrf52840dk_nrf52840/pm_static_dfu.yml
代码如下
EMPTY_0:
address: 0xfc000
end_address: 0xfd000
placement:
after:
- mcuboot_secondary
region: flash_primary
size: 0x1000
app:
address: 0x7200
end_address: 0x84000
region: flash_primary
size: 0x7ce00
mcuboot:
address: 0x0
end_address: 0x7000
placement:
before:
- mcuboot_primary
region: flash_primary
size: 0x7000
mcuboot_pad:
address: 0x7000
end_address: 0x7200
placement:
align:
start: 0x1000
before:
- mcuboot_primary_app
region: flash_primary
size: 0x200
mcuboot_primary:
address: 0x7000
end_address: 0x84000
orig_span: &id001
- mcuboot_pad
- app
region: flash_primary
sharers: 0x1
size: 0x7d000
span: *id001
mcuboot_primary_app:
address: 0x7200
end_address: 0x84000
orig_span: &id002
- app
region: flash_primary
size: 0x7ce00
span: *id002
mcuboot_secondary:
address: 0x84000
end_address: 0xfc000
placement:
after:
- mcuboot_primary
align:
start: 0x1000
region: flash_primary
share_size:
- mcuboot_primary
size: 0x78000
mfg_storage:
address: 0xff000
end_address: 0x100000
region: flash_primary
size: 0x1000
settings_storage:
address: 0xfd000
end_address: 0xff000
placement:
align:
start: 0x1000
before:
- end
region: flash_primary
size: 0x2000
sram_primary:
address: 0x20000000
end_address: 0x20040000
region: sram_primary
size: 0x40000
- 编译烧录
编译后的内存分配
- 烧录 nordic_aws_nrf52840.hex
nrfjprog --sectorerase --program nordic_aws_nrf52840.hex --reset
- 烧录应用程序
由于没有配置 sidework 网关设备到这一步你只能显示到下面的 log,会有时间同步失败的标识
我这里有网关设备,所以后面后增加如下 log 显示时间同步成功
配置 sidework 网关
这里不再介绍
由于国内只能用于测试,国外这些国外友人可以轻松搞定的,但是需要每个月 $100
就像配置小爱音箱一样配置联网就行,只不过多了一步打开 sidework
数据传输
短按一下 button1 是发送数据到服务器,默认使用 ble 的方式
短按 button3 切换数据传输方式到 fsk
再次短按切换到 lora
按下 button1 通过 lora 方式发送到服务器
修改引脚
不使用 dk 板而使用其他的板子(minewsemi ms24 系列) 就需要修改引脚
修改的 overlay 如下(boards/nrf52840dk_nrf52840.overlay)
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
&spi3 {
status = "disabled";
};
sid_semtech: &spi2 {
compatible = "nordic,nrf-spim";
status = "okay";
pinctrl-0 = <&spi2_default>;
pinctrl-1 = <&spi2_sleep>;
pinctrl-names = "default", "sleep";
clock-frequency = <DT_FREQ_M(8)>;
};
/{
semtech_sx1262_gpios{
compatible = "gpio-keys";
semtech_sx1262_cs: cs {
gpios = <&gpio0 22 GPIO_ACTIVE_LOW>;
label = "semtech_sx1262 CS";
};
semtech_sx1262_reset_gpios: reset {
gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
label = "semtech_sx1262 Reset";
};
semtech_sx1262_busy_gpios: busy {
gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>;
label = "semtech_sx1262 Busy";
};
semtech_sx1262_antenna_enable_gpios: antena_enable {
gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
label = "semtech_sx1262 Antena Enable";
};
semtech_sx1262_dio1_gpios: dio1 {
gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
label = "semtech_sx1262 DIO1";
};
};
};
&spi2_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 21)>,
<NRF_PSEL(SPIM_MISO, 0, 17)>,
<NRF_PSEL(SPIM_MOSI, 0, 20)>;
};
};
&spi2_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 21)>,
<NRF_PSEL(SPIM_MISO, 0, 17)>,
<NRF_PSEL(SPIM_MOSI, 0, 20)>;
low-power-enable;
};
};
&button0 {
gpios = <&gpio0 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 0";
zephyr,code = <INPUT_KEY_0>;
};
&button1 {
gpios = <&gpio0 3 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 1";
zephyr,code = <INPUT_KEY_1>;
};
&button2 {
gpios = <&gpio0 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 2";
zephyr,code = <INPUT_KEY_2>;
};
&button3 {
gpios = <&gpio0 11 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 3";
zephyr,code = <INPUT_KEY_3>;
};
&led0 {
gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
label = "Green LED 0";
};
&led1 {
gpios = <&gpio0 25 GPIO_ACTIVE_LOW>;
label = "Green LED 1";
};
&led2 {
gpios = <&gpio0 28 GPIO_ACTIVE_LOW>;
label = "Green LED 2";
};
&led3 {
gpios = <&gpio0 29 GPIO_ACTIVE_LOW>;
label = "Green LED 3";
};
&qspi_default {
group1 {
psels = <NRF_PSEL(QSPI_SCK, 1, 10)>,
<NRF_PSEL(QSPI_IO0, 1, 11)>,
<NRF_PSEL(QSPI_IO1, 1, 12)>,
<NRF_PSEL(QSPI_IO2, 1, 13)>,
<NRF_PSEL(QSPI_IO3, 1, 14)>,
<NRF_PSEL(QSPI_CSN, 1, 15)>;
nordic,drive-mode = <NRF_DRIVE_H0H1>;
};
};
&qspi_sleep {
group1 {
psels = <NRF_PSEL(QSPI_SCK, 1, 10)>,
<NRF_PSEL(QSPI_IO0, 1, 11)>,
<NRF_PSEL(QSPI_IO1, 1, 12)>,
<NRF_PSEL(QSPI_IO2, 1, 13)>,
<NRF_PSEL(QSPI_IO3, 1, 14)>;
low-power-enable;
};
group2 {
psels = <NRF_PSEL(QSPI_CSN, 1, 15)>;
low-power-enable;
bias-pull-up;
};
};
&spi1_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 7)>,
<NRF_PSEL(SPIM_MOSI, 1, 6)>,
<NRF_PSEL(SPIM_MISO, 1, 8)>;
};
};
&spi1_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 7)>,
<NRF_PSEL(SPIM_MOSI, 1, 6)>,
<NRF_PSEL(SPIM_MISO, 1, 8)>;
low-power-enable;
};
};
但是切换 ble fsk 和 lora 会出现错误
这里偷了个懒,修改了dts,没有自己建板子,只要删除 nrf52840dk_nrf52840.dts 红框部分就可以了