You are on page 1of 45

財團法人資訊工業策進 遠端觸控遙控車

專題報告書

遠端觸控遙控車

班級:SI-701
組別:第四組
參與同學: 97971002 宋昀融
97971004 呂岳儒
97971012 董世文
97971018 曾一之

1
財團法人資訊工業策進 遠端觸控遙控車

專題 期末報 告內容 目次

1、摘要.........................................................................................................................................3
2、功能與構想 ...........................................................................................................................4
2.1 動機與目標....................................................................................................................4
2.2 功能描述........................................................................................................................4
3、系統硬體架構.........................................................................................................................5
3.1 硬體規格........................................................................................................................5
3.2 硬體建置步驟................................................................................................................8
4、系統軟體架構.......................................................................................................................10
4.1 軟體平台架設與設定..................................................................................................10
4.2 軟體架構......................................................................................................................11
4.3 軟體模組分析..............................................................................................................11
5、系統實作...............................................................................................................................12
5.1 系統實作內容..............................................................................................................12
5.2 遭遇問題與其解決方法..............................................................................................12
5.3 期末預期成果..............................................................................................................13
5.4 實際進度與計畫差異之說明......................................................................................14
6、成果操作與展示
6.1 安裝與設定..................................................................................................................15
6.2 操作與展示..................................................................................................................17
7、自我評估…...…………………………………………………………………………….. 19
8、參考資料…...…...………………...………………………………………………..……...19
附錄: 使用手冊、程式碼等………………………………………………………………….20

2
財團法人資訊工業策進 遠端觸控遙控車

1. 摘要

由於市面上有一台頗受大家喜愛的掌上型遊戲機,那就是任天堂的NDSLite,因為多樣化

的操控介面,遊戲的操作可採用十字鈕,或者是使用觸控螢幕,還有內建軟體《塗鴉聊天

室》可與通信距離內使用同一聊天室的 NDS Lite 玩家互傳圖文資料。雖然NDS Lite 主

機中只提供日文假名、英文、西歐語系文字、數字與符號的虛擬鍵盤,並未內建中文或漢

字輸入功能,但仍舊可以透過塗鴉的功能傳輸手寫的文字與圖形,都是利用觸控面板來完

成。

利用掌上型遊戲機NDSLite以上的概念,利用觸控筆配合觸控面板來完成遊戲的破

關,就是它的一大特色和賣點,所以我們是想利用觸控的玩法,從遊戲裡拿到現實生活,

去操控一台實體的遙控車。

市面上賣的GPS衛星導航,都有行車記錄暨車輛監控的功能,可以掌握車子移動的速

度、現在所在位置,甚至還能設定我的最愛(經常行走的路線),方便下一次出發前,衛星

導航不需要再做設定車子就能按照衛星導航先前紀錄的路線去跑,就是記憶軌跡路線的功

能。

3
財團法人資訊工業策進 遠端觸控遙控車

2. 功能與構想
2.1 動機與目標
2.1.1 動機 :
1、抒發生活上的壓力:
因為消費性產品的排行榜上,娛樂總是居高不下的,休閒娛樂對於國
人是相當重要的,因為在繁榮的都市生活,每一位忙碌的上班族,總
是加班還是加班,如果上班的時候又不順利,又加上被主管訓話,心
情沮喪,等到下班~遊戲機器便成為抒發壓力的一個好選擇。

2、想做出不同新鮮感的玩具:
因為市面上的遙控車幾乎都是利用遙控器的電波來操控遙控車,方向
鍵和前進倒退鍵通常都是做成分別的搖桿上來操作,在操控的方便性
和簡單性都還是有待加強,甚至在遙控車的記憶軌跡路線也是可以做
一個新的突破。
2.1.2 目標 :
1、觸控筆 touch 到 ARM9 的觸控面板算出座標。
2、用觸控筆在面板上畫出車子行走路線,並透過 8051 去控制 RF 發射訊號給
遙控車。
3、車子接收到傳送的 RF 訊號後,就去驅動馬達運作。
4、並可依需求去記憶規劃路線。

2.2 功能描述

1、繪製行徑軌跡:藉由 ARM 板上的觸控螢幕畫出遙控車的行徑軌跡。

2、將ARM9和8051連接:將螢幕上繪製出的軌跡線轉換成資料,透過ARM
4
財團法人資訊工業策進 遠端觸控遙控車

