2015年6月29日 星期一

運動感測器#1


研究一下運動感測器, G-Sensor (加速度計), Gyro Sensor陀邏儀,, E-compass 電子邏盤 , 先看一下Android 手機內運動感測器的輸出狀況. 到時自己實作時,也就知道應該做到這樣的結果, 其實, 發現要得到這樣的結果, 除了硬體外, 還必須有一些演算法搭配。

不管先來看一下, Android手機座標系統 (OpenGL ES座標系統)






加速度感應器 : 傳回 X, Y, Z 軸受重力的影響 . 加速度的單位是 m/sec2

當手機平放時, Z軸有值, X,Y軸為0; 正面放 Z軸輸出9.81, 反面放 Z軸輸出 -9.81




 當手機直立時, Y軸有值, X,Z軸為0; 正面放  Y軸輸出9.81, 反面放 Y軸輸出-9.81

 當手機側放時, X軸有值, Y,Z軸為0;  左側面放 X軸輸出9.81, 右側放 X軸輸出-9.81



當手機平放時, 以邏盤方式順時針或逆時針旋轉, 得到的數值都是Z值9.81, 無法得知其旋轉方向



方位感測器: 我們可以得知X,Y,Z方向的旋轉方向. 輸出角度數值為 [-π,π]

Azimuth: 為當手機平放時以邏盤方式轉動, 可得其為順時針或是逆時針轉動,

Pitch: 當手機繞著X旋轉時,輸出角度變化值

Roll: 當手機繞著Y旋轉時, 輸出角度變化值






整理資料來源連結:
[1] 感應器應用

2015年6月13日 星期六

用Raspberry Pi 實現四軸飛行器



   無人四軸飛行器其靈敏性高、機動性佳、體積小與重量輕等特點,其應用不再只是侷限在軍事方面,也可適用於一些民生用途如空拍導航、地形偵查等。
故本專題想要以上課所學到的內容,來實現一個基於嵌入式Linux系統的一個四軸飛行器。本專題從基本的直流無刷馬達(BLDC)控制開始著手,到完成整個飛行器控制核心及慣性感測器的系統整合,最後實際測試飛行。本系統所使用的控制核心為Raspberry Pi B+, SoC 晶片為Broadcom BCM2835(ARM11@ 700MHz)。

四軸飛行器主要是利用四顆BLDC來帶動螺旋槳產生的浮力,使得四軸飛行器能於空中進行不同的運動,其中BLDC需要透過驅動電路將單一直流電轉換成三相電流,並透過PWM訊號使BLDC產生不同的轉速。因此,系統使用PCA9685讓Raspberry Pi具備四組硬體PWM輸出能力以控制四顆BLDC。

螺旋槳的轉動會產生作用力與反作用力以及一些旋轉的慣性,且當飛行於室外時,也會因為氣流和風勢的影響,造成四軸飛行器飛行時無法平衡。故,為了達到平穩飛行的目的,我們必須能瞭解四軸飛行器的航向、俯仰、側滾等姿態變化資訊,因此我們利用一顆慣性感測元件MPU6050,其同時包含了加速度計及佗羅儀,可用來即時量測物體運動時的加速度與角加速度。這些加速度與角加速度的變化,再透過控制核心作PID運算處理,並回授矯正誤差值,最後輸出PWM訊號來控制BLDC,使四軸飛行器的能夠達到穩定的平衡飛行。為了加強控制穩定性,量測到的加速度及角加速度訊號於進入PID前,均事先進行互補濾波器(Complementary Filter) 的演算處理。

另外,我們在四軸飛行器上實作一個簡單終端機UI操控界面並安裝一個USB WiFi Dongle (IEEE 802.11n),使PC端可以透過WiFi隨時得知控制系統的狀態,包含姿態、航向、轉向等,並且可遠端操控四軸飛行器的運動方向,如上升、下降、左旋、右旋。最後,我們四軸飛行器的電源使用的是20C鋰電池,即其具有20倍1C 放電速度鋰電池,才能提供系統及四顆BLDC於同時高速運轉下足夠的消耗電流。




關鍵詞:



Raspberry Pi,四軸飛行器,Complementary Filter,互補濾波器,BLDC,
,MPU6050,PCA9685,加速度計,佗羅儀,直流無刷馬達,PWM, ,PID,慣性感測器,IMU ,自動控制

