2016年11月26日 星期六

GPS Antenna test


可能有人注意到我在High Altitude Ballooning with LoRa Fourth launch用的探空儀
GPS天線的部份兩個是不一樣的,主要是因為我當時在設計的時候找到一個非常小的GPS天線
原本抓地到訊號,但是一把其他零件裝上去卻又遲遲Lock不住,所以只好換成另外一種7mm的GPS天線.

所以為了測試天線的效能,這次做一次地面的探空儀測試,兩組裝上不同GPS天線,固定在三角架上測試GPS的性能以外,順便也做一次耗電量的測試.


探空儀還是同一個設計,只是GPS模組的部分因為MTK沒有指令可以Query 目前的GPS資料
只能把一些多餘的NEMA關掉,對Atmega328的Interrupt base的UART來說,TDMA的第一格可能會出問題,因為要處裡GPS丟出來的訊號.所以我還是回去用ublox的MAX 7Q.



最終結果如下:

下兩張圖是GPS衛星的天空軌跡,shaded的顏色是衛星經過時的訊號強度,中間的一槓代表板子的擺放,而凸出來的那根是表示板子的正面
7mm晶片型天線

迷你型晶片天線
首先來講一下7mm的那支天線,可以很明顯的看出來因為板子不是為了這支天線所設計的,焊接的時候並不能避免天線的背面的衰減,理想上應該是要一個圓形對稱
迷你型的比較正常,基本上呈現圓對稱,但是訊號弱了大概1~5db,其中在低仰角的部分根本低到0db了
再來講到細節,注意到板子背面其實還有一個小的死角,其中迷你天線的訊號比較沒那麼低
我的猜測是電池座的鐵片干擾到了天線的接收,而由於電路板上面有做迷你天線的反射面,所以對其影響不大.


電池的話則是出現一個很有趣的現象,看起來用迷你的天線比較省電
另外就是因為電池用的是一次性鋰電池,初始電壓達到1.7,不過迅速降到1.4之後平緩的下降
可惜沒有整個過程都跑完,不過總時間達到四小時三十七分鐘

其他問題最大的大概就是氣壓計的初始誤差了,可以看到兩台的溫溼度基本上一致
但是兩個的氣壓差了
大概0.6hPa左右,還滿恐怖的不過還在Datasheet的正負1hpa之內

2016年11月9日 星期三

High Altitude Ballooning with LoRa Fourth launch



這次最主要的是探空儀改版,從上圖很明顯的可以看出來面積再次的下降
壓到了2x5cm(不包含外部感應器),幾乎是兩個AAA電池的大小了

為了縮小面積,最主要的GPS模組換成MAX-7相容的L70-R,氣壓計換成BMP280
另外Atmega328也換成MLF的版本,唯獨16Mhz的Crystal與RFM98沒換
而升壓電路維持同一個晶片,但是電感換成體積更小的了

BMP280真的很小,旁邊有一個0402的電容可以比較

另外也把SHT21+GPS的天線做在同一張板子上,這樣一來就不用另外再接線了,減低重量也簡化組裝,SHT21為了減少主板的影響,所以中間的PCB寬度很窄,一不小心真的會扳斷

而ISP換成1.25mm的插座,原本用接觸點+彈簧針的方式真的是很不方便而且占面積

天線也換成5/8波長的多芯線,比之前的單芯線重量少很多
所以..這次的減重答案就是.....

各位觀眾,七公克,七公克,七公克
雖然加上電池就變十五克,但是比起之前的重量少了快60%

這次還是打算用鋁箔氣球做測試


接收機還是一樣一個全向性與指向性

一樣還是全向性接收機用的是Linkit 7688架的Server,然後指向性天線是用筆電收

所以iPhone和筆記型電腦都可以直接看到接收的狀態

然後這次的飛行最主要的問題就是我的指向性天線沒有對準,所以導致全向性天線接收機的RSSI比指向性天線好非常多,當然也有可能是我的指向性天線已經有點問題了,這可能要在查一下,不過幸好全向性天線的狀況不錯,整個過程都能接收的到訊號,所以基本上資料沒斷

結果如下:

基本上還是一到高度就開始漏氣然後往下掉,最高到四千公尺左右

電壓這次的測量方式改成用內建的Bandgap,應該比較準一點,可以看到從一剛開始的1.47v一路下降到1.34v,但是有趣的是之後的斜率有點改變,而整個曲線也不像是正常的電池放電那種
我可能之後會做一個正常的探空圖,不過多少用這個可以看看端倪
這天基本上沒啥逆溫層,上去下來的溫度也差不多,不過濕度差異頗大,可以看到1000m處
應該是有雲啦,要算一下水氣量

