[測試] AS3992 – UHF RFID Single Chip Reader

《文件與教學》
文件總整理,可以從這論壇查看使用教學。
https://www.soliddepot.com/forum/viewforum.php?f=22

AS399X firmware(.hex)下載
https://www.soliddepot.com/forum/viewtopic.php?f=22&t=40343&sid=e0f3335ae0e157fb2e77c799a567d57d

下載完整資料(出處),包括 datashhet、schematics、firmware、document 等等。
https://www.dropbox.com/s/u9cv2ytscplytmg/AS3992%20reader%20module%20files%20English.zip?dl=0

 
《硬體外觀》
AS3992_adapter_antenna_tag
AS3992 開發板 + 3.6V/2A 電源 + 3dBi 天線 + 五張 915MHz Tag

usb_debugger_jtag_adapter
USB Debug Adapter + JTAG 排線 + JTAG 轉 C2 轉板

 
《AS3992 韌體更新》
由於韌體預設是燒錄 USB 版本,可以燒成 UART 版本方便測試。連接方式如下。

jtag_connect_usb_debugger
JTAG排線防呆。

jtag_connect_adapter
注意要三角對三角。

pin_of_as3992_jtag_adapter
AS3992 的 C2CK 和 C2D 還有 GND 要和 JTAG 轉板腳位相接。

connect_as3992_jtag_adapter
相接的結果(用手扶著就可以了)。

upload_firmware_connection
完整連接圖。

韌體更新要透過 Silicon Lab 提供的 FLASH 燒錄工具(C8051F)上傳。或是下載完整資料裡的壓縮檔。選擇 C2 programmer > Flash Programming V3.90.exe

如果一切連接順利,就可以看到 USB Debug Adapter 是可以選取的。
silicon_lab_flash_utility

點選 “Connect”,順利的話就可以連接到 AS3992,原來 “Connect” 會變成 “Disconnect”。
connect_to_as3992

下載 AS399X firmware.zip(.hex)
其中,as399xdemo_uart_3992.hex 表示 115200bps baud rate
另外,as399xdemo3992uart_9600.hex 表示 9600bps baud rate
我們選擇 115200bps 燒錄(用 9600bps 的也可以)。

upload_firmware
燒錄完畢後,重插拔電源將會使用新韌體開機(如果下載到一半斷線也沒關係,但電源不能斷)

 
《AS3992 連線》
我們測試的環境為 Raspberry Pi 3,使用 2016-05-23 的映像檔。
Raspberry Pi 和 AS3992 使用 USB 轉 TTL 序列傳輸線(PL2303HXD 或是 PL2303HX 都可以)相接。
raspberry_pi_as3992

通訊的方式是用 CuteCom,如果還沒安裝請先用 sudo apt-get install cutecom 安裝。
在 Pi 上連線的介面是 /dev/ttyUSBX,例如 /dev/ttyUSB0 如下圖。
dev_ttyusb0

一切沒問題,就可以使用 cutecom 做連線測試了。步驟如下:
1. 在 Device 選擇 /dev/ttyUSB0
2. 在 Baud rate 選擇 115200
3. 在 Data bits 選擇 8
4. 在 Stop bits 選擇 1
5. 在 Parity 選擇 None
6. 這時候點選 Open device
7. 最下方選擇 Hex input
8. char delay 選擇 1 ms
cutecom

根據文件說明,送 10 03 00 是查詢韌體版本,送 10 03 01 是查詢硬體版本。

因此我們在底下的 Input 輸入100300 就可以看到 AS3992 回傳的韌體版本。
cutecom_100300

如果是輸入100301 就可以看到 AS3992 回傳的硬體版本。
cutecom_100301

更多命令就需要參考完整的手冊才知道怎麼使用了。最重要的是完整資料裡的 datasheet 和 command。
datasheet: AS3992 reader module files English > Application notes > AS3992_Datasheet_v1.0.pdf
command: AS3992 reader module files English > Application notes > AN399x Leo Roger System Description_1_4.pdf

 
《AS3992 讀卡》
有人將 AS3992 UHF RFID reader 寫了 Python 的模組,可以參考使用。

接線就和剛剛的方式一樣,Raspberry Pi 透過 PL2303HX 或 PL2303HXD 和 AS3992 相接。

################                 ##########
# Raspberry Pi #  --USB to TTL-- # AS3992 #
################                 ##########

開啟 Pi 的終端機,先把程式拉(pull)下來。

$ cd ~
$ git clone https://github.com/GuyLewin/pyAS3992
$ cd pyAS3992/

因為原本的範例程式(example.py)只會讀取一次,我們稍做修改就可以持續讀取。

$ vim main.py
import as3992_api
import time