物聯網應用之智慧溫室箱



植物對於外在環境主要因素包括:光、溫度、水,本專題實現一個“智慧溫室箱”,可用來記錄植物生長環境紀錄,以找出不同植物所需的最佳生長環境數據,例如光照長度及光強度、環境溫溼度及土壤水份等。

 本專題以Raspberry Pi為核心,並且連接各式數位及類比感測器,包含光感測器、空氣溫溼度感度器、土壤濕度感度器、水位高度感測器,以獲得溫室箱內各種植物生長環境參數,並且這些參數的變化將即時更新於溫室箱的LCD上。 本系統會依據不同植物的參數設定,維持其應有的生長環境狀態。為控制溫室箱內溫度與溼度,我們利用超音波霧化器當作細小水霧供應源,只要施以不同振幅,就能得到不同的造霧量,來達到溫室箱內環境的乾溼控制。此外,為了進一步更快速達到溫度響應和溫度穩定性,系統使用了一個熱電致冷晶片模組及並配合4個輔助風扇,來促使冷、熱空氣快速循環,進而提升溫室箱內的升溫與降溫的速度。植物生長需要適當的水份,因此若偵測到土壤溼度過低時,系統會啓動抽水馬達(Water Pump)進水份補充。至於植物生長的光環境控制,我們利用一個3W LED作為光照來源,並藉由控制PWM調節植物光照週期及照明補充。

 此外,本專題利用Facebook旗下的雲端程式開發平台Parse for IoT,來作為植物生長數據資料庫平台,系統會自動將這些植物生長環境數據定時上傳到parse,並且我們實作一個Web管理界面,使用者可使用PC或行動裝置透過瀏覽器進行遠端數據查看及環境各項參數設定。


關鍵詞:
 Parse for IoT、Raspberry Pi、超音波霧化器、熱電致冷晶片、溫溼度感度器、土壤濕度感度器、水位高度感測器 更多其他專題

更多其他..http://www.ittraining.com.tw/ittraining/index.php/activity?id=393



2015年6月3日 星期三

Raspberry Pi 擴充應用板2


這個Raspberry Pi 擴充應用板, 主要是解決Raspberry Pi 的幾個問題: 
  1. Raspberry Pi 沒有類比輸入的態力: 所以增加ADC 晶片以提個8 通道的AD 輸入, 以連接更多類比型式的Sensor; 另外
  2. Raspberry Pi 缺乏足夠多的硬體PWM的輸出能力 (一般MCU都很多組): 故本擴充板加入了16 通道PWM的能力, 可方便連接馬達作PWM控制, 例如伺服馬達Servo, DC 馬達及BLDC無刷馬達都會需要。
  3. GPIO 數量不足:  加入了2顆 Serial Shift Register,使本擴充板成為一個 I/O Expansion Board , 來達成擴充GPIO 數量的目的。 目前板子預設是接了2顆7段顯示器, 可供測試練習使用, 若拿掉它, 所有接腳便可拿來當GPIO使用。
  4. Debug Console: 不用再買Serial-TO-USB的轉接線材了, 本擴充板已內建PL2303晶片了, 直接拿一般接手機的USB線 (現在都是microUSB 接頭) 接本擴充板,另一端以接到電腦USB port, 直接用用windows 超級終端機就可以連入系統. (Pi預設: baudrate 19200bps , 8N1 , No Flow control)
  5. 本片板子還外接MSGEQ7 音頻分析器、Audio 3.5mm 連接器、再擴充LED Matrix 接頭 8x2連接器 (16pin),來做一些音頻的運用。




規格 

ADC channel x8
PWM channel x16
USB-to-Serial (PL2303)
8位元Serial Shift Registerx2
7段顯示器x2
SPI 擴充座x1
I2C排針座x2
Power LED (藍光LED)
Power 座 (5v, 3.3v, GND)
-------
延伸I/O:
MSGEQ7 音頻分析器
Audio 3.5mm 連接器
LED Matrix 接頭 8x2連接器 (16pin)






2015年5月29日 星期五

直流無刷馬達BLDC



