發表文章

文章總列表

假日RF工程師: 改善居家WiFi性能

圖片
這個周末,化身成假日無線網路工程師與老婆的對話...     “老婆,家裡有鍋蓋嗎?”     “你要當美國隊長嗎?”     “不是啦,WiFi基地台收訊很差啦,給我一片鍋蓋啦”     “那要幫你畫星星嗎?”     “(汗)” 鍋蓋確實拯救了客廳WiFi收信死角。不過鍋蓋畢竟是主婦戰鬥用品,必須用別的解決方案...     “老婆,那家裡有鋁箔紙嗎?”     “我誰?小當家耶” 老婆從背後抽出一捲鋁箔紙,稍微加工,然後無線AP就變成這樣了... 測試起來效果不錯耶!1.71Mbps -> 12.89Mbps 請容假日RF工程師解釋一下原理 無線基地台後方是鄰居家,等於一半能量都浪費掉,不如讓他反射回來 金屬能反射WiFi信號,所以鍋蓋有用;鋁箔要多大片都可以,效果更好 曲面皺褶鋁箔使反射信號四散,均勻提高各處信號強度,拯救通信死角 本來想買電力線網路,現在看起來可以省下了(樂) TODO 設計產品原型1:準備一張厚紙板,上面畫上美國隊長的星星。厚紙板做成曲面,背後貼上曲面皺摺鋁箔 設計產品原型2:準備一張厚紙板,上面貼上波多野結衣清涼照片。厚紙板做成曲面,背後貼上曲面皺摺鋁箔 拍攝自吹自擂影片傳到youtube,製作網頁接受來自世界各地的訂單,周末一邊顧小孩,一邊在家裡做副業補貼尿布錢 ---- 認真寫一下原委,其實電磁學沒有學好,白走了很多路 (淚) 家裡的無線網路基地台架在最裡面的房間,客廳在另外一側,幾個角度信號奇差無比。我研究一堆方案來改善信號... 加上無線網路repeater 既然信號到不了客廳,那裝一個repeater吧!TP-Link WR702N比信用卡還小張,價格便宜又省電(還有802.11N)。只是這種repeater方案天生會吃一半頻寬,能放的位置收訊又不好;另外裝置有時候不會自動選信號強的基地台用,這個方案不完美 換上3T2R的基地台 (本來是2T2R) EDiMAX BR-6479Gn有3根天線,支援Gigabyte Lan,瑞昱晶片,價格便宜。沒有刷機這類用途的話,其實這台機器真的很讚。...

小米2s + Android 5.1.1

圖片
目的 因為某次摔機意外,我把小米2s螢幕摔壞了,所以買了ZenFone5擋著先。大片的螢幕用起來確實不錯,只是最近要幫他升級Android 5 老是失敗。但是我好想玩Android 5啊! 故事又回到MI2S,掏寶網很容易就買得到屏幕總成,很快手機又被我修好了(構造真的滿簡單的)。Google一看,竟然看到 Ivan把Android 5.1.1移植上去 ,於是乎又手癢了(笑)。 我猜Ivan應該是小米公司負責先期porting的工程師,專門把新的作業系統移植到公司的手機。工作的成果可以公司用,也可以釋出ROM讓社會大眾使用。因為有Ivan這樣的開發者在,小米手機也可以獲得接近Nexus的體驗。定期有人更新手機真的不錯,謝謝你,Ivan。 簡單的步驟 首先要刷最新版的MIUI 6開發版,他會讓system/data partition合而為一。燒這個要用線刷,會把手機資料全部清光。 步驟一做完後,可以開機進MIUI 6看看,也是Android 5。我不喜歡太多大陸公司的深度訂做,所以沒用MIUI6(也許現在已經沒了),有興趣也可以玩看看,也是設計漂亮。 接下來燒Ivan提供的Recovery,也是進Fastboot執行batch file。 最後進Recovery寫Android 5的ROM,以及 GAPPS ,搞定。 用起來的感覺 滑順,相當滑順,我覺得比之前的Android 4.4 Kitkat還要流暢好用。不知道是不是錯覺,我覺得作業系統的英文中文字型都有改進。 Android 5的畫面真的精美漂亮,不枉我花了幾個鐘頭再去安裝程式,重新設定。 我現在用的手機是Acer JADE S,也是宏碁仔細校調過,有很多巧思在裡面。這陣子換了幾次手機介面:MIUI -> Google -> ASUS -> ACER -> Google。系統的邏輯都一樣,只是每次換就得重新適應一些細微的差異。用到現在,我最喜歡Google原生版,畢竟Google倒閉的機率目前看來是比較低的。 Android 5原生介面真的漂亮,介面和諧,充滿一致性。難過有人說Material Design是Google拿出能和蘋果匹敵的設計語言。 這邊再說一次,謝謝你,Ivan。 用到現在的問題 用藍芽BLE...