9的RS-232的UART傳輸給8051的UART接收。

3、車子的移動:8051收到資料去控制馬達轉動,可以達到前進、後退、左轉、

右轉的動作。

4、記憶路線:當觸控螢幕畫出遙控車的行徑軌跡,再 Compiler 成執行檔存到 SD_CA

RD 裡面,將車子移到起始點,再去 QT 視窗點選到 SD_CA

RD 裡去開檔案,使車子沿著記憶路線到指定位置。

3. 系統硬體架構

3.1 硬體規格

3.1.1 ARM9_DMA_2440 開發平台

平台硬體配置

5
財團法人資訊工業策進 遠端觸控遙控車

• 中央處理器

CPU:Samsung S3C2440A,核心 ARM920T,典型主頻 400MHz,最高可達 533MHz 。

• 外部記憶體

SDRAM:64MB,Clock Frequency 100MHz—133MHz。

NOR FLASH:2MB NOR FLASH,用於存放 bootloader。

NAND FLASH:64MB,相容 16MB,32MB,64MB,128MB。

• 電源介面

採用 5V,1.5A 外置電源供電,內部採用 LDO 的方式設計。

• 網路介面

一個 10M Ethernet,採用 CS8900A-CQ3,帶指示燈 RJ-45 介面。

一個 10/100M Ethernet,採用 DM9000E,帶指示燈 RJ-45 介面。

• USB 介面

一個 HOST USB1.1 介面,採用自恢復保險器件保護對外供電系統。

一個 Device USB1.1 介面。

• 串列埠

兩個標準串列埠,一個複用串列埠(與 Irda 複用)。

擴充 1 通道 Full-Modem 串列埠。

• 音效介面

採用 IIS 介面晶片 UDA1341,立體聲音效輸出介面可接耳機或音箱;支援錄音,底板

有音效輸入介面可接麥克風。

• 紅外通訊介面

採用高靈敏度 RPM851A 紅外收發模組,標準配置,和串列埠 3 複用。

• CMOS SENSOR 攝影機介面

底板上內置一個 130 萬像素的 CMOS SENSOR 攝影機,可直接攝影並在液晶螢幕上

6
財團法人資訊工業策進 遠端觸控遙控車

顯示,並有一個 2.0mm 間距雙排插座用作攝影機擴充,這個擴充介面可連接其他型

號的 CMOS SENSOR 攝影機,支援的標準為 ITU-R BT.601/656 YCBCR 8-bit standard。

• LCD 介面

相容 3.3V/5V 供電 LCD 螢幕。

系統平台配 256K 色 480x272 /4.3 英寸 Sharp TFT 液晶螢幕,附觸控功能。

支援彩色 TFT 液晶螢幕,尺吋從 3.5 吋到 10.4 吋,板上可供 TFT LCD 逆變器,電源

(+5V)。

• Touch 介面

一個觸控螢幕控制器(四線電阻式)。

• VGA 介面

可直接連接各種 VGA 介面的 CRT 顯示器或液晶顯示器,帶對比度微調電位器。

• SD 卡介面

一個,支援 SD/MMC 和 SDIO 設備,存儲可支援至 4G SD 卡。

• CF 卡介面

一個,工作在 TrueIDE 模式。

• IDE 介面

一個,可直接掛接硬碟。

• JTAG 介面

ARM 標準 20PIN JTAG 介面。

• Reset 電路

採用手動重置和晶片重置相結合的方式,晶片採用 MAX811,重置穩定可靠。

• 平台其他功能

*四個除錯指示 LED。

*一個 CF 卡指示 LED。

*一個硬碟指示 LED。

*一個電源指示 LED。
7
財團法人資訊工業策進 遠端觸控遙控車

*矩陣鍵盤:8 個按鍵,可進行鍵盤模擬。

*ADC 轉換器:8 通道 10 bit 精度 ADC,其中一路硬體設計為可調,其餘拉出。

3.1.2 8051 單晶片實習板

1、AT89C51ED2 為 8 位元微控制器,內部程式記憶體為 64Mbytes,SRAM 有 1792

bytes,工作頻率可達 60MHz。

2、不需要透過燒錄器,由 RS-232 串列埠(COM 埠)接收電腦傳送的執行檔。

