2012年12月30日 星期日

安裝 LPCXpresso

這篇將說明 LPCXpresso 的安裝與設定,我把安裝程序分成三個部份:

  1. 安裝 LPCXpresso
  2. 安裝 Subversion, RSE 與 RXTX 外掛
  3. 設定環境

STEP 1:安裝 LPCXpresso

  • 到 Code-Red 的 LPCXpresso 官網註冊一個帳號:http://lpcxpresso.code-red-tech.com/LPCXpresso/
  • 用你註冊的帳號登入 LPCXpresso 官網,然後點 Download。寫這篇時,我下載的是 LPCXpresso v4.3.0,大小為 216 MB。

image_thumb[1]

  • 裝好軟體後,啟動時會出現底下的警告,說軟體沒註冊 Debug code size 將限制在 8KB 內,必須進行產品啟動才能將限制放寬到 128KB:

image_thumb[2]

  • 點選 Help > Product activation > Create Serial number and Activate,然後把底下視窗兩個選項都打勾:

image_thumb[3]

  • 此時會自動打開瀏覽器連到 Code-Red 網站:

image_thumb[5]

  • 直接點選 "Send me my activation code",然後到你的 Email 信箱收 Activation Code
  • 點 Help > Product activation > Enter Activation code,輸入 Email 收到的 Activation Code:

image_thumb[6]

  • 產品啟動完成後,便會看到 Debug limit 已擴增到 128k(備註:這裏簡單說明一下,有關 LPCXpresso 的 Code Size 限制,是指 Debug mode 下最多 128k,但是在 Release mode 是沒有限制的):

image_thumb[7]

STEP 2:安裝 Subversion, RSE 與 RXTX 外掛

  • 點 File > Switch Workspace > Other 把 Workspace 改到沒有中文路徑名的目錄,避免 LPCXpresso 發生水土不服的狀況
  • 點 Help > Install New Software,輸入 Subversion 外掛來源:http://subclipse.tigris.org/update_1.8.x,然後照下圖勾選必要的選項,按下 Next 並照安裝指示把 Subersion 外掛裝起來

image_thumb[8]

  • 點 Help > Install New Software,輸入 RSE (Remote System Explorer) 外掛來源:http://download.eclipse.org/tm/updates/3.4,然後照下圖勾選必要的選項,按下 Next 並照安裝指示把 RSE 外掛裝起來

image_thumb[9]

  • 點 Help > Install New Software,輸入 RXTX 外掛來源:http://rxtx.qbang.org/eclipse,然後照下圖勾選必要的選項,按下 Next 並照安裝指示把 RXTX 外掛裝起來

image_thumb[10]

STEP 3:設定環境

  • 點 Window > Show View > Other,出現底下視窗後,選擇 SVN 檔案庫:

image

  • 你可以選擇把 SVN 檔案庫 VIEW 拉到比較方便的位置,如:

image

  • 完成後的畫面:

image

  • 點 Window > Show View > Other,出現底下視窗後,選擇 Remote Systems:

image

  • 你可以選擇把 Remote Systems VIEW 拉到比較方便的位置,如:

image

  • 完成後的畫面:

image

以上是 LPCXpresso 安裝程序的概略說明 ,如果你需要一步步的安裝介紹,可以參考「LPCXpresso + FreeRTOS 即時多工.全新體驗」這份講義。當你裝好 LPCXpresso 後,泡杯濃縮咖啡喝,休息一下吧。

參考資料

2012年12月27日 星期四

nano1768 與 UNOT.NET 簡介

nano1768

nano1768 是一塊基於 ARM Cortex-M 32-bit MCU 的板子,很適合當作雛型開發的平台 (prototyping platform)。它是台灣英倍達國際設計研發的產品。

21207130289072_508         
▲ nano1768

nano1768 的尺寸很迷你,長寬只有 54mm x 26mm,雖然如此,它的心臟卻很強,因為它用的是 NXP LPC1768 32 位元微控制器,運算速度高達 100 MHz。內建 Ethernet, USB,而且還有豐富的周邊介面與 Flash 記憶體,如果你詳細看它的規格 會發現 nano1768 的硬體功能遠比傳統 8 位元微控制器強大很多。

nano1768-dimension-00nano1768-bottom

底下摘要條列一些我認為是 nano1768 的特色,完整技術規格可以在英倍達國際網站這個頁面上找到。

核心:

  • Core: ARM Cortex-M3
  • Frequency: 100 MHz
  • Flash: 512 KB
  • microSD: 128 MB up to 16 GB, FAT32
  • RAM: 64 KB (User RAM: 32 KB)
  • Power (Vin): 60-120 mA (USB 5V or DC 9-12V)

