2021年1月1日 星期五

Solar Eclipse 2020

 


2020年算是我個人變動比較大的一年,去年出國念書今年畢業在國外上工,經歷了Remote Learning的下學期,沒有畢業典禮+計畫被打亂的畢業,在空蕩蕩的機場搭飛機回台灣隔離14天,然後又飛回去搬家準備上工。一直沒什麼時間寫下這篇記錄,趕在2020年要過了之前寫完這篇。

這篇算是在防疫旅館做完的Project,目標是做出一個自動追蹤太陽的照相機來照日環蝕。通常要追蹤星體都是用赤道儀,透過跟地球自轉同步的旋轉軸達到跟星體同步,但是沒有用赤道儀有兩個原因:

  1. 一個是赤道儀貴得要死......貴到不好意思跟老師借來玩
  2. 第二個是由於地球自轉軸是傾斜的,赤道儀使用之前需要手動對齊北極星+周圍幾個參考星體(因為北極星不是正北),我不確定白天是要怎麼對齊

所以就變這樣了:


CCD(CMOS? lol)是Raspberry Pi HQ Camera,雖然比不上單眼但是很夠用了,加上因為底片大小比較小(1/2.3)所以長焦的鏡頭也比較小,勉強可以用便宜的兩軸伺服器馬達來移動。
長焦鏡頭是Canon FD 100-200 MM f5.6 Lens,RPI HQ Camera一個特色是因為是C/CS mount,所以可以轉接不少老/新鏡頭,我翻了一下Ebay找Cannon FD的長焦就這個好像還可以,買起來才13USD。

好,所以到此照相/機械架構有了,接下來就軟體的架構: 目標是做出一個能夠收集完整解析度之下最高FPS最原始的資料+自動追蹤的架構。

RPI相機資料有四種輸出: 1. MJEPG Encoder 2.H.264 Encoder 3. Raw 4.YUV
大致上整體影像的Pipe Line如下: RAW----->Debayer---->MJEPG or H.264 Encoder
四種輸出就是看你從哪一個Process接出來用

其中H.264有FHD解析度限制,所以只剩下1和3,MJEPG的問題是RPI的Video Encoder不知道為啥Quality調得很低,壓出來的畫質慘不忍睹,第二個問題是MJEPG Encoder雖然沒有解析度限制,但是也是有總pixel的處理限制,雖然解析度不至於頂到但是假如我開VNC調用MJEPG的時候就會撞到。於是只剩下RAW和YUV,RAW檔案的問題是因為是相機底層的資料,我需要先生出相機校正的參數,包含鏡頭變形和色散等等的,老實說我在旅館做不來,加上資料量大小真的恐怖,所以最後試了一下還是用YUV資料。

但是YUV資料量也很恐怖,假設以頂到RPI HQ Camera的CSI-2頻寬上限來算,10 FPS x 4056 x 3040 x 2 = 30Mb/s,要記錄全程大概數小時的資料至少就要數百GB,所以勢必是需要有壓縮的方式,加上太陽濾鏡之後的資料其實就一個大圓以外都黑的,簡單的JPEG就很能壓縮。

我試了在RPI上面跑FFMPEG的結論就是RPI4做不來,那只剩下一個方式:把資料Dump到我的筆電處裡,透過1G的有線網路的話至少可以跑到5FPS,於是就用了raspividyuv+FFMPEG在我的電腦收RPI Dump的資料。

這邊還有一個需要留意的,RPI的ISP生出Frame的時候會帶有timestamp,通常是為了送到Encoder做時間軸用而raspividyuv不會用到,但是因為日蝕是有精確的時間點的,我需要知道每個Frame的時間才好處理,所以我稍微修改了一下raspividyuv把pts紀錄到另外一個檔案裡,事後再把Frame+PTS一同處理。

插曲就是2.5G有線網路其實差不多要開始流行了,我看到2.5G的USB Dongle價錢開始往下壓就買了兩隻想說這下我終於可以把1G的瓶頸暴力的拉到2.5(幾乎是RPI HQ Cam的CSI-2頻寬),結果就是預設的Linux Driver跑不到2.5,很微妙的在1.2左右,原廠的Driver不知道為啥也安裝不了但是還是比1G好一點就硬著頭皮用了