3、實習板包含六個單元:

(1) 8 顆 LED。

(2) 1 顆七段顯示器。

(3) LCD 模組。

(4) 8Bit Dip Switch,做簡易的 IO 控制。

(5) 1 顆蜂鳴器。

(6) RS-232 串列傳輸。

每個單元都有固定的 IO 控制動作。

3.2 硬體建置步驟:

1、首先將 ARM 板與 8051 用 RS-232 連接。

2、將 8051 的電源端(+9V)連接至遙控模組上,以提供遙控器所需之電源。 後退 P11

3、再將 RF 遙控模組上的前、後、左、右信號線與 8051 的(P10~P13)連接,以達到控制遙

控車上、下、左、右的功能。(如下圖)
前進 P10

右轉 P13

左轉 P12
財團法人資訊工業策進 遠端觸控遙控車

(8051 電路圖 )

9
財團法人資訊工業策進 遠端觸控遙控車

(8051 電路設計製作 )

4. 系統軟體架構
4.1 軟體平台架設與設定
4.1.1 在 Linux 上安裝 Embedded QT
a. 在 Trolltech 下載免費的 QT Embedded 版本目前較穩定版本是 3.0.0,建立家目錄並
在此解壓縮
$mkdir EMBEDDED-QT

$cd EMBEDDED-QT
$cp ../*.tar.gz .
$for i in *.tar.gz; do tar vxfz
$I; done
b. 在 bash 下用 pwd 來確定當前的目錄:

$pwd

/EMBEDDED-QT/qt-embedded-free-2.3.1
c. 設定 QTDIR 的遠景

10
財團法人資訊工業策進 遠端觸控遙控車

$export QTDIR=/EMBEDDED-QT/qt-embedded-free-2.3.1

$export LD_LIBRARY_PATH=/EMBEDDED-QT/qt-

embedded-free-2.3.1/lib:$LD_LIBRARY_PATH
d. 等 make 完成,就已經把 embedded qt 安裝成功了
$mak
e. 再將 QT 多餘的部分 strip ,就可以開始使用

$strip –R .note –R .comment bin/*

$strip –R .note –R .comment

$QTDIR/lib/libqte.so*

$QTDIR/lib/libqpe.so*

$strip –R .note –R .comment

$plugins/*/*

4.2 軟體架構
1、撰寫觸控程式:在 Linux OS 平台下撰寫螢幕觸控介面程式,作為控制遙控車行
徑軌跡的控制端。
2、撰寫 UART 程式模組:將觸控介面上的觸控點的每一點座標的位移量資料,傳
送至 Linux Kernel Module 中的 UART Module 作資料處理,並透過 RS-232 傳輸
至 8051 控制板上。
3、撰寫 8051 控制程式:藉由 8051 控制程式與接收到的 RS-232 資料,來操控遙控
車上的馬達控制。

11
財團法人資訊工業策進 遠端觸控遙控車

4.3 軟體模組分析

5. 系統實作
5.1 系統實作內容
硬體的部份,我們利用 8051 板,我們將變壓器的電源正負端提供給遙控模組,分別去
控制遙控車的前、後、左、右。軟體的部份,我們則是用 QT 去撰寫視窗的控制介面,
以及 ARM 和 8051 之間的 UART 傳輸,由於串列埠四種工作模式,由於 Mode0 主要
是用來擴充 I / O,Mode1 只有 Data 的傳輸及可設定鮑率,用於電腦 RS232 串列埠,
Mode2 是用於晶片傳輸,Mode3 是比 Mode1 多一個同位偵錯的位元,所以是傳 Data

12
財團法人資訊工業策進 遠端觸控遙控車

加一個同位偵錯。不過較常用的是 Mode1,所以我們是採用 Mode1 的串列埠工作模


式去做。並且鮑率是用 9600 bit/sec 作為傳輸速率。

5.2 遭遇問題與其解決方法

5.2.1 系統整合: 對於程式軟體撰寫的結果,與硬體架構上的設計,在進入整合階段時,

往往會出現許多不可預期的任何可能,例如:軟體無法驅動硬體上的

功能,或是邏輯運算上有瑕疵等;硬體電路在實作上可能出現小區域

性無法導通,或受周遭雜訊的影響而導致硬體在傳輸上的不穩定等。