周邊:

  • 10/100 base Ethernet x 1
  • USB Host/Device x 1
  • GPIO x 26
  • UART x 3
  • CAN Bus x 2
  • SPI x 2
  • I2C x 2
  • PWM x 6
  • ADC x 6
  • DAC x 1

Pin Assignment

21207130289072_49

UNO.NET

為了讓熟悉 Arduino 的使用者順利進入 nano1768 的世界,英倍達國際另外設計了一塊與 Arduino 相容的板子 UNO.NET。當你拿到 UNO.NET 後,在包裝盒裏會看到如下的內容:

apk uno-02
▲ 圖片來源:英倍達國際。圖中 Android 公仔並不包含在產品包裝內,可別誤會了。

其實可以這樣說,UNO.NET 只是一個殼而已,在使用的時候,你必須讓 nano1768 跟 UNO.NET 兩個合體,也就是把 nano1768 疊在 UNO.NET 身上才行,沒有 nano1768 的話 UNO.NET 是動不了的。如果沒有特別聲明,之後文中提到 UNO.NET 時,指的都是合體後的悟天克斯,唔,我是說 nano1768+UNO.NET。

看一下底下這張照片,你可以看到 UNO.NET 的腳位與 Arduino 完全相容,當然,相較於 Arduino,UNO.NET 的硬體能力有過之而無不及,因為 UNO.NET 的周邊多很多,而且還有 Ethernet 與 USB Host 通訊的能力:

 

21207103614614_321

值得注意的是,nano1768/UNO.NET 可以透過 USB 供電,但是它用的是 USB A/Mini-B 的 cable。

你也許會問「那程式的開發跟 Arduino 一樣嗎?」,嗯,應該這麼說,nano1768-UNO.NET 有一個叫作 uCXpresso Framework 可以讓你開發程式,但是如果你還是習慣 Arduino 的寫程式風格 (Coding Style),也沒關係,因為英倍達國際已經把 Arduino core library 移殖到 nano1768-UNO.NET 上,所以你仍然可以像在寫 Arduino 的程式一樣使用 nano1768-UNO.NET。

IDE

nano1768 軟體開發環境使用的是 LPCXpresso,它是 Elicpse-based 的 IDE,如果你熟 Eclipse,很快就可以上手。LPCXpresso 的介面如下:

ide

小結

nano1768 是硬體功能非常強大的一個微控制器開發平台,尤其它具備 Ethernet 和 USB Host 介面而且還有 microSD,很適合做網路應用, USB 應用,甚至結合手機與雲端服務開發各式感測、監控與自動化的應用。在台灣的開放硬體世界中,nano1768 的軟體和硬體技術算是很有水準的,所以在技術服務方面應該不是問題,不至於會發生找不到支援的狀況。衷心期待將來會看到更多 nano1768 的應用。

參考資料

2012年12月22日 星期六

使用 Arduino 遙控家電

前言

躺在床上看書看累了,你想倒頭就睡,卻懶得下床關燈嗎?或是窩在舒服的沙發上看電視,你想開個電風扇涼快一下,卻連抬個腿都覺得麻煩嗎?「拿起一個遙控器,按一下把電燈關掉,再按一下就把電風扇打開。」,如果可以這樣,該是多麼美好的一件事!

這聽起來很困難嗎?不!一點都不!本專題要告訴您如何使用紅外線遙控插座,藉此控制電器的開關,並且以 Arduino 自製一個簡單的紅外線遙控器,利用 Arduino 來遙控紅外線插座。

image image

STEP 1:

把紅外線插座插到 110V 插座 (圖1),先按一下黑色按鈕讓燈亮,再按住按鈕約 3 秒鐘,等燈亮後手放開,此時燈會閃爍 (圖2),代表紅外線插座已進入紅外線學習模式:

image
▲ 圖 1:將紅外線插座插入110V插座

image
▲ 圖 2: 按住按鍵 3 秒鐘後放開,此時燈會閃爍,表示已進入紅外線學習模式

拿起家裏任何一個遙控器,對著紅外線插座按任一鍵 (圖3),這個紅外線插座很聰明,當你聽到繼電器發出嗒的一聲時,表示它已經把紅外線學起來了。

image
▲ 圖 3:用遙控器對著紅外線插座按任一鍵

