2011年12月1日 星期四

Serial2Keystroke

先前我們提到 Arduino Uno Keyboard 可以讓 Arduino 透過 USB 介面送出按鍵敲擊動作 (keystroke) 給電腦,不過 Arduino Uno Keyboard 目前僅限 Uno 或 Mega 2560 的板子才能使用。假如我們用的是 Duemilanove 或是其它只能走 Serial 通訊的 Arduino 板子,這樣也可以辦得到嗎?答案是可以的。方法是這樣:

基本上這個解法分成兩個部份:

1) 要有一支 Arduino sketch,這支程式負責送字元到 serial port

2) 我們還要一支 Serial-to-Keystroke 的 PC 端工具,這支程式會讀取來自 serial port 上的資料並且負責把資料轉換成 keystrokes

聽起來有點玄嗎?事實上是很簡單的。

下載本文範例及工具

這篇提到的範例跟工具我全部打包好了,你可以點底下的連結下載:

http://goo.gl/itpNS

Hello World

底下是一支很簡單的 Arduino sketch (senda.ino),它會每隔 1 秒鐘送出一個 "Hello World" 字串到 serial port:

請打開 Arduino IDE 把上面這支程式上傳到 Arduino 板子上。

Serial2Keystroke

第二部份是 PC 端的 Serial2Keystroke 工具,如前面說的,這支程式會負責把來自 serial port 的資料轉換成 keystrokes。這支工具是用 Tcl 寫的,程式碼不長,完整程式碼如下:

lappend auto_path [pwd]
package require twapi

# 定義 Serial Port 以及通訊設定
set serialPort COM5:
set iomode "9600,n,8,1"

# 從 Serial Port 收資料
proc GetData {channel} {
    if {[gets $channel line] > 0} {
        puts "Received Data: $line"
        set charOne [string index $line 0]
        set line [string range $line 1 end]
        if {$charOne == "K"} {
            twapi::send_keys $line
        } else {
            twapi::send_input_text $line
            twapi::send_keys ~ ;# send enter keystroke
        }
    }
}

# 開啟 Serial Port
set channel [open $serialPort RDWR]
fconfigure $channel -mode $iomode -blocking 0 -buffering line

# 當 Serial Port 有資料可讀時,自動呼叫 GetData 收資料
fileevent $channel readable [list GetData $channel]

# 進入 Event-Loop 處理 file events
vwait forever

Serial2Keystroke 程式的操作辦法如下,打開一個 DOS 視窗,然後輸入底下的指令執行:

image

接著切到 text editor 視窗,這時候你應該就會看到 text editor 視窗上每一秒鐘會收到一個 Hello World 的字串。

如果要結束 Serial2Keystroke 程式,只要關閉 DOS 視窗或是切到 DOS 視窗後按下 Ctrl + C 就可以中斷程式。

IR2Keystroke

我把 IR2Keystroke 這篇的範例程式重新改寫了一個版本,程式碼如下:

這支程式邏輯是這樣,程式裏面定義了遙控器 left 和 right 鈕的紅外線 key code,在 loop() 中程式會不斷進行紅外線的解碼,假如有收到紅外線訊號,就檢查是否 left 鈕或 right 鈕,如果是 left 鈕就送出 PageDown 的 keystroke,如果是 right 鈕就送出 PageUp 的 keystroke。只要簡單幾個工具,你就可以用 Arduino 來遙控電腦,把電腦當作數位相框來遙控。

因為這支程式會送 PageUp 跟 PageDown 這些特殊鍵,所以程式用 sendKeys() 來發送資料。以送 PageUp 按鍵為例,程式寫法為 sendKeys("{PGUP}”)。關於其它特殊鍵的寫法,請參考 Tcl Windows API extension  這頁的表格。

註:關於線路的接法、IRRemote Library 的安裝辦法跟執行結果 (影片示範) 可以參考 IR2Keystroke 這篇的說明。

後記

提醒一下,在使用 Serial2Keystroke 的時候,要注意一件事,你必須確定 Arduino sketch 跟 Serial2Keystroke.tcl 兩支程式所用的 baud rate 是一樣的。另外,記得也要調整 Serial2Keystroke.tcl 的 serial Port 設定。

參考資料

6 意見:

GCY 提到...

Tcl/Tk看起來很有趣啊啊啊啊之前有想要來研究的說看來這是個契機:)

coopermaa 提到...

我以前整理過一份 "TCL 基本語法與指令" 的文件,你可以參考看看:
http://www.nhu.edu.tw/~cmwu/Lab/TCL.doc

如果你要完整一點的中文資料,可以看 Dai 寫的 Tcl/tk 教學文件:http://blog.got7.org/2009/06/tcltk.html

honkiaa 提到...

喔喔喔喔,你會tcl/tk?,可以教我嗎?

coopermaa 提到...

對啊。我 2004 年就開始接觸 Tcl/Tk 了,我們公司的產品有用到 Tcl/Tk,所以我懂一些。你想學 Tcl/Tk? 哈,沒問題啊,找個時間我教你。:)

GCY 提到...

good!感謝資料寒假來玩:)

coopermaa 提到...

Keep walking! 加油啊。