RSSI的話很明顯可以看到這次指向性比全向性還要好,最主要的問題是我指錯方向..
下一版接收軟體應該會把方位角與仰角顯示出來
這張是兩個資料合併的結果,所以RSSI的變化有點大,不過還是可以看出來基本上極限在-96~100附近

最後就是GPS衛星數最大有11顆,以一個晶片型天線來說很不錯了
還有最遠距離13.19km,不過基本上是因為氣球掉下去才結束的






2016年9月24日 星期六

旋轉撥號器-mobile phone with Linkit one

最近Openlab找到一批傳統電話上的撥號盤,覺得滿有趣的就拿回家試試,
然後用Linkit one做成行動電話

我想留點關於這撥號盤的note,所以先來講一下運作方式
首先有三條線,其中一個地線,其他兩個分別是撥號開始與號碼數

當使用者開始轉的時候,撥號開始這條線會接地,而使用者轉完,開始倒轉的時候
每過一格,號碼數的那條線會有一個脈衝出來,轉完之後撥號開始這條就恢復斷路
畫成圖的話是這樣:



要注意的是,畢竟這是一個純機械的裝置,訊號一定會有彈跳的現象發生,所以程式的部分一定要做Debounce.
另外就是撥號盤沒有掛電話的按鈕,所以另外再做一個上去.

然後就沒啥問題了,Linkit one 的GSM example寫得很清楚,用LGSM的library很快


#define dial_pin 6
#define count_pin 7
#define hang_pin 2
#define DEBOUNCE_TIME 50
#include <LGSM.h>

String remoteNumber = "";
char charbuffer[20];
uint32_t first_digit = 0;

void setup() {
Serial.begin(115200);
Serial.println("Started");
pinMode(dial_pin,INPUT_PULLUP);
pinMode(count_pin,INPUT_PULLUP);
pinMode(hang_pin,INPUT_PULLUP);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
}
int readDigit(){
      bool catched = 0;
      int count = 0;
      uint32_t lastmillis;
      bool diaing = 1;
      while(diaing){
       
          if(digitalRead(count_pin)==1 && catched==0 && millis()-lastmillis>DEBOUNCE_TIME && digitalRead(dial_pin)==0){
           
              catched = 1;
              count ++;
              lastmillis = millis();
          }
          if(digitalRead(count_pin)==0){
              catched = 0;
          }
          if(digitalRead(dial_pin)==1){
            delay(5);
            if(digitalRead(dial_pin)==1){
            diaing = 0;
            }
          }
      }
      count = count%10;
      return count;
}
void loop() {

if(digitalRead(dial_pin)==0){
  digitalWrite(13,LOW);
        uint32_t last_digit = millis();
        int digit_count=0;
        while(millis()-last_digit<3000){//digit_count<10 &&
           if(digitalRead(dial_pin)==0){
              delay(10);
              last_digit = millis();
              int count = readDigit();
              Serial.print("Number:");Serial.println(count);
              digit_count++;
              remoteNumber+=String(count);
           }
       }
       Serial.print("Phone Number:");Serial.println(remoteNumber);
       if(digit_count==10){
        Serial.print("Calling to : ");
        Serial.println(remoteNumber);
        Serial.println();
        digitalWrite(13,HIGH);
        remoteNumber.toCharArray(charbuffer, 20);
        if(LVoiceCall.voiceCall(charbuffer))
          {
            Serial.println("Call Established. Enter line to end");
            // Wait for some input from the line
            while(digitalRead(hang_pin) == 1);
            // And hang up
            LVoiceCall.hangCall();
          }
        Serial.println("Call Finished");
       }
       remoteNumber= "";
}

}



2016年8月12日 星期五

nRF24l01 Sensor node (氣象站 3.5)


這是nRF24l01的第三版Wireless sensor node了,主要的改良很明顯的是,多了一個7-segment LCD來顯示溫度與濕度,我之前的幾個版本常常發生的問題就是想要看溫溼度的時候,卻要點開網頁來看,覺得頗煩,所以決定再做一個有顯示器的版本.

為了這個顯示,最大的問題就在於耗電量的控制,首先顯示器的選擇表裡面,TFT LCD和OLED先槓掉了,這兩個都是吃電怪獸,動輒數十到數百mA的水準,接下來就是電子紙和Sharp Memory LCD,其實這兩個都是非常好的選擇,只有價錢+連接線是有點問題,價錢不用說,就是貴,不過連結器的問題在於,我不是很希望有軟板+連接器,單純主觀認為醜,如果我把連接線折到背面,我就需要再PCB挖孔給連接線過,而原先是有打算要用導電玻璃版本的Sharp memory LCD,但是掏寶那家出清完了只好作罷,於是剩下還在表上的就只有傳統的LCD了