最近四軸飛行器很流行, 很多發行器裝的都是直流無刷馬達(BLDC). 所以拿來玩玩看, 其實CD ROM等光碟機、硬碟機裡面使用的馬達也是直流無刷馬達。
BLDC 之所以稱無刷直流馬達,是因為 BLDC 無須透過電刷進行電流換相,且馬達特性與 DC Motor 相同,轉速同樣由繞組線圈的電壓決定,與 DC Motor 相比少了噪音與電刷磨損的問題。

BLDC規格:

A2217 (1750KV)
1750KV值的意義為何? 愈大的KV值表示其轉速愈快1750KV表示每1伏特為1750 RPM (無負載時), RPM : 1分鐘幾轉; 若是10伏特,則有17500轉 (無負載時)。相關規格如下
工作電壓 :  6.5V~12V
電壓 電流     推力
8V       18.6A    816克
7.5V    16.9A   739克
7V       15.1A      653克
6.5V    13.6A   578克
11.1V  30A    1000克

BLDC為1750KV

線圈在內旋轉時不動

BLDC驅動電路板:

另外, BLDC 沒有辦法像DC馬達可直接通電旋轉,需透過驅動電路將單一直流電轉換成三相電流。底下這個BLDC驅動電路板, 給它PWM 訊號就可以由它送出三相訊號來控制BLDC. 
BLDC工作頻率和一般伺服馬達Servo 工作頻率一樣, 50HZ (週期為20000us), 試了一下這個驅動電路板, 一開始必須先送出一個pulse , 寛度是1000us就會進入初始狀態,也就是可以開始工作了, 接著再送出其他不同的pulse寛度就會旋轉,以這一顆BLDC, 實驗的結果是pulse 寛度 為 1300us~2000us。當pulse 寛度1300us開始旋轉, 愈接近2000us轉速愈快。若pulse 小於1300us 則停止轉動



 
BLDC驅動電路板 (3線連接馬達隨便接; 另外粗的2條是馬達電源接電源供應器; 3條細線給控制板電源, 其中白色為PWM訊號線)

驅動電路板拆解後正面, 控制板MCU為PIC
驅動電路板拆解後背面



DEMO 
 利用Raspberry Pi 搭配艾鍗擴充應用板上的16 channel PWM 來輸出PWM訊號以控制BLDC

艾鍗Pi擴充應用板,具16 channel PWM 輸出功能









2015年5月25日 星期一

在Raspberry Pi B+ & Pi2 上面學 Linux 驅動程式開發 -- GPIO Button 中斷 --

實驗名稱

    Raspberry Pi & Pi2, Linux 驅動程式開發 -- GPIO --

實驗目的

    簡單介紹在Raspberry Pi Linux 系統底下,如何使用GPIO。

使用材料及設備

    硬體: Raspberry Pi & Pi2, Ittraining Edu Kit 子板

    軟體: 可編譯 Linux Module 的 Raspbian 系統。

原理介紹

GPIO 是嵌入式系統中極為重要的功能,但是在一般的桌機與筆電系統之中卻很少見。一般MCU在操作GPIO時是直接透過寫入資料到對應的暫存器來控制其輸出入。但是在Raspberry pi 上則是透過 Linux 系統提供的 API 來操作GPIO。

本篇文章會使用艾鍗科技出產的教學子板來做示範-- 利用教學子板上的GPIO 按鍵來實作驅動程之中GPIO 中斷的使用方式。GPIO 按鍵按下後會去點亮GPIO LED。

無子板的話也可以使用麵包板自行實作電路達到相同的效果。



程式說明

程式碼內容

---------------- CODE -----------------

---------------- CODE -----------------

程式架構

此模組除了最基本的進入點函式 init_module() 和離開點函式cleanup_module()之外,還有這次的主題中斷處理函式 button_isr()。

中斷點處理函式 button_isr()被核心呼叫的時機為指定中斷訊號發生的時候。這樣的機制會在指定中斷處理函式和指定中斷訊號做連結(使用核心提供的函式)之後生效。

就此模組而言,按鈕的 GPIO 輸入電位產生 Rising-Edge (上緣觸發) 的變化時系統會發出一個特定中斷訊號給核心,然後核心就會去呼叫和此特定中斷訊號相對應的中斷處理函式 button_isr(); 切換 LED 的 GPIO 輸出電位,藉此控制LED的亮暗。


程式碼說明