def main():
    ann = as3992_api.AntennaDevice()
    print "Firmware info: %s\nHardware info: %s" % ann.get_system_info()
    print "Activating antenna"
    ann.set_antenna_state(True)
    print "Tags:"

    while True:
        try:
            for epc, rssi in ann.iter_epc_rssi():
                print epc.encode("HEX"), rssi
        except:
            pass

        time.sleep(1)

if __name__ == "__main__":
    main()

執行 main.py,我們拿五張 tag 做測試,會讀到 epcrssi。實測接收距離約在 10-15cm 左右。

$ sudo python main.py

as3992_reader

[測試] SX1272 LoRa Module 和 Waspmote Gateway SX1272 LoRa module

lora-scenario
圖片來源:LoRa looks good to go

本文是以 cooking hacks 出的 SX1272 LoRa module + LoRa shield(圖左) 和 Waspmote Gateway SX1272 LoRa module(圖右) 做測試。
sx1272-lora-module-and-waspmote-gateway-sx1272-lora-module

《前言》
要使用 LoRa 通訊,最簡單的方式就是將 LoRa module 設定相同的 channel,這樣在相同 channel 的節點就可以互相收送資料,這是 P2P 的拓撲。

如果在 P2P 模式下增加 LoRa Gateway,一方面可以讓拓撲轉變星狀,能更有效的收集資訊,另一方面也可以整合多種裝置與通訊協定,延伸資訊傳遞的方式。
diagrama_lorawan_1_small
圖片來源:Extreme Range Links: LoRa 868 / 900MHz SX1272 LoRa module for Arduino Waspmote and Raspberry Pi

《設定 LoRa Gateway》
我們可使用任意的終端機軟體(例如 CuteCom)和 LoRa Gateway 溝通。要注意連線的參數:

  • Baudrate: 38400
  • 8 Data bits
  • No parity
  • 1 Stop bit

如果裝置開啟成功,我們就可以開始和 LoRa Gateway 進行互動式的溝通,傳輸的訊息都是 16 進位(hexadecimal)的格式。

每一個訊息稱為 frame,有固定的格式,至少五個部份為:

  1. SOH (Start of Header – ASCII 0×01),起始通訊符號。
  2. DATA(Command or return message),實際送出或接收到的資料。
  3. CR+LF (Carry return + line feed -ASCII 0x0D and 0x0A),換行符號。
  4. CRC(CRC16-Modbus),錯誤檢查。
  5. EOT (End of Transmission – ASCII 0×04),結束通訊符號。

所有命令都需要轉成 16 進位發送,可以透過線上的工具做轉換。
而 CRC 是將 DATA 進行 CRC-16(Modbus) 運算後的值,可以透過線上的工具計算結果。

實際舉例,我們想取得目前 LoRa Gateway 的設定值,要傳送的 frame 值會是這樣:
01 52 45 41 44 0D 0A 32 41 33 31 04

其中,01 就是 SOH52 45 41 44 就是 READASCII 轉成 HEX 的值。0D 0A CR+LF32 41 33 31 是用 52 45 41 44 進行 CRC 的運算結果,一樣也是要轉成 HEX。04 就是 EOT

cutecom_send_read_command_to_lora_gateway
在輸入時注意要選擇 Hex input,而 Char delay 要選擇 0 ms。

回傳的結果為:

\0x01INFO#FREC:CH_12_868;ADDR:1;BW:BW_125;CR:CR_5;SF:SF_12;SNR:0;RSSI:-105;RSSI_PACKET:119;VER:0.13
6979\0x04

因為我們在 CuteCom 沒有勾選 Hex output,因此是用 ASCII 顯示結果,回傳訊息一樣是 [SOH]DATA[CR+LF]CRC[EOT] 的形式。

  • 開頭是 0x01 就是 SOH
  • DATA 部份為
    INFO#FREC:CH_12_868;ADDR:1;BW:BW_125;CR:CR_5;SF:SF_12;SNR:0;RSSI:-105;RSSI_PACKET:119;VER:0.13

  • 其中 INFO,表示目前的設定,用 # 分隔後面的資料。而資料格式為 name:value,資料間用 ; 分隔。
  • 0D 0ACR+LF
  • 6979 就是將 DATA 進行 CRC 的 ASCII 運算結果,要再轉成 HEX。
  • 結尾 0x04 就是 EOT

參數說明如下:

  • FREC (frequency and channel): CH_X_Y where X is the channel and Y the frequency band. Bands allowed are 900 and 868 (MHz). Channels allowed are 10 to 17 for 868 MHz band and 00 to 12 for 900 MHz band.
  • ADDR (address): Number between 1 and 255.
  • BW (Bandwidth): BW_X where X can be 125, 250 or 500 KHz
  • CR (coding rate): CR_X where X is a number between 5 and 8.

