2018年8月21日 星期二

TTN Gateway Setup



前陣子終於架了一個長期的戶外Gateway,用的是兩張V1.2的Gateway Hat, 分別跑915Mhz 和 433Mhz

架構是POE一條網路線供電和網路,內部用一個分離器接出網路和電給RPI,RPI背兩張Gateway Hat,中間那層是433Mhz,上層是915Mhz+GPS,因為PPS有接到GPIO,所以中層433Mhz的板子吃915Mhz那張的PPS,最後兩條RX拉出來接上兩個天線。

最主要的問題大概是過熱吧,可能放在這種戶外防水盒內不通風的狀況下,加上RPI和SX1301都滿熱的...所以我還另外加上一個風扇,然後在中層貼了兩個散熱片。

次要的問題大概是手上沒有短的網路線,所以整線滿慘的...

次次要的問題大概是不知道為啥光華買不到915Mhz的天線,所以只好拿膠棒天線直接上

可以看到天線底下有一個915Mhz的LNA+Filter板,供電用Bias給,433Mhz的天線也是一樣,不過用比較高級的LNA,0.28dB的NF看起來不錯。

至於怎麼接上TTN:

clone完packet_forwarder之後,先Compile,然後在./packet_forwarder/lora_pkt_fwd/底下有一個update_gwid.sh,先跑一遍讓packet_forwarder讀網卡的MAC address,然後會跑出一個Gateway ID,用那個ID去註冊TTN,記得頻率要選Asia 923-925。

接下來準備global_conf.json,在台灣的話會是Asia 923-925
這邊有conf檔案可以下載(AS2):https://github.com/TheThingsNetwork/gateway-conf