Intel C1037U 準系統

圖片
Purpose 老婆家裡的電腦機殼放在桌子下,散熱實在不大好,天氣熱就開始怪怪的。我決定買一部新電腦解決這個問題。經過Survey,挑了幾台電腦。 Gigabyte BRIX系列 這個電腦 真的不錯,只有10cm x 10cm,尺寸精緻漂亮,從低階到高階的機器都有。唯一的缺點是貴了點。大概現在電腦效能都過剩,發熱量也低,拿來做文書(寫程式)上網放個大機殼實在是不聰明。這個尺寸的機器真的不少人做,微星,華碩,Intel都有。我最滿意的是技嘉這台,又小又漂亮。 我最初看上的機器是J1900這顆Intel SoC,主機板加記憶體大概3000可以搞定。如果是技嘉的準系統要賣到$9000,我覺得貴了點,還不一定買得到。 掏寶 最後我找到掏寶的C1037U, 這裡 有開箱文。下圖是機器加鍵盤滑鼠的樣子 Intel C1037U Celeron 1.8G, 2cores, TDP=17W 4G RAM 128G SSD WIFI, USB3.0*4,  無風扇 20cm x 20cm x 3cm $5772, 機器, 運費 和技嘉比一下 尺寸四倍大(20x20 vs. 10x10) 硬碟容量四分之一(128G vs. 500G),不過這個是SSD 價格只有一半 當然沒保固 (都從大陸買了,沒什麼好要求的) 使用心得 機器來的時候,一張說明書都沒有,倒是已經裝好WIN7,不過和台灣的使用習慣不符。到裝置管理員記一下硬體型號,重灌就是了。驅動程式不難找,都是常見的貨色。 因為沒有風扇,散熱是透過鋁殼。在滿載時溫度最高60度,外殼摸起來燙燙的。我用燒機程式故意讓機器維持滿載一兩個小時也不會熱當,CPU始終維持在最高速(1.8G)。因為我預計掛在螢幕後頭,機器過熱的問題應該還好。 無線網路的天線做在外頭實在有點醜,還好我是打算藏在螢幕後面。買的時候有附螢幕後掛架,可以把它藏起來就是。外殼是金屬,若要把天線藏在裡面恐怕需要精心設計一番,以這個價位的話... 嗯嗯... 還是不要太計較了。 電腦效能拿來上網做文書寫程式都夠用,因為有4G記憶體,程式網頁多開一點依舊難不倒。不過和高階的機器比,瀏覽器捲動畫面的流暢度還是會有點頓。比如我開 圖多的網頁 ,...

Raspberry Pi, 嬰兒監控系統