ISP除了Debayer以外還有其他2A的功能,包含Auto Brightness + AWB,Auto Focus因為RPI Camera沒有調焦的功能,所以只能輸出Focus的數字,所以在Setup的時候是先跑輸出Focus找到對焦點之後再開始資料採集。而由於日蝕的亮度變化,所以Auto Brightness有開,而AWB則是固定,我的Cmd如下:
raspividyuv -t 0 -fps 15 --mode 3 -w 4056 -h 3040 -ss 10000 -ISO 100 -ev -10 -mm average -ex spotlight -awb sun -o tcp://169.254.142.200:6667 -pts $DATE_STRING.txt -v
./ffmpeg.exe -f rawvideo -pix_fmt yuv420p -s 4064x3040 -probesize 89M -r 10 -i tcp://0.0.0.0:6667?listen -q:v 5 ".\$((Get-Date).ToString('yyyy-MM-dd_hh-mm-ss'))\img-%08d.jpg" -vf scale=800:600,fps=1 -q:v 2 -f image2 -update 1 udp://169.254.35.220:13991
加上我懶,所以Setup Stream是用power shell script自動跑這兩隻程式
*Note: YUV輸出的時候會自動Padding所以FFMPEG收的時候是4064x3040 

以上是資料採集,接下來是自動追蹤
我其實以前也做過太陽的追蹤,2017美西有一次Solar Eclipse,雖然我人在加州只看到日偏食,但是還是有照全程,只是那時候我忘記帶腳架,導致事後資料處裡很麻煩,於是就寫了OpenCV的程式自動擷取太陽出來:
2017年LA日偏食

效果不錯,因為太陽濾鏡之後也只剩下一個大圓球很好追,所以就用了OpenCV來追太陽
如果稍微看ffmpeg的指令的話會發現除了壓縮完影像之後,其實我還Copy了Frame然後把解析度調到800x600後送回RPI4,這個資料就是回去給RPI4上面的OpenCV用的,OpenCV抓到太陽的中心點之後就會判斷需不需要移動(因為伺服器馬達有角解析度的限制),然後送指令給伺服器馬達的控制Server。最後為了我自己控制的方便,挖了XBOX的控制器出來讓我能直接手動找太陽+開/關Auto Control。

當然這還是得要先測試個幾次:
很蠢的測試



以下是這次日蝕的OpenCV的追蹤結果

有雲的時候邊緣比較拿抓閥值,但是可以直接指定圓的大小就還好,重點是中心點

當然還是會有跑掉的時候,所以控制Loop需要有一點De-bounce

因為下一張就回去了




當天跑去故宮南院,還搬了冰桶過去XD



從早上待到結束,Some Result:
這張是NEX-5N照底圖+RPI HQ Camera Overlay上去的,照底圖要在太陽來之前/之後照XD

幾張Key Frame

以上,就是在這2020年顛簸的旅程中的一點紀錄





2019年6月1日 星期六

SI8B Pancake Geiger Counter Tube


速戰速決,總之這是新買的一個蓋格管,從圖來看最大的特色就是這個設計的感應面積非常大,通常暱稱叫做Pancake Tube。多虧這個大片的感應面積,這個蓋格管比之前我用管狀的靈敏很多,這款的背景CPM通常可以到~180

而且最有趣的是因為上蓋是透明的雲母片,所以其實可以看的到輻射打過去所激發的光。


大Guy94這樣,驅動版我懶得做就挖了之前高空氣球的那塊板子來用所以沒有特別的點,電壓我還是調成跟之前一樣,連Bais的電阻都是1M而已,短時間照照相可能還好,長時間拿來做監控可能還是要照一下規格書給4.7M。



2019年4月27日 星期六

LoRa Gateway / Concentrator V2


總之這是第二版的LoRa Gateway。

說來話長,不過我當初做LoRa Gateway並不是要用來接LoRawan,而是跑自己的系統去收探空儀的資料,可是最後做出來之後因為要整合進現有系統的時間和成本都太高,所以最後來不及放在探空儀系統裡面。(當然啦,論文一直沒有出來我也不想繼續幫忙下去)

所以這版最主要就是把這個Project修正回適合LoRawan部屬的東西,簡單來說就是把PA/LAN和RF Switch做上去,從上圖和之前的比較就可以發現這片只有一個RF出來接天線,其他的都在板子上了。

Layout上除了保持RF走線能夠跑越短越好以外,TX/RX的Stage也隔的很遠,圖的上方是PA Stage,下方則是LNA,另外也換成了四層板,所以RF Switch和PA power switch都可以透過layer 4走回來而不破壞原有的GND Plane。

