使用Arduino Nano驱动Lora模块

为什么选用Lora

射频通信芯片有很多种,但是一般在同样功耗下,距离没有Lora远;同等范围下,没有Lora节能。

Lora通信只适用于低速率,高延时的场合,与WiFi正好相反。

  • 考虑在野外,没有移动通信网络覆盖的环境下,收集传感器数据,适合使用。
  • 在设密度大,使用移动通信网络成本过高,使用Lora来统一收集数据,例如远程抄表。

Lora作为物联网的一种通信技术选型,正好是移动通信网络,WiFi的补充。

完整项目

我使用一个Arduino Nano 来驱动Lora模块,另外加了一个BMP085(I2C接口)气压传感器,一个光敏电阻,一个按钮。

使用PlantformIO平台开发。(比Arduino IDE好用很多)

实现功能有:

  • 参考arduino-LoRa双向通行的自有简单协议;
  • 获取传感器的温度,气压数据,光亮度;
  • 获取供电电池电压;
  • 定时通过Lora发送数据,按键强制发送一条数据;
  • 使用链表缓存需要发送的内容,避免频繁发送时候影响数据接收;
  • 接收Lora数据:
    • 指令led点亮灯2秒;
    • 指令ping,返回pong;

项目地址: https://github.com/formatkm/lora_node

Lora模块

  • 串口模块
  • SPI接口模块

一般串口模块连接相对简单,与其他无线模块AT指令不同(例如:蓝牙模块、GPRS模块),还需要对GPIO口连接控制引脚完成状态配置操作,我想这个是因为需要比达到比较快的切换速度。

SPI口接口直接操作寄存器完成对芯片的操作和数据的发送接收。优点是可以自定义自己的通信协议,而且是要使用的是同种sx127X系列的芯片的模块都可以相互通信。

串口模块内部实际是有一个单片机控制Lora芯片,实现的自己的一套通信协议,一般同一个厂家的模块才可以互相通信。

基本概念

  • RSSI:信号强度指示,用来判定链接质量,数字越大通信效果越好。

  • SNR:信噪比,电平与噪声电平之比。数字越大通信效果越好。

  • Preamble

    前导码用于保持接收机与输入的数据流同步。作用是提醒接收芯片,即将发送的是有效信号。

  • Header

    可以通过操作模式,选择显示/隐式两种Header类型:在RegModemConfig1寄存器上,通过设定ImplicitHeaderModeOn选择

  • 显式报头模式

    LoRa默认都为显式Header模式,在这种模式下,Header会包含Payload的相关信息,包括:

  •   Payload长度(byte)
  •   前向纠错编码率
  •   是否使用CRC(16位)
  • 隐式报头模式

    在特定情况下,如果Payload长度、编码率以及CRC为固定值或已知,则可以通过隐式Header模式来缩短发送时间。。该情况下 ,需要手动设置无线链路两端的Payload长度、错误编码率以及CRC。。。

  • IQ signal:极性信号反转,用于标识上行,下行,避免多个节点间互相冲突,节点间不能互相通信

接线

按钮接到D3,使用中断引脚

  • SPI接口
SCK  <----> D13
MISO <----> D12
MOSI <----> D11
NSS <----> D10
REST <----> D09
DIO0 <----> D02 (中断)
  • I2C
SDA  <----> A4
SCL <----> A5
  • 其他
LED  <----> D06
KEY <----> D03
光敏 <----> A2

驱动程序代码

基于ArduinoSx1278驱动有(测试使用顺序):

  • LoRaLib (已不在维护,使用RadioLib替代)
  • RadioLib (支持多种无线芯片,更专业)
  • arduino-LoRa (简单好用,封装配置)

最终选用的是arduino-LoRa,使用RadioLib 在实现双向通行上遇到问题(C++功力不够)。

arduino-LoRa最大的好处就是简化了很多芯片参数的配置,如果业余选手要配置好参数能够实现两个模块通信是个艰巨的挑战,这也是串口Lora模块的优势,不用去关心复杂的通信参数配置。

阅读arduino-LoRa代码,你会发现很多参数都有范围判断的默认值,如果设置超出范围也不会出错。

要实现模块连通,SPI接线基本不会有问题。最重要的是NSSRESTDIO0这三个不能接错,对于Arduino板DIO0一定要接在有中断的引脚上

DIO0也称IRQ引脚,在模块有数据接收,发送完毕后会有一个电平指示(高度单片机,要接受数据或者数据发送完毕),所以必须接到中断引脚,普通GPIO脚速度达不到。

const int csPin = 7;          // 也就是NSS接口
const int resetPin = 6; // reset引脚
const int irqPin = 2; // 必须是中断引脚,Arduino Nano只有2、3脚为中断

初始化模块

LoRa.setPins(csPin, resetPin, irqPin);// set NSS, reset, DIO0 pin