圖片
緣起 家中的嚕嚕米出生後,晚上睡覺發出不少有趣的音效讓我們捨不得睡,只好放到隔壁房間圖個安寧。他的房門開關聲比較大,進出容易吵醒他,長輩送了一組Angel Care可以遠端看小孩的狀態。不過Angel Care只能在室內用,我在上班就不能看兒子的即時影像。要搞定這個倒也不難,IPCAM已經是成熟的技術。但是因為老爸 很小氣 喜歡DIY,所以想自己拿RPi做一個。 RPi安裝 剛好手邊有 以前和妹聊msn用的 Logitech Webcam Pro 9000,當時也是不錯的機器,接上RPi的支援不錯,打lsusb立刻就看得到。 底下的文章介紹怎麼在RPi上面跑motion來做監視器。如果用Raspberry Pi專用的攝影機模組,需要用motion-mmal版;如果是webcam,可以用標準版。       How to Set Up Motion Detection Webcam in Ubuntu       How to make a DIY home alarm system with a raspberry pi and a webcam       Raspberry Pi as low-cost HD surveillance camera 嬰兒監控系統有一些地方要調整... 解析度要是1280 x 720,和手機解析度一致。畫質給他開好一點 要做到開機就自己啟動 要在家裡的IP分享器打洞,從外面才連得進來 webcam的速度慢,我也不寄望網路有多快,frame rate只開2 設定檔在/etc/motion/motion.conf。這個檔案註解寫得很詳細,裡面也有偵測到移動時錄影的功能,值得研究研究。 電腦/ Android/ iPhone連線測試 安裝未知的東西,知道有沒有動起來是更重要的關鍵。這段和前段”RPi安裝”其實是平行進行。我最初用MacBook的Safari瀏覽器,連到motion的port 8081立刻就看得到連續的影像;倒是我用Chrome在windows就都看不到。 畢竟是要在公司看小孩,重點還是手機要搞定才行;不...

RADO Thinline

圖片
我一直沒有帶錶的習慣。主要是寫程式的關係,如果手腕有個重量(手錶),會影響在鍵盤上移動的速度。在手機變成隨身設備後,看時間的需要已經充分滿足,我也多年沒戴錶。但是我一直很喜歡看錶,尤其是機械錶。在小巧的機身裡塞入精密的機械,運作之精巧,總是讓人神往。 另一個故事是小時候,第一次看到RADO錶的目錄,精簡的表面,陶瓷錶帶給我高科技的感覺。目錄上的價格我也忘記了,我只是記得很貴,一直都沒勇氣去看看。多年後,我終於克服(?)內心的恐懼,走入RADO錶店看看。 專櫃小姐詢問我的需要,我很喜歡Swatch的Skin系列手錶,希望他薄一點,當我在鍵盤上移動不易感到負擔。小姐拿錶開始讓我試帶,我很刻意的不看錶帶上的價格,就算數字閃過去了也刻意不閱讀,慢慢探索我可能需要的錶款。上頭有鑽的都會被我打槍;太厚的我也不喜歡;重量偏重的我也不愛;過程裡我完全不知道每一款手錶的價格。 我發現這個技巧很實用,價格經常會影響人的判斷與看法,所以我選擇不看數字,讓自己的 主觀判斷 主導挑選的過程。集中精神在自己的手腕上,感受商品的質感,以及他的魅力。 經過一系列的刪去法,最後我看上Thinline系列。這手錶很薄,陶瓷錶帶據說十分耐刮。他符合所有要求,根本就是Swatch Skin系列的高級進階版,戴在手上我感受到他的戰鬥力,錶上每個設計都在誘惑我刷卡把他帶回去。 這個時刻問價格才有意義了。經過百貨公司複雜的價格計算規則(專櫃小姐一定要數學很好才能當),六萬(石英版)或七萬(機械款)可以把它帶回去,大概是Swatch Skin的20倍。 那麼... 最後我有沒有帶回去呢?沒有。 因為我很容易弄丟東西,想像我要去跑步需要先把錶脫下,我有一定的機率會弄丟手錶。弄丟Swatch Skin就很痛了,弄丟Rado Thinline鐵定痛不欲生。如果這支錶賣Swatch Skin的5x也許我會毫不猶豫帶回家 XD 結論:我根本就只是去看爽的而已...

假日藍芽/嵌入式系統工程師: Nordic app_timer module

