2015年4月30日 星期四

在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- timer --

實驗名稱:

在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- timer --

實驗目的:


    介紹 timer 在 Linux Kernel 裡面的作用和原理。

使用材料及設備:


    硬體: Raspberry Pi B+

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

原理介紹:


    此範例展示如何在 Linux 核心模組之中使用計時器(timer)來執行程式。如果模組程式之中有需要固定時間之後執行特定程式的需求時,可使用計時器來簡單達成。使用方式和 work queue 類似,不過在初始化計時器資料結構變數的時候需要另外設定等待時間。

在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- wait queue --

實驗名稱:

 -- wait queue --

實驗目的:


    介紹 tasklet 在 Linux Kernel 裡面的作用和原理。

使用材料及設備:


    硬體: Raspberry Pi B+

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


原理介紹:


撰寫模組程式的時候,往往會遇到要因為某項資源還沒有準備好或某個訊息還沒有完成接收的情形,程式就可能會被卡在這裡等待。但是在Linux 模組程式之中如果在這種時候用類似無窮迴圈來做等待的動作的話,會使得系統被卡死而造成系統不穩定。因此系統提供了 wait queue 的機制使模組可以進入等待的狀態並讓 CPU 跑去做其他的事情。而在取得資源或是訊息接收完成時由另外的函式喚醒正在等待狀態中的模組,並且從等待的地方繼續執行下去。

2015年4月26日 星期日

Access VBA: 如何針對SQL輸出表格內容進行操控


目標: 讓Access顯示出資料表的型式,並且每個欄位都可以個別控制



Step 1: 利用建立一個表單, 型式為"子表單工作表" , 表單名稱為 "newsubform",

"子表單工作表"設定屬性

卷軸列: 只有垂直
允許新增: 否
記錄選取器:否
記錄導覽按鈕: 否
事件: onClick 建立"內嵌巨集", 以開啓表單,並filter以顯示對應的record

Step2: 讓"子表單工作表"的每一個欄位是可以選取並加以控制


設定好子表單工作表的欄位
子表單工作表資料顯示

內嵌巨集的內容 (或是使用巨集openForm 呼叫)



step 3: 可以建立一個空白表單, 插入一個"子表單控制項", 資料來源選擇"newsubform" 即大空告成







2015年4月24日 星期五

Pi使用Bluetooth和手機連接



1) 將BT Module 插到Raspberry Pi Shield上, 接法如下:

 VCC  --> Pi 3.3V
 GND --> Pi GND
 RX    --> Pi TX  (Pi Shiled 標識為RX,此表示BT RX插入的位置)
 TX    --> Pi RX  (Pi Shiled 標識為TX,此表示BT TX插入的位置)

接上後BT Module  的LED灯會一直閃爍.

Note: BT Module (HC05或HC06) 其他的Pin, 主要用來決定是否要進入[設定模式], 當然有些BT模組是做成按鍵, 讓你決定是否要在通電後進入設定模式。進入設定模定, 可以讓你重設BT uart baudrate 、Pin Code及BT 名稱。

Note: IT Pi Shiled 旁邊有一個Switch 要切到UART而非PL









2) 把UART 空出來給BT UART 使用 ,由於 Pi 原本/dev/ttyAMAO 預設是當作debug console 用途,所以在 Pi 上修改2個檔案便可把UART空出來了,改完後pi要記得重新開機

  •   sudo nano /boot/cmdline.txt
    #移除這個參數,
    console=ttyAMA0,115200 

  •   sudo nano /etc/inittab
   #移除或註解此行
  #Spawn a getty on Raspberry Pi serial line
  #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

3) 在Pi 開啓終端機程式,如minicom ,設定好baudrate,parity,data bit 等serial參數,即可接收來自手機送來的訊息。 minicom 使用方式如下畫面; 若pi沒有minicom ,可以執行sudo apt-get install minicom 進行線上安裝。


執行 "sudo minicom  -s "指令 進入設定畫面

2015年4月22日 星期三

在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- work queue --

實驗名稱:

    Linux 驅動程式開發 work queue 

實驗目的:

    介紹 work queue 在 Linux Kernel 裡面的作用與使用方式。

使用材料及設備:

    硬體: Raspberry Pi B+

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

2015年4月20日 星期一

在Raspberry Pi & Pi2 上面學 Linux 驅動程式開發 -- Tasklet --

實驗名稱

    Linux 驅動程式開發 -- Tasklet --

實驗目的

    介紹 tasklet 在 Linux Kernel 裡面的作用和使用方式。

使用材料及設備


    硬體: Raspberry Pi B+

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



原理介紹

    tasklet 就是向系統核心註冊一個工作,系統核心會把該工作排進去它的行程表之中,並等到適當的時機去處理這個被註冊的工作。在核心程式之中遇到 Interrupt (中斷)訊號,需要撰寫 ISR (Interrupt Service Routine,中斷服務程式) 來執行指定中斷發生時要做的事情。 在 ISR 程式執行期料常常會關掉中斷訊號,避免在 ISR 執行尚未結束時又因觸發中斷而重複呼叫相同的 ISR 造成系統的不穩定。

因此 Linux 核心裡面 ISR 要做的事情越少越好,盡量減少執行期間所花的時間。但有時候中斷發生之後要處理的事情很多的時候,通常會讓 ISR 的程式變成只是註冊一個 tasklet 到核心的工作排程裡面,然後就結束 ISR 並打開中斷。 然後讓核心在之後的適當時機再去處理這些較花時間的工作。