然後這東西在設計快到結尾的時候剛好RPI 3 B+出來,雖然了無新意(因為被VC綁死SOC其實也沒啥把戲可以玩了),但是為了PoE我還是買單了,因為真的在部屬一個戶外的Node其實要網路要供電的話,PoE一條網路線可以牽個幾十公尺都沒問題,而且搭配工業用供電器真的方便。所以我就立刻把PoE Header做上去了,原本其實也是想把PoE模組做上去,只是有個小問題,除了Layout會需要大改以外,通常常見的PoE模組供電量會因為電感限制在2A,也就是要嘛就是12V2A要嘛就是5V2A,要再上去也有只是貴了一階上去,我當時不確定拿5V2A夠不夠就先放棄了,只把POE拉出來讓上層可以用RPI出的PoE Hat。

其他的就差不多了,四層板另外換成霧面黑(我真的愛霧面黑)

除此之外由於換成了四層板,我回頭去看了一下RPI Zero的版本.....

其實真的擠得進去XDDDD

好啦,這不完全是一樣的設計,應該有人發現到RFFE只剩下一顆,我其實用了一顆PA/LNA/Switch整合的RF Frontend,所以可以把面積再次往下縮小,就變上圖那樣了,而且SX1301的133Mhz Crystal也找了一顆非常小的2520面積的OSC,整個就是壓面積


四層板用到連電源走線都有點難度的那種狀況,但是還是維持了一整片完整的GND Plane就是
少數幾張我覺得很誇張的板子


最後就是來講一下一個應該沒有人注意到的點,有看到第一張電路板上面有個TW0001嗎?
這其實是OSHW的認證標示。Opensource Hardware這件事其實很多人會宣稱自己是,可是常常發生這種明明宣傳是,可是只放出來一張電路原理圖或者是一張BOM表這種,所以OSHW基本上就是設計了一套新的認證機制,就是讓設計者去登記自己的作品,然後透過填寫的問卷去評估是否符合OSHW的要求。

我基本上覺得台灣很多人在談論OSHW的時候基本上是在講幹話,因為他根本沒有Release什麼鬼東西就宣稱自己是OSHW,不然就是對這種新的認證方式根本不了解而只是一昧地去宣傳一種空泛的OSHW的口號而不去散佈正確的OSHW的Criteria。我其實等了半年都沒看到OSHW有台灣的人去登記覺得有點傷心,最後就默默的把我的這個作品拿去登記了。中間也不是沒有去跟其他人宣傳過這件事,可惜的是絕大多數的台灣人都害怕東西Release出去就會有其他人來抄襲而不願意去公開。的確,科技業這類保護自己的方式當然沒有甚麼問題,可是你他媽的就不要宣稱自己是OSHW阿阿阿阿

只能說是科技業的心態已久,然後宣傳的人大多也只是提倡一種空泛的口號。
台灣第一個OSHW Certified Project


覺得台灣大多數在談論OSHW其實也只是徒有其表而無其實就是。滿紙荒唐言,謹以此紀錄在我的筆記本裡面。





2019年4月26日 星期五

DIY Seismograph


總之這次就是作地震儀。
其實以前高中曾經碰過的一款簡單地震儀是這個:http://qcn.stanford.edu/
QCN當初是為了廣佈地震儀作地震預警用,台灣有教育單位合作可以申請免費的QCN Sensor架設地震測站。我當初從學校拿了一個回家裝,配上一台退役的eeePC 701跑QCN的軟體這樣。QCN的設計和很多現在所謂DIY地震儀類似,其實就是拿MEMS加速度計作Sensor,但是因為MEMS的靈敏度不高而且雜訊也多,QCN另外還有作一些演算法(統計)去評估地震發生的有無。架設完之後也曾經發生過幾次地震,可惜的是訊號跟雜訊比起來真的低,所以我一直沒有想要去作MEMS的地震儀。

另外一種Sensor就是我現在在用的Geophone,這種Sensor其實也沒有那麼靈敏,只是比MEMS好上不少,通常是拿來作人工地震探測那種比較高頻率的地震測量,但是對於台灣這種地震常常發生在附近的國家來說,其實也很可以了。

By the way,地震有分P,S以外,還有表面波跟各種pspspspspspspspsp這種轉來轉去的波
因為地球不是均質的球,震波透過去的時候會產生各種反射和折射而且這一折一反還會生出P or S波出來,後面的那種折來折去的基本上就是訊號超小所以先忽略掉,不過表面坡就很有趣了,表面波顧名思義是地震發生後,由於波速越往下越快,波會因為折射回來淺層,所以能量會集中回表面然後傳遞的一種波,特色就是可以傳遞到很遠的地方。以美國的地質局為例,美國的地震網路之所以可以測量各地的地震以及規模是因為他抓的是表面波。表面波另外一個特色是由於不同頻率有不同的波速,表面波(A.K.A很雜的波)會出現頻散的現象,但是越遠只會剩下波長長的波,所以地震儀拚的其中一項就是能收到多低頻。不過好在Geophone也是可以到數個Hz這種程度,所以附近的地震都還行。