原先是打算拿一個專用的IC接上Arduino就Call it a day,但是查了一查,各種耗電量的悲劇,以我的Use case,耗電量必須維持在數十uA之間,否則使用時間會極為悲劇,但是看來看去,專用IC的耗電量大都有數百uA到數mA之間,有夠恐怖.

所以只好轉往有LCD controller的MCU找,大概看了一下就覺得MSP430RF4133這顆還不錯,基本上功能都全,耗電量也很低,要維持LCD只需大約1uA左右.

然後就買了4133的Launchpad來試試
紅色那張就是MSP430FR4133的Launchpad
原本想說把板子上的LCD拿下來,但是左看右看,這八成是沒辦法乾淨的拿下來了,只好自己先用IC搭一個出來
可以看到這非常的雜亂,多虧LCD一堆線
大概改了一下原本的LCD library的接腳之後就能用了, 然後就開始Layout.

主要就是把Temperature Sensitive的部分透過PCB Cut out隔離,然後RF的部分底下不鋪銅
另外零件選用如下:

  • Temperature & Humidity: HTU21D==SHT21==HDC1080 in terms of layout
  • Barometer: BMP180 or BMP280
  • Light Sensor: OPT3001 or Si1133
  • NFC tag: RF430

我目前上的零件只有HDC1080,BMP180,OPT3002這幾個
然後當然還是同一個nRF24l01的SMD模組
另外電池也還是用CR2032,而板子的大小和悠遊卡相同

PCB和零件到了之後就開始寫程式去...
多虧有energia,很多library大都可以直接移植過去沒問題,nRF24l01的驅動用的是nRF24
HDC1080用的是我之前寫給HDC1000的那版,BMP180用這個
大概都動起來之後就開始壓耗電量,大概就這幾件事情要做

  1. 能睡就睡
  2. 事情越少越好
  3. 睡得越死越好

能睡就睡主要就是用Sleep代替Delay(除非Bit-Bang啦,那個沒辦法),在這次的Project裡面,有兩個需要等待的,第一當然就是等下一秒,第二就是等Sensor+RF處裡完,所以在這兩個時間,我都用Sleep代替delay

然後就是因為每分鐘才會送一次資料,又顯示器只有溫溼度,所以每秒鐘只去讀溫溼度計然後更新LCD

再來就是要把沒有用到的pin拉到一個特定的state,避免floating造成漏電
於是這一版的耗電量讓待機壓到15uA,而平均的耗電量大約80uA,用CR2032可以撐半年

另外就是我想提一下Ti的energytrace,這真的是他X的好用,基本上就是一個會記錄的電流電壓計,但是測量範圍可以達到uA~mA,除了把時間軸plot出來以外,還會自己算預估使用時間與尖峰電流,對我幫助非常大,以前我都只能用示波器去看去算,現在在軟體裡面點一點就好


2016年7月23日 星期六

High Altitude Ballooning with LoRa Third launch

這次把探空做的更小,面積縮小到3x5cm,零件的改變基本上差不多
Sensor移除了MPU9250,氣壓計換成MS5607(因為可以低到10hpa)
GPS模組不變,而電源供應的部分變得最多

這次可以用三種供電選項,以設定操作電壓3.3V為界:
>3.3V可以用LDO供電
<3.3也有個Step-up,讓這次的Node可以吃一個AAAA電池
最後還可以吃太陽能電池

如果用L92的話,總重量可以壓在25g

而接收站這次改變的最大,以前在發射的接收站都只是用Python做的離線版,只不過是Cmdline的GUI版本,所以其他人都需要走過來看數據,這其實不是很方便,所以這次改用Node.js做了一版網頁版本的Server,與搭配的前端.
我先講一下這次的整個架構:用圖說明比較快

第一次測試TDMA的時候,是為了測試不同設定下的距離,這是改成切換不同的頻道,
而且雖然第一次測試是失敗的,但是這次大家都裝了GPS,有了共同的timepulse,就可以做到用一對一變成一對多:
Node.js的部分主要分三個
  1. 直接記錄成CSV
  2. 推送網頁
  3. Socket即時傳控制與資料

而前端也是有四個模組組成
  1. 地圖
  2. 控制
  3. 每個通道的即時資料
  4. Chart

地圖是我從第一次放探空氣球就一直很想做出來的東西,以前用Python的時候不知道怎麼寫,但是用網頁就方便多了,利用leaflet+抓下來的Google map,就可以做成我要的離線版地圖
不過這次遇到的問題是,c3.js很吃資源,每秒推一筆SP3的風扇就開始轉,所以暫時先拿掉這功能

