文章

顯示從 2015 起發佈的文章

[模組] 三軸陀螺儀與加速規 Gyro & Accelerometer

圖片
#  ADXL335 三軸加速計的 USB 體感搖桿 #  三軸重力加速計 Accelerometer (GY-61 ADXL335) 前言         前一篇 " 三軸重力加速計 " 介紹 ADXL335 晶片的重力加速計 (也稱加速規),主要能偵測出三軸的重力變化,便能得知物體轉動方向方位。有一個特殊情況可解釋陀螺儀的作用,當加速規放置水平時,此時轉動轉動 Z 軸,我們會發現 X/Y 軸的重力值變化量其實並不大,請參考底下的實驗影片。這樣的變化量可能被誤以為是雜訊,不容易判斷物體是否方向方位在改變。如果能再多計算每一軸轉動的速度,由轉動的角速度輔助,便能計算物體位移量。於是,陀螺儀正是用來計算角速度的,配合重力計一起使用。因此,若加速規再輔以陀螺儀的功能,這樣能更精準算出物體的移動與轉動方向 (我覺得這是很複雜的數學)。 設計流程         Arduino 官方網站 中提供好多種重力加速計與陀螺儀的模組,我便找了一顆 MPU6050 晶片來測試。這顆晶片不只具有三軸重力加速計,還有陀螺儀的功能,對外的通訊介面為 I2C 方式。首先,實驗過程我採用恩智浦的 LPC1114 控制器來比較一下 MPU6050 與 ADXL335 的重力數值,如圖一所示。圖一的 LCM 第一行顯示的是 MPU6050 X, Y, Z 軸的重力值,第二行顯示的是 ADXL335 的三軸重力值,我已經把兩塊模組的 X/Y 軸方向調整為一致了 (兩塊模組的三軸定義方向其實不太一樣,用軟體方式調整),如圖右下角所示。圖中,X 軸的重力值約為 -0.023g 和 -0.018g,Y 軸的重力值約為 -0.016g 和 0.018g,Z 軸的重力值約為 0.964g 和 1.112g。兩者數值的誤差,我的解釋是實驗過程並沒有做校正的動作,因此兩者模組存在一些誤差。撇開誤差,如果我們的實驗對精準度沒有要求太高的話,倒是很快取得三軸重力數值並計算出大概方位。 圖一:MPU6050 與 ADXL335的加速規數值 (單位 mg) 規格分析         下圖二是 MPU6050 晶片的陀螺儀規格,這顆可提供四種精度,如果物體的轉速慢,則可以選擇 FS_SEL=0,角速度範圍在正負250度/秒。如果物體的轉速快,則需要選擇較大的角速度

[模組] 三軸重力加速計 Accelerometer (GY-61 ADXL335)

圖片
#  ADXL335 三軸加速計的 USB 體感搖桿 #  三軸陀螺儀與加速規 Gyro & Accelerometer 模組介紹         三軸重力加速計是一種重力感測器,也稱為加速規或加速計。三軸指的是 X, Y, Z 軸,重力加速度就是我們高中理化曾學過的地心引力 (g)。由於這個重力加速度是地球的天然資源 (就像磁力線的指南針),所以當我們身體傾斜或翻轉時,透過地心引力的影響讓身體內部機構可感受到其傾斜或翻轉。於是,將此概念應用到科技工業上,像電玩的 體感遊戲 (Wii, Kinect...) 、 飛行器 、 懸臂旋轉 、 震動感測 ...等都使用到相關元件,本文針對三軸重力加速計的晶片做測試研究,希望能獲得更多的應用靈感。首先,找一顆晶片試試吧!Arduino 開發套件常見的三軸加速計,使用的是 ADI ADXL335/345 晶片,因此我買了一個來測試玩玩看,並用 NXP LPC1114 晶片來設計系統。         三軸重力加速計晶片是 MEMS 設計工藝,能將這種感測技術設計到小晶片裡面,不得不佩服這群工程人員。由於地表的重力加速度有方向性,晶片又根據該重力為基準來測量三軸的變化,所以晶片與三軸的方向座標必須先定義好,如下面圖一所示,晶片面朝上為 Z軸。以圖一為例,晶片放置水平,量測到的重力數值為 X 軸 0g, Y 軸 0g, Z軸 1g。然後,該晶片內部再將這三軸的物理量轉換成電壓值輸出。實驗中,我手上拿到的是 ADXL335,它是輸出三軸的電壓值,所以設計系統時需要選用具有 ADC 功能的 MCU ,才能將這三個電壓值轉換回重力值。此外,ADI 還開發另一顆 ADXL345 晶片,與 ADXL335 晶片有些不一樣的地方,前者內部已有包含 ADC 功能,能將重力值直接轉換成數位值,並使用 I2C / SPI 介面和外部通訊,提供使用者不同的選擇。 圖一:晶片的三軸方向座標 規格分析         三軸重力加速計晶片在使用前先要找到 0g 的電壓值,這也是校正歸零的步驟。雖然每顆晶片出廠前都經過測試,但是每顆晶片之間的物理特性還是存在一點點差距,這種差距還算是合理範圍,只是我們必須用校正的方式將它拉到同一標準內,消除這種誤差 。底下圖二所示為晶片的規格,當 0g 的時候,電壓輸出是 1.5