好,所以基本上就是我最近看到有人在賣便宜的Geophone就買來試試,Geophone的本質就是線圈配上非常重的磁鐵,所以晃動的時候會有AC產生,簡單了然。
我當初是想做一片電路板專門來接Geophone,只是因為要出國念書了實在沒時間搞,所以就朝向拿現成的東西拼接的方向,另外因為我希望管理和程式以及聯網方便一點,所以我挑的是RaspberryPi以及一個24bit ADC的Hat,組裝完長得像下圖:

一共有三個Geophone對應東西方向,南北方向,上下的軸,然後直接接上板子的ADS1256。
最後透過束線帶固定在雷切的壓克力板,底下貼腳墊濾掉高頻的波。
我用的Raspberry Pi Hat是waveshare出的WaveShare High-Percision  AD/DA : https://www.waveshare.com/wiki/High-Precision_AD/DA_Board
還行,我也沒啥好選的就這樣吧。

這個板子有附上滿多example Code的,要Python要C要bcm2835 lib還是wiring Pi都任君挑選,
由於效能的關係我就從bcm2835的example下手了,由於我沒有裝OPA去放大訊號,我就把ADS1256內建的開到64倍的放大,然後拉高Sampling Rate這樣,順便開成differential mode。
比較有趣的是因為ADS1256開到7500ps,其實CPU資源吃很兇,如果同一個thread還要寫資料和切換檔案的話中間耗掉的時間會導致資料消失,所以我就開了兩個thread,一個專門讀然後透過pipe傳回主要的thread去寫檔案和切換檔案這樣,這件事情也是我轉向Raspberry Pi 3的理由之一,原本其實是想用Raspberry Pi Zero去作這個Project的,可是因為單核心真的撐不住,所以就上RPI 3然後搭配多核心多個thread這樣使用。

檔案寫完當然還沒結束,首先要解決的是把檔案存哪裡的問題,這樣程式寫起來sampling rate在三個differential channel大致上有750ps,檔案每五分鐘就生出快要14Mb的大小,一天下來兩三個Giga跑不掉,所以最快的方式就是.......拿出學生版的無上限Google Drive!!!!
而且如果有管理員來問的話這個根本超級學術用的一定Safe。(我懶得用binary,因為塞免錢的網路硬碟)

上傳Google Drive有很多種方式,懶得人比如我就是用rclone去作,rclone基本上把各種網路硬碟的操作變成rsync這樣的cmd,還挺方便的,可能之後來寫一篇記錄一下這個。

好,總之檔案都放無上限的Google Drive,接下來要處理的就是畫圖了,我當初是用Matlab畫了幾次的圖(等下個案的圖),可是到後面因為要做到自動化,所以改用obspy這個python的地震資料專用軟體來畫daily plot,然後去撈中央氣象局的地震時間把事件點在圖上(by the way,中央氣象局的地震API超爛,根本只會回最近的那一筆而已,我只能直接爬網頁爬下來時間和規模的資料 = =)。大概就長下面那樣,Dailyplot是把一整天的地震儀的資料畫上去配上氣象局的地震事件的資料上去,搭配VPS自動處裡每天的地震儀資料就差不多了。
我放在公司所以人為的影響滿大的

接下來就是拿個Case來講了,我當初弄玩Code剛好過了幾天就發生一次非常大的地震
個人有記憶以來(我對921和331都沒啥印象)最大的一次

我當時人正在十樓,然後這個地震儀正在測試穩定性,發生過後除了上FB發地震文之外就是先去把資料撈回來看XD
地震發生的時候因為正在測試中,所以我還沒有把XY軸擺出來,三個軸都是放成Z軸,所以資料也只有Z軸的資料,但是可以看到非常的符合中央氣象局的Data(包含頻散的特徵),這也是第一次這個地震儀抓到的一筆資料。


後面還有個Case是比較小的M3.9
Again,not bad,而且台北市震度也只有1而已。

所以目前這個系統就是放在我家某個角落默默地上傳到免費無上限的Google Drive,然後有個VPS每天定時去撈去畫daily plot這樣了。

Code預計放Github,可能再修美觀一點這樣吧。

Code:https://github.com/will127534/RaspberryPi-seismograph



UPDATE: 8/8號的M6.0地震
很大,炸掉我的DailyPlot的程度的大