發表文章

目前顯示的是有「BLE」標籤的文章

文章總列表

假日嵌入式藍芽開發工程師:nRF51822 (5)

圖片
Introduction of SoftDevice 這一篇我要介紹Nordic SDK的用法,我第一次讀完寫的筆記。自己也都不大會,只好寫下來給社會大眾笑了。 通信系統一般會包括 {Antenna, LNA, RF filter-chain, Digital-front-end, Baseband, BLE protocol}。Baseband/ protocol包括硬體加速器和軟體,這邊的軟體就是SoftDevice,Nordic提供編譯好的binary,燒進指定區域就有BLE protocol可以用。Nordic提供 一系列的SoftDevice ,我只用過S110,其他的都是照著網頁的寫(心虛) S110:BLE Peripheral S120:BLE Peripheral or Central S130:BLE Central, Observer, Broadcaster S210:ANT+ S310:BLE & ANT+ concurrent Nordic的SoftDevice燒進去後,memory map如下圖,S110占Flash(96KB),RAM(8KB),這個數量級證明BLE protocol沒辦法自幹。Nordic SDK讓BLE protocol和User code跑在同個space裡,使用MPU(Memory Protection Unit)保護記憶體不互踩,只是debug要花點心思。另外SoftDevice會佔某些MCU的硬體,用戶要知道哪些硬體還可以用。這種做法最優的地方是BLE protocol能無痛升級,怎麼設計SoftDevice也很有趣。用戶的code用SVC(Supervisor Call)呼叫SoftDevice,這部分等有空再寫一下。我在用的S110 SoftDevice這裡有 文件 可以閱讀。 Basic Program Structure of LBS Example 底下介紹 上一篇 的程式,Nordic sample code結構都差不多,先把周邊設備都初始化,然後初始化BLE stack,最後進入一個low power的main-loop等待事件。Nordic整份SDK都用了event-driven思維,這部分也很值得學習。 ...

假日嵌入式藍芽開發工程師:nRF51822 (4)

圖片
Introduction 這篇開始要進入BLE主題,首先會介紹怎麼跑起來BLE-blinky這個範例,然後介紹Nordic的BLE protocol怎麼使用。 Compile & Flash Nordic LBS Example Against PCA10001 Nordic提供不少BLE的範例,裡面最簡單的就是LBS(LED-Button Service)。這個範例讓手機透過BLE遠端控制板子的LED亮暗;按下button時候,手機也可以即時收到通知。這個範例包括central和peripheral雙向通訊,仔細研究大概就能抓住Nordic SDK怎麼用。編譯和Flash的步驟如下: Sample code路徑如下: nRF51_SDK_10.0.0_dc26b5e/ examples/ ble_peripheral/ experimental_ble_app_blinky/ 把裡面的pca10028整個複製一份叫pca10001,把裡面S110的Makefile和Linker script做必要的修改,然後Makefile也可以補強一點。這裡不再重寫一次,直接參考前一篇文章。 然後下去build,送你一個build error應該是合情合理的 (3)的原因是某個目錄找不到,名稱和board name以及softdevice name有關。我們換了一個board,這裡也得幫他準備 從這個:experimental_ble_app_blinky/ config/ experimental_ble_app_blinky_s110_pca10028 複製到:experimental_ble_app_blinky/ config/ experimental_ble_app_blinky_s110_pca10001 這個目錄只有一個檔案,叫nrf_drv_config.h,這個檔案其實是SDK的一部分,調整那些功能要啟動。Nordic也不希望直接改SDK裡的這個檔案,正確的做法是拷貝這個檔案到project底下,然後修改inclusion search path,把private header放到最前面。這也是實戰中非常常見的做法。 然後理論上就可以build以及燒錄進去,接下來開發版就變成一個BL...

假日嵌入式藍芽開發工程師:nRF51822 (3)

圖片
Introduction 這篇文章介紹怎麼用Makefile + GCC搭建NRF51的開發環境,我試著結合自己工作經驗,聊一下我對建構開發環境的看法。另外我在Windows/ Linux/ Mac三個作業系統都試過可以用,投資時間在GCC開發環境其實是值得的。 我認為工程師一定要自己親手架設過開發環境,親身體驗所有細節,才會成為高手。我工作的地方選擇專業分工,大多環境的東西都有專人維護,團隊成員只要會用會抱怨就可以了。但是compiler如果出問題,最好的手法是單獨抽出compile command,修改compile flag,或著丟出pre-processor output來觀察。能弄清楚程式怎麼編譯,連結,image檔怎麼出來,真的是好處多多。 我過去我用過Keil ARM寫Samsung S3C2410的bootloader。產生好ELF以後,抽出text/data section,自己寫工具下載到NAND Flash,然後看CPU開機載入我寫的程式 -> 爽!不過前面的敘述裡,還是有個版權物Keil ARM。所以這次我要脫離舒適圈,採用GCC + Makefile做一樣的事。 目錄結構 好的目錄結構帶你上天堂!這個題目其實沒有聖杯,端看規劃的目的。我規劃的目錄結構如下,設計初衷是整個目錄能放在隨身碟帶著走,所以compiler也解壓縮到裡面去。但我還是得安裝另外一些小工具。最後我還是用安裝檔裝到/c/Program Files/底下,這樣能大幅壓縮開發包目錄。開發包目錄我會搭配版本控制一起用,預期裡面的東西 一行都不能改 (不過後面有些原因會放寬),我選擇用另外一個git project來儲存user code(但最後也不是,呵呵)。 雖然不完美,還是放出來給大家見笑一下,過幾個月我再回來笑自己。 nrf51822_dev_pkg/ dist/ 放下載回來的安裝包,比如compiler,SDK,Nordic-Tool都放這裡 doc/ 放網路上找到的文件,比如板子的schematic,IC的data sheet,Application Note SDK/ 放Nordic SDK解壓縮的本體 tool/ 放工具解壓縮後的目錄,比如compiler...