[模組] 德州儀器 CC2540 藍芽開發 + ADC

圖片
       德儀的 CC2540 / 2541 藍芽晶片已經推出市場幾年了,隨著模組廠商的努力開發,將藍芽模組設計成 SMD 貼合元件,對於小型設計廠商的我們真是大大的便利。目前的藍芽模組不僅體積越做越小,價格也越來越親民,如果自己有些 idea 想要設計電路板來驗證藍芽相關的應用的話,直接拿藍芽模組來實現是不錯的方法之一。此外,CC2540 本身就是一顆 8051 為核心的晶片,所以具備一些 MCU 的基本功能,若將其 MCU 與藍芽的功能都發揮出來,這樣不僅系統成本降低且耗電量也會減少。本文的目的就是希望直接拿現有的藍芽模組來開發 CC2540,不希望再多用一顆 MCU 來控制這個模組。         一般市面上的藍芽模組都已經把藍芽的基本功能開發好了,藍芽的參數配置只要透過模組提供的 UART 介面(最常見的基本介面)來設定。這種作法除了需要藍芽模組之外,還需要另一顆 MCU 來控制這片藍芽模組,所以使用者通常會選擇自己熟悉的 MCU 來開發藍芽通訊。之前文章,我們已經採用 Arduino 晶片控制藍芽模組的方式完成藍芽通訊,底下將說明如何用市面上的模組來開發 CC2540。         我們拿市面上容易買到 HC-05 / HC-08 的藍芽模組來實驗,這塊模組原本是透過 UART 介面與外部的 MCU 溝通,讓使用者不需要為了藍芽的技術知識而傷腦筋。模組本身已經內建設計好藍芽的基本功能,使用者只需藉由 UART 介面設定參數便可動作。不過,我們卻想要把這塊模組改造,將本身的 MCU 與藍芽的功能發揮出來。首先,要準備德儀的 CC-Debugger 除錯器和安裝 IAR Embedded 軟體。接下來,將模組上面的五根接腳接出來,分別為 Vcc, 、 GND 、 RST 、 DC 和 DD,再連接到除錯器的相對應接腳,這樣就可以準備開發 CC2540 的韌體了。底下圖一所示就是將 CC-Debugger 連接到自製的藍芽開發板。 圖一:CC-Debugger 連接自製 CC2540 開發板         將 CC-Debugger 接上自製的開發板,到德儀的網站下載 CC2540 BLE-Stack 軟體 ,軟體本身提供不少範例程式的代碼。範例分成四類:Broadcaster 、 Observer 、 Peripher

[應用] 超音波與溫濕度系統 (以 NXP LPC11x 控制器實現)

圖片
前言        這是一個超音波測距和溫濕度系統,MCU 當作系統的核心,整合超音波模組 、溫濕度模組 、和 LCM 顯示模組。系統的電源為 5V,耗電量約 26mA,使用三顆四號電池供電。可應用的範圍,如:自走車 、掃地機器人 、停車場車位偵測...等。我們先在麵包板上把各個模組的電路功能設計出來,並驗證韌體程式可以正常運作,接下來再製作成 PCB 電路板。 元件介紹        超音波模組  HC-SR04 :如下圖所示,一般常使用在  Arduino  系統上,做為自走車的距離感測器,利用發射超音波與接收其反射波的時間差計算出前方物體的距離,再根據距離遠近做出適當的動作。        溫濕度零件  DHT11 :這是溫度與濕度整合的零組件, 其工作電壓在  3~5.5V ,具有  8-bit  的解析度,溫度範圍  0~50 度 C ,濕度範圍  20~90% ,可應用的領域像是家電 、空調、數據紀錄器、自動控制 … 等等。     NXP LPC11xx 系列的 MCU :這是ARM  Cortex-M0 為核心的控制器,運算速度約  50MHz ,用來控制超音波模組和溫濕度模組,包含控制一個 2x16 LCM 顯示模組,如下圖所示。除了讀取溫濕度數據之外,同時  MCU  計算超音波傳輸的時間,再將數值轉換成反射物的距離,並將所有資訊顯示在 LCM 上。 圖一:超音波與溫濕度系統 圖二:超音波測距模組 原理說明        LPC1114 MCU  對超音波模組的 Trig 腳發出一個  pulse ,突波的時間需超過 10 us 以上,如下圖所示。超音波的反射信號會回應在模組的  Echo  腳上,當低電位升到高電位的時間是音波發射的時間點,而當高電位降到低電位是接收反射波的時間點。        為了精準計算音波傳輸的時間,我們採用  LPC MCU  的中斷來擷取  Echo  腳的電位變化,計算出兩個中斷產生的時間差,再轉換成距離。一般常溫下,聲音傳遞的速度為  340 m/s ,也就是說聲音每走 1 公分需要  29.4 us ( = 1s / 34000 ㎝ ) 。由於從超音波發射到接收需要走  2 倍的距離,所以我們必須將中斷的時間差除以  2 才是實際超音波傳遞

