lora sx1268 sx1302通信与实际测试结论

概念

Lora是一种无线通信的调频技术

特点

• 低功耗:
• 通信距离远:城镇可达2-5 Km , 郊区可达15 Km,
• 抗干扰强:LoRa抗干扰性能是比较优秀的,但是通信距离远,功耗又低,抗干扰又强,这三者是不可能三角距离较近容易出现信号干扰,造成丢包

• lora网关:基站,接收节点数据。基站使用有线或者无线网络将数据转发。
• 节点:节点之间可以通信

lora频率范围: 470-510
sx1268\sx1302 芯片范围:470-490,
天线范围,中心频点490,增益3dbi

网关、节点的容量
sx1268 单通道、sx1302 8通道


数据发送时间

使用SX1261Calculator_setup.exe工具,计算一个包发送的时间

  • SF小,发送的时间短,意味着相同的时间内,可以发送更多的数据
  • 发送数据越长,时间越大
  • 数据长度是阶梯形状上涨;例如:20 21 22 字节长度 发送时间是相同的
    在这里插入图片描述
    在这里插入图片描述
    例如2s发送一次数据的节点容量
    Sx1268的容量 = 通道数*(2s*1000/每个包发送的时间)
    Sx1302的容量:8通道,并且有不同的扩频因子。不同的扩频因子下,不同的通道的数据是不干扰的。
    总容量 = sf5(容量)+sf6(容量)+sf7(容量) + sx12(容量)

SF越小,频率越高,发送越快
SF越大,灵敏度越小,可接收到的距离越远

理论计算

工具下载链接
在这里插入图片描述


信号值与信号衰减

1)影响信号的因素
在这里插入图片描述
2)介质损耗
在这里插入图片描述

3)信号值的参考
在这里插入图片描述

4)

  • lora节点模块间不能靠的太近,容易产生干扰
  • 天线位置和放置的角度对信号有影响,天线需要根据实际的结构空间进行定制(将中心频点拉正)

通信距离实测

基站安装在与节点平行高度
在这里插入图片描述
金属的实际测试
测试方法:使用天花板,铝扣板制作一个封闭空间,测试铝扣板对信号的影响
测试结论:金属遮挡有严重衰减,大约-20dbm
在这里插入图片描述


节点到节点通信

硬件:两块sx1268
使用串口通信
参数:
发送方的发送频点 = 接收方的接收频点
SF 发送与接收需要使用相同的扩频因子

在这里插入图片描述


程序理解

sx1268

SPI接口,收发函数
static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
{
           int ret;
	  struct spi_ioc_transfer tr = {
	    .tx_buf = (unsigned long)tx,
	    .rx_buf = (unsigned long)rx,
	    .len = len,
	    .delay_usecs = delay,
	    .speed_hz = SPI_SPEED,
	    .bits_per_word = bits,
	  };
  
	  ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);//只有一组
	  if (ret < 1)
	    pabort("can't send spi message");
}

sx1302
packforward 启动脚本

#!/bin/sh
# This script is intended to be used on SX1302 CoreCell platform, it performs
# the following actions:
#       - export/unpexort GPIO23 and GPIO18 used to reset the SX1302 chip and to enable the LDOs
#
# Usage examples:
#       ./reset_lgw.sh stop
#       ./reset_lgw.sh start

# GPIO mapping has to be adapted with HW
#
#
SX1302_RESET_PIN=64
SX1302_POWER_EN_PIN=60

WAIT_GPIO() {
    sleep 1
}

init() {
    # setup GPIOs
    echo "$SX1302_RESET_PIN" > /sys/class/gpio/export; WAIT_GPIO
    echo "$SX1302_POWER_EN_PIN" > /sys/class/gpio/export; WAIT_GPIO
    # set GPIOs as output
    echo "out" > /sys/class/gpio/gpio$SX1302_RESET_PIN/direction; WAIT_GPIO
    echo "out" > /sys/class/gpio/gpio$SX1302_POWER_EN_PIN/direction; WAIT_GPIO
}
reset() {
    #echo "CoreCell reset through GPIO$SX1302_RESET_PIN..."
    #echo "CoreCell power enable through GPIO$SX1302_POWER_EN_PIN..."
    #write output for SX1302 CoreCell power_enable and reset
    echo "1" > /sys/class/gpio/gpio$SX1302_POWER_EN_PIN/value; WAIT_GPIO

    echo "1" > /sys/class/gpio/gpio$SX1302_RESET_PIN/value; WAIT_GPIO
    echo "0" > /sys/class/gpio/gpio$SX1302_RESET_PIN/value; WAIT_GPIO
	  
	  #echo "1" > /sys/class/leds/hy_stationboard_rola0_power/brightness; WAIT_GPIO
    #echo "1" > /sys/class/leds/hy_stationboard_rola0_rest/brightness; WAIT_GPIO
    #echo "0" > /sys/class/leds/hy_stationboard_rola0_rest/brightness; WAIT_GPIO
}

term() {
    # cleanup all GPIOs
    if [ -d /sys/class/gpio/gpio$SX1302_RESET_PIN ]
    then
        echo "$SX1302_RESET_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
    fi
    if [ -d /sys/class/gpio/gpio$SX1302_POWER_EN_PIN ]
    then
        echo "$SX1302_POWER_EN_PIN" > /sys/class/gpio/unexport; WAIT_GPIO
    fi
}

case "$1" in
    start)
    #term # just in case
    init
    reset
    ;;
    stop)
    reset
    term
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac
exit 0

猜你喜欢

转载自blog.csdn.net/WANGYONGZIXUE/article/details/121786599
sx