5.2.2 資料傳輸: 對於硬體上數位訊號的傳輸,所收發的資料是否正確,也是組員們可

能面臨的考驗之一,資料收送的不正確,可能導致硬體的不正常運作,

而無法演算出預期的效果。在 ARM 開發板方面,則是使用 Uart 傳輸

方式再透過遙控車上無線傳輸模組將資料傳出去,期間可能發生的問

題點訊號的穩定性,以即在於是否能夠在觸控螢幕產生資料位移的第

一時間,將訊號正確傳至遙控車上。

5.2.3 演算法效能: 程式演算法方面,則是為了使遙控車能夠在最短時間內行走至指定

位置;此部份演算法即是將觸控面板的座標位置轉換成位移資料傳輸

至遙控車上,由遙控車收到的位移資料轉換為驅動馬達正反轉的訊

號,目前 ARM 開發板傳送給遙控車的訊號是否可正確執行,還是組

員們所必須探討的。

5.2.4 訊號接收不良: 本專案在無線通訊的操作上有許多方式,如:紅外線傳輸模組與

13
財團法人資訊工業策進 遠端觸控遙控車

藍芽傳輸模組,期間遭遇的可能問題有以下幾點,如紅外線在收發階段時所考慮

到的傳輸距離,在超出限定距離的範圍之下,可能導致紅外光波長的

發散效應,或是期間遇到實體阻礙,而可能導致光訊號產生所謂的繞

射現象,而降低傳輸的訊號;藍芽傳輸模組也有傳輸距離的限制,都

會造成通訊的不穩定。

5.2.5 驅動馬達: 目前遙控車安裝的是直流馬達,可能產生控制不易的問題,即是馬達

已停止運轉但輪胎持續轉動造成遙控車行逕方向與觸控面板傳送資訊

不一致的情形。

5.2.6 解決方法

5.2.6.1 尋找較佳無線資料傳輸的方式: 資料傳輸的方式種類盛多,在 ARM 開發板傳

送資料的概念上,若要簡化連接 ARM 板的方式以及避面撰寫硬體驅動

程式,可選擇無限藍芽轉 RS232 的傳輸模組,其中此法也牽涉到硬體成本問題;由

於遙控車上本來就有無線傳輸裝置其頻率為 40MHz,目前操控上沒有太大

問題,故本專案採用此方式。

5.2.6.2 尋找其它更佳的演算法: 初步的演算法若無法顯現出預期的效果,則需將

演算法改良至最佳化,或是尋求其他更好的路徑演算法取代之。

5.2.6.3 使用步進馬達: 使用步進馬達可以有效改善直流馬達的問題,更精密的控

制馬達轉動與控制遙控車輪胎轉動,達到正確控制遙控車行逕方向。

5.3 期末預期成果

5.3.1 完整的呈現專題內容 :期望完成系統建置、軟體設計、硬體實作等目標。

5.3.1.1 系統的建置 :完成提案報告書的規劃


14
財團法人資訊工業策進 遠端觸控遙控車

1、將 ARM 開發板觸控螢幕上的位移資料透過藍芽傳輸裝置傳遞到 8051 開

發板。

2、再由 8051 將資訊傳遞給遙控器使得遙控車移動至正確位置。

5.3.1.2 軟體的應用與規劃 :

1、完成 ARM 開發板觸控螢幕的軟體設計。

2、完成資料傳送與接收的軟體設計。

3、完成遙控器驅動的單晶片軟體設計。

5.3.1.3 硬體的實作 :

1、完成遙控器裝置與 8051 開發板的連接。

2、完成 8051 開發版與 ARM 開發板的連接。

5.4 實際進度與計畫之差異

15
財團法人資訊工業策進 遠端觸控遙控車

6. 成果操作與展示

6.1 安裝與設定

1、安裝的軟體如下:

1-1 Linux 平台部分

Tmake-1.11

Qt / Embedded-2.3.10

Qt-X11-2.3.2

Qtopia-Free-Source 2.1.1
16
財團法人資訊工業策進 遠端觸控遙控車

1-2 8051MCU 部分—

Keil C

2、Qt-X11 環境變數設定

export QTDIR=/home/iii/qt-2.3.2

export TMAKEDIR=/home/iii/tmake-1.11