程式碼一開始定義了指定按鈕使用 GPIO23,而LED 使用 GPIO27。所以在程式進入點使用了gpio_request(LED) 對系統提出使用該GPIO 的申請,成功的話回傳0,失敗的話回傳一個負值錯誤碼。再指定 LED 為輸出並初始輸出電位為 low : gpio_direction_output(LED, 0 ),回傳值為0表示成功。這兩個API函式的介面如下

int gpio_request(unsigned int gpio, const char *label);
int gpio_direction_output(unsigned int gpio, int value);

按鍵的 GPIO 部份,同樣要先向系統申請
使用: gpio_request(BUTTON)。如果該GPIO有相對應的中斷號碼,則可以使用函式 gpio_to_irq(BUTTON) ,會回傳對應該GPIO的中斷號碼,如果失敗的話會回傳一個負值。

int gpio_to_irq(unsigned int gpio);

知道中斷號碼之後,我們需要使用稍微複雜一點的函式註冊指定的中斷處理函式給指定的中斷號碼。

註冊中斷處理函式給對應的中斷號碼

request_irq( button_irq, button_isr ,IRQF_TRIGGER_RISING, MY_GPIO_INT_NAME, MY_DEV_NAME);

button_irq 為中斷號碼,是由函式 gpio_to_irq() 回傳得到,而 button_isr 是中斷處理函式的函式指標,經過註冊之後硬體引發該中斷號碼給核心,核心就會去執行button_isr() 函式。

設定值 IRQF_TRIGGER_RISING 是指定設定該 GPIO 當輸入電位由低向高變化的時候引發中斷(上緣觸發),當然還有其他的設定值如下緣觸發: IRQF_TRIGGER_FALLING ,設定時可以用符號 "|" 來做成上緣下緣都會觸發中斷的設定值: 

IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING

而 MY_GPIO_INT_NAME 為字串 "my_button_int",代表中斷名稱,在註冊成功之後會出現在系統檔案之中 /proc/interrupts。 可以用下列指令來顯示系統中目前所有的中斷名稱。系統裡面所有的中斷名稱可以使用指令 "cat /proc/interrupts" 顯示出來,裡面會有系統中所有的中斷訊號的資訊,包括引發的資數

而 MY_DEV_NAME 為字串 "my_device"。其實request_irq()的最後一個參數的資料形態為 ( void * ),這個指標會在呼叫中斷處理函式的時候從第二個參數傳入。如果你設計的中斷處理函式有需要用到一個自行維護的資料的話,可以透過這個指標傳入。沒有用到的話傳入NULL也行。只是這邊我們傳入該模組自行維護的模組名稱的字串進去。

而 request_irq() 註冊中斷處理函式成功的話會回傳 0 。之後在按下按鍵之後,放開按鍵的時候會讓 GPIO23 引發中斷訊號,該中斷訊號會有一個特定的中斷號碼,系統會依照接收到的中斷號碼去呼叫對應的中斷處理函式 button_isr()。

中斷處理函式

中斷處理函式的介面形式如下:

irqreturn_t button_isr(int irq, void * data);

系統在呼叫該中斷處理函式傳入的參數 irq 為對應的中斷號碼,Debug的時候有機會用到。而如前面所述 data 其實就是在註冊中斷處理函式給對應中斷號碼時最後一個傳入的指標(void *),此模組是傳入 MY_DEV_NAME 裝置名稱的字串指標,從範例碼來看,其實並沒有用到...。

呼叫 button_isr() 時,所做的事情就只是用 gpio_set_value() 來切換 LED 亮暗狀態。但是在中斷處理函式在運行的期間,會不希望因為其他中斷訊號引發造成程式中斷,所以會使用 local_irq_save(flags) 來關掉CPU受理其他中斷訊號的功能,等到函式要結束之時再使用 local_irq_restore(flags)來重新使CPU可以受理中斷訊號。

執行結果

因為按鍵會有開關彈跳的問題,所以一般處理按鍵開關類的輸入都會進行所謂 debounce 的處理。但是在這個範例之中並沒有特別去做這件事情,所以按鍵每按一下時,其實都會在短時間內引發隨機次數的中斷。處理這樣的問題有很多種手法,不過為了練習Linux Kernel API,所以下一篇文章會用 timer 的方式來處理。