Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Learn LoRa with Python and Raspberry Pi

Learn LoRa with Python and Raspberry Pi

這是我們在 PyCon TW 2017 的分享內容。

摘要:
在物聯網(IoT)的環境下會根據不同需求使用不同的無線通訊方式,而 LoRa 的特色在於長距離與低功耗。但目前 LoRa 並不像大多數成熟的通訊協定可以隨插即用,它的優點在於所有東西都可以自己做,缺點也在於所有東西都要自己做。
我們將分享 LoRa 原理與實做經驗,如何用 Raspberry Pi + LoRa 模組 + Python 打造一個微型閘道器(nano gateway),包括在難以用軟體除錯與優化的情形下,如何使用 Python 自製一個頻譜分析儀來分析訊號。讓有興趣弄髒手的人能 happy hacking。

議程:
https://tw.pycon.org/2017/zh-hant/events/talk/348467557675565193/

台灣樹莓派

April 20, 2017
Tweet

More Decks by 台灣樹莓派

Other Decks in Technology

Transcript

  1. 姓名標示 — 非商業性 — 相同方式分享 CC (Creative Commons) 姓名標示 —

    你必須給予 適當表彰、提供指向本授權 條款的連結,以及 指出(本作品的原始版本)是否已 被變更。你可以任何合理方式為前述表彰,但不得以 任何方式暗示授權人為你或你的使用方式背書。 非商業性 — 你不得將本素材進行商業目的之使 用。 相同方式分享 — 若你重混、轉換本素材,或依本 素材建立新素材,你必須依本素材的授權條款來 散布你的貢獻物。
  2. • 法國公司 Cycleo 設計 ,Semtech 在 2012 收購 • LoRa

    是實體層 (PHY) 的調變技術 • 採用 CSS(Chirp Spread Spectrum) 調變技術 • 常用頻段 :433/470~510/868/915MHz • 低功耗 , 低資料率 , 長距離 , 低價格 • 低功耗 :RX<10mA, Sleep<200nA • 長距離 :500m 到 15Km • 靈敏度 : 低於 -137 dBm • 資料率 :0.3kbps 到 50kbps LoRa(Long Range)
  3. 18 • C • C# • Ruby • Perl •

    Python • Scratch • Java Pi4J Library • Shell script 如何控制 Raspberry Pi 的 GPIO ? http://makezine.com/2013/04/14/47-raspberry-pi-projects-to-inspire-your-next-build/
  4. • 特色 • 傳輸距離可達 15km • 長達 10 年的低功耗 (

    使用鈕扣電池 ) • 支援 433MHz/868MHz 等頻段 • 支援 LoRaWAN class A 協定 • 整合 FSK,GFSK,LoRa 等調變技術 • UART 傳輸介面 + 類 AT 命令列控制 • 最大輸出功率可達 +14dBm • 靈敏度可達 -143dBm • 每次最大傳輸 255bytes Microchip RN2483 LoRa Module
  5. • radio set freq [868100000] • radio set bw [500]

    • radio set pwr [8] • radio set sf [sf11] • radio set wdt [0] • mac pause • radio rx 0 • radio tx [1234] 相關參數 頻率 頻寬 發射功率 Watchdog Timer 設定 Spreading Factor 停用 LoRaWAN 功能 傳送 1234 啟用連續接收模式 http://ww1.microchip.com/downloads/en/DeviceDoc/40001784B.pdf
  6. lora = serial.Serial("/dev/ttyUSB0", 57600) • lora.write(b'radio set bw 500\r\n') lora.readline()

    lora.write(b'radio set sf sf11\r\n') lora.readline() lora.write(b'radio set freq 868100000\r\n') lora.readline() while True: lora.write(b'mac pause\r\n') lora.readline() t = int(time.time()) byte_cmd = bytes('radio tx ' + str(t) + '\r\n') lora.write(byte_cmd) lora.readline() lora.readline() Python 發送端程式
  7. lora = serial.Serial("/dev/ttyUSB0", 57600, timeout=1) • • lora.write(b'radio cw off\r\n')

    • lora.readline() • lora.write(b'radio set bw 500\r\n') • lora.readline() • lora.write(b'radio set sf sf11\r\n') • lora.readline() • lora.write(b'radio set freq 868100000\r\n') • lora.readline() • lora.write(b'mac pause\r\n') • lora.readline() • • while True: • lora.write(b'radio rx 0\r\n') • • if lora.readline().strip() == "ok" or "radio_tx_ok" : • print( str(lora.readline().strip()) ) Python 接收端程式
  8. • 通訊領域常用 dB,dBm 表示相對強度或功率 • 對數相加減 = 常數相乘除 • dB

    10 × log10(ratio) ≡ , 純量無單位 • 因此 10 倍增加標示為 +10dB, 而 1/100 標示為 -20dB • 如果是 2 倍增加 , 標示為 +3dB( 應為 +3.01dB) • dbm 10 × log10(Power)1mW ≡ • 因此 0.02 Watt 是 20mW, 也是 13dBm • 可以從 10dBm(10mW)+3dBm(2mW) 計算得來 先備知識
  9. • 量測隨頻率變化的輸入信號強度 • 硬體 • SDR(Software Defined Radio) • HackRF

    • 軟體 • GNU Radio • FreqShow(Python) 頻譜分析儀 (Spectrum Analyzer) http://jensd.be/755/network/lorawan-simply-explained
  10. • 定義網路系統架構與通訊協定 • 終端點採 LoRa 做長距離通訊 ( 星狀拓樸 ) •

    和終端點的是通訊雙向 • AES 加密 LoRaWAN http://www.atim.com/en/technologies-2/lorawan/
  11. • 定址 :DevEUI, AppEUI • 使用 ALOHA, 沒有 CSMA 機制

    , 三種 class LoRa Node https://www.thethingsnetwork.org/wiki/LoRaWAN/Home
  12. • 冗餘封包濾除 (CRC) • 安全性查驗 (Authentication/Authorization) • 最佳 ACK 路徑

    (ACK Routing) • 適應性資料率 (Adaptive Data Rate, ADR) Network Server http://jensd.be/755/network/lorawan-simply-explained
  13. • 使用硬體 • Pi 3 x2 – https://www.piepie.com.tw/10684/55/ • Pi

    3 x1 • Arduino x1 • Microchip RN2483 Module x4 – https://www.piepie.com.tw/14724/1420/ Pi 3 Arduino RN2483
  14. • 限制 : • 只能傳送 0-F 資料 (Hex) • 每個符號以

    ASCII 方式傳送 (1bytes) • Data 資料 : • 包含 id 與 content, 以 JSON 格式封裝 Payload 設計 Data CRLF Length SOH 1bytes 3bytes 2bytes char*bytes 0x01 0x0D 0x0A
  15. • 接收端 ACK 機制與傳送時間 • 當接收端收到封包後 , 回傳 ACK(0x06) 與

    id • 回傳時間與封包長度有關 • 發送端重送機制類似 class A • 傳送端發送完畢後 , 將等待一段時間等待 ACK • 如果沒有收到 ACK, 將用 ALOHA 方式重送 • 最大重送次數 <3 ACK 與重送機制設計