目的 Nordic提供心跳表的範例程式,不用多少功夫就能把它跑起來。範例用了app_timer module,因為某種潔癖使然,我花了一些時間追蹤運作機制。另外Nordic沒有太多文件描述他的運作,我也希望這篇文章能幫助社會大眾。 app_timer module使用一個RTC (Real Time Clock)模擬成多個軟體timer。這個技巧以前我在歐萊禮的書看過,當時沒花太多工夫研究,這次也想順便弄懂裡面是怎麼實作的。 架構 app_timer使用硬體RTC1 timer app_timer支援多個軟體timer,但是底層只用RTC1硬體timer。軟體用了queue,linked-list這些資料結構堆出需要的功能 程式庫支援在不同的IRQ level執行(ARM Cortex M0支援多種IRQ level)。這個比較是設計的考量,操作內部資料結構時可以不用關中斷製造critical section 使用者可以創造多個SW timer,可以設定{period, one-shot/periodic, callback function} 使用方式就不寫中文了 (懶惰) Initialization #define APP_TIMER_PRESCALER (0) #define APP_TIMER_MAX_TIMERS (5) // # of timers #define APP_TIMER_OP_QUEUE_SIZE (5) // timer operation queue APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false); In my board, a 32768hz oscillator is placed. I set the prescalar of RTC1 to 0, whose actual divider value is (PRESCALER + 1) RTC1's internal timer is 24-bit wide, and setting prescaler to 0 results timer overflow after 512...

Holiday Bluetooth Engineer: Nordic's app_timer module

Purpose I was tracking the heart rate sensor example, and try to figure out how to use the library. I found app_timer module's usage is a bit weird, so I tried to read source code, and find underlying mechanism. The note is intended to help people who want to understand app_timer library in Nordic's library, since Nordic doesn't have good document of this library. The module uses a single HW timer to implement several SW timers. I once read the trick from O'Reilly book, and I'm interested in how to implement it. Architecture The library uses RTC1 timer as underlying hardware timer. The library supports multiple SW timers through using single HW timer (RTC1). It mainly uses queue/ linked-list to achieve the target. The library also supports schedule timer at different IRQ level. This is implementation consideration, which allows multiple execution context running at the same time without creating critical section explicitly. Users can create several ...

假日藍芽/嵌入式系統工程師: 買BLE開發玩具

圖片
我開始研究BLE沒多久,我就意識到藍芽低功率的真正戰場是裝置的開發(比如心跳表)。如果要真的搞懂BLE技術,我勢必得自己做BLE裝置。研究過後,有兩個平台可以選: TI CC2541 8051 , 8KB-RAM, 128/256KB-FLASH Nordic nRF51822 Cortex-M0 , 16KB-SRAM, 128/256KB-FLASH 兩個方案都是BLE SoC。我特別喜歡TI的文件和範例程式。TI的 SensorTag 就是一個已經會動的產品,上面裝了六種sensors,附上firmware的程式碼,以及Android/ iOS的程式碼。用這些範例來學,速度比起從無到有打造快多了。身為假日工程師,我一定得找這種方案。不過 我實在很討厭8051 ,這大概是TI方案最嚴重的弱點。 Nordic的網站根本不給人下載資料(笑),比起來TI真的是大方許多。我得先買開發工具,上網註冊,Nordic才給看資料。我花了一些功夫確定Nordic也提供像TI那樣的範例程式,算是可用了。我比較熟悉ARM的CPU,而且也買了J-Link EDU這顆JTAG。如果沒有特別原因,我傾向用nRF51822。 兩個平台的開發工具都不貴:3000,所以就挑一個吧。不過我發現掏寶網上有一堆便宜的開發板,打nRF51822或CC2541,就有一卡車的板子可以選。這些"加強"過的版子通常會有USB轉RS232的IC (PL2303),甚至上頭也有(盜版)J-Link,真的超好用。 關於J-Link我有些話要說。Segger的 J-Link EDU 只賣台幣2400左右,除了不能做商業用途,和標準版沒有任何差異。考慮到他這麼便宜,而且品質精良,J-Link EDU真的值得投資。就別再買謎版的J-Link了... 因為價格實在太便宜了,最後我也懶得選,乾脆兩個平台都買,只花了2400 nRF51822 development board CC2541 development board CC debugger for TI's CC2541 CC2541 based BLE sniffer 接下來幾個禮拜大概可以跟這些玩具玩得很開心~~~