如果我們想將 channel 改為 12、address 改為 3、bandwidth 改成 500KHz、coding rate 改成 5,這樣的 frame 應該會長這樣(DATA 和 CRC 先用 ASCII 顯示):

  • SOH = 0×01
  • DATA = SET#FREC:CH_12_868;ADDR:3;BW:BW_500;CR:CR_5;SF:SF_12
  • CR+LF = 0x0D 0x0A
  • CRC = 79CA
  • EOT = 0×04

轉成 HEX 結果:

01 53 45 54 23 46 52 45 43 3a 43 48 5f 31 32 5f 38 36 38 3b 41 44 44 52 3a 33 3b 42 57 3a 42 57 5f 35 30 30 3b 43 52 3a 43 52 5f 35 3b 53 46 3a 53 46 5f 31 32 0d 0a 37 39 43 41 04

cutecom_send_set_command_to_lora_gateway
可以看到回傳結果就是我們剛剛的設定值,只是 SET 改成 INFO

我們也可以再送一次 READ 確認結果。
cutecom_resend_read_command_to_lora_gateway

會設定 LoRa Gateway 以後,可以試試看和 LoRa module 通訊,例如將光敏電阻的值從 LoRa module 送到 LoRa Gateway。

 

《實際測試》
lora_module_send_value_of_light_sensor_to_lora_gateway

Gateway:
筆記型電腦 + Waspmote Gateway SX1272 LoRa module。在該電腦上安裝 CuteCom

Node:
Raspberry Pi 2 + SX1272 LoRa Shield + LoRa module。在 Pi 上安裝 ArduPi librarySX1272 Libraries
感測器為光敏電阻與 10K 電阻串連,並分別接到 Raspberry Pi LoRa Shield 的 5V、GND 和 A1。

此一範例程式是修改自 How to Send Sensor Data Using LoRa Extreme Range Connectivity Kit

/*                                                                                                                                                                      
 *  LoRa 868 / 915MHz SX1272 Module
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  http://www.libelium.com 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see http://www.gnu.org/licenses/. 
 *  
 *  Version:           1.0
 *  Design:            David Gascón 
 *  Implementation:    Victor Boria & Luis Miguel Marti
 */

// Include the SX1272 and SPI library: 
#include 
#include "arduPiLoRa.h"

int e;
char message1 [60];
int ldr;

void setup()
{
    // Print a start message
    printf("SX1272 module and Arduino: receive packets without ACK\n");

    // Power ON the module
    sx1272.ON();
    printf("Setting power ON: state ");
    printf("%d\n",e);

    // Set transmission mode and print the result
    e = sx1272.setMode(4);
    printf("Setting Mode: state ");
    printf("%d\n",e);

    // Select frequency channel
    e = sx1272.setChannel(CH_12_868);
    printf("Setting Channel: state ");
    printf("%d\n",e);

    // Select output power (Max, High or Low)
    e = sx1272.setPower('H');
    printf("Setting Power: state ");
    printf("%d\n",e);

    // Set the node address and print the result
    e = sx1272.setNodeAddress(2);
    printf("Setting node address: state ");
    printf("%d\n",e);

    // Print a success message
    printf("SX1272 successfully configured\n");
}

void loop(void)
{
    ldr = analogRead(1);
    sprintf(message1, "ldr value: %i \r\n", ldr);
    e = sx1272.sendPacketTimeout(3, message1);
    printf(message1, "ldr value: %i \r\n", ldr);
    printf("Packet sent, state ");
    printf("%d\n",e);

    delay(5000);
}


int main (){
    setup();
    while(1){
        loop();
    }
    return (0);
}

此一程式可以用 cooking/examples/LoRa/cook.sh 進行編譯後執行。

$ cd /home/pi/cooking/examples/LoRa
$ ./cook.sh get_light_sensor.cpp
$ sudo ./get_light_sensor.cpp_exe

cook_and_execute

一開始光的強度不高時值分別為 820 和 820 和 818。但當我們拿光去照光敏電阻時,值會降低到 580 和 608。
lora_module_get_light_sensor_and_send

這些值不但會顯示在螢幕,也會透過 LoRa module 傳送到 LoRa Gateway。
cutecom_read_value_from_lora_gateway

《結論》
根據這次的測試結果,未來如果有多個 LoRa module,將很容易的建構出一個星狀拓撲的 LAN(LoRa Area Network)。這樣低功耗長距離的傳輸協定,可能會大規模的應用在物聯網(IoT)的情境中。

參考資料:
* Extreme Range Links: LoRa 868 / 900MHz SX1272 LoRa module for Arduino Waspmote and Raspberry Pi
* LoRa Gateway tutorial
* How to Send Sensor Data Using LoRa Extreme Range Connectivity Kit