export TMAKEPATH=$TMAKEDIR/lib/linux-g++

export PATH=$QTDIR/bin:$TMAKEDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib

export QVFB=/home/iii/qt-2.3.2 tools/qvfb

3、Qt-X11 Library 編譯—

$ cd $QTDIR

$ ./configure –no-xft

$ make

4、QVFB 編譯

$ cd $QVFB

$ tmake–o Makefileqvfb.pro
17
財團法人資訊工業策進 遠端觸控遙控車

$ make

5、Qt / Embedded 環境變數設定

export QTDIR=/home/iii/qt-2.3.10

export QPEDIR=/home/iii/qtopia-free-2.1.1

export TMAKEDIR=/home/iii/tmake-1.11

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++

export PATH=$QTDIR/bin:$TMAKEDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib

6、Qt / Embedded 編譯

$ mkdir $QTDIR/bin

$ cp /home/iii/qt-2.3.2/bin/uic $QTDIR/bin/

$ cp $QPEDIR/src/qt/qconfig-qpe.h$QTDIR/src/tools/

$ cd $QTDIR

$ ./configure –system-jpeg –gif –qvfb–qconfig qpe –depths 4,8,16,32

$ make

18
財團法人資訊工業策進 遠端觸控遙控車

6.2 操作與展示

1. 在 UI 介面上作路徑規劃

2. 位移資料經由 RS-232 傳輸到 8051 單晶片

19
財團法人資訊工業策進 遠端觸控遙控車

3. 8051 單晶片將收到的資料轉換成輸出控制訊號

4. 遙控車收到 RF 訊號後驅動馬達動作

20
財團法人資訊工業策進 遠端觸控遙控車

7. 自我評估
1、目前現況 (1)硬體:已完成自製的焊接電路板,作為遙控車與 ARM 之間溝通的橋梁。
(2)軟體:目前已完成 QT 路線規劃的程式、UART 傳送資料的程式,以及
8051 單晶片 UART 接收程式與輸出控制遙控車訊號程式。
(3)系統:QT/Embedded 的系統環境編譯,目前尚未編譯完成。
2、未來發展性:(1)、利用觸控面板的操控玩法,來取代現有的機械式元件操作。
(2)、路線規劃未來可以應用在很多地方,如工廠的生產線控管,以及餐
廳的送餐路線規劃。

8. 參考資料
8.1 ARM9 S3C2440 (Linux 及 MiniGUI 上層應用實驗篇)
8.2 ARM9 S3C2440 (ADS 應用實驗篇)
8.3 Linux 程式設計 教學手冊 (第三版)
8.4 精通 QT 4
8.5 嵌入式 Linux 程式設計(修定第二版)
8.6 單晶片 8051 實作入門(最新版)

21
財團法人資訊工業策進 遠端觸控遙控車

附錄:使用手冊、程式碼等
1 使用手冊
1.1 畫面操作 :在 QT 視窗內,按滑鼠的左鍵拖曳作路線的規劃。
1.2 功能操作:
(1)、儲存圖片:按選單的 save map 作儲存檔案格式的選擇,選擇好欲儲存的檔
案格式後,再輸入檔案名稱即可。
(2)、儲存路徑:點選功能鍵上的 save path 即可將路徑座標儲存。
(3)、執行重覆路徑:點選功能鍵上的 replay 即可將儲存的路徑座標還原 QT 視
窗並送出訊號。
(4)、清除畫面:點選功能鍵上的 clear screen,即可將 QT 視窗畫面殘留路線清除。

2 程式碼
2.1 (8051 程式碼)

#include <AT89X51.h>

unsigned char TABLE[]={0x01,0x02,0x04,0x08,0x05,0x09,0x06,0x0a};

int k=0,m=0;

char n=' ',z=' ';

void delay(unsigned int count)


22
財團法人資訊工業策進 遠端觸控遙控車

while(count>0)

count--;

void mini_board(void)

P0=0xef; //掃描第 1 行

if(P0_0==0) //檢查第 B 列,若是 P1=1

z='7';

else if(P0_1==0)

z='8';

else if(P0_2==0)

z='9';

if(z=='7'||z=='8'||z=='9')

goto end;

P0=0xdf;

if(P0_0==0)

z='4';

else if(P0_2==0)