舉例來說,Pi 的教育子板上面有按鈕與GPIO 連結,而假設這個時候我們希望寫一個 moudle 使該按鈕被壓下時,去透過網路發送一個訊號 (按鍵式網路 Call 機?) 到指定的網站。處理網站連線的事情往往很浪費時間,而這個時候如果把處理網站連線的事情給寫在 ISR
裡面,很有可能在按鈕快速連按的時候,因為 ISR 尚未結束而造成訊號的漏失。因此我們可以將處理網站連線的事情給寫在一個程式之中。而 ISR 只做把該程式利用 tasklet 的機制給排到 kernel 的核心工作排程之中,留待以後再執行讓 ISR 儘快結束以免漏掉下一次中斷。



程式說明

程式碼內容

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

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

程式架構與程式碼說明

#include<linux/interrupt.h>,程式碼的第三行,要使用 tasklet 的排程之前要先引入這個 header 檔。這表示著, tasklet 排程是配合中斷所使用的。為了方便看清楚使用方式,這個範例之中並沒有使用到中斷、ISR 的東西。

最簡單的tasklet的使用流程就是,開始先宣告一個資料結構為 struct tasklet_struct 的變數,並且將該變數和要執行的 function 綁定,並做初始化。之後透過 kernel 提供的API: tasklet_schedule 把這個tasklet 變數給排程到核心的工作排程之中,之後kernel就會找一個適當的時機來執行被綁定的那個 function 。

DECLARE_TASKLET(my_tasklet, my_tasklet_handler, 0); 程式碼的第 8 行,這段程式碼是kernel所提供的巨集用來簡化宣告tasklet 資料結構的步驟。巨集原型為:

DECLARE_TASKLET( name , function , data)

name 是 tasklet 的資料結構變數名稱, function 為該 tasklet 要去執行的函式名稱,而data 為要傳入給function 的參數值。所以在這個範例程式碼第 8 行,my_tasklet 會被宣告成一個 tasklet_struct 的變數,並且和 my_tasklet_handler 這個已在第 7 行就宣告好的 function 綁定在一起。而在程式碼第 10 ~ 15 行則是實作 my_tasklet_handler 的程式碼,要注意一下,這個 function 要傳入一個 unsigned long flag 參數。而傳入的值就是DECLARE_TASKLET 巨集的第三個參數。

tasklet_schedule(&my_tasklet);  程式碼第 21 行。執行完DECLARE_TASKLET巨集完成宣告tasklet的動作之後,下一步就是在適當的時候將其排入系統工作排程之中。而排入工作排程的動作由kernel API: tasklet_schedule(struct tasklet_struct * ptr) 所完成。所以此例的範例 code 中,會在模組被載入的時候馬上將該 tasklet 排入工作排程。

可以看一下範例的 module_init 所執行的程式碼。會先printk 一段訊息之後,再將tasklet 排進 kernel 的工作排程,然後再 printk 一段訊息。藉此觀察程式碼的執行順序與時機。

執行結果

可以看到 my_tasklet 的執行時機會在module_init 執行完之後。


而之後我們將會介紹如何簡單使用另一種工作排程方式 WORK QUEUE 。




2015年4月14日 星期二

用Arduino練習:Arduino 收集 MSGEQ7 音頻分析資料 用Uart 傳送給Raspberry PI 2 做LED Mictnx應用

實驗名稱


  Arduino 收集 MSGEQ7 音頻分析資料 用Uart 傳送給Raspberry PI 2 做LED Mictnx應用。




實驗目的

  在這篇文章中我們將要介紹你如何去簡單製作自己的音頻分析儀,讓自己有一個音頻分析的Arduino風格主板。








2015年4月8日 星期三

編碼器原理(機械式元件)

實驗名稱

編碼器原理的結構,以機械式元件做為介紹。


實驗目的

  因為每次使用馬達的時候,都一直無法準確的知道馬達轉動的角度,所以我們以機械式解碼器來了解此原理與結構。

在做此實驗的時候,我們第一想到控制機械手臂要怎麼樣才可以準確的夾到東西呢?要如何知道現在的角度?要怎麼樣才可以知道現在是正轉還是逆轉呢?



用arduino練習: arduino與Raspberry Pi 2 Uart Part 1通訊控制

實驗名稱


這次實驗對想以arduino 傳送Uart資料給PI 2




實驗目的

先要瞄準一個目標自己的達成的目標,在一點一滴的把需要的架構建立起來,完成下面得結構圖用來達成未來的目標。






這次的目標鎖定"機械手臂抓取糖果"

2015年4月7日 星期二

使用 Raspberry Pi 操作伺服馬達機械手臂

實驗名稱

使用 Raspberry Pi 操作伺服馬達機械手臂

相關文章:  Raspberry Pi2: 用 Python 透過 I2C 控制 16 頻道 PWM 模組 (PCA9685)

實驗目的

在高度工業化與資訊化的現代,機械人與機械手臂在各方面的應用越來越受到重視,並且在物聯網、大數據所組成的工業4.0的未來世界裡,將扮演一個極度重要的角色。

以往研究控制機械人與機械手臂控制系統是一門高成本且高技術門檻的領域,非相關人員的一般民眾在自行開發與研究上難以入門。但是隨著科技的發展,SoC 嵌入式系統的性能越來越高,價格越來越低,使得進入該領域的門檻開始慢慢降低,而使得一般民眾開始可以在車庫裡發展該方面的應用。

在 Raspberry Pi 的 Linux 環境底下,撰寫程式控制伺服馬達組成的機械手臂。並使用市面上的遊戲機搖桿來操作機械手臂。 藉此研究整個訊號控制流程與程式結構設計,建立相關研究的基礎。


使用材料及設備


六個伺服馬達組成的機械手臂一組。