先前我們提到 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
聽起來有點玄嗎?事實上是很簡單的。
下載本文範例及工具
這篇提到的範例跟工具我全部打包好了,你可以點底下的連結下載:
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 視窗,然後輸入底下的指令執行:
接著切到 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 設定。
Tcl/Tk看起來很有趣啊啊啊啊之前有想要來研究的說看來這是個契機:)
回覆刪除我以前整理過一份 "TCL 基本語法與指令" 的文件,你可以參考看看:
回覆刪除http://www.nhu.edu.tw/~cmwu/Lab/TCL.doc
如果你要完整一點的中文資料,可以看 Dai 寫的 Tcl/tk 教學文件:http://blog.got7.org/2009/06/tcltk.html
喔喔喔喔,你會tcl/tk?,可以教我嗎?
回覆刪除對啊。我 2004 年就開始接觸 Tcl/Tk 了,我們公司的產品有用到 Tcl/Tk,所以我懂一些。你想學 Tcl/Tk? 哈,沒問題啊,找個時間我教你。:)
回覆刪除good!感謝資料寒假來玩:)
回覆刪除Keep walking! 加油啊。
回覆刪除