if (!LoRa.begin(433E6)) {             // 初始化使用频率 433 MHz
Serial.println("LoRa init failed. Check your connections.");
while (true); // 失败后停止执行
}

测试

使用arduino-LoRa的例子程序,如果接线正确,那么Arduino中烧入程序,会打赢出Sx1278的寄存器信息。

https://github.com/sandeepmistry/arduino-LoRa/blob/master/examples/LoRaDumpRegisters/LoRaDumpRegisters.ino

参考链接

使用Arduino Nano驱动Lora模块的更多相关文章

  1. Arduino Nano + WIZ550io = 简易上网

    我爱Arduino Nano – 这是一个非常好外形小巧却功能齐全的Arduino Uno.然而.当我去将它连接到互联网,全部的干净利落小巧也消失在大尺寸的以太网盾底下了. 只是,我近期发现了一个更好 ...

  2. Arduino nano的bootloader文件烧录

    1.买了了nano还没用就用 avrisp烧录器给烧了其他程序,仅仅是的avr单片机了:2.将他恢复成Arduino nano吧. 在Arduino软件安装目录中的hardware\arduino中. ...

  3. Arduino使用HC05蓝牙模块与手机连接

    Arduino使用HC05蓝牙模块与手机连接 一切都是最好的选择 首先是线路连接,一定不要接错了 Arduino 代码 #include <SoftwareSerial.h> // Pin ...

  4. Arduino Nano 读取ADS1100实例

    利用Arduino Nano的wire库可以很方便对ADS1100进行设置和读取转换后的数据. /* * Arduino reads ADS1100 I2C 16bit diff ADC */ /* ...

  5. stm32驱动超声波模块

    下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发. #define HCSR04_PORT GPIOB #define HCSR04_CLK RCC ...

  6. LoRa模块无线收发通信技术详解

    LoRa是一种LPWAN通信技术,它基于扩频技术而广泛应用于超长距离的无线传输场景中.现在,LoRa主要在全世界433.868.915MHz等自由频带工作.其最大特征是灵敏度高,传输距离长,工作功耗低 ...

  7. 物联网lora模块应用案例和LoRawan网关通信技术

    什么是LoRa LoRa(Long Range) 无线通信技术是 Semtech 在2012年开发出来的一款适合物联网使用的射频IC.其设计理念为低功耗.长距离.低成本.网路简单.易于扩展的无线数传技 ...

  8. Arduino+A4988驱动两相四线步进电机

    先吐槽一下,在某宝买东西这么多年碰到的不靠谱的卖家也没这几天多.丝杆发短,42电机只有32大,碳杆上的鱼眼粘的没法再歪了还死紧……所以组装还得几天.于是先玩了一下DC-DC降压模块和A4988,规划了 ...

  9. Arduino SPI驱动7引脚0.96寸OLED SSD1306 调试笔记

    https://www.geek-workshop.com/thread-37818-1-1.html 2.下载最新库https://learn.adafruit.com/monoc ... ibra ...

随机推荐

  1. Docker基础学习相关网址

    中文学习地址:https://yeasy.gitbooks.io/docker_practice/content/ 官网介绍地址:https://www.docker.com 官网学习地址:https ...

  2. 透过现象看webpack处理css文件中图片路径转换的具体过程

    webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也 ...

  3. Sqli-Labs 闯关 less 42-49

    Less 42 这一关一进去看着像前面的二次注入.发现也注入不了.. 我们观察代码发现这一关用的是堆叠注入. 登陆的这里可以看到login_password登陆的时候并没有使用mysqli_real_ ...

  4. python 类 - 继承

    继承 什么是继承? 编写类时,并非总要从空白开始.如果要编写的类是另一个现成类的特殊版本,可使用继承. 一个类继承另一个类时,将自动获得另一个类的所有属性和方法.现有的类称为父类,而新类称为子类. 子 ...

  5. Codeforces_731_F

    http://codeforces.com/problemset/problem/731/F 其实是暴力枚举,但是有些小技巧,直接保存每个数的数量. 枚举每个起点时,然后依次加上起点大小的分段的数量的 ...

  6. Go语言实现:【剑指offer】求1+2+3+...+n

    该题目来源于牛客网<剑指offer>专题. 求1+2+3+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). Go ...

  7. 分组密码CBC加密缺陷

    title: 分组密码CBC加密缺陷 date: 2017-05-15 10:04:47 tags: ["密码学"] --- 关于密码学的种种漏洞以及利用网上也有不少,但是比较零散 ...

  8. Python Namespace - 命名空间

    命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python ...

  9. php面试笔记(4)-php基础知识-流程控制

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而流程控制相关的 ...

  10. Spring Bean几种注入方式——setter(常用),构造器,注入内部Bean,注入集合,接口...

    依赖注入分为三种方式: 1.1构造器注入 构造器通过构造方法实现,构造方法有无参数都可以.在大部分情况下我们都是通过类的构造器来创建对象,Spring也可以采用反射机制通过构造器完成注入,这就是构造器 ...