完成設定後,馬上來做個簡單的測試,將電器 (例如電風扇、立燈) 插到紅外線插座上,然後按一下遙控器同一顆按鍵,此時電器電源會打開 (圖4),再按一下,便會關閉電源 (圖5)。

image
▲ 圖 4:按一下打開電器,此時燈會亮

image
▲ 圖 5:再按一下關閉電器,此時燈會熄滅

STEP 2:

下一步是使用 Arduino 讀取遙控器的紅外線訊號。

首先是連接電路,將 38kHz 紅外線接收器接到 Arduino 上。紅外線接收器的接法如圖 6 所示,接收器的 Vout 腳接到 pin 2 腳位,Vcc 接到 5V 輸出腳位,GND 接到 Arduino 的 GND 腳位。

image
▲ 圖 6:紅外線接收器線路接法

接著是安裝 IRRemote Library。請將 IRRemote Library 下載後(註1),解壓縮放到 libraries 資料夾底下即可,例如 "C:\arduino-1.0.1\libraries"

將底下的程式輸入Arduino IDE 並上傳至 Arduino 板子上:

程式上傳完畢後,打開 Serial Monitor,接著拿起遙控器,對著紅外線接收器按下按鍵(要用跟紅外線插座一樣的同一個按鍵),這時候 Serial Monitor 會顯示紅外線訊號的編碼,如圖 7 所示:

image
▲ 圖 7:遙控器紅外線訊號

請將解到的 Protocol 種類與編碼記錄下來(本例為 NEC 協定,編碼為 4CB3817E),待會我們會用到。

STEP 3:

下一步我們將使用 Arduino 來發射紅外線,以遙控紅外線插座。

首先一樣是先連接電路,我們要把紅外線發射器和一顆按鈕接到 Arduino。紅外線發射器的接法如圖8所示,發射器的長腳要接到 pin 3 腳位,並且串接一顆 100 ohm 電阻,短腳要接到 GND 腳位。至於按鈕則是一支腳接到 5V輸出腳位,另一支腳接到 pin 4 腳位,同時接一個 10K 電阻連接到 GND 腳位。

image

將底下的程式輸入Arduino IDE 並上傳至 Arduino 板子上:

本例所用的是講 NEC 協定的遙控器,所以程式呼叫 sendNEC() 發射紅外線訊號,如果你在 STEP 2 解到是其它紅外線協定,必須改呼叫其它函式,例如 sendSony(), sendRC5(), sendRC6(), sendSharp() 等。另外,記得將程式裏的紅外線編碼換成你遙控器的編碼。

大功告成了,此時按下按鈕後,Arduino 就會遙控紅外線遙控插座,你便可以打開或關閉電器的電源囉。

假如你有 Ethernet Shield、Wi-Fi Shield 或者是藍芽擴充模組,你只要利用 Arduino 和紅外線遙控插座,然後再寫個手機 App 便可以利用手機來遙控家電的開關了。這部份就留給你當作功課了。

註1: IRRemote Library 可由以下連結下載:

https://github.com/coopermaa/Arduino-IRremote

材料表:

1) 一張 Arduino 板子,一條 USB 傳輸線,以及 Arduino IDE 軟體開發環境:
clip_image002clip_image004

2) 一顆 38 kHz 的紅外線接收器 (Infrared Receiver),如 TSOP2438, TSOP4438, PNA4602, FM-8038TM2-5DN

clip_image006
▲ 紅外線接收器(Infrared Receiver)

3) 一顆發射波長為 940nm (nanometer, 奈米) 的紅外線發射器
clip_image007

4) 一個紅外線遙控插座 (可在露天或淘寶買到)

clip_image009

上傳與下載檔案

在熟悉 Dropbox 的認證程序 (Authentication) 後,接著我們來學習如何上傳、條列與下載檔案。

你可以拿底下的範本來練習 (來自 Dropbox Python SDK Docs):

有關如何取得 App key 與 App secret,請參考「建立 app 取得 App key 與 App Secret」一文

上傳檔案

檔案的上傳很簡單:

put_file 這個 method 需要 2 個參數,第 1 個參數指定檔案在 Dropbox 上的存放路徑,第 2 個參數是一個 file object,也可以是 string。如果成功上傳,sample.txt 會被放在 app folder 或者 Dropbox 的根目錄下 (根據你的 app 的 access type 而定)。在 response 中,會有剛剛上傳的檔案的 metadata,內容會像這樣:

條列檔案或資料夾的 metadata

假設使用者 app folder 的檔案結構如下,裏面包含一個空的資料夾 Sample Folder 以及剛剛上傳的 sample.txt:

image