假日嵌入式藍芽開發工程師:nRF51822 (2)

圖片
Introduction 這篇文章想介紹怎麼建構土炮研究BLE環境,包括我的2014/2016環境。在真的拿MCU寫BLE FW之前,先找個BLE裝置玩一下人家的產品比較有趣。 BLE Development Tool, 2014 我和BLE結緣是因為一邊跑步想一邊觀測心跳,所以我買了藍芽心跳帶。那時我的小米2s還停在Android 4.1.1,根本不支援BLE。我刷上了Ivan秋葉隨風提供的AOSP Android 4.4,然後就抓得到心跳錶了! 小米2s,刷機note 我買的心跳帶是 雙揚i-GotU HRM-10 ,我懷疑他感應的是我的步伐而不是心跳,也常常抓不到,整個就很爛。最初懷疑是手機BLE收不好,我想透過Raspberry Pi和心跳帶打交道看看,畢竟Android/ Raspberry Pi都是基於Linux。我插上藍芽Dongle,編譯bluez,使用附贈的gatt-tool研究BLE原理。因為心跳帶很爛,研究做得很辛苦,BLE link經常斷線。但是從tool終究是看到心跳值,成就感滿點。 假日藍芽工程師,架設環境 假日藍芽工程師,先動起來再說 透過gatt-tool繼續探索BLE,在bluetooth的網站到處查那堆UUID,還真的給我參透了!我寫了兩篇文章講ATT/GATT,這兩篇點閱率滿高的,表示應該很多人都想研究BLE。如果我想賺100USD廣告費,多寫一點就對了(笑)。 後來我也成功在Android上寫程式讀到心跳。 假日藍芽工程師,ATT protocol 假日藍芽工程師,GATT protocol 假日藍芽/Android工程師: 寫個APP讀心跳 BLE Development Tool, 2016 我還是推薦透過心跳帶研究BLE,平常運動可用,不研究也不會浪費。我推薦名世電子的 Echowell DMH-30 ,他是BLE/ANT+雙介面,可以同時連到我的Garmin碼表(ANT+)和手機(BLE)。這間公司的產品和服務都很到位,比上面那間雙揚好多了。 2014年在Raspberry Pi開發BLE的方法還可以用,只是不大舒服,事實上我寫完文章就沒再去玩gatt-tool了。我改用Nordic Semiconductor的nRF Co...

假日嵌入式藍芽開發工程師:nRF51822 (1)

Introduction 2014/10買回來的nRF51822開發版,兩年來斷斷續續學習我終於大概有點成果了。接下來想寫一些文章把這些東西紀錄一下。希望可以早日收到Google給我的100USD廣告費支票(哈)。 http://lihgong.blogspot.tw/2014/10/ble.html 開發版 我手邊的開發版是淘寶買的nRF51822EK_TM,他是Nordic Semiconductor的nRF51822 EK, PCA1001仿製品,上面多放了常見的周邊(如下),可以視為原廠的加強版,而且還賣得便宜一點,像是三軸加速器感應器就直接放上去,拿來學習還滿好的。 JLINK-OB MPU6050 (三軸加速度感應器 + Gyro) 1x 三色LED 3A Relay UART to USB (PL2308) 128M SPI Flash 1x buzzer nRF51-EK (Evaluation Kit), PCA10001 https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF51822-Evaluation-Kit 時至今日,我大概不會推薦上面的方案。因為Nordic後來推的開發版叫nRF51-DK (PCA10028),支援Ardunino Uno Revision 3接頭。他也援mbed開發,這個很酷,板子上的J-Link會變成一個磁碟機,把ELF檔拖進去就可以燒錄。最要命的是新出的SDK已經不直接支援PCA10001,要稍微動點手腳才能用範例。我如果不是已經買了板子也懶得弄了。推薦直接到mouser電子買一片,只是要折騰一下他的網站就是... (但是真的滿便宜的)。 nRF51-DK (Development Kit), PCA10028 https://developer.nordicsemi.com/nRF5_SDK/ Mouser電子nRF510DK http://www.mouser.tw/ProductDetail/Nordic-Semiconductor/nRF51-DK/?qs=%2fha2pyFadugZXgh3xrn3AtVnVqf%...

假日藍芽/嵌入式系統工程師: 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 ...