買書捐殘盟

2011年9月20日 星期二

Google App Inventor - 使用手機的LocationSensor讀取經緯資料

現在的手機只要具備GPS的功能,就可以使用Google App Inventor裡的LocationSensor 來讀取
所在位置的經緯度、高度等資料。


(圖1-軟體介面外型)

部分程式:

其中:
1. [value latitude] -->由Location Sensor傳回的緯度數據
2. [value longitude]-->由Location Sensor 傳回的經度數據
3. LatitudeReport.Text --> 將[value latitude]顯示在(圖1)的緯度欄位
4. LongitudeReport.Text-->將[value longitude]顯示在(圖1)的經度欄位
5. AddressReport.Text-->將[LocationSensor1.CurrentAddress]的結果顯示在位址欄位

至於已知兩處AB的經緯度,如何得知A-B間最短的距離?
我利用:

其中:
其中 為大圓距離, 是地球半徑(6371km),而點 1 經度、緯度分別為 ,點 2 的經度、緯度分別為
其實這只是球面三角餘弦公式的推廣,注意經緯度的度數計算時要轉成徑度,才會計算正確。
d算出來的單位為km.

2011年9月14日 星期三

Google App Inventor- 製作找方位軟體

坊間有一些support Compass的軟體,以圖像的方式做出指北針,操作者可由指針朝北定出方位。

筆者試著以Google App inventor製作一簡易型的指北針,只要您的手機有Orientation Sensor就具備數位指北針的支援。


(圖1)

介面說明:
1. [Compass Test]-軟體標題
2. [CurrentDirection]-標籤文字
3. [TextBox]-存放方位感測器(Orientation Sensor)的方位
4. [CheckDirection]- 按鈕每點一次,可搜尋當前方位角
5. 引用OrientationSensor,並設定為[enable]


※使用AppInventor,介面可使用中文字,但Block Editor僅能使用英文字,設計時須注意。

(圖2)

圖2即Block Edit的程式碼。
由appinventor手冊提供的orientation sensor,偵測到的為數值,介於0~359。
其中:
0: 北方
90: 東方
180: 南方
270: 西方

筆者將數值轉化成文字,使操作的時候較易識別。
-------------------------------
※測試時,操作者將手機任意指向一方位,按下[CheckDirection]按鈕,即馬上顯示該方位的方位角,但無角度顯示,僅以16方位之結果顯示之。
即:
東、西、南、北
東南、東北、東南東、南東南、北北東、東北東
西南、西北、西南西、南南西、西北西、北北西

2011年9月4日 星期日

手機藍芽遙控挖土機



這個遙控的原理承襲前述藍芽遙控的方式,技術上大同小異。
bot裝置參考[Lego.com Mindstorms]部分的接法。
機身略有修改。

2011年9月1日 星期四

VB設計:讓電腦自動偵測SerialPort,並自動與nxt連線

在上一篇[利用藍芽技術,讓電腦可控制NXT主機],當時談到:

在設計時,使用者必須先知道自己的電腦對外連線的輸出埠(Com port)並連結,才能讓電腦透過藍芽連線裝置。

然而,如果能夠設計一程式,讓電腦在開啟軟體後,能夠自動偵測與連結電腦現有的輸出埠,而無須使用者去指定,便能增加其便利性。

換句話說,電腦到底選中哪一個輸出埠,交由軟體自己去尋找與連線,而不再經由使用者去確認與指定。

我的作法是:
ˋ
上圖即VB建構的一個畫面,畫面上方做一個MenuStrip,裡面的item包含Connect 、Disconnect
以及結束。

當按下[connect]的item,程式碼相對應的內容如下:

   Private Sub ComPortConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComPortConnect.Click

Dim com_port As String = ""

For Each sp As String In My.Computer.Ports.SerialPortNames
com_port = sp
Next

SerialPort1.PortName = com_port
SerialPort1.Open()
ConnStatus.Text = com_port + " is Connected"
End Sub
------
其中:
1.ComPortConnect_Click() 代表按下該item後即將完成的動作行為
2. Dim com_port As String ="": 宣告com_port為字串變數,其初始值為空字串
3. For Each sp.....:這一段的敘述,讓電腦自動尋找已建立的com port name有哪些,其結果回傳給sp變數,並指定給com_port
4. SerialPort1.PortName = com_port: 指定SerialPort的PortName為被找到的com_port
5. SerialPort1.Open( ): 開啟該com_port的序列埠
6. ConnStatus是畫面裏頭的文字方塊(TextBox),當連線成功,則在該TextBox顯示COM(x) is connected!

當按下[Disconnect]的item,相對應程式碼如下:


SerialPort1.Close()
ConnStatus.Text = "Wait to connect!"

上述意思是:
把SerialPort開啟的序列埠關閉,並於文字方塊顯示Wait to connect!