我們可以針對檔案或資料夾呼叫 metadata:

就會得到類似這樣的結果:

從 metadata 中你可以獲得很多資訊,例如完整的檔案路徑 (path),file sizes (bytes),上次修改日期 (modified) 等。

假如要知道資料夾有沒有變動,我們要自行保存並比較 hash。

下載檔案

檔案的下載也很簡單,只要呼叫 get_file_and_metadata:

get_file_and_metadata 會傳回兩個值,一個是檔案的資料,另一個是檔案的 metadata。你必須呼叫 .read() 才能取得檔案的內容。

總結

底下是本文的完整程式碼,使用之前記得先建一個 sample.txt,並且輸入你的 app ket, app secret 與 access type 。

參考資料

2012年12月18日 星期二

Dropbox SDK 範例中文支援

前幾天把玩了一下 Dropbox SDK 範例,有網友反應,說 Dropbox 官方的 web_upload_app.py 是可以上傳檔案到 Dropbox,但是如果檔名裏有中文,上傳就會失敗。我發現,不只 web_upload_app.py,cli_client.py 也有同樣的問題。

我做了一個新的版本,用這個版本,現在就算檔名有中文也沒問題了。你可以點底下的連結下載檔案:

cli_client.py

web_upload_app.py

我是拿 dropbox-python-sdk-1.5.1 的版本來改的,底下摘要說明我修改的地方:

cli_client.py

這支程式我只動到兩三行,全部都在 DropboxTerm 的 do_put() method 裏。新舊版程式碼對照如下 (註: 簡單起見,底下拿掉了程式文件說明):

舊版:

新版:

web_upload_app.py

這支程式只動到 ExampleHandler 的 upload_page() method。新舊版程式碼對照如下:

舊版:

新版:

參考資料

2012年12月17日 星期一

Authentication

這篇說明如何用 Python SDK 去跟 Dropbox 進行認證。Dropbox 用的認證通訊協定是 OAuth 1.0 (Open Authentication Protocol)。網路上有很多的資料和 libraries 可以讓你用 OAuth 去跟 Dropbox 認證,但我們不必從零開始,因為 Dropbox 提供的 Python SDK 很簡單,只要三個步驟就可以搞定。

註: 本文內容大部份取自 Dropbox developers 網站

在開始之前,我們必須先做兩件準備工作:

第 1 件: 準備 App key 和 App secret

首先,你必須準備好 app key 和 app secret 以及 app 所用的 access type:

# Get your app key and secret from the Dropbox developer website
APP_KEY = 'INSERT_APP_KEY_HERE'
APP_SECRET = 'INSERT_SECRET_HERE'

# ACCESS_TYPE should be 'dropbox' or 'app_folder' as configured for your app
ACCESS_TYPE = 'INSERT_ACCESS_TYPE_HERE'
有關如何取得 App key 與 App secret,請參考「建立 app 取得 App key 與 App Secret」一文。
第 2 件: 建立認證用的 session 物件

接著我們必須建立一個 session 物件。session 物件主要是負責認證的工作。在建立 session 物件時,記得把 App key, App secret 和 access type 一併傳入,同時引用 Dropbox SDK 的 libraries:

# Include the Dropbox SDK libraries
from dropbox import client, rest, session

# Create a session object for holding OAuth authentication info
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
前面提到,認證只要三個步驟,這三個步驟是:
1. 取得 request token
2. 使用者授權給 reqeust token
3. 用 request token 來交換 access token
底下說明分別說明:
Step 1: 取得 request token

取得 request token 的方法很簡單,只要呼叫 obtain_request_token 這個 SDK method 即可:

request_token = sess.obtain_request_token()
Step 2: 使用者授權給 reqeust token

取得 request token 後,接著就要請使用者授權給 app。方法是導引使用者到 Dropbox 網站取得他的同意,request token 要傳到 build_authorize_url 建立一個授權用的 URL,像這樣:

url = sess.build_authorize_url(request_token)
print "url:", url
print "Please visit this website and press the 'Allow' button, then hit 'Enter' here."
raw_input()

上面只是印出 URL 然後請使用者在授權完畢後按個 Enter 鍵,這是為了方便說明,在實際的應用中,通常我們會直接顯示 Dropbox 的認證網頁,而且可能會順便傳入一個 callback URL,以便在使用者同意授權之後就直接跳轉回到你的應用程式。

當使用者瀏覽 build_authorize_url 產生的 URL 時,Dropbox 會確認使用者以他的帳戶登入,並且呈現一個像底下這樣徵詢同意的畫面:

image

為了避免有心人士非法取得授權,Dropbox 提供的 requst token 使用壽命只有 5 分鐘,所以如果使用者沒有在 5 分鐘之內授權,request token 就會失效,必須重新取得。

Step 3: 用 request token 來交換 access token

一旦取得使用者的授權,我們就可以拿 request token 來交換 access token,方法是透過 obtain_access_token 這個 SDK method:

# This will fail if the user didn't visit the above URL and hit 'Allow'
access_token = sess.obtain_access_token(request_token)

access token 就是 app 之後用來向 Dropbox 發任何 API requests 所需的,必須妥善保存。如果把 access token 保存起來的話,你就不需要再重覆前面這些步驟,除非使用者重新安裝你的 app。

好了,認證工作完成後,接下來就簡單了,當你要存取使用者的 Dropbox 資源時,只要把 session 物件傳給 DropboxClient 就可以了。例如,當我們呼叫 account_info 時,這個 method 就會回傳一個以 dictionary 保存的使用者的帳戶資訊:

client = client.DropboxClient(sess)
print "linked account:", client.account_info()

底下是用 pprint 印出帳戶資訊的一個例子:

image

總結

當你看到這邊,你就已經學會 Dropbox API 的認證,這是使用 Dropbox API 最基本而且也是最重要的一堂課。底下是完整的範例:

參考資料

2012年12月13日 星期四

把玩 Dropbox SDK 範例

Dropbox 官方 Python SDK 附帶了一些範例,位於 example 資料夾中:

image

其中 cli_client.py 是一個 Dropbox 的指令介面工具,而 web_upload_app.py 則可以讓你透過 Web 上傳檔案到 Dropbox,這兩個範例很適合入門,我們來看怎麼使用這兩個範例。

設定 App key 與 App secret

要執行這些範例,我們需要修改範例程式填入事先申請的 App key 與 App secret,並且輸入 app 所用的 access type:

# XXX Fill in your consumer key and secret below
# You can find these at
http://www.dropbox.com/developers/apps
APP_KEY = 'XXX'
APP_SECRET = 'XXX'
ACCESS_TYPE = 'app_folder' # should be 'dropbox' or 'app_folder' as configured for your app

有關如何取得 App key 與 App secret,請參考「建立 app 取得 App key 與 App Secret」一文。

cli_client.py

cli_client.py 是一個 Dropbox 的指令介面工具,可以讓使用者以指令的方式上傳下載檔案。cli_client.py 的使用方法大致如下:

Step 1: 執行方式:

python cli_client.py

Step 2: 載入程式後,可以下 help 指令看有哪些指令可用:

image

Step 3: 第一次使用必須輸入 login 進行登入:

image

如上圖紅框處,輸入 login 後會自動產生一個 URL,請複製貼到瀏覽器上訪問這個 URL,接著 Dropbox 會詢問你要不要授權給 app,此時請點選 Allow:

image

授權後,網頁會出現成功的訊息:

image

Step 4: 回到 cli_client.py 的畫面,按下 Enter 鍵,這時候 Dropbox 會出多 Apps > a-demo-app 這一層資料夾:

image

Step 5: 之後便可以下指令來操作使用者的 a-demo-app 這個資料夾的內容了。你可以下 account_info 指令取得帳戶資訊:

image

下載檔案要用 get 指令,上傳檔案用 put 指令,要刪除檔案或資料夾用 rm 指令。至於指令的用法請用 help 指令查看說明文件。

web_upload_app.py

web_upload_app.py 是一個可以讓你透過 Web 上傳檔案到 Dropbox 的工具。web_upload_app.py 的使用方法大致如下:

Step 1: 執行方式:

python web_upload_app.py

執行後,程式會要求你打開瀏覽器連到 http://localhost:8000

image
▲ Web Server 預設開啟在 port 8000,你可以再加一個參數自行決定要用哪個 port number

Step 2: 打開瀏覽器連到 http://localhost:8000

image

Step 3: 一樣,Dropbox 會詢問你要不要授權給 app,此時請點選 Allow:

 image

Step 4: 通過授權後,會看到一個上傳檔案用的網頁介面:

image

在這個網頁介面上,你可以上傳檔案,例如我上傳了一個 Main.c:

image

上傳完畢後,過沒多久,我的 Dropbox 就同步收到剛剛上傳的檔案了。(檔案路徑會是在 Dropbox 的 Apps > a-demo-app > Main.c)

在原來的 web_upload_app.py 視窗中,你可以看到所有的 HTTP Requests:

image

參考資料