[筆記] 整合NXP LPC11x 與 KEIL C 開發環境

圖片
        三~四年前,當開發恩智浦的 LPC11xx (ARM Cortex-M0) 韌體時,設計者必須在名為 LPCXpresso 的套裝軟體下執行,它提供各系列晶片的周邊驅動程式與原始碼,方便使用者 compile & link。如果要除錯程式的話,這套軟體必須再搭配使用名為 LPC-Link 的除錯器,我們用它來除錯也可燒錄代碼。幾年前,LPC 並不支援在 KEIL C 的環境開發 (當時很多 ARM 晶片都用 KEIL 環境開發),所以只能安裝 LPCXpresso,後來 LPC 已經成功整合到 IAR / KEIL 等環境了。有關的開發軟體與除錯器可以連結到 LPCware 的網站上。         最近我的 LPC-Link 好像壽終正寢,USB 完全偵測不到它。原本想再買一個 LPC-Link,不過因工作需要我也常常使用 ULINK2 在開發與除錯意法半導體 STM32 晶片 (ARM Cortex-M3),於是想要將 LPC 開發環境移植到 KEIL C上面,這樣就只要維護一套開發軟體和一個除錯器,也能開發設計 STM32 和 LPC11x 韌體了。圖一就是移植到 KEIL 所需的重要檔案,原本的驅動程式原始碼移過來,並替換掉下列的檔案,基本上就大功告成了。                core_cm0.c                system_LPC11xx.c                startup_LPC11xx.s   (原 cr_startup_lpc11.c in LPCXpresso) 圖一:LPC11xx 整合到 KEIL環境         除錯的方面,因為不用 LPC-Link 後,首先要將 ULINK2 除錯器接到晶片接腳上。我的 ULINK2 一端連著一條 20-pin JTAG 排線,而真正使用到 debug 的腳只有五根,分別是 Vcc, GND, NReset, SwClk, SwDio。因此,只要將上述的五根接腳接到 LPC111x 晶片對應的 pin 腳,大致上就完成了。               NReset <---> PIO 0_0               SwClk  <---> PIO 0_10

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

圖片
前言         在 Android 裡面的藍芽和低功耗藍芽 (Bluetooth Low Energy) 控制方式不一樣,這裡有一篇文章[ 連結 ]說明傳統藍芽與 BLE 有哪些部份不同。此外在 API 方面,很多低功耗藍芽的函式必須在 API level 18 以上才能使用,也就是 Android 4.3平台以上。上一篇介紹的 BluetoothChat 程式是採用傳統的藍芽控制方式,為了讓開發者認識 BLE 如何控制,Android 官方網站提供一個 BLE Gatt 的範例程式,圖一所示是這個範例程式的專案檔,主要的程式檔為 DeviceScanActivity 、 DeviceControlActivity 和 BluetoothLeService。 圖一:BLE範例程式專案檔         圖二所示是這個範例的系統方塊圖,從 AndroidManifest.xml 設定檔可得知操作畫面先呼叫 DeviceScanActivity 類別,它衍生自 ListActivity 類別。這 Activity 畫面的 onCreate( ) 函式裡面依舊執行傳統藍芽的檢查: 檢查本身有無藍芽裝置 (參考前一篇 BluetoothChat 的做法) 檢查有無 BLE service 打開藍芽功能 搜尋 BLE 設備        當 DeviceScanActivity 創建出來後,畫面右上方會出現選單,這對應到類別的 option 操作。這裡有兩種選擇:start scan 或 stop scan,如下圖的左邊所示。當搜尋後的結果會列在畫面上,操作者可以從中選一 BLE 設備進行連線,如下圖的右邊所示。透過 Intent 方式開啟 DeviceControlActivity 類別,生成這類別過程會開啟 BluetoothLeService 這個藍芽服務。這裡使用了一個技巧,就是 bind service 的方法,我們把這個 service 類別想像成提供在背景持續工作的服務,而且能提供訊息給 UI 畫面。 圖二:BLE範例的系統方塊圖 搜尋 BLE 設備         搜尋 BLE 設備的方式與傳統藍芽有些不同,第一步都必須取得藍芽配適器 Bluetooth Adapter,不過

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