z='6';
23
財團法人資訊工業策進 遠端觸控遙控車

if(z=='4'||z=='6')

goto end;

P0=0xbf;

if(P0_0==0)

z='1';

else if(P0_1==0)

z='2';

else if(P0_2==0)

z='3';

if(z=='1'||z=='2'||z=='3')

goto end;

m=0;

end :

m=1;

void switch_case(void)

int i=0;

switch(n)

{
24
財團法人資訊工業策進 遠端觸控遙控車

case'8' : //鍵盤的 8

P1=~TABLE[i];

break;

case'2' : //鍵盤的 2

P1=~TABLE[i+1];

break;

case'4' : //鍵盤的 4

P1=~TABLE[i+2];

break;

case'6' : //鍵盤的 6

P1=~TABLE[i+3];

break;

case'7' : //鍵盤的 7

P1=~TABLE[i+4];

break;

case'9' : //鍵盤的 9

P1=~TABLE[i+5];

break;

case'1' : //鍵盤的 1

P1=~TABLE[i+6];
25
財團法人資訊工業策進 遠端觸控遙控車

break;

case'3' : //鍵盤的 3

P1=~TABLE[i+7];

break;

void UART(int BPS) //串列環境及鮑率設定

SCON = 0x50; //設定串列傳輸為模式 1 及致能接收

TMOD = 0x20; //設定計時器 1 為模式 2

TH1 = 256-(28800/BPS); //設計時器決定串列傳輸鮑率

TR1 = 1; //開始計時

main()

UART(9600); //設定串列環境及鮑率

P1=0xff;

delay(30000);

P1=0x55;
26
財團法人資訊工業策進 遠端觸控遙控車

delay(30000);

P1=0x00;

delay(30000);

P1=0xff;

while(1) //重覆執行

mini_board();

if(RI!=0)

RI=0; //若 RI=1 表示已接收完畢,令 RI=0

n=SBUF;

switch_case();

delay(20000);

else if(m==1)

n=z;

switch_case();

while ((P0|0xf0)!=0xff);//若 P00~P03≠1111 表示未放開按鍵,自轉等待


27
財團法人資訊工業策進 遠端觸控遙控車

P1=0xff;

z=' ';

else

P1=0xff;

2.2 UART 程式碼:


#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <termios.h>

#include <stdio.h>

#define BAUDRATE B9600

#define MODEMDEVICE "/dev/ttyS1"

#define _POSIX_SOURCE 1

#define STOP '@'

int main(int argc,char *argv[])

28
財團法人資訊工業策進 遠端觸控遙控車

int fd, c=0, res;

struct termios oldtio, newtio;

char ch;

static char s1[20];

fd = open(MODEMDEVICE, O_RDWR|O_NOCTTY);

if (fd < 0) {

perror(MODEMDEVICE);

exit(1);

tcgetattr(fd, &oldtio);

bzero(&newtio, sizeof(newtio));

newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;

newtio.c_iflag = IGNPAR;

newtio.c_oflag = 0;

newtio.c_lflag = ICANON;

29
財團法人資訊工業策進 遠端觸控遙控車

tcflush(fd, TCIFLUSH);

tcsetattr(fd, TCSANOW, &newtio);

close(fd);

tcsetattr(fd, TCSANOW, &oldtio);

return 0;

2.3 QT 程式碼:

2.3.1 main.cpp

#include "RemoContCar.h"

#include <qapplication.h>

int main( int argc, char **argv )

QApplication a( argc, argv );

REMOContCar RemoContCar;

RemoContCar.resize( 500, 372 );

RemoContCar.setCaption("Remote Control : BMW_Z8");

a.setMainWidget( &RemoContCar );

if ( QApplication::desktop()->width() > 550

30
財團法人資訊工業策進 遠端觸控遙控車

&& QApplication::desktop()->height() > 366 )

RemoContCar.show();

else

RemoContCar.showMaximized();

return a.exec();

2.3.2 RemoContCar.cpp

#include "RemoContCar.h"

#include <qapplication.h>

#include <qevent.h>

#include <qpainter.h>

#include <qtoolbar.h>

#include <qtoolbutton.h>

#include <qspinbox.h>

#include <qtooltip.h>

#include <qrect.h>

#include <qpoint.h>

#include <qcolordialog.h>

#include <qfiledialog.h>

31
財團法人資訊工業策進 遠端觸控遙控車

#include <qcursor.h>

#include <qimage.h>

#include <qstrlist.h>

#include <qpopupmenu.h>

#include <qintdict.h>

#include <string>

#include <cstdlib>

#include <qlabel.h>

#include <qpixmap.h>

const bool no_writing = FALSE;

Canvas::Canvas( QWidget *parent, const char *name )

: QWidget( parent, name, WNorthWestGravity ), pen( Qt::blue, 1 ), polyline(3),

mousePressed( FALSE ), buffer( width(), height() )

if ((qApp->argc() > 0) && !buffer.load(qApp->argv()[1]))

buffer.fill( colorGroup().base() );

setBackgroundMode( QWidget::PaletteBase );
32
財團法人資訊工業策進 遠端觸控遙控車

#ifndef QT_NO_CURSOR

setCursor( Qt::upArrowCursor ); //ex:

crossCursor,upArrowCursor,pointingHandCursor

#endif

TextLabel1 = new QLabel(this, "TextLabel1");

TextLabel1->setGeometry(QRect(0, 0, 500, 120));

TextLabel1->setText(tr("My Label"));

QPixmap pixmap("z8.xpm");

TextLabel1->setPixmap(pixmap);

TextLabel1->setScaledContents(TRUE);

void Canvas::save( const QString &filename, const QString &format )

if ( !no_writing )

buffer.save( filename, format.upper() );

void Canvas::clearScreen()

33
財團法人資訊工業策進 遠端觸控遙控車

buffer.fill( colorGroup().base() );

repaint( FALSE );

void Canvas::mousePressEvent( QMouseEvent *e )

mousePressed = TRUE;

polyline[2] = polyline[1] = polyline[0] = e->pos();

void Canvas::mouseReleaseEvent( QMouseEvent * )

mousePressed = FALSE;

void Canvas::mouseMoveEvent( QMouseEvent *e )

if ( mousePressed ) {

QPainter painter;

painter.begin( &buffer );
34
財團法人資訊工業策進 遠端觸控遙控車

painter.setPen( pen );

polyline[2] = polyline[1];

polyline[1] = polyline[0];

polyline[0] = e->pos();

painter.drawPolyline( polyline );

painter.end();

QRect r = polyline.boundingRect();

r = r.normalize();

r.setLeft( r.left() - penWidth() );

r.setTop( r.top() - penWidth() );

r.setRight( r.right() + penWidth() );

r.setBottom( r.bottom() + penWidth() );

bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );

static int tmp_x=0,tmp_y=0;

char uart_data[2];

int x = e->x();

int y = e->y();
35
財團法人資訊工業策進 遠端觸控遙控車

int mov_x=x-tmp_x;

int mov_y=y-tmp_y;

std::string buf = "./_uart ";

uart_data[0]='0';

if (mov_x>0 && mov_y<0) // up & right

uart_data[1]='1';

else if(mov_x>0 && mov_y>0) // down & right

uart_data[1]='7';

else if(mov_x<0 && mov_y<0) // up & left

uart_data[1]='3';

else if(mov_x<0 && mov_y>0) // down & left

uart_data[1]='9';

else if(mov_x>0) // right

uart_data[1]='6';

else if(mov_x<0) // left

uart_data[1]='4';

else if(mov_y>0) // down

uart_data[1]='2';

else if(mov_y<0) // up

uart_data[1]='8';
36
財團法人資訊工業策進 遠端觸控遙控車

buf += uart_data;

system(buf.c_str());

tmp_x=x;

tmp_y=y;

void Canvas::resizeEvent( QResizeEvent *e )

QWidget::resizeEvent( e );

int w = width() > buffer.width() ?

width() : buffer.width();

int h = height() > buffer.height() ?

height() : buffer.height();

QPixmap tmp( buffer );

buffer.resize( w, h );
37
財團法人資訊工業策進 遠端觸控遙控車

buffer.fill( colorGroup().base() );

bitBlt( &buffer, 0, 0, &tmp, 0, 0, tmp.width(), tmp.height() );

void Canvas::paintEvent( QPaintEvent *e )

QWidget::paintEvent( e );

QArray<QRect> rects = e->region().rects();

for ( uint i = 0; i < rects.count(); i++ ) {

QRect r = rects[(int)i];

bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );

REMOContCar::REMOContCar( QWidget *parent, const char *name )

: QMainWindow( parent, name )

canvas = new Canvas( this );

setCentralWidget( canvas );
38
財團法人資訊工業策進 遠端觸控遙控車

QToolBar *tools = new QToolBar( this );

bSave = new QToolButton( QPixmap(), "Save", "Save as PNG image", this,

SLOT( slotSave() ), tools );

QToolTip::add( bSave, "Save the Map & Clear Screen" );

bSave->setText( " Save Map " );

tools->addSeparator();

bSavePath = new QToolButton( QPixmap(), "SavePath", "SavePath", this,

SLOT( slotSavePath() ), tools );

QToolTip::add( bSavePath, "Save the Path & Clear Screen" );

bSavePath->setText( " Save Path " );

tools->addSeparator();

bOpen = new QToolButton( QPixmap(), "Open", "Open", this, SLOT(

slotOpen() ), tools);

QToolTip::add( bOpen, "Clear Screen & Replay the Path" );

bOpen->setText( " Replay " );

tools->addSeparator();

39
財團法人資訊工業策進 遠端觸控遙控車

bClear = new QToolButton( QPixmap(), "Clear Screen", "Clear Screen", this,

SLOT( slotClear() ), tools );

QToolTip::add( bClear, "Clear Screen" );

bClear->setText( " Clear Screen " );

tools->addSeparator();

void REMOContCar::slotSave()

QPopupMenu *menu = new QPopupMenu( 0 );

QIntDict<QString> formats;

formats.setAutoDelete( TRUE );

for ( unsigned int i = 0; i < QImageIO::outputFormats().count(); i++ ) {

QString str = QString( QImageIO::outputFormats().at( i ) );

formats.insert( menu->insertItem( QString( "%1..." ).arg( str ) ), new

QString( str ) );

menu->setMouseTracking( TRUE );

int id = menu->exec( bSave->mapToGlobal( QPoint( 0, bSave->height() +

1 ) ) );

40
財團法人資訊工業策進 遠端觸控遙控車

if ( id != -1 ) {

QString format = *formats[ id ];

QString filename = QFileDialog::getSaveFileName( QString::null,

QString( "*.%1" ).arg( format.lower() ), this );

if ( !filename.isEmpty() )

canvas->save( filename, format );

delete menu;

canvas->clearScreen();

void REMOContCar::slotSavePath()

canvas->clearScreen();

void REMOContCar::slotClear()

canvas->clearScreen();

void REMOContCar::slotOpen()

41
財團法人資訊工業策進 遠端觸控遙控車

canvas->clearScreen();

2.3.3 RemoContCar.h

#ifndef REMOCONTCAR_H

#define REMOCONTCAR_H

#include <qmainwindow.h>

#include <qpen.h>

#include <qpoint.h>

#include <qpixmap.h>

#include <qwidget.h>

#include <qstring.h>

#include <qpointarray.h>

class QMouseEvent;

class QResizeEvent;

class QPaintEvent;

class QToolButton;

class QSpinBox;

class QLabel;

42
財團法人資訊工業策進 遠端觸控遙控車

class Canvas : public QWidget

Q_OBJECT

public:

Canvas( QWidget *parent = 0, const char *name = 0 );

int penWidth()

{ return pen.width(); }

void save( const QString &filename, const QString &format );

void clearScreen();

QLabel* TextLabel1;

protected:

void mousePressEvent( QMouseEvent *e );

void mouseReleaseEvent( QMouseEvent *e );

void mouseMoveEvent( QMouseEvent *e );

void resizeEvent( QResizeEvent *e );

void paintEvent( QPaintEvent *e );

43
財團法人資訊工業策進 遠端觸控遙控車

QPen pen;

QPointArray polyline;

bool mousePressed;

QPixmap buffer;

};

class REMOContCar : public QMainWindow

Q_OBJECT

public:

REMOContCar( QWidget *parent = 0, const char *name = 0 );

protected:

Canvas* canvas;

QToolButton *bSave, *bClear , *bOpen, *bSavePath;

protected slots:

void slotSave();

void slotOpen();

void slotClear();

void slotSavePath();

};
44
財團法人資訊工業策進 遠端觸控遙控車

#endif

45