Holiday Bluetooth/ Embedded Engineer: buy BLE development toys

圖片
When I started to survey BLE technology, I am well aware that the battlefield of BLE development is device. To fully understand BLE technology, I shall develop my own BLE devices. After some surveying, I had 2 candidates: TI CC2541 8051 , 8KB-RAM, 128/256KB-FLASH Nordic nRF51822 Cortex-M0 , 16KB-SRAM, 128/256KB-FLASH Both solutions BLE SoC. I like TI's great documentation and sample codes. TI's SensorTag  is an excellent sample BLE device with firmware source code and Android/ iOS application source code which could accelerate studying. Being a holiday engineer, starting from an example is much better than from scratch. However, I personally don't like 8051. That's the weakest point of TI's solution.  In Nordic's website, they didn't allow users to download documents freely as TI. I probably need to buy their development kit then I can gain access to these data. I spent some time to find its documents & examples to ensure that they also provid...

假日藍芽/Android工程師: 寫個APP讀心跳

圖片
我一直很好奇手機是怎麼和心跳表溝通。如果想自己寫個APP做實驗,要搞定三個麻煩: 我不會寫Java 我不會寫Android的GUI程式 我不會寫Android的藍芽程式 寫了幾個禮拜,每次搞定一點。這個主題太大,也不可能寫下所有東西。這篇文章記下學習過程的重要關鍵點。 Android開發環境 幾乎所有Android程式書都有一章在講怎麼安裝開發環境。我選Google包裝好得Eclipse ADT Bundle,抓回來裝好就可以在Windows/MAC上都可以寫程式。用這個環境寫出第一個Android APP非常容易,點一點就可以在手機上跑起來。 書上也有講怎麼用模擬器開發,但我的目標是開發藍芽程式,直接在手機上跑比較實在。 JAVA 我大概10年前有嘗試學Java,接著馬上放棄,大概算99%的新手吧。我的記憶只剩怎麼寫Hello World的程式:     // hello.java     public class hello {         public static void main(String[] args) {             System.out.println("Hello World");         }     } 編譯指令     javac hello.java 執行指令     java hello 第一個Java程式會跑之後,就用它測試If-Else,For-Loop,Function-call,FILE-IO,String-processing,很快可以抓到一些Java的感覺。感謝世界上眾多的Java開發者,幾乎什麼問題都找得到答案。用類似這樣的關鍵字"java open file",就找得到資訊了。 Android GUI Programming Android GUI框架在幕後定義某種流程,在事件發生時呼叫一些callback函數回應事件。使用者的工作就是了解這個框架...

Holiday Bluetooth/Android Developer: Read Heart Rate In Android

圖片
I'm always curious how the smart phone interacts with BLE device. I would like to write own APP to interact with my BLE heart rate sensor. To do this, I have to overcome 3 difficulties: I don't know Java I don't know Android GUI programming I don't know Android Bluetooth programming I spent several weeks to overcome these difficulties. Topic is too large to describe everything clearly. I just can describe some landmark when I was studying. Android Development Environment Almost all Android development book has a chapter illustrating how to setup environment. I installed Eclipse ADT Bundle for both WIN/MAC. With the aid of Eclipse, I had my 1st Android application running on the phone easily.  The books also illustrated how to use Android simulator. But Bluetooth is not possible to simulate over that. I always run the program directly on the phne. JAVA I'm not 100% Java newbie. I learned Java about 10 years ago and gave up very soon. The only ...

假日藍芽工程師: GATT protocol