圖片
準備工作         第一次寫 Android 藍牙連線程式還不知該如何開始 (新手上路),於是先找一本 APP 開發的書吧!也許從書中能獲得一些訊息。之前筆者主要使用的程式語言是 C/C++,所以初次看到 APP 的每個範例都不是很面熟。經過幾周的研讀後,給後進初學者的建議是先準備下列的書和開發環境: Java 8.0 程式語言 ,如果對 Java 語法不熟悉,最好有一本工具書能快速查詢。 Android APP 程式設計,學習 UI 如何設計的概念。 開發 IDE 環境 Android Studio 1.4 以上         Android  官方的開發網站提供不少範例程式,由於先前開發藍牙相關的設備,因此我們從網站下載一個 BluetoothChat 程式來研究,藉此熟悉 Android SDK 來了解如何使用藍牙介面。首先了解一下這個範例有什麼功能,它的功能其實很簡單 (範例就是要簡單才夠力),即透過藍牙通訊在手機或平板上互傳訊息的程式。圖一是範例程式的專案打開後列出相關的檔案,包含設定檔 、java程式檔 、資源檔。然而主要的程式檔為MainActivity 、 BluetoothChatFragment 、 BluetoothChatService 、 DeviceActivity 這四個,另外還有一些程式檔案是 debug log 的用途,方便我們在 debug 模式下顯示於 IDE 的訊息。不過,初學者可以直接從上述的四個檔案來研究,log 以後有興趣再說。 圖一:範例 BluetoothChat 專案         下圖二是範例 BluetoothChat 的流程圖,主要是由上述的四個 java 檔案組成的類別。APP 程式一開始先呼叫 MainActivity,這是初學者必須懂的常識,如果不清楚的話,趕緊找本書K一K。當系統呼叫 MainActivity 類別時,該類別會生成一個新的 BluetoothChatFragment,這是一個 Android Fragment 所衍生的類別,關於 fragment 是甚麼?它跟 UI 畫面有關,請參考官方網站的詳細解說。此外,生成 BluetoothChatFragment 的同時也會新生成 BluetoothChatService 類別,這個類

[應用] Arduino + 藍芽酒精感測器

圖片
        去年初,無意中發現美國 Breathmeter 公司推出酒精感測器,他們推出這項產品的起因是根據統計每年在美國因酒精因素而死亡的人數約一萬人,因酒精原因而造成受傷的人數約17萬人,另外超過百萬人因酒駕而被捕。在這個背景下,該公司一開始設計的概念是希望藉由可攜式設備並經手機的耳機介面來量測血中酒精濃度,所以初期的規劃是以有線通訊的方式傳送。他們的產品啟發了我們的想法,若能利用藍芽通訊的方式傳送檢測資料又能低耗電的話,那不是更方便?         上一篇文章提到使用 Arduino Pro Mini 開發板 (3.3V) 搭配藍芽模組 HC-08 組合成一個測試電路,初步確認我們的電路設計無誤後,也驗證了藍芽通訊和系統的耗電情形。有了這個藍芽控制電路之後,這個基礎將方便我們著手開發各種無線通訊的應用。實作酒精感測器最重要的就是找到適當的感測器元件,去年我們使用 Figaro TGS2620 酒精感測器,不過這顆元件的操作電壓在 5V,使得整個系統的耗電量偏高,一般電池的電量很快就耗盡。於是,今年找到了一顆低電壓的酒精感測器 Cambridge CMOS Sensors CCS803,它是以 CMOS MEMS 技術開發出來的感測元件,所以體積很小且操作電壓很低,最高只要 1.8V,這麼低的電壓有助改善耗電的問題。         我們設計的電路板如下所示,板子尺寸為 2 cm x 4 cm,從照片可看到與一元相比的面積。圖一是將 Arduino Pro Mini 晶片搭配酒精感測元件的電路板正面圖,其中酒精感測器位在正面圖的最左邊,一顆 4-pin 小小的元件。圖二所示是電路板的背面,也就是承載一塊藍芽模組。 圖一:藍芽酒精偵測的正面 圖二:藍芽酒精偵測的背面         最後,我們接上充電電池測試這塊板子運作的情況,如下圖三所示。先量測耗電情況,當系統進入休眠狀態時,耗電流約 3.2mA,這比之前 (Arduino + BT) 量測的耗電流稍微大一些 (多了約 1.2mA),這是因為系統多了升降壓電路和電壓轉換,中間多了一些能量的損耗。另外,我們用圖中的電池測試藍芽通訊和感測器全速運作下 (耗電流粗估 18mA),放了兩三小時後,電池仍舊持續運行中。從初步測試後觀察,電路設計與韌體方面應該沒

