Ameba Arduino: [RTL8195] [RTL8710] 使用 Dragino Lora 扩展版

材料准备

  • Ameba x 1
  • Dragino LoRa Shield x 2

范例说明

Dragino Lora扩展板基于开放源码库,允许用户发送数据,能够达到极长的传输范围,并且在低data-rates提供超远距离扩频通信和高抗干扰性的同时尽量减少电流消耗,而因各个国家有不同的频段规划,在购买时请留意LoRa Shield所使用的频段。

LoRa Library请至下列连结下载:
https://github.com/Ameba8195/Arduino/blob/master/libraries/AmebaLoRa.zip

安装library的方式请参考Arduino官方网站的教学文章将zip档的library加入Ameba:
https://www.arduino.cc/en/Guide/Libraries#toc4

Dragino LoRa Shield SPI范例接线说明如下:

Dragino LoRa Shield可以直接嵌合在Ameba板子上,但由于Ameba的CS pin与标准的SPI协议相比有其特殊性,因此Dragino LoRa Shield的CS pin不能直接与Ameba的CS pin相连接,于此在Dragino LoRa Shield上的修改需将CS pin也就是pin 10的脚位往内扳,并且使用杜邦线接至pin 0,如下图示:

3

而Dragino LoRa Shield的SPI Data是从ICSP的SPI BUS产生的,因此如同以下图示接至AMEBA的SPI脚位:

3

RTL8710 的接线图如下:
3

  • 范例使用说明

本范例中同时使用send及receive程式码,来作2块Dragino LoRa Shield的功能验证,一块是发送端,另一块是接收端,我们打开范例“File” -> “Examples” -> “AmebaLoRa ” -> “LoRaSender”及LoRaReceiverCallback, 分别编译并上传至Ameba之后按下Reset按钮,就可以在终端机看到底下的结果:

3

程式码说明

程式开始时进入setup()会先利用begin() method初始化LoRa class,里头带的参数915E6与其RF的频率相关,在此不作变更

LoRa.begin(915E6);

LoRaSender发送端:
进入loop()里,发送端的工作则是先呼叫beginPacket() method,开始进入发送的程序,而使用print(“hello ”) method,则可以让LoRa送出hello字串的参数,最后再呼叫endPacket( ) method,即完成发送端的程序

LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();

LoRaReceiverCallback接收端:
本接收端范例使用onReceive callback的方式来接收传送端送过来的讯息,在setup()里,作完begin() method后利用onReceive(void * cbfunction) method,来触发注册的cbfunction函式

LoRa.onReceive(onReceive);
LoRa.receive();

接着使用receive() method进入LoRa的receive mode
范例中在onReceive里注册的callback函式名称为onReceive,当被触发时会带有收到多少字节的packetSize参数

void onReceive(int packetSize) {
  // received a packet
  Serial.print("Received packet '");
  // read packet
  for (int i = 0; i < packetSize; i++) {
    Serial.print((char)LoRa.read());
  }
  // print RSSI of packet
  Serial.print("' with RSSI ");
  Serial.println(LoRa.packetRssi());
}

要读取收到的字节只要呼叫read() method,范例中使用了回圈,依收到字节的大小依序印出字串:

  for (int i = 0; i < packetSize; i++) {
    Serial.print((char)LoRa.read());
  }

最后使用packetRssi() method可以得到目前RSSI的数值

Serial.println(LoRa.packetRssi());