然後再修改一下,首先就是板子上沒有LBT,所以LBT要關掉
"lbt_cfg": {
"enable": true,
--> 改成false

然後有GPS, 所以 "gateway_conf": {後面加上"gps_tty_path": "/dev/serial0",
不過這樣一來Gateway的位置就沒辦法自行設定,即使沒有public也是一樣



Low Power WiFi Weather Display V2




總之這版是Update成電子紙版本,最主要是因為我去看了Computex之後才發現原來4.2"比我想像中的大很多,價錢也沒有說很貴,所以就買回來試試。基本上架構和之前一樣,都是MT7687 + G2553的組合,而且這次因為電子紙也可以直接斷電,所以整個Power Plane就簡單很多,直接切斷電子紙和MT7687的3.3V,然後斷開USB轉UART的TX/RX 即可。

由於新的4.2"電子紙螢幕hen大,所以電池也直接Upgrade成4000mAh的電池,照目前的耗電量估算至少可以撐一整年,只是比我想像中的重了一點...另外電池底下的黑色軟片是NFC線圈的防磁貼片,為了避免電池影響到NFC的運作,如果以前有玩過悠遊卡放手機裡面的人應該有印象。

照慣例螢幕底下放Wifi Config用的NFC Tag,真的好用,然後因為空間實在是太大了,所以放我老婆照片。
新的4.2"解析度其實沒有大很多,只是長了一點,所以軟體可以不用大改也會動

軟體上幾乎一樣,因為剛好我之前的螢幕是400x240,而新的只是長了一點400x300
所以繪圖上,只是加了一行降雨機率。不過另外一點比較重要的是,現在會定時Update,以前純粹是G2533睡了8HR醒來Update,但是有個問題是CWB每00,06,12,18Z 會Update一次預報,所以我需要Update最新的那一報,所以Solution是MT7687 Update完畢之後,HTTP Get的Header其實就有時間,用那個計算下一個Update時間經過多久之後,透過Pulse的長度去通知G2533需要Sleep多久(MT7697沒有UART可以用+我懶得用其他方式encode digital的)。不過可想而知的是,一來MSP430的時鐘並不是那麼的精確,二來這種透過Pulse長度來計算的方式也會有計量誤差(Aka.測量長度的解析度問題),所以我的設計上並不是說整點就去撈,因為不確定實際上是整點前還是後,所以固定晚五分鐘Update。


大概就是這樣,Battery Testing.......



2017年11月2日 星期四

LoRa Gateway / Concentrator


總之這是一個真正的LoRa Gateway,在說明之前我先釐清一下部分人的概念。
LoRa的Modulation除了有頻率的差別以外,還有一個很重要的是Spread Factor(SF),
這些參數要完全對上,一個普通的LoRa Transciver(SX127x)才有辦法收的到。

坊間很多人因為無知或是惡意誤導,會拿SX127x的那種Single Channel的IC去宣稱自己是Single Channel Gateway,這種和SX1301的Level完全不同。

真正在架設LoRa網路的所用的方法,是拿一顆(or 以上)專用的IC(SX1301/8)去弄,
SX1301/8前端有兩個個0.8Mhz的BW的RFFE把Raw IQ送給SX1301/8
然後SX1301/8內部的DSP有49個LoRa decoder去解在這1.6Mhz裡面的LoRa封包。

而其中最主要的LoRa Channel是 8個Frequency x 7~12 SF 的48ch decoder,這48組可以同時解,也就是說即使Frequency相同,SF不同的狀況下都能解出來,不過這48組的BW被限制在125Khz。另外一組LoRa則隨意設定,還有個FSK的Channel則是為了短距離的通訊(因為速度夠快,而且因為距離近,收訊沒啥問題,速度夠快On The Fly就短,對於發射裝置來說耗電低,對於接收端來說單位時間所能收的客戶也變多)

所以LoRa Gateway請指名SX1301/8

First Try

續之前的LoRa project,我最主要的是需要一個Mult-Channel的Receiver,這計畫的第一版因為失敗,所以後來的7688 receiver才變成四個Channel的Single channel receiver去撐multi-channel。

那時候失敗最主要的原因是因為我沒有辦法把SX1301的FW成功的Load進去,但是SPI Bus的壓力測試是通過的,也就是裡面的那顆FPGA跑不起來所以整個卡半天都弄不好。

這大概是一年前的Project,那時候受限於SX1301這顆晶片並沒有放完整的Datasheet出來,我所參照的電路圖來自Microchip的LoRa Gateway User Guide,裡面有整個Gateway的完整電路圖,第一版的作法是SX1301那邊照抄,SX1255/7的部分因為有Datasheet,所以抄Datasheet。

不過到了今年年中的時候我發現SX1301竟然Release了Datasheet,所以茅起來檢查一下問題在哪,結果對了Pin腳對半天,竟然......
Reset的電位是拉高Reset,而不是常見的拉低Reset,所以不只是我沒有放電阻拉,後續補上的還拉錯方向。
另外一個比較小的問題是耗電量,我的第一版沒想太多就用LDO上,結果PO到Github就被別人發issue說LDO不夠用,一聽才知道,幹,SX1301的1.8V Rail吃掉0.6A....

所以就打算修正再來試一次,由於我那時候剛好在美國交換一兩個月,Pi Zero買了一堆
就做了一張給PI Zero用的版本,由於Layout塞不下,把一組RFFE拿掉,留一個SX1255/7
但是因為另外一邊超空,所以塞GPS模組提供PPS,然後因為我不想要拖一個天線在外面,就拿了一個有內建天線的模組來用。當然啦,也把LDO換成Switching,不過3.3V Rail就直接從RPI上面拿。
Ver2
這版終於跑起來了,整個超爽der,越想越爽就想說那就做一個RPI用的版本吧。

然後就做完了,不過不只是把第二個FE加回去而已,大致上第二版還是有幾個問題
第一個就是LoRawan所提供的lib裡面關於GPS校正時間的軟體,由於吃uBlox專用的指令,所以基本上只支援uBlox的GPS模組,所以沒辦法只好改用很兇的MAX-7Q上,懶得改lib。
第二個就是RX增加了Bias的位置與SAW Filter,最主要是因為SX1255/7是直接downconvert,而且IC內部並沒有SAW,又因為取樣的BW只有0.8Mhz,所以在這外面的訊號通通會變雜訊灌進來,所以還是放了Filter在上面,而Bias則是因為SX1255/7並沒有一個放大用的LNA,所以還是得加一個,而為了接線方便,同時考慮到天線頗長,所以設計上是有個小的板子接在天線正後方,負責Filter與Amp,然後透過RF上面放個DC的Bias去供應這張板子的電流。最後的小細節就是在SAW前面還有一個TSV,防ESD打壞SAW。
直接接起來大概長這樣,注意的是中間可以牽一段很長的SMA線沒問題

然後因為RPI的SPI device有兩個CE0/1,所以在背面也留了一個Jumper可以跳
像上面那張就是疊了一個915+一個433的版本。另外天線接頭的部分也為了選擇多樣性,用的是SMA/U.FL複合體,所以要上哪種都OK。最後就是SX1301運作的時候真的溫度不低,所以拿RPI用的散熱銅片貼上去這樣。

當然啦,以上這幾個改進都回到RPI Zero的版本

歷經一年的Project終於完工,我終於能夠用到同時 8-ch frequency x 7~12 SF的正常Gateway惹。



不過目前這版問題還是有的

第一個就是TX效能很差,因為直接從RFFE拉出來,內建有Driver,但是Power不大,
對我目前只需要Multi-Channel的狀況是還好,但是之後應該會需要用到TX,所以勢必是需要加一個PA,不然就是需要把SX1301的PA enable腳位拉出來,這樣我就可以另外接上一個PA然後用enable作為PA的開關。
第二個是Bias的問題,因為我現在只留了一個電感在那邊,所以用U.FL的時候,一旦不小心接到地,Bias會直接短路燒掉,所以我暫時的改法是後面接電阻,但是因為pad是0402,所以焊接的時候電感和電阻成三角形的方式焊接上去。


2017年6月19日 星期一

Linkit 7697 Badge

總之這是一個很奇妙的Project
最剛開始是主管看到那個Wifi Display,碰巧因為主管的主管想要發給工程師一人一片Linkit97的板子, 所以主管要我做一個類似的東西,但是因為成本的關係所以要改用別的螢幕

同時我聽到有人是想要做Badge,上面插Linkit 7688的那種。所以我同時Layout了兩個試試,一個是TFT LCD + Linkit 7697,另外一張是LED矩陣的Badge概念版。那時候Linkit 7697剛開始量產,還沒來的及打通一些奇奇怪怪的零件,所以想當然耳的TFT LCD其實還跑不了,就先把Badge版焊接一版出來看看。俗話說的好,數大便是美。288顆LED燈雖然用手焊接焊的要死要活,但是滿壯觀的,所以之後就變成了Badge版。

設計上就是兩個LED控制器,加起來可以控制288顆Led燈,規劃成18x16
另外還有一個三軸加速度計與亮度計,Input是一組方向鍵與四顆按鈕(ABXY)與兩個側邊按鈕

供電可以透過鋰電池或是電腦,同時接上的話會幫鋰電池充電
模組就和Linkit7697一樣用的是MT7697的模組,只是這是群登做的

這顆LED控制IC真的不錯
貪吃蛇

 俄羅斯方塊

這張板子大概是我第一次硬體完全都是我設計然後量產打件的,其實滿多點我想留在這邊當個紀錄

首先是板子零件選用,台灣的EMS廠商大都需要一個公司等級的供應商,通常小批量的就是Mouser,Digikey...等等的。但是這樣一來就會造成成本大增,因為這些地方小批量的價錢真的都不便宜,動輒好幾倍的價差。由於我之前都是上掏寶採買零件,這造成我非常大的成本估計落差,所以要嘛就是找到一家可以用掏寶的EMS,不然就是在選擇零件的時候,參考Mouser or Digikey等等的。另外就是請務必確認EMS廠商能夠使用掏寶來的零件以及符合時間要求,比方說EMS廠商要進口的時候,過海關會造成拖延。如果對掏寶的零件不熟悉的EMS廠來說,處理進口就會有非常大的延誤,可以的話建議是直接自己買,然後交給EMS廠商當客供料件,省去可能的問題。(P.S 以上的敘述中,我的量大約在1K以下)

然後就是BOM表了,如上所述,基本上BOM表需要有一個明確的廠商產品序號供EMS採買
但是有些零件例如電阻,電容等等的通用零件,其實可以詢問EMS廠商的庫存,以及合作的廠商,把所需要的電阻值與精度或者是電容值與電容特性給EMS廠商就可以了。

再來還有打件的零件圖,由於打件後,需要檢查打件有無問題,需要一個參照的圖表標示各個位置的電阻值

最後就是生產的時候會需要有測試程式確認每個零件的焊接都正常,這程式我建議是硬體設計完就可以開始寫了,然後硬體焊接測試的時候就可以直接上,省時間。
工廠的測試試算時間的,所以測試時間也是越短越好,也因此測試的手續越簡單越好。

最後的最後就是,因為這個東西電路板就是最後的外觀,整個電路的設計都需要考慮到視覺的效果,比方說零件的對稱性還有排列的整齊度。
如果用的是亮面的PCB Soldermask的話,那連電路的走線都需要考慮一下。

硬體講完了來講軟體
總之就是雜,功能有以下三種

1.貪吃蛇
2.俄羅斯方塊
3.時鐘

貪吃蛇和時鐘是我自己刻的,俄羅斯方塊是移植

底層的Library修改自Adafruit的Library,就是變成兩顆IC這樣,省去我還要再另外包一層。
然後上層接上Adafruit GFX。

整個Code因為功能不少,所以拆成幾個部分:

1.控制,包含LED矩陣與按鈕
2.貪吃蛇
3.時鐘
4.俄羅斯方塊的一堆Code

Code的部分倒是還好,我比較想講的是Dual buffer。

當我要更新一個Frame的時候,如果我直接動到正在顯示的那個記憶體空間,
在Clear frame的時候就會造成LED矩陣會有一瞬間被清空,導致動畫會有閃爍的情形,
還好這顆LED控制器裡面有8個Frame buffer,所以我可以指定寫入下一個Buffer再通知IC說顯示下一個Buffer,而實際上我只用了兩個做Dual buffer。

其他的倒也還好,MT7697裡面硬體功能不少,而Arduino IDE裡面也可以直接叫出Hal來用。
比方說遊戲所需要的隨機號碼產生器,可以看到我是Call MT7697內建的TRNG,而不是Random() + RandomSeeed。

最後的最後就是亮度計會自動校正螢幕的亮度,因為我非常不喜歡太亮的LED,所以在每次Update螢幕的時候都會去抓亮度計的讀數,唯一可惜的是我忘記加上Filter了....


我的資料都放在Github了,可以看看
https://github.com/will127534/Linkit7697_Badge