圖片
假日工程師這次要介紹GATT protocol,這東西定義了兩個術語 Service (服務) Characteristics (特徵 ?!) 其實就是上面這張圖,每個服務裡,會包含多個特徵。每個特徵會有 一個property/value 以及幾個descriptor。 Service 所有的Service會用UUID =  0x2800 定義服務的起點。在之前的 ATT protocol 裡,滿足的handle是0x1/ 0x8/ 0x9/ 0x11/ 0x15。     handle: 0x0001, uuid: 2800          1800, Generic access     handle: 0x0008, uuid: 2800          1801, Generic attributes     handle: 0x0009, uuid: 2800          180D, Heart Rate     handle: 0x0011, uuid: 2800          180F, Battery Service     handle: 0x0015, uuid: 2800          180A, Device Information 這些handle的數值是服務的UUID,代表這個服務是什麼。以handle[0x9]為例, 0x180D 正是心跳感應器。因為下一個UUID = 0x2800位在handle[0x11],所以心跳感應器所屬的handle[0x9~ 0x10]。 所以每個BLE裝置,只要找UUID = 0x2800就可以找到所有的services,而且同步可以確定所屬的handle區間。 Characteristic 在每個Se...

Holiday Bluetooth Engineer: GATT protocol

圖片
The GATT is built over ATT protocol, which defines 2 terms Service Characteristics Each service contains several characteristics. Each characteristic has single property/value and several descriptor. Service In ATT table, the entry with UUID =  0x2800  defines service, which is the start-of-service. The content within is service UUID. In previous  post , handle = 1/8/9/11/15 are of such type.     handle: 0x0001, uuid: 2800          1800, Generic access     handle: 0x0008, uuid: 2800          1801, Generic attributes     handle: 0x0009, uuid: 2800          180D, Heart Rate     handle: 0x0011, uuid: 2800          180F, Battery Service     handle: 0x0015, uuid: 2800          180A, Device Information Take handle[0x9] as example, the value ...

假日藍芽工程師, ATT protocol

圖片
前言 搞定從Raspberry Pi讀心跳之後(by notification), 下一步就是弄清楚BLE通信協定。這篇文章希望可以提供一些範例,解釋GATT/ATT是怎麼運作的。希望他能幫助社會大眾了解BLE是怎麼玩的。 ATT (Attribute) 所有BLE裝置都要支援ATT (Attribute, 屬性)協定。看起來很厲害,其實只是一個資料結構:     struct {         u16 uuid; // Universally Unique Identifier         u8 *data; // variable length data     } att[65536]; 這個通訊協定就是一張表格,一個陣列。陣列允許random access,只要給個index就可以了。在BLE的術語理,這個index叫 handle 。表格每個單元還包括16bit的UUID作為metadata,解釋這筆資料是什麼。另外資料並不是直接嵌在表格,而是放一個指標,允許可變長度的資料。 在 上篇文章 ,我用了gatttool和心跳表打交道。這個工具就是透過RPi的藍芽dongle和心跳表的ATT layer打交道。參考gatttool的說明功能表就可以看出ATT protocol的功能: 在工具裡,執行"char-desc"可以把藍芽裝置所有的handle和對應的UUID讀出。對應的pseudo code看起來很像這樣:     for handle in range(1, 65535):         if att[handle] is effective:             print "handler=%d, uuid=%d", i, att[i].uuid 我實際上在RPi執行的結果如下: 要在8051/ARM實作ATT protocol不會很難,就是一個存資料的資料結構而已。這邊有兩點值得再注意: UUID代表Universal Unique...

Holiday Bluetooth Engineer, ATT protocol

圖片
Foreword After getting notification from my heart rate sensor through RPi, the next step is to figure out the BLE protocol.  I would like to provide some examples illustrating how GATT/ATT works. Hope that this article can help people who want to understand BLE. ATT (Attribute) All BLE devices support ATT protocol. ATT stands for attribute. It looks like an table with following data structure:     struct {         u16 uuid; // Universally Unique Identifier         u8 *data; // variable length data     } att[65536]; The ATT protocol is a table under the hood. The data structure enables us doing random access through array-index. In BLE terminology, the array index is "handle". Each entry in the table has an 16bit UUID field describing what's the data is (metadata). Another interesting point is that data is just a pointer, which enables variable length data structure. In  last post , I used the gatttool to c...