而為了野外架接收站的方便,我把整套系統搬到Linkit 7688,就把整個系統縮小到可以放在防水盒裡面,搭配降壓模組直接吃12V的電瓶.
另外雖然可以直接用Linkit 7688 Duo直接接上LoRa的模組,不過因為手上就已經有以前做好的接收站了,所以就直接用Serial port接上7688.絕對不是因為我懶喔O.<
第一版的探空,換個韌體就變接收機惹,一路用到現在
獨立運作還可以開AP讓大家連線的接收站,我愛7688
內部照我就不放了,因為真的是太慘烈,我怕正常人看到會崩潰

然後這次是在文化大學放的氣球
我也想要有個RTK GPS...
由於要多個Node,所以改用全向性天線


BUT,我還是有架另外一台用指向性天線作為Backup,不過這台小接收站是用Arduino Leonardo(Atmel Atmega32U4)做的,我之前手癢做一台專門接收用的板子.

不過需要接上電腦才能運作,所以把nodejs搬到筆電架整套Server.
我忘記帶繩子
然後最後就是發射了,這次發射與以往的不同,氣球改用鋁箔氣球

主要是實驗需要定高度,而且高度要低,所以用鋁箔氣球測試看看狀況如何
結果異常慘烈XD,用高度的時間圖一看便了

氣球上升到一半就漏氣然後就掉了,而且超快,最後收不到資料都是Lost LOS
第一個是如下圖只有一顆氣球,而且是灌滿的,拉力大概75克,第二個是如上圖的三顆沒充滿的氣球,拉力沒測...
LOS lost

由於不到一小時氣球就掉了,所以距離也就數十公里....
下次應該會再測試幾次吧

2016年5月24日 星期二

Taiwanduino



左:正式版 中:Beta版 右:正式版的電路板


總之這是一張台灣造型的Arduino

首先要提到的是,這張板子的目的
其實這張板子是在Openlab.Taipei 週三來碗Arduino的聚會時,提出的idea
當初的目的是讓大家都能焊接出一個台灣形狀的Arduino相容版,就這樣

基本上,這個目的就先限制住了零件的選擇,基本上只能選DIP的零件
這時候我第一個想到的其實是用Attiny85的版本,畢竟國內外N堆人都曾經做過同樣的東西
不過這時候Co-worker DC提到了想要加撥放器的功能,基本上就是PWM播放Wav檔案

這時候Attiny85的問題就是Pin腳太少,不拔下來沒辦法燒錄,這時候剛好想起來之前Adafruit做過的Trinkit pro用的就是Atmega328 + V-USB的bootloader,做到類似Attiny85 USB開發板那種,用GPIO模擬USB HID,然後以此作為上傳的通道,又為了存放Wav檔,所以另外加了SPI Flash,然後再把其中一個PWM pin拉出來,配合2N2222 + 電阻 + 喇叭,做完撥放器的部分,配合電容式觸控,就可以完成撥放器的功能了


於是最後就變成這樣了,電容觸控需要一堆1M歐姆,USB也需要幾個Zener+電阻,還有一個SPI Flash,最後的Layout其實真的很緊迫,畢竟還需要留個PAD給電容觸控,只有鵝鑾鼻+觸控點我確定是刻意挑位置放的,鵝鑾鼻其實是因為在Layout的時候剛好柯P在一日雙塔,然後就...那我也來多個LED當燈塔好了,不過北端沒地方放了,所以只放了一個鵝鑾鼻

包裝

零件大概就是這樣,不過我這次還想講軟體,首先就是這張板子有他的USB PID/VID,不只是把Trinkit pro 的 bootloader拿來用,pid.codes有免費的USB PID/VID可以申請

有趣的是那後面的故事,原本這個code是要向USB聯盟購買的,廠商會買到一個Vender ID,而他底下會有uint16_t 個 Product id可以用,買一個要5000美元,很明顯的有些廠商用不完,所以這家廠商就為了推廣OpenSource Hardware,所以讓OSHW的硬體也可以拿到一組PID
當然USB聯盟是禁止的,不過他已經發出去PID也收不回來了XD
順帶一提,這張板子的PID是0x5457 = 'TW'

東西大概都放這了https://github.com/will127534/Taiwanduino/
過陣子我再來補商品化的一些故事,or我自己的意見

2016年2月13日 星期六

MT2502 module breakout


MTK官網的Reference design直接改的,另外就是一定要從電池供電才會動...

2016年2月3日 星期三