[模組] Arduino + 藍芽 BLE 模組

圖片
        物聯網一詞是今年相當熱門的話題之一,靠著萬物皆可連的概念讓未來的生活多出很多的想像空間。2015年初,金屬中心智慧系統組提出一個手持裝置偵測器的想法,首先浮出腦海的方式就是採用藍芽與手機連通。自從一兩年前開始,手機的藍芽規格逐漸發展並升級到4.0,加上有了低功耗的連接模式,資料擷取的應用便越來越多,比如家庭或工業上的監控訊號擷取,醫療量測的資料擷取...等。         為了開發設計出手持裝置偵測器,我們從網路上找到 HC-08 藍芽 4.0 模組,它讓使用者能比較快速進入藍芽通訊的領域,透過串列端口控制這塊模組的各項參數,縮短的開發時程。雖然藍芽模組縮短我們進入的門檻,但模組的擴充性卻有所限制,因此需要從外部搭配 MCU 晶片來整合全系統。不過,初步來看這樣的設計還不夠完美,卻也能達到基本的要求。下面的圖示就是以 Arduino Pro Mini 為控制核心,再加上藍芽模組所組成的系統。 圖一:Arduino Pro Mini + HC08 BLE 4.0 模組         設計一個手持裝置遇到最大的麻煩就是耗電,要解決這個問題,以目前的電路設計而言,分成運算時脈和系統的工作電壓兩點。以同等級的 MCU 來說,時脈變慢的話通常耗電量會降低 (雖然運算速度也變慢),假設裝置的運算量不複雜的話,倒是可以盡量讓輸入 MCU 的時脈變慢。通常市面上的 Arduino 板子都是 16MHz,不過用這個概念,我們找到 Arduion Pro Mini 8MHz 3.3V 的開發板。另外,要減少耗電量還可以考慮降低系統的電壓,選用的元件也盡量以低電壓為主,這樣整體耗電會比較低。         此外,在解決耗電問題上,可從 Arduino 韌體設計考慮,當藍芽未連接的情況下,讓 Arduino 進入 power down 模式,這樣可以達到省電的效果。而這塊藍芽模組也有四種操作模式可以設定,只要進入休眠情況,整體系統的耗電都能改善不少。底下是實驗的數據 <全速情況>          Arduino Pro Mini 耗電流大約 6 ~ 7 mA          HC-08 Bluetooth 4.0 耗電流大約 10 mA         底下影片是操作的過程。我們實際操作時,在藍芽未

[應用] 四軸伺服馬達控制軸卡

圖片
        2013年底,金屬中心智慧系統組需要設計伺服馬達的控制軸卡,以便整合到 WindShear 系統 內,於是從市面上尋找有關馬達控制晶片的資料。其實,製作馬達控制軸卡的晶片並不多,很快地找到日本 NOVA Electronics 的產品非常適合我們的需求,選用了最多高等級的晶片 MCX314AL (可控制四軸)。圖一所示,花了一兩個月研究與討論後所設計出的軸控卡,能夠與 WindShear 的其他板卡一同使用。圖二為板卡上的 MCX314AL 晶片,這顆的操作電壓為3.3V 正適合與 STM32F207 等晶片的工作電壓 。 圖一:四軸伺服馬達控制軸卡的全貌 圖二:四軸伺服馬達控制晶片 MCX314AL         控制軸卡上面是兩個 SCSI-II 介面,每個介面(50 pin)可連接兩軸,所以這個板卡可接四軸(X, Y, Z, U axis)。2014年初,已成功連結到台達電的伺服馬達驅動器 (ASDA系列),並且能藉由 WindShear 遠端畫面監控馬達的動作和驅動它。