tag:blogger.com,1999:blog-91372678884463212792024-02-08T12:41:59.673-08:00CH LEGO BLOG於 2013.12.1 由Yahoo Blog轉移Unknownnoreply@blogger.comBlogger106125tag:blogger.com,1999:blog-9137267888446321279.post-14994611914638382932018-06-20T03:11:00.000-07:002018-06-20T03:11:22.059-07:00以 PFx Brick 運用 Under-actuation 建構具有三個自由度的 LEGO 搬運設備即使<b> <a href="https://www.fxbricks.com/" target="_blank">PFx Brick</a></b> 比起 <a href="https://www.sbrick.com/" target="_blank"><b>SBrick</b></a> 少了兩個 Power Functions Ports, 不過它所具有的多樣化周邊, 包含: 音效 與 燈光, 對 LEGO 的創作者而言, 更增添了創作的空間與樂趣.<br />
<br />
以下的 Demo 影片示範以 PFx Brick 的兩個 Motor Ports 驅動一個具有: 抓取' 抬起' 旋轉等三個動作(自由度)的搬運設備, 包含了兩個主要功能:<br />
<ol>
<li>抓取機構: 將貨物 抓取後抬起 或 放下後釋放 的功能.</li>
<li>旋轉機構: 以 順時針 或 逆時針方向 旋轉抓取機構的功能.</li>
</ol>
<div>
同時配合機構的運作, 再加上音效與燈光等警示效果, 一方面可凸顯不同作業時的特性, 亦能夠模擬真實世界的作業實況, 這些都是 PFx Brick 團隊推出這項產品的企圖心.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/0MMof3mrToQ/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/0MMof3mrToQ?feature=player_embedded" width="480"></iframe></div>
<div>
<br /></div>
<div>
<h2>
<span style="color: blue;">PFx Brick的控制界面設定</span></h2>
<br />
PFx Brick 具有<b><span style="color: red;">兩個 LEGO Power Functions Ports</span></b>, <b><span style="color: red;">一個 8 Channels 的 Lighting Dock</span></b> 以及<b><span style="color: red;">一個外接喇叭</span></b>, 其中 Lighting Dock 目前可以接兩種介面板, 分別是傳統 LED 與 Brickstuff 的高亮度 Pico LED, 前面影片中的警示燈即是使用此種微型 LED 燈.<br />
<br />
PFx Brick 內建 Flash memory 用來儲存 <b>設定資料</b>(Profile) 與 <b>音效檔</b>, 不同於 SBrick 是將 Profile 存放在手機端, 會這樣設計的原因是為了要能夠同時提供 <b>手機</b>(BLE) 與 <b>LEGO IR 遙控器</b>兩種無線控制方式.<br />
<br />
因此, 在手機上所使用的 <b>PFx Mobile App</b> 控制界面也是模擬目前 LEGO 兩種不同類型的 IR 遙控器, 分別如下圖左側的 8879(Speed Remote Control) 與右側的 8885 或 EV3 IR Beacon.<br />
這兩種控制界面都具有對應 LEGO IR 遙控器相同的控制項, 所以當完成了所有控制項的設定並將 Profile 下載至 PFx Brick 之後, 則無論是使用手機 或 IR 遙控器, 操控的方式都將會是一樣.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-sMEfucv2z80/WySzqPeHdEI/AAAAAAAABf8/J-2UsEVVC0w_2YqG6evqI-EwWOFn1aOuACLcBGAs/s1600/PFxBrick_Mobile_App.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="1286" height="352" src="https://1.bp.blogspot.com/-sMEfucv2z80/WySzqPeHdEI/AAAAAAAABf8/J-2UsEVVC0w_2YqG6evqI-EwWOFn1aOuACLcBGAs/s400/PFxBrick_Mobile_App.png" width="400" /></a></div>
<br />
<br />
PFx Brick 的 Profile 透過電腦端的 <b>PFx Desktop APP</b> 進行設定, 在示範影片中採用如下圖的 Dual Joystick 控制界面, 共有 7 個控制項, 分別對應遙控器左' 右兩邊搖桿的前推' 後拉與置中 以及 EV3 Beacon 按鍵等 7 個動作:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-gYayobMVRNE/WyUop1bg3eI/AAAAAAAABgU/wcRThLWXTzcEQJcRwsU73FCFLeYzlY1TwCLcBGAs/s1600/PFx_Grabber_Settings_main.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="760" data-original-width="1280" height="379" src="https://2.bp.blogspot.com/-gYayobMVRNE/WyUop1bg3eI/AAAAAAAABgU/wcRThLWXTzcEQJcRwsU73FCFLeYzlY1TwCLcBGAs/s640/PFx_Grabber_Settings_main.png" width="640" /></a></div>
<br />
<br />
每個控制項包含<span style="color: red;">三種</span>設定項目: <b><span style="color: red;">Motor Action</span></b>' <b><span style="color: red;">Light Action</span></b> 以及 <span style="color: red; font-weight: bold;">Audio</span><span style="color: red;"><b style="color: red;"> </b></span>, 以下就示範影片中兩個主要功能的設定方式進行說明:<br />
<br />
<h3>
(1) 抓取機構設定:</h3>
如下圖, 以控制界面右側的上' 下鍵分別設定為操控: <b>將貨物抓取後抬起</b> 以及 <b>放下貨物後釋放</b> 等兩個 Actions, 這是運用單一馬達完成兩個自由度的動作(也稱為 Underactuated Mechanism), 其中向上鍵的設定內容如下圖右邊 [Edit Action - Right Joystick Forward] 畫面所示:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-OsEoAmOQ1A0/WyUVV1-8WeI/AAAAAAAABgI/RZdDd2QTshsSj3tXahF2iHG_JcuCNEbhwCLcBGAs/s1600/PFxBrick_Grab_and_Lift_settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="568" data-original-width="960" height="377" src="https://4.bp.blogspot.com/-OsEoAmOQ1A0/WyUVV1-8WeI/AAAAAAAABgI/RZdDd2QTshsSj3tXahF2iHG_JcuCNEbhwCLcBGAs/s640/PFxBrick_Grab_and_Lift_settings.png" width="640" /></a></div>
<br />
設定的內容如下:<br />
<ul>
<li><b>Motor Action</b>: 當持續按著向上鍵時, 接在 Port B 的馬達會以 50% 的 Speed 運轉, 此時抓取機構會開始<b>夾住貨物</b>, 一旦夾緊之後隨即<b>將貨物抬起</b>.<br />至於向下鍵的<b> 放下後釋放 </b>反向動作設定, 則只需於 [Right Joystick Forward] 控制項中將 Motor Speed 改成 -50% 即可.</li>
<li><b>Light Action</b>: 當 Motor Action 啟動時, 8 個 Channels 的 Pico LED 會依單' 雙數順序, 以間隔 1 秒的週期交替輪流顯示, 作為抓取動作時的警示燈號.</li>
<li><b>Audio</b>: 當 Motor Action 啟動時, 會以外接喇叭播放 Servo2.wav 音效檔, 作為抓取機構的運轉音效.</li>
</ul>
<br />
當放開按鍵時, 會中止馬達的運轉以及關閉警示燈顯示與音效的播放, 這些動作設定於 [Right Joystick Center] 控制項中: (如下圖)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-QhqZ99uaGp0/WyaDm8clp5I/AAAAAAAABgg/MguE7ZSjG5k5yhmuuplf02jVx-b8zY1VwCLcBGAs/s1600/PFx_Grabber_Settings_RightJoystickCenter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="600" height="332" src="https://4.bp.blogspot.com/-QhqZ99uaGp0/WyaDm8clp5I/AAAAAAAABgg/MguE7ZSjG5k5yhmuuplf02jVx-b8zY1VwCLcBGAs/s400/PFx_Grabber_Settings_RightJoystickCenter.png" width="400" /></a></div>
<br />
<h3>
(2) 旋轉機構設定:</h3>
如下圖, 以控制界面左側的上' 下鍵分別設定為: <b>將機構順時針</b>與 <b>逆時針旋轉</b> 等兩個 Actions, 其中向上鍵的設定內容如下圖左邊 [Edit Action - Left Joystick Forward] 畫面所示:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-D6YET_-b6Vs/Wydla6hM4lI/AAAAAAAABgs/fB07hZ-FNDsGh88a5ZEpERbmzmpPORN8ACLcBGAs/s1600/PFxBrick_Rotation_settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="568" data-original-width="960" height="378" src="https://4.bp.blogspot.com/-D6YET_-b6Vs/Wydla6hM4lI/AAAAAAAABgs/fB07hZ-FNDsGh88a5ZEpERbmzmpPORN8ACLcBGAs/s640/PFxBrick_Rotation_settings.png" width="640" /></a></div>
設定的內容如下:<br />
<ul>
<li><b>Motor Action</b>: 當持續按著向上鍵時, 接在 Port A 的馬達會以 67% 的 Speed 運轉, 此時機構會 <b>往右以順時針方向旋轉</b>.<br />至於向下鍵的<b>逆時針旋轉</b>動作設定, 則需於 [Left Joystick Forward] 控制項中將 Motor Speed 改成 -67% 即可.</li>
<li><b>Light Action</b>: 當 Motor Action 啟動時, 右側的前方向燈(編號: 6' 7' 8) 與 後方向燈(編號 4) 等 4 個 Pico LED 會閃爍顯示, 作為旋轉動作時的方向指示燈號.<br />而向下鍵的逆時針旋轉動作, 則改為使用編號 1' 2' 3 與 5 等 4 個位於左側的 Pico LED.</li>
<li><b>Audio</b>: 當 Motor Action 啟動時, 會以外接喇叭播放 ReverseBeep1.wav 音效檔, 作為旋轉動作時的警示音效.</li>
</ul>
<br />
當放開按鍵時, 會中止馬達的運轉以及關閉警示燈顯示與音效的播放, 這些動作設定於 [Left Joystick Center] 控制項中: (如下圖)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-oUC1mKcQUGY/WydtIN2qJ0I/AAAAAAAABg4/EeCU2iwbZew3cUbXUNrxX1zvv5EZRJBUgCLcBGAs/s1600/PFx_Grabber_Settings_LeftJoystickCenter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="600" height="332" src="https://3.bp.blogspot.com/-oUC1mKcQUGY/WydtIN2qJ0I/AAAAAAAABg4/EeCU2iwbZew3cUbXUNrxX1zvv5EZRJBUgCLcBGAs/s400/PFx_Grabber_Settings_LeftJoystickCenter.png" width="400" /></a></div>
<br />
<h2>
<span style="color: blue;">透過 Underactuation 增加機構自由度(DOF)</span><span style="color: blue;">的方式</span></h2>
<br />
PFx Brick 只有兩個 Motor Ports, 通常以兩個馬達驅動的機構至多僅能有兩個動作 (<b>DOF 自由度</b>), 不過由示範影片中可以看出整個機構實際上共有三個動作: 抓取' 抬起(或 放下' 釋放)與 旋轉, 這是因為在抓取機構中使用了 Under-actuation 的設計: 以一顆馬達來完成兩個動作. 運作的方式參考下圖說明:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-AMGW5zTb3Vs/Wye_SUEgXTI/AAAAAAAABhE/CqMhymrOBNEf8DU57z97ndA_hwAiRy-6wCLcBGAs/s1600/PFxBrick_Grabber_Underactuation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="652" data-original-width="489" height="640" src="https://1.bp.blogspot.com/-AMGW5zTb3Vs/Wye_SUEgXTI/AAAAAAAABhE/CqMhymrOBNEf8DU57z97ndA_hwAiRy-6wCLcBGAs/s640/PFxBrick_Grabber_Underactuation.png" width="480" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
上圖的抓取機構中, <b>輸入齒輪(1) </b>的動力來源為馬達, 再透過 <b>惰齒輪(2) </b>將動力傳遞給 <b>輸出齒輪(3)</b>, 當馬達開始運轉時, <b>輸出齒輪(3) </b>會驅動夾具機構夾緊物品, 而一旦物品被夾緊而造成 <b>輸出齒輪 停滯(halted)</b>時, 原 <b>惰齒輪 </b>的角色將會轉變成 <b>輸出齒輪 </b>將被夾緊的物品舉起, 因此而完成了兩個自由度的動作, 這是克服 PFx Brick 只有兩個 Motor Ports 而增加機構自由度比較簡易的方式.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
另外, 也可以在同一個 Motor Port 上接兩個馬達同時運轉, 不過這樣必須考量運作的協調性, 機構設計上較複雜也更耗費電力. </div>
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-67324545957087522792018-06-05T09:22:00.000-07:002018-06-20T03:06:35.063-07:00PFx Brick - 兼具聲光效果的 LEGO PF 馬達 BLE 控制器雖然目前以藍芽遙控傳統 LEGO Power Functions 馬達的控制器, 最熱門的至少還有 <a href="https://www.sbrick.com/" target="_blank">SBrick</a> 與 <a href="https://buwizz.com/" target="_blank">BuWizz</a> 兩種, 不過位於加拿大的 <a href="https://www.fxbricks.com/" target="_blank">Fx Bricks</a> 在 2017 年透過 Kickstarters 籌資, 也成功推出了另一款能以 BLE 遙控 PF 馬達的控制器: <b><a href="https://www.fxbricks.com/pfxbrick/" target="_blank">PFx Brick</a>,</b> 以下的 Demo 影片, 大致就可以看出 Fx Bricks 團隊何以在已經有強大競爭者的情況下仍然推出這項產品的企圖心.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ioXx4qGi1mI/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/ioXx4qGi1mI?feature=player_embedded" width="480"></iframe></div>
<br />
<br />
如上面影片所展示的效果, 相較於 SBrick 或 BuWizz , 最大的差異在於 PFx Brick 多了 <b>音效</b> 與 <b>燈光 </b>功能, 此外還具有許多獨有的特性, 以下這些就是它的主要亮點:<br />
<br />
<ul>
<li><b>內建 Flash Memory 儲存音效檔 , <span style="color: red;">可以透過外接喇叭<b style="color: black;"><span style="color: red;">直接</span></b>撥放歌曲或音效</span>.</b></li>
<li><b>外接 Lighting 介面, <span style="color: red;">具備 8 組可獨立控制的<b style="color: black;"><span style="color: red;"> channels </span></b><b style="color: black;"><span style="color: red;">顯示</span></b>燈光效果</span>, 除了可接傳統的 LED 之外, 也支援 <a href="https://www.brickstuff.com/" target="_blank">Brickstuff</a> 的高亮度 Pico LED.</b></li>
<li><b><span style="color: red;">具備 Lego IR 接收器</span>, 所以, 也可以使用 Lego 8879' 8885 或 EV3 的 IR Becon 遙控器進行控制 ( ** <span style="color: red;">EV3 或 NXT 就可以使用 Mindsensors 或 Hitechnic 的 IR 發射器控制 PFx Brick ^^</span>)</b></li>
<li><b>具備 Micro USB 接口, 除了作為連接電腦進行設定之外, <span style="color: red;">還可以外接行動電源供電</span>, 大大的支援 LEGO 創作的長時間操作.</b></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-SPy98qvsbUo/WxYWJ5SwHSI/AAAAAAAABe4/sbwYsjHv_IAq3vr19rzWTLxSvkGX3gmLgCLcBGAs/s1600/PFxBrick_vs_Sbrick.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1373" data-original-width="1600" height="342" src="https://1.bp.blogspot.com/-SPy98qvsbUo/WxYWJ5SwHSI/AAAAAAAABe4/sbwYsjHv_IAq3vr19rzWTLxSvkGX3gmLgCLcBGAs/s400/PFxBrick_vs_Sbrick.png" width="400" /></a></div>
<div>
<b><br /></b>
<b></b><br />
<a name='more'></a><b><br /></b></div>
<div>
<h2>
<b><span style="color: blue; font-size: x-large;">PFx 控制介面設定</span></b></h2>
</div>
<div>
PFx Brick 的控制介面採用模擬 Lego 8879 speed control 與 8885(或 EV3) 兩種固定模式, 同樣具備 4 個 channels 的選項, 不像 SBick 可以自行依據需要加入不同的控制項, 應該是為了要相容 IR 遙控器的需求.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
控制介面的設定需先在電腦端以 USB 連接 PFx Brick 之後, 再使用 PFx Desktop App 對每一個控制項(按鍵)進行設定, 包含: 馬達動作' 燈光動作 與 音效, 完成後將設定資料 (Profile)連同 Audio Files 下載至 PFx Brick, 接著再開啟手機端的 PFx Mobile App 進行操作.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-ptg-TUzWLsI/WxZDIfKjp_I/AAAAAAAABfY/Foxl-8iJERYd0KRSJhHuSgd1nHEXQLoiwCEwYBhgL/s1600/PFx_Grabber_Settings_8885.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="708" data-original-width="1600" height="282" src="https://2.bp.blogspot.com/-ptg-TUzWLsI/WxZDIfKjp_I/AAAAAAAABfY/Foxl-8iJERYd0KRSJhHuSgd1nHEXQLoiwCEwYBhgL/s640/PFx_Grabber_Settings_8885.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
上圖模擬 LEGO 8885(EV3) 的控制介面共有 5 個控制項(按鍵), 每個控制項都可以設定所要執行的馬達動作(Motor Action)' 燈光動作(Light Action) 與 音效(Audio), :<br />
<br />
<ul>
<li><b><span style="color: #666666; font-size: large;">Motor Action</span>: 共有 15 種預設動作可供選擇, 包含: Speed' Direction' 加減速' 時間的設定, 還有擺動(Oscillate)' 隨機(Random)的特殊動作, 甚至可以隨著音樂節奏調變馬達速度的 Sound Modulated 選項.</b></li>
<li><b><span style="color: #666666; font-size: large;">Light Action</span>: 可以選擇對個別 channel(Individual) 或 全部 8 個 channels (Combination) 設定燈光效果, 分別都有十幾個預設動作可供挑選, 包含: 警示' 閃爍' 隨機' 霹靂車(Linear Sweep)' Sound Bar' Motor Modulated' Sound Modulated 等等, 相當豐富.</b></li>
<li><b><span style="color: #666666; font-size: large;">Audio</span>: 可挑選要播放的歌曲或音效</b><b>, 設定播放的時間' 次數以及一些特殊效果.</b></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-iGT58hvVciA/WxZYToTSDYI/AAAAAAAABfg/AjFb1lxxTBgjDJHiNUlwXrqTlROXHdn8QCLcBGAs/s1600/PFx_Grabber_Settings_EV3Beacon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="557" data-original-width="600" height="371" src="https://1.bp.blogspot.com/-iGT58hvVciA/WxZYToTSDYI/AAAAAAAABfg/AjFb1lxxTBgjDJHiNUlwXrqTlROXHdn8QCLcBGAs/s400/PFx_Grabber_Settings_EV3Beacon.png" width="400" /></a></div>
<div>
<b><br /></b></div>
<div>
上圖就是前面 Demo 影片中馬達' 燈光 與 音效的相關設定, 這是使用 PFx Mobile App 控制介面最下面太陽形狀的控制項(模擬 EV3 IR 遙控器中最上面的 IR Beacon 按鍵).</div>
<div>
<br /></div>
<div>
當按下此按鍵之後, PFx Brick 就會驅動 Motor B 以 50% 的速度運轉 3 秒' 中斷 0.5 秒方式重複執行(<b>Oscillate</b>), 同時開始播放 Sugar_Zone_45sec2 這首歌, 而 8 個 channels 的燈光, 則會配合歌曲節奏變更顯示亮度與時間(<b>Sound Modulated</b>), 非常的動感與熱鬧.</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-51326619526511491012018-05-13T19:45:00.000-07:002018-06-05T09:15:12.395-07:00SBrick 筆記 - 三種進階功能測試 (Clinometer' Sequence' Circuit)SBrick 的 <a href="https://designer.sbrick.com/" target="_blank">Profile Designer</a> 提供了 6 種控制項 (Controls) 作為遙控 LEGO PF 裝置的操作介面 :<br />
<ul>
<li><b>Slider</b>: 以移動滑條方式控制單 Channel 的動作. </li>
<li><b>Joystick</b>: 以雙向搖桿方式控制雙 Channels 的動作. </li>
<li><b>Button</b>: 以按鈕的 On/Off 開關方式控制單 Channel 的動作.</li>
<li><b>Clinometer</b>: 測斜儀, 藉由偵測作為遙控裝置(手機 或 平板)的三種運動方式 - Pitch(俯仰)' Yaw(偏擺) 與 Roll(翻滾), 控制三 Channels 的動作.</li>
<li><b>Sequence</b>: 同時控制多個 Channels 依據時間序列執行指定的動作.</li>
<li><b>Circuit</b>: 藉由讀取指定 Channel 或 感應器的值(Input), 比對設定的條件(Logic), 觸發符合條件的控制指令(Target).</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
</div>
其中後三種屬於較進階的控制項, 即使 SBrick 原廠也一直延到產品上市幾個月之後才提供正常的運作功能, 尤其 <b>Sequence</b> 與 <b>Circuit</b> 兩個控制項具備可程式化的特性, 能夠運用 PF 周邊建構如同 EV3 與 NXT 一樣彈性的自動化應用, 對於 Lego Technic 玩家具有相當的吸引力.<br />
<br />
<h2>
<span style="color: red; font-size: x-large;">功能測試</span></h2>
<br />
為了測試這三種進階控制項, 將製作一台以 PF 馬達驅動的四輪車(如下圖), 主要功能包含:<br />
<ol>
<li>以 PF Servo motor 控制車輛的轉向以及以 PF L motor 驅動車輛的行進, 另以三個 PF LED 燈分別作為車頭燈 與 左右轉向指示燈.</li>
<li>以 <b>Clinometer</b> 控制項偵測手機的 俯仰 與 偏擺 動作, 遙控車輛的 進退 與 轉向, </li>
<li>以兩個 <b>Sequence</b> 控制項顯示左' 右轉向指示燈的閃爍效果.</li>
<li>以一個 <b>Circuit</b> 控制項偵測車輛是否處於前進狀態, 以自動點亮 或 關閉 車頭燈.</li>
<li>以兩個 <b>Circuit</b> 控制項偵測車輛是否處於左' 右轉向狀態, 以自動啟動 或 關閉左' 右轉向指示燈的閃爍顯示, 模擬真實車輛的運作.</li>
</ol>
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-CO90U_VU_XQ/WvUYEIIJn0I/AAAAAAAABcY/sXeOp4K0wqIcOGH4G4KGqlovMnjHZJMaACLcBGAs/s1600/SBrick_RC_Car.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="691" data-original-width="922" height="478" src="https://1.bp.blogspot.com/-CO90U_VU_XQ/WvUYEIIJn0I/AAAAAAAABcY/sXeOp4K0wqIcOGH4G4KGqlovMnjHZJMaACLcBGAs/s640/SBrick_RC_Car.png" width="640" /></a></div>
<br />
上述功能的實作, 可以參考以下影片:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/QPuF397CK8c/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/QPuF397CK8c?feature=player_embedded" width="480"></iframe></div>
<br />
<br />
<a name='more'></a><br /><br />
<h2>
<span style="color: red; font-size: x-large;">控制介面設計</span></h2>
<div>
要使用 SBrick 手機 app 的控制介面, 須先於電腦以 <a href="https://designer.sbrick.com/" target="_blank">Profile Designer</a> 進行設計與建立, 包含: 設定背景圖片與加入所有會使用到的控制項(Controls), 完成之後將 Profile 存放在 SBrick 的網站中, 接著再以手機 app 連結下載之後, 對 Profile 控制項的 Channels 與 SBrick 的實體 Ports 進行對應, 這樣才可以在 SBrick 的手機 app 中使用設計好的控制介面遙控連接在 SBrick 上的 PF 馬達或 LED 燈.<br />
<br /></div>
<h3>
一、設計控制介面的 Profile:</h3>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-VS0SE3W5flQ/WvT7bR5578I/AAAAAAAABcM/t5YjCL1GoPcfStJ6PO_wrK9r_mitOdrWACPcBGAYYCw/s1600/SBrick_RC_Car_Clinometer_Ctrl_Designer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="760" data-original-width="1280" height="380" src="https://1.bp.blogspot.com/-VS0SE3W5flQ/WvT7bR5578I/AAAAAAAABcM/t5YjCL1GoPcfStJ6PO_wrK9r_mitOdrWACPcBGAYYCw/s640/SBrick_RC_Car_Clinometer_Ctrl_Designer.png" width="640" /></a></div>
<div>
<br /></div>
<div>
如上圖所示, 在本次測試的控制介面中共使用了 8 個控制項, 每個控制項的用途與設定方式, 如以下說明(依序自左上起): </div>
<div>
<br />
<b><span style="font-size: large;">(1) Clinometer</span></b> - 透過手機姿態的變化遙控車輛的行進與轉向, 共包含三個 Channels: <b>Pitch</b>(俯仰)' <b>Yaw</b>(偏擺) 與 <b>Roll</b>(翻滾), 但車輛的控制只需要其中兩種, 實際以 iPhone 測試驗證此控制項的回應方式, 選擇以 <b>Pitch</b> Channel 作為轉向控制(左右偏擺), 而以 <b>Roll</b> Channel 作為行進控制(前後俯仰), 這樣似乎與Channel 的名稱定義不同, 不過這是經由實際測試得到的結論, 所以可能是 SBrick 原廠的失誤.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-PTidHMwHkDM/Wvag6BO76gI/AAAAAAAABco/2Ya5Qz7Pbb4SfbR6XT1RO62LCmHB7MuxQCLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Clinometer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="544" data-original-width="261" height="400" src="https://3.bp.blogspot.com/-PTidHMwHkDM/Wvag6BO76gI/AAAAAAAABco/2Ya5Qz7Pbb4SfbR6XT1RO62LCmHB7MuxQCLcBGAs/s400/SBrick_RC_Car_Clinometer_Ctrl_Clinometer.png" width="191" /></a></div>
<div>
<br /></div>
<div>
<b><span style="font-size: large;">(2) Close button</span></b> - 結束 app </div>
<div>
<br />
<b><span style="font-size: large;">(3) FlashLeftLights</span></b> - 以 0.5 秒的間隔週期, 閃爍顯示左轉燈的 <b>Sequence</b> 控制項</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Lt8hTOxDs0Y/WvajB7DBafI/AAAAAAAABc0/xVXnvhz7UsweZXOkFvrcNPinwaKqOiAmQCLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Sequence_FlashLeftLights.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="502" data-original-width="934" height="340" src="https://2.bp.blogspot.com/-Lt8hTOxDs0Y/WvajB7DBafI/AAAAAAAABc0/xVXnvhz7UsweZXOkFvrcNPinwaKqOiAmQCLcBGAs/s640/SBrick_RC_Car_Clinometer_Ctrl_Sequence_FlashLeftLights.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<b><span style="font-size: large;">(4) HeadLights</span></b> - 開關頭燈的 <b>Button</b> 控制項:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-GpBrDmzepwg/Wvajl2KAkPI/AAAAAAAABc8/bUSLf_YwWEoDIIm7CRbeWP8cWmZ9FM6sQCLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Button_HeadLights.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="549" data-original-width="264" height="400" src="https://1.bp.blogspot.com/-GpBrDmzepwg/Wvajl2KAkPI/AAAAAAAABc8/bUSLf_YwWEoDIIm7CRbeWP8cWmZ9FM6sQCLcBGAs/s400/SBrick_RC_Car_Clinometer_Ctrl_Button_HeadLights.png" width="191" /></a></div>
<div>
<br />
<b><span style="font-size: large;">(5) FlashRightLights</span></b> - 以 0.5 秒的間隔週期, 閃爍顯示右轉燈的 <b>Sequence</b> 控制項:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-ngR_QuMZpR4/WvakfauzC1I/AAAAAAAABdI/gE7djnoRWDgcjqP1HREV-khmvjpK6DpAACLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Sequence_FlashRightLights.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="504" data-original-width="933" height="344" src="https://4.bp.blogspot.com/-ngR_QuMZpR4/WvakfauzC1I/AAAAAAAABdI/gE7djnoRWDgcjqP1HREV-khmvjpK6DpAACLcBGAs/s640/SBrick_RC_Car_Clinometer_Ctrl_Sequence_FlashRightLights.png" width="640" /></a></div>
<div>
<br />
<span style="font-size: large;"><b>(6) Circuit-SteerLeft</b> </span>- 偵測若車輛正在左轉時, 會自動啟動 <b>FlashLeftLights Sequence </b>的<b> Circuit </b>控制項</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-XxjILslvSzY/WvatTb1uNNI/AAAAAAAABdY/M109BZWMLek1M6LIz-Nd-VKy2onDVTaNQCLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Circuit_SteerLeft.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="504" data-original-width="903" height="355" src="https://4.bp.blogspot.com/-XxjILslvSzY/WvatTb1uNNI/AAAAAAAABdY/M109BZWMLek1M6LIz-Nd-VKy2onDVTaNQCLcBGAs/s640/SBrick_RC_Car_Clinometer_Ctrl_Circuit_SteerLeft.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br />
<span style="font-size: large;"><b>(7) LitHeadLights</b> </span>- 偵測當車輛前進時, 會自動設定 <b>HeadLights</b> 為 ON<b> </b>的<b> Circuit </b>控制項</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-nrF4DqTcqh0/WvaxHJ5t-XI/AAAAAAAABdk/tqNA1Y0EDBch4npogPuUugIusKTPPMt_QCLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Circuit_LitHeadLights.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="503" data-original-width="901" height="356" src="https://1.bp.blogspot.com/-nrF4DqTcqh0/WvaxHJ5t-XI/AAAAAAAABdk/tqNA1Y0EDBch4npogPuUugIusKTPPMt_QCLcBGAs/s640/SBrick_RC_Car_Clinometer_Ctrl_Circuit_LitHeadLights.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br />
<b><span style="font-size: large;">(8) Circuit-SteerRight</span></b> - 當偵測到車輛正在右轉時, 會自動啟動 <b>FlashRightLights Sequence </b>的<b> Circuit </b>控制項</div>
<div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-_4KPQN15vq4/WvayOGACbKI/AAAAAAAABdw/9aTzsW9jleYLewxmMbjmRWvvJxRWEedZACLcBGAs/s1600/SBrick_RC_Car_Clinometer_Ctrl_Circuit_SteerRight_Input.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="760" data-original-width="1280" height="380" src="https://4.bp.blogspot.com/-_4KPQN15vq4/WvayOGACbKI/AAAAAAAABdw/9aTzsW9jleYLewxmMbjmRWvvJxRWEedZACLcBGAs/s640/SBrick_RC_Car_Clinometer_Ctrl_Circuit_SteerRight_Input.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<h3>
二、設定 SBrick 實體 Ports 與 Profile Control - Channels 的對應:</h3>
</div>
<div>
<br />
完成設計控制介面的 Profile 之後, 接下來需要在 SBrick 的手機 app 中將 Profile 所有控制項的 Channels 對應到連接實體 PF 設備的 SBrick Ports, 這樣手機 app 才能夠使用自行設計的控制介面遙控以 SBrick 所建構的車輛.<br />
<br />
<h3>
SBrick app 設定:</h3>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-wTjbkmjYiN4/Wva9Dq2lutI/AAAAAAAABeE/efePY1XnlYk6lGcfNbvukLTwpykBYbw1gCLcBGAs/s1600/SBrick_RC_Car_app_Settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="702" data-original-width="1600" height="280" src="https://1.bp.blogspot.com/-wTjbkmjYiN4/Wva9Dq2lutI/AAAAAAAABeE/efePY1XnlYk6lGcfNbvukLTwpykBYbw1gCLcBGAs/s640/SBrick_RC_Car_app_Settings.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<ol>
</ol>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h3>
SBrick 實體 Ports 與 Profile Channels 的對應:</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-YhQME85slCk/WvbC6zz4YvI/AAAAAAAABeU/rIFivjX2Tp8ku6W6dFp_LMZ6aODEeDxgQCLcBGAs/s1600/SBrick-RC-Car-FunctionDesc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="691" data-original-width="922" height="478" src="https://2.bp.blogspot.com/-YhQME85slCk/WvbC6zz4YvI/AAAAAAAABeU/rIFivjX2Tp8ku6W6dFp_LMZ6aODEeDxgQCLcBGAs/s640/SBrick-RC-Car-FunctionDesc.png" width="640" /></a></div>
<div>
<br /></div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-60056073449848886162018-04-10T21:03:00.000-07:002018-05-10T18:16:23.405-07:00以 LEGO Boost 與 Scratch 2 製作互動遊戲<span style="font-size: large;">LEGO Boost 除了使用行動裝置上官方所提供的 app 編寫程式外, 也可以在電腦上透過 <a href="http://www.picaxe.com/LEGO-Boost/" target="_blank">S2Bot</a> 以 Scratch 2 控制, 這樣正好能夠運用 Scratch 的遊戲編程功能 以及 Boost 的馬達與感應器, 製作出生動有趣的互動遊戲.</span><br />
<span style="font-size: large;">下面的影片就是一個結合兩者所製作的「顏色輪盤遊戲」, 玩法如下: </span><br />
<ol>
<li><span style="font-size: large;">先由 Scratch 2 顯示讓玩遊戲的人可以挑選所要下注顏色的畫面.</span></li>
<li><span style="font-size: large;">下注之後啟動Boost 的顏色輪盤隨機旋轉至某一個顏色, 再藉由 Boost 的顏色感應器讀取比對輸贏狀態.</span></li>
<li><span style="font-size: large;">Scratch 會因應本局的輸贏, 變更舞台背景並計算剩餘的籌碼, 而且當贏局時 Boost 還會表演一小段歡呼動作作為獎勵.</span></li>
<li><span style="font-size: large;">一旦輸光所有籌碼, 本次的遊戲就隨之結束.</span></li>
</ol>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Nn8bPAisyEk/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/Nn8bPAisyEk?feature=player_embedded" width="480"></iframe></div>
<br />
<h2>
<span style="color: red; font-size: x-large;">LEGO Boost 「顏色輪盤遊戲機」構造</span></h2>
<h2>
<span style="font-weight: normal;">遊戲機的構造全部都是使用 LEGO Boost 17101 的零件組合而成, 包含兩個內建馬達與一個外接馬達以及顏色感應器全部都用上, 各部分的功能如以下圖片說明:</span></h2>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2>
</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-3fMPHq32THY/Ws2fIt2XYiI/AAAAAAAABbA/ATIt-JbsoKYOav8r_n1Vc41sxzYgNiZrgCLcBGAs/s1600/Boost_Color_Roulette_Game_Machine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-3fMPHq32THY/Ws2fIt2XYiI/AAAAAAAABbA/ATIt-JbsoKYOav8r_n1Vc41sxzYgNiZrgCLcBGAs/s400/Boost_Color_Roulette_Game_Machine.png" width="400" /></a></div>
<br />
<h2>
<span style="color: red; font-size: x-large;">使用 S2Bot app 連接 Boost 與 Scratch 2</span></h2>
<br />
<span style="font-size: large;"><a href="http://www.picaxe.com/LEGO-Boost/" target="_blank">S2Bot app</a> 的功能是提供 Scratch 2 能夠以藍芽方式無線遙控 LEGO Boost, 包含: <b>馬達控制</b>與<b>讀取感應器</b>, 而執行 Scratch 的電腦, 無論是 Windows 或 Mac, 都必須使用 <a href="http://www.picaxe.com/bled112-bluetooth-usb-dongle" target="_blank">BLED112 藍芽配接器</a>, 才能連接 Boost. </span><br />
<ol>
<li><span style="font-size: large;">由 </span><b style="font-size: x-large;"><a href="http://www.picaxe.com/Teaching/Other-Software/Scratch-Helper-Apps/" target="_blank">此處</a></b><span style="font-size: large;"> 下載安裝 S2Bot app .</span></li>
<li><span style="font-size: large;">執行 S2Bot app, 由左上方下拉選單中挑選 <span style="color: red;"><b>LEGO Boost</b></span> , 接著點按 <span style="color: red;"><b>Scan for Devices</b></span> 開啟對話框連接 Boost.</span></li>
<li><span style="font-size: large;">若是首次連接 Boost, 再點按右上方的下拉選單按鈕, 選擇 <span style="color: red;"><b>New Scratch template</b></span> 產生 Boost 的 Scratch 程式積木範本: boost_template.sb2 並存檔於電腦中.</span>
<div class="separator" style="clear: both; text-align: center;">
</div>
</li>
<li><span style="font-size: large;">在 Scratch 2 中透過 File->Open 開啟 boost_template.sb2, 即可於腳本區的 More Blocks 中使用 Boost 的程式積木.<div class="separator" style="clear: both; text-align: center;">
</div>
</span></li>
</ol>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-vUk2wrRoXXc/Ws2fQmyMueI/AAAAAAAABbE/uEtScax6g4MrLQL1TC2LMq3X343Py-jAwCEwYBhgL/s1600/S2Bot_Boost_template.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="499" data-original-width="507" height="392" src="https://1.bp.blogspot.com/-vUk2wrRoXXc/Ws2fQmyMueI/AAAAAAAABbE/uEtScax6g4MrLQL1TC2LMq3X343Py-jAwCEwYBhgL/s400/S2Bot_Boost_template.png" width="400" /></a></div>
<span style="font-size: large;"></span><br />
<a name='more'></a><span style="font-size: large;"><br /></span></div>
<h2 style="text-align: left;">
<span style="color: red; font-size: x-large;">以 Scratch 2 控制 LEGO Boost 馬達</span></h2>
<br />
<span style="font-size: large;">使用 Scratch 2 腳本區中 More Blocks 的 Boost 程式積木可以控制 Boost 的兩個內建馬達(Motor A 與 B) 以及外接馬達(Port C 或 D) 的速度' 方向' 位置 </span><span style="font-size: large;"> </span><span style="font-size: large;">與</span><span style="font-size: large;"> 運轉時間</span><span style="font-size: large;">.</span><br />
<span style="font-size: large;"> Boost 馬達內建位置感應器, 精確度如同 EV3/NXT 一樣, 每一圈 360 階, 惟要注意的是 Boost 的兩個內建馬達是車輛模式配置, 所以兩者旋轉方向與位置值的變化關係正好相反, 當以順時針方向旋轉時, Motor A 的位置值變化是負增量, Motor B 是正增量, 至於外接馬達則與 Motor B 一樣</span><span style="font-size: large;">為正增量.</span><br />
<span style="font-size: large;">在 More Blocks 中提供了四個變數: <span style="color: blue;">SensorA</span>' <span style="color: blue;">B</span>' <span style="color: blue;">C</span>' <span style="color: blue;">D</span> 用來讀取馬達位置感應器的值, 即使手動方式旋轉馬達感應器的值也會有變化, 可以透過程式積木將位置值歸零.</span><br />
<span style="font-size: large;"><br /></span>
<span style="color: red; font-size: x-large;">Boost 的距離/顏色二合一感應器</span><br />
<div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Boost 的外接感應器可同時偵測物體的距離與顏色, 使用 <span style="color: blue;">distance</span> 與 <span style="color: blue;">color</span> 兩個變數讀取.</span><br />
<br />
<ul>
<li><span style="font-size: large;"><b>距離感應器: </b>可偵測距離約在 30cm 以內, 近距離時(小於 5cm)回傳 0-10 的值, 增量為 1, 大於 5cm 時回傳 10-100, 增量為 10, 若未偵測到任何障礙物回傳 100 的值.</span></li>
<li><span style="font-size: large;"><b>顏色感應器: </b>可辨識六種顏色, 回傳值分別為: <b>黑</b>(0)' <b>藍</b>(3)' <b>綠</b>(5)' <b>黃</b>(7)' <b>紅</b>(9) 與 <b>白</b>(10), 若未偵測到任何顏色則回傳 255.</span></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/YB4cknV5cLF7As1Socv9PlxGOQ_BTWBMPlSebI4oj6BVIPbYYN61p4Dj2yFOZd3Yj32I8BhOsts=s400" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="338" data-original-width="212" height="400" src="https://4.bp.blogspot.com/YB4cknV5cLF7As1Socv9PlxGOQ_BTWBMPlSebI4oj6BVIPbYYN61p4Dj2yFOZd3Yj32I8BhOsts=s400" width="250" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<span style="font-size: large;"><br /></span></div>
<h2>
<span style="color: red; font-size: x-large;">Boost 本體的內建感應器</span></h2>
<div>
<span style="color: red; font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">Boost 除了外接的 <b>距離/顏色感應器 </b>之外, 本體 (hub) 也內建幾個感應器, 在 More Blocks 中都有對應的變數積木可用來讀取:</span></div>
<div>
<ul>
<li><span style="font-size: large;"><b>傾斜感應器</b>(Tilt sensor): 會偵測本體目前的姿態, 使用 <span style="color: blue;">tilt</span> 變數讀取感應器值, 據 <a href="http://www.picaxe.com/LEGO-Boost/" target="_blank"><b>文件</b></a> 上說明可以回傳 0-5 六個姿態值, 實際測試則只有五種值, 分別為: <b>平放</b>(0)' <b>左/右傾斜</b>(4/2)' <b>直立</b>(1/3), 另外, 還可以使用 <span style="color: blue;">tiltx</span> 與 <span style="color: blue;">tilty</span> 兩個變數讀取以角度為單位更精確的兩軸傾斜值.</span></li>
<li><span style="font-size: large;"><b>按鍵狀態</b>: 使用 「<span style="color: blue;">button pressed ?</span>」 積木, 可以判斷本體上的綠色按鍵是否正被按下( 回傳 true/false ).</span></li>
<li><span style="font-size: large;"><b>電流感應器</b>(Current sensor): 使用 <span style="color: blue;">current</span> 變數讀取, 實際測試當馬達運轉受到外力阻礙時, 感應器的值會驟增.</span></li>
<li><span style="font-size: large;"><b>電壓感應器</b>(Voltage sensor): 使用 <span style="color: blue;">voltage</span> 變數讀取, 可用來判斷電池的電量狀態, 正常值約在 3.2V 左右.</span></li>
</ul>
</div>
<br />
<span style="font-size: large;"><br /></span></div>
<h2>
<span style="color: red; font-size: x-large;">改變 Boost 的 LED 顏色</span></h2>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">透過「<span style="color: blue;">set hub light to __</span>」積木, 可以變更 Boost 本體上 LED 的顯示顏色, 共有十種顏色可以選擇 或 設定成 off 狀態.</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<h2>
<span style="color: red; font-size: x-large;">結論 與 心得</span></h2>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">這次試著以 LEGO Boost 與 Scratch 2 製作一個互動遊戲, 過程中對於 Boost 無論是馬達的精準程度' 感應器的功能等使用體驗, 感覺上相當的實用, 特別是 S2Bot app 為 Boost </span><span style="font-size: large;">所提供的</span><span style="font-size: large;">Scratch 程式積木(建議下載最新的 v0.8.4 ), 確實能夠充分發揮 Boost 硬體所具備的功能, 即使玩過 NXT/EV3, 仍然覺得是值得入手的 LEGO Set. (感謝 創意科技 林老師的協助) </span><br />
<span style="font-size: large;">唯一的限制就是 Technic 零件不多, </span><span style="font-size: large;"> 不過, 可以使用補充零件來加強, 並非問題.</span></div>
<div>
<ol>
</ol>
<br />
<span style="font-size: large;"><br /></span></div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-9137267888446321279.post-55506582259500079612018-04-10T21:00:00.000-07:002018-04-10T21:00:10.875-07:00以 Scratch2 製作劇場版的機器人控制體驗:結合 S2Bot 遙控 SBRick<span style="font-size: large;">PICAXE 這家公司的教育部門,推出了 <a href="http://www.picaxe.com/Teaching/Other-Software/Scratch-Helper-Apps/"><b>S2Bot</b> 的 <b>Scratch Helper Apps</b></a>,提供了透過 <a href="https://scratch.mit.edu/"><b>Scratch 2</b></a> 可以用來控制多種機器人系統,包含 LEGO 的 Wedo、Wedo 2.0、NXT、EV3以及 <a href="https://www.sbrick.com/"><b>SBrick</b> PF 馬達藍芽控制器</a>。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">由於 <b>Scratch 2</b> 擅長於製作遊戲動畫,因此結合 </span><b style="font-size: x-large;"><a href="http://www.picaxe.com/Teaching/Other-Software/Scratch-Helper-Apps/" style="font-size: x-large;">S2Bot</a></b><span style="font-size: large;"> 就可以將對實體機器人的控制,融入到 <b>Scratch 2</b> 設計的劇情中,這會是相當有趣的體驗,也是其他程式語言很難做到的情境。</span><br />
<span style="font-size: large;">以下的影片,就是對上述的構想所做的嘗試。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/GiFStk3lvAU/0.jpg" frameborder="0" height="466" src="https://www.youtube.com/embed/GiFStk3lvAU?feature=player_embedded" width="560"></iframe></div>
<span style="font-size: large;"><br /></span><span style="font-size: large;">影片首先開始的武器測試 (Weapon System Test) ,是展示以 Scratch 2 + S2Bot 遙控 <a href="https://www.sbrick.com/"><b>SBrick</b></a> PF 馬達控制器的功能,由 <b>Pico </b>角色執行,包含:順/逆時針方向旋轉雷射槍座、改變瞄準方向以及發射雷射槍等動作。<br />而雷射槍</span><span style="font-size: large;">的</span><span style="font-size: large;">燈光閃爍</span><span style="font-size: large;">特效是使用 <b><a href="http://www.brickstuff.com/">Brickstuff</a></b> 的照明系統 ( </span><span style="font-size: medium;"><b><a href="http://chlego.blogspot.tw/2016/04/brickstuff-lego.html">參考本文</a></b></span><span style="font-size: large;"> )。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">接著是一個射擊遊戲,太空船 (<b>Spaceship</b> </span><span style="font-size: large;">角色</span><span style="font-size: large;">) 會以隨機的高度與方向出現並飛越螢幕畫面,而</span><span style="font-size: large;"> <b>Pico</b> </span><span style="font-size: large;">角色則</span><span style="font-size: large;">一方面</span><span style="font-size: large;">發射</span><span style="font-size: large;">雷射槍</span><span style="font-size: large;"> (<b>Shoot laser gun</b> 角色) 同時遙控 </span><a href="https://www.sbrick.com/" style="font-size: x-large;"><b>SBrick</b></a><span style="font-size: large;"> </span><span style="font-size: large;">的</span><span style="font-size: large;">射擊</span><span style="font-size: large;">動作。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">當 </span><span style="font-size: large;"><b>Spaceship</b> </span><span style="font-size: large;">角色偵測到已碰觸到 </span><span style="font-size: large;"><b>Shoot laser gun</b> 角色時,表示太空船被雷射槍擊中,這時候 </span><span style="font-size: large;"><b>Spaceship</b> </span><span style="font-size: large;">角色以及舞台背景都會切換成為爆炸的造型,而 <b>Pico</b></span><span style="font-size: large;"> </span><span style="font-size: large;">角色</span><span style="font-size: large;">也呈現為歡呼的造型。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">而配合劇情進行的各種音效,也更加凸顯出每個情境所強調的效果。</span><br />
<span style="font-size: large;"></span><br />
<a name='more'></a><span style="font-size: large;"><br /></span>
<span style="font-size: large;">以下是 Scratch 2 中,每個角色與舞台的程式碼:</span><br />
<span style="font-size: large;">(1) Pico 角色 (點擊圖片放大)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-EFB6JqXFfr0/V3-YR9SFtfI/AAAAAAAABVw/mQSw14qsyYkfnVluSAeAq9BilURr4u7CwCLcB/s1600/Pico_sprite_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://2.bp.blogspot.com/-EFB6JqXFfr0/V3-YR9SFtfI/AAAAAAAABVw/mQSw14qsyYkfnVluSAeAq9BilURr4u7CwCLcB/s320/Pico_sprite_script.png" width="560" /></a></div>
<br />
<span style="font-size: large;">(2) Pico walking 角色 (</span><b>點擊圖片放大</b><span style="font-size: large;">)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-8lUkoZnsttQ/V3-YZAEFudI/AAAAAAAABV0/bB1EQJ1fuV0nxAhaa3hciPG1oE31IIHDgCLcB/s1600/Pico_walking_sprite_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://2.bp.blogspot.com/-8lUkoZnsttQ/V3-YZAEFudI/AAAAAAAABV0/bB1EQJ1fuV0nxAhaa3hciPG1oE31IIHDgCLcB/s320/Pico_walking_sprite_script.png" width="560" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">(3) Spaceship 角色 (</span><b>點擊圖片放大</b><span style="font-size: large;">)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-2Hux7UAZhkc/V3-Yf7xfmtI/AAAAAAAABV4/khehVd6W9I0HkNIaQGRKtiauwfLOloVhwCLcB/s1600/Spaceship_sprite_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://1.bp.blogspot.com/-2Hux7UAZhkc/V3-Yf7xfmtI/AAAAAAAABV4/khehVd6W9I0HkNIaQGRKtiauwfLOloVhwCLcB/s320/Spaceship_sprite_script.png" width="560" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">(4) Shoot laser gun 角色 (</span><b>點擊圖片放大</b><span style="font-size: large;">)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-XPQbrcj0pOQ/V3-YljFk0WI/AAAAAAAABV8/8vlBhskE8dkj3k_WZeRjIkO6_FTbCneQgCLcB/s1600/Shoot_laser_Gun_sprite_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://2.bp.blogspot.com/-XPQbrcj0pOQ/V3-YljFk0WI/AAAAAAAABV8/8vlBhskE8dkj3k_WZeRjIkO6_FTbCneQgCLcB/s320/Shoot_laser_Gun_sprite_script.png" width="560" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">(5) 舞台 (</span><b>點擊圖片放大</b><span style="font-size: large;">)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-phxVh-UCW6g/V3-YtSA119I/AAAAAAAABWA/7actrH409xMUZDmkudEMHcKE3I2NmjhBQCLcB/s1600/Backdrops_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://4.bp.blogspot.com/-phxVh-UCW6g/V3-YtSA119I/AAAAAAAABWA/7actrH409xMUZDmkudEMHcKE3I2NmjhBQCLcB/s320/Backdrops_script.png" width="560" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-75624206650829196582016-04-28T20:31:00.001-07:002016-07-08T05:25:18.777-07:00以藍芽遙控 LEGO PF 馬達的四軸機械手臂:使用 SBrick<div class="first" id="yui_3_9_1_1_1461814675716_782" style="background-color: white; padding: 0px;">
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: x-large; line-height: 29.6055px;"><a href="https://www.sbrick.com/">SBrick</a></span><span style="font-size: 16.003px; line-height: 29.6055px;"><span style="font-size: x-large;"> </span>是 2014 年在 </span><a href="https://www.kickstarter.com/projects/sbrick/sbrick-smart-way-to-control-all-your-lego-creation/description" style="font-size: 16.003px; line-height: 29.6055px;">Kickstarter </a><span style="font-size: 16.003px; line-height: 29.6055px;">所推出的<b>可連接 4 個˙LEGO PF 馬達的藍芽接收器</b></span><span style="line-height: 29.6055px;"><span style="font-size: 16.003px; line-height: 29.6055px;">,同時也提供了 iOS、Android、Windows Phone 等三種行動平台的遙控 App,而 App 的操作介面還可以透過 SBrick 的 <a href="https://designer.sbrick.com/">Profile Designer 網頁</a>,</span></span><span style="font-size: 16.003px; line-height: 29.6055px;">依據操控需求,</span><span style="font-size: 16.003px; line-height: 29.6055px;">自行客製化設計後下載到行動裝置中。</span></div>
<div style="line-height: 29.6055px;">
<a href="https://4.bp.blogspot.com/-SCmUSXiT2H4/VyLSaR6z75I/AAAAAAAABT8/awvktFhv9VQVIhBEQD43BxT5srs1Fhz0ACLcB/s1600/4DOF_RbtArm_WithSBrick_03.png" imageanchor="1" style="line-height: normal; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="400" src="https://4.bp.blogspot.com/-SCmUSXiT2H4/VyLSaR6z75I/AAAAAAAABT8/awvktFhv9VQVIhBEQD43BxT5srs1Fhz0ACLcB/s400/4DOF_RbtArm_WithSBrick_03.png" width="300" /></a></div>
<div style="line-height: 29.6055px;">
<span style="font-size: 16.003px; line-height: 29.6055px;">當實際以 iPad 操作時,回應的速度幾乎與 Lego 的 IR 遙控器一樣靈敏,而採用藍芽相較於紅外線的優勢在於<b>較長的遙控距離</b>以及<b>沒有方向性的限制</b>,這對於玩 Lego Technic 的愛好者而言,無疑又多了一樣可選擇的好幫手。</span></div>
<div style="line-height: 29.6055px;">
</div>
<div style="font-size: 16.003px; line-height: 29.6055px;">
<span style="font-size: 16.003px; line-height: 29.6055px;">以下</span><span style="font-size: 16.003px; line-height: 29.6055px;">影片</span><span style="font-size: 16.003px; line-height: 29.6055px;">就是以 SBrick 控制的四軸機械手臂,其中 iPad App 的操作介面正是依據控制需求的客製化設計。</span></div>
<div class="separator" style="clear: both; font-size: 16.003px; line-height: 29.6055px; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/29stPJlUyGk/0.jpg" frameborder="0" height="466" src="https://www.youtube.com/embed/29stPJlUyGk?feature=player_embedded" width="560"></iframe></div>
<div style="font-size: 16.003px;">
<div style="line-height: 29.6055px;">
<span style="line-height: 29.6055px;"><span style="font-size: large;"><b></b></span></span><br />
<a name='more'></a><br />
<span style="line-height: 29.6055px;"><span style="font-size: large;"><b><br /></b></span></span>
<span style="line-height: 29.6055px;"><span style="font-size: large;"><b>SBrick 除了具有使用藍芽的優勢之外,可客製化的操控介面也是一大亮點,提供對於所建構的機構,更順手的操作</b></span></span><span style="font-size: 16.003px; line-height: 29.6055px;">。</span></div>
<div style="line-height: 29.6055px;">
<span style="font-size: 16.003px; line-height: 29.6055px;">而原廠也預建了幾個熱門的 Technic sets profile,如:LT42042、LT42043等,都可以直接下載使用。</span></div>
<div style="line-height: 29.6055px;">
<span style="font-size: 16.003px; line-height: 29.6055px;">對於使用 SBrick 的<b><a href="https://designer.sbrick.com/"> Profile Designer 設計頁面</a></b>,提供有</span><span style="line-height: 29.6055px;"><span style="font-size: large;"><b>五種基本控制項</b></span></span><span style="font-size: 16.003px; line-height: 29.6055px;">可以設定,包含:</span></div>
<br />
<ul>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue;"><span style="font-size: large;">Close</span> </span></b><span style="font-size: 16.003px;">:選擇離開 App 的按鍵</span></span><span style="font-size: 16.003px; line-height: 29.6055px;"> </span></li>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue; font-size: large;">Background</span></b><span style="font-size: 16.003px;">:控制面板的背景顏色設定</span></span></li>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue; font-size: large;">Slider</span></b><span style="font-size: 16.003px;">:類似可滑動電位計的控制項</span></span></li>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue; font-size: large;">Joystick</span></b><span style="font-size: 16.003px;">:類似搖桿的控制項,依據回傳的 X、Y 值,可同時控制 SBrick兩個 Ports 的輸出</span></span></li>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue; font-size: large;">Button</span></b><span style="font-size: 16.003px;">:開 / 關控制項</span></span></li>
</ul>
<span style="font-size: 16.003px; line-height: 29.6055px;">另外,還有</span><span style="line-height: 29.6055px;"><span style="font-size: large;"><b>兩個進階控制項</b></span></span><span style="font-size: 16.003px; line-height: 29.6055px;">:</span><br />
<br />
<ul>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue; font-size: large;">Clinometer</span></b><span style="font-size: 16.003px;">:使用行動裝置本身</span><span style="font-size: 16.003px; line-height: 29.6055px;">的</span><span style="font-size: 16.003px;">三軸傾斜感應,</span></span><span style="font-size: 16.003px; line-height: 29.6055px;">可同時控制 SBrick 三個 Ports 的輸出</span></li>
<li><span style="line-height: 29.6055px;"><b><span style="color: blue; font-size: large;">Sequence</span></b><span style="font-size: 16.003px;">:對單一Port 的可程式化控制,可以設定最多 500 個指令,每個指令包含輸出的大小與持續的時間,可用來控制 PF LED 的閃爍效果 或 馬達的特定運轉方式。</span></span></li>
</ul>
</div>
</div>
<div style="background-color: white; line-height: 29.6055px; margin-top: 11px; padding: 0px;">
<div class="separator" style="clear: both; font-size: 16.003px; text-align: center;">
<a href="https://2.bp.blogspot.com/-7tZ6jVT9sHE/VyLOGrtnBII/AAAAAAAABTk/n9CR7Oxfz_czs98yulw3wwuErBLrrL2MACLcB/s1600/4DOF_RbtArm_ProfileDesigner_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="339" src="https://2.bp.blogspot.com/-7tZ6jVT9sHE/VyLOGrtnBII/AAAAAAAABTk/n9CR7Oxfz_czs98yulw3wwuErBLrrL2MACLcB/s640/4DOF_RbtArm_ProfileDesigner_03.png" width="640" /></a></div>
<div style="font-size: 16.003px;">
<br /></div>
<span style="font-size: 16.003px;">設計好的操控介面 Profile 儲存之後,就可以由行動裝置上的 SBrick App 下載,</span><span style="font-size: large;"><b>再將每個控制項連接到實際對應的 Port</b></span><span style="font-size: 16.003px;">,如下圖:</span><br />
<div class="separator" style="clear: both; font-size: 16.003px; text-align: center;">
<a href="https://4.bp.blogspot.com/-3TlPV0MaMLg/VyLPhmqQP9I/AAAAAAAABTw/KEN3JJO_lyUJpNB_jM9DkLDV-S49yQ0SgCLcB/s1600/4DOF_RbtArm_SBrickApp_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://4.bp.blogspot.com/-3TlPV0MaMLg/VyLPhmqQP9I/AAAAAAAABTw/KEN3JJO_lyUJpNB_jM9DkLDV-S49yQ0SgCLcB/s400/4DOF_RbtArm_SBrickApp_04.png" width="300" /></a></div>
<div style="font-size: 16.003px;">
連接對應好 Profile 控制項以及 SBrick 的 Ports 之後,就可以開啟操控介面,開始控制操作了。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-vrQyUDpwjxc/VyLTb2A1m5I/AAAAAAAABUE/G3yKgh7aitYZ5PsLyGjjEaQN9xPV1jiQACLcB/s1600/4DOF_RbtArm_SBrickApp_05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://1.bp.blogspot.com/-vrQyUDpwjxc/VyLTb2A1m5I/AAAAAAAABUE/G3yKgh7aitYZ5PsLyGjjEaQN9xPV1jiQACLcB/s400/4DOF_RbtArm_SBrickApp_05.png" width="300" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-hh7RT7HpQnY/VyLTf-Y7X4I/AAAAAAAABUI/H8QUVVPvXl0iWlhUSd2ZHxeOolIyFXGwACLcB/s1600/4DOF_RbtArm_SBrickApp_06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://1.bp.blogspot.com/-hh7RT7HpQnY/VyLTf-Y7X4I/AAAAAAAABUI/H8QUVVPvXl0iWlhUSd2ZHxeOolIyFXGwACLcB/s400/4DOF_RbtArm_SBrickApp_06.png" width="400" /></a></div>
<div style="font-size: 16.003px;">
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-89882450184556267602016-04-11T21:47:00.001-07:002016-04-11T21:55:21.847-07:00以 Brickstuff Lego 照明系統製作的 星際戰士<div style="text-align: justify;">
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;">過去在欣賞 <a href="http://sariel.pl/">Sariel 的 Technic 創作</a>時, 有時會很好奇如何在那麼緊湊的機構中加上照明功能, 特別是 LED </span><span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;">的</span><span style="background-color: white;"><span style="font-family: "arial" , "stheiti" , "pmingliu" , sans-serif;"><span style="font-size: 16.003px; line-height: 29.6055px;">亮度與配線彈性, 很明顯都是 <a href="http://shop.lego.com/en-US/LEGO-Power-Functions-Light-8870">Lego PF Light</a> 所無法做到的, 後來也是從他所</span></span><a href="https://www.youtube.com/watch?v=cYMRZTAgcPI" style="font-family: arial, STHeiti, pmingliu, sans-serif; font-size: 16.003px; line-height: 29.6055px;">公開的影片</a><span style="font-family: "arial" , "stheiti" , "pmingliu" , sans-serif;"><span style="font-size: 16.003px; line-height: 29.6055px;">中得知, 原來有一部分是使用</span></span><a href="http://www.brickstuff.com/" style="font-family: arial, STHeiti, pmingliu, sans-serif; font-size: 16.003px; line-height: 29.6055px;"> Brickstuff 的 Lego 照明系統</a> 。</span></div>
<div style="text-align: justify;">
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;">最近有機會取得了一組 Brickstuff 的 <a href="http://www.brickstuff.com/store/p4/Lighting_Effect_Starter_Kit_for_LEGO%C2%AE_Models.html">Starter kit</a> 以及 <a href="http://www.brickstuff.com/store/p18/DIY_Brickstuff_Connecting_Cables_%285-Pack%29.html">DIY Connecting cables</a>, 因此, 就試著以樂高零件製作了一支雷射槍, 同時也使用 Arduino 控制器加上一些特效, 包含: 發射時兩支槍管的交互快速閃爍, 以及呈現出槍枝本身能源消耗與充電時的狀態, 這些都是使用 Brickstuff 的組件所製作出來的, 以下就是完成後的示範影片:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/GJ-ju1YA7wk/0.jpg" frameborder="0" height="466" src="https://www.youtube.com/embed/GJ-ju1YA7wk?feature=player_embedded" width="560"></iframe></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;">Brickstuff 特別為樂高所製作的照明裝置, 無論 LED 燈' 線纜 或接頭, 真的非常地小, 像影片中的雷射槍以及能源指示燈, 線材都能夠完全收納在樂高的管狀零件中, 組裝過程不用太花心思去考量機構如何去配合線材的問題, 相信無論應用在車輛或建築物的燈具上, 會比使用樂高原廠的 LED 燈還更事半功倍, 唯一的缺點是太貴了 XD</span><br />
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;"></span><br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-bgfXsVWyqag/Vwx_rH7gtZI/AAAAAAAABTI/w_gbktynfCE6ZgC-va2aKT8QYH7EeJKVgCLcB/s1600/BS_LegoLights_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-bgfXsVWyqag/Vwx_rH7gtZI/AAAAAAAABTI/w_gbktynfCE6ZgC-va2aKT8QYH7EeJKVgCLcB/s1600/BS_LegoLights_2.png" /></a></div>
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;"><br /></span>
<span style="background-color: white; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 16.003px; line-height: 29.6055px;"><br /></span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-39313270418695695102016-04-05T20:44:00.000-07:002016-04-05T20:44:31.917-07:00實作 EV3 以 Temboo 連接 Google 雲端服務的方式<span style="color: blue; font-size: large;"><b>Temboo 平台雲端服務的 Choreos</b></span>, 提供了多種程式語言的程式庫, 以簡化開發工作, 其中的 Python 不僅方便好用同時也支援多種作業系統, 包含: Windows' OSX 與 Linux 等, 而 EV3 官方版本的作業系統雖然也是以 Linux 為核心, 但並不太容易安裝像 Python 這樣的程式語言.<br />
<br />
不過, 幸好可以使用專門為 <b><span style="color: blue;">EV3</span></b> 與 <b><a href="https://www.raspberrypi.org/">Raspberry-Pi</a> + <a href="http://www.dexterindustries.com/BrickPi/">Brick Pi</a></b> 開發的 <a href="http://www.ev3dev.org/"><span style="color: blue; font-size: large;">ev3dev</span></a>, 讓 EV3 可以充分運用 Linux 的強大功能, 包含為數眾多的免費軟體與 USB 周邊, 如: Web Cam' RJ45 轉接器' 音效卡' 隨身碟等, 同時若需要的話, 還可以使用 USB Hub, 同時連接多個 USB 裝置,<br />
<span style="color: blue; font-size: large;">讓 EV3 成為具體而微的 Linux 電腦.</span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-zR0FvxG9l8E/VwRfyjJMJzI/AAAAAAAABRw/4F0oeREJgicPU-q63dBuTEeRanZKrBGiQ/s1600/ev3dev_LCD.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="256" src="https://2.bp.blogspot.com/-zR0FvxG9l8E/VwRfyjJMJzI/AAAAAAAABRw/4F0oeREJgicPU-q63dBuTEeRanZKrBGiQ/s640/ev3dev_LCD.png" width="640" /></a></div>
<br />
<br />
<h2>
<b><span style="color: blue; font-size: large;">ev3dev 的功能特性</span></b></h2>
<span style="color: blue; font-size: large;"><br /></span>
<span style="color: blue; font-size: large;">※ 安裝 <a href="http://www.ev3dev.org/">ev3dev</a> 並不會刷掉原有的 EV3 Kernel</span>, 只需將 ev3dev 的 Image 檔案寫入至另一片 Micro SD 卡中, 插入 EV3 後重新開機就可以使用, 並隨時可以換回原有的 Micro SD 卡, 恢復原有官方版本的作業環境.<br />
<br />
<ul>
<li><span style="color: blue; font-size: large;">關於 ev3dev 的安裝指南</span>, 可以參考: <a href="http://www.ev3dev.org/docs/getting-started/">Getting Started with ev3dev</a> 網頁 Step 1 ~ 3 說明.</li>
</ul>
<br />
<span style="color: blue; font-size: large;">※ ev3dev 提供了 4 種網路</span><span style="color: blue; font-size: large;">連接</span><span style="color: blue; font-size: large;">方式</span>, 可以參考: <a href="http://www.ev3dev.org/docs/getting-started/">Getting Started with ev3dev</a> 網頁 Step 4: Setup a network connection 說明.<br />
<br />
<span style="color: blue; font-size: large;">※ ev3dev 目前提供: C++' Node.js 與 Python 等三種程式語言支援開發 EV3 的專案</span>. 並以統一介面方式建立程式庫.<br />
<br />
<ul>
<li><span style="color: blue; font-size: large;">關於 EV3 硬體功能使用方式</span>, 可以參考: <a href="http://www.ev3dev.org/docs/getting-started/">Getting Started with ev3dev</a> 網頁 Step 5 Using the EV3 Hardware drivers 說明.</li>
<li><span style="color: blue; font-size: large;">關於程式庫規格</span>, 可以參考: <a href="http://ev3dev-lang.readthedocs.org/en/latest/">ev3dev Language bindings </a>的網頁說明.</li>
</ul>
<br />
<span style="font-size: large;"><span style="color: blue;">※</span></span><span style="font-size: large;"> </span>此外, ev3dev 的 Python 程式庫雖然可同時支援 2.x 與 3.x 版, 不過, 目前只預裝於 2.x 版,<br />
<br />
<ul>
<li><span style="color: blue; font-size: medium;"><span style="font-size: large;">安裝 Python 3.x 程式庫方式</span></span>, 可以參考: <a href="https://github.com/rhempel/ev3dev-lang-python#python2x-and-python3x-compatibility">Python2.x and Python3.x Compatibility</a> 的網頁說明.</li>
<li><span style="color: blue; font-size: large;">開發 ev3dev Python 程式的方式</span>, 在 <a href="http://www.ev3dev.org/docs/tutorials/">官網 Tutorials 網頁</a> 中有介紹在 PC 或 Mac 端安裝 <a href="https://www.jetbrains.com/pycharm/download/#section=windows">PyCharm 開發環境</a>的說明, 或是透過 SSH 連接 EV3 後直接使用文字編輯器撰寫程式.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-gvdACjMJXiU/VwR-E-h3IZI/AAAAAAAABSc/IuyJECyBPjAHXHn4bsRvMe91jWSSuL5jA/s1600/nano_python_suite.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="402" src="https://4.bp.blogspot.com/-gvdACjMJXiU/VwR-E-h3IZI/AAAAAAAABSc/IuyJECyBPjAHXHn4bsRvMe91jWSSuL5jA/s640/nano_python_suite.png" width="640" /></a></div>
<div>
<br /></div>
<h2>
<span style="color: blue;">使用 Temboo 支援的 Google 雲端服務</span></h2>
<br />
關於 Temboo Choreo 的使用方式, 可以參考前一篇 "<b><a href="http://chlego.blogspot.tw/2016/03/arduino-yun-temboo-gmailv2-spreadsheets.html"><span style="color: blue;">Arduino Yun 筆記:測試呼叫 Temboo 的 Gmailv2 與 Spreadsheets choreos 功能</span></a></b>" 的說明.<br />
<br />
至於 Temboo Choreo 的 Python 程式庫, 可以由 <b><span style="color: blue;"><a href="https://temboo.com/sdk/python">此連結</a></span></b> 下載.<br />
<div>
<br /></div>
而本次將會以 EV3 的 Color Sensor 讀取環境光源的亮度值 (Ambient Light Intensity), 並每間隔 10 秒透過 Temboo 的 <a href="https://temboo.com/library/Library/Google/Spreadsheets/AppendRow/">Google - Spreadsheets - AppendRow</a> Choreo 將包含: ( <b><span style="color: blue;">讀取時間</span></b> 與 <b><span style="color: blue;">感應器值</span></b> ) 的一筆資料寫入至 Google 試算表中.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-0dRBE_XEteo/VwR1h_1oV7I/AAAAAAAABSA/dN-Cy1VFwBkyYQaBMwwBxGStN5nv7t_SQ/s1600/ev3dev_temboo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://3.bp.blogspot.com/-0dRBE_XEteo/VwR1h_1oV7I/AAAAAAAABSA/dN-Cy1VFwBkyYQaBMwwBxGStN5nv7t_SQ/s400/ev3dev_temboo.png" width="480" /></a></div>
<br />
<br />
<b><span style="color: blue; font-size: large;">Pyhton </span><span style="color: blue; font-size: large;">程式說明:</span></b><br />
<br />
<b><span style="color: blue;">A. 匯入程式庫</span></b><br />
<br />
# 匯入 ev3dev 程式庫<br />
from ev3dev.auto import *<br />
<br />
# 匯入 Temboo 程式庫<br />
from temboo.Library.Google.Spreadsheets import AppendRow<br />
from temboo.core.session import TembooSession<br />
<br />
# 匯入 讀取系統日期功能<br />
from datetime import datetime<br />
<br />
# 匯入 sleep() 功能<br />
from time import sleep<br />
<br />
<b><span style="color: blue;">B. 連接 EV3 Color Sensor 及設定測量環境光源亮度模式</span></b><br />
cs = ColorSensor(); assert cs.connected<br />
cs.mode = "COL-AMBIENT"<br />
<br />
<b><span style="color: blue;">C. 登入 Temboo 並建立 Session</span></b><br />
session = TembooSession("Temboo-Acct", "Temboo-APP", "Temboo-AppKey")<br />
<br />
<b><span style="color: blue;">D. 傳送資料至 Google 試算表的函式</span></b><br />
def sendDataToGoogle(nowTime, sensorVal):<br />
# 建立 Choreo 實例<br />
appendRowChoreo = AppendRow(session)<br />
<br />
# 取得 Choreo 的 InputSet 物件<br />
appendRowInputs = appendRowChoreo.new_input_set()<br />
<br />
# 設定 Choreo 所需要的輸入資訊<br />
rowData = ','.join([nowTime, str(sensorVal)])<br />
appendRowInputs.set_RowData(rowData)<br />
appendRowInputs.set_SpreadsheetTitle("ev3_lightIntensityValue")<br />
appendRowInputs.set_RefreshToken("RefreshToken-of-Google-Spreadsheets")<br />
appendRowInputs.set_ClientSecret("Your-Google-Client-Secret")<br />
appendRowInputs.set_ClientID("Your-Google-Client-ID")<br />
<br />
# 執行 Choreo 呼叫 Google 雲端服務<br />
appendRowResults = \<br />
appendRowChoreo.execute_with_results(appendRowInputs)<br />
<br />
# 顯示執行 Choreo 後的回傳訊息<br />
print("NewAccessToken: " + appendRowResults.get_NewAccessToken())<br />
print("Response: " + appendRowResults.get_Response())<br />
<br />
<br />
<b><span style="color: blue;">E. 讀取 EV3 Color Sensor 測量值</span></b><br />
# 進行 10 次的測試<br />
for rec_cnt in range(10):<br />
# 取得目前的系統時間字串<br />
nowTime = datetime.strftime(datetime.now(), '%m-%d-%Y %H:%M:%S')<br />
<br />
# 讀取 Color Sensor 的測量值<br />
sensorVal = cs.value(0)<br />
print("Light Intensity: ", sensorVal)<br />
<br />
# 呼叫執行 AppendRow choreo 函式<br />
sendDataToGoogle(nowTime, sensorVal)<br />
<br />
# 等候 10 秒之後再繼續執行<br />
sleep(10)<br />
<br />
<span style="color: blue; font-size: large;"><b>執行結果</b></span><br />
<br />
下圖右側為程式執行過程所顯示的回傳訊息,<br />
左側為新增資料至 Google Spreadsheets 的執行結果.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-8QhmJwnQkR8/VwSCG4fxv5I/AAAAAAAABSo/er00VZtTXBQ-MH8v2L8NsXkvt_m349Iug/s1600/AppendRowToGoogleSheets_70.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://3.bp.blogspot.com/-8QhmJwnQkR8/VwSCG4fxv5I/AAAAAAAABSo/er00VZtTXBQ-MH8v2L8NsXkvt_m349Iug/s640/AppendRowToGoogleSheets_70.png" width="640" /></a></div>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-29797636492774576682016-03-26T21:35:00.000-07:002016-04-05T20:44:24.244-07:00Arduino Yun 筆記:測試呼叫 Temboo 的 Gmailv2 與 Spreadsheets choreos 功能<b><a href="https://www.arduino.cc/en/Guide/ArduinoYun"><span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;">Arduino </span><span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;">Yún</span></a></b><span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;"> </span>名稱中的 "<span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;"><b>Yún</b></span>" 正是中文的 "<span style="font-size: large;"><b>雲</b></span>" ,也就是特別強調在<span style="font-size: large;"><b>雲端應用</b></span>的整合能力,所以除了 Yun 本身已具備的連網功能之外,更透過與 <b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;"><a href="https://temboo.com/arduino/yun/">Temboo</a> </b>的合作,很方便的就能夠連接許多目前相當普遍的雲端服務,如:Google、Facebook、Twitter、Yahoo Weather、Dropbox ... 等。<br />
<br />
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;"><a href="https://temboo.com/arduino/yun/">Temboo</a></b> 平台提供了數十種連接雲端服務的 <b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;"><a href="http://support.temboo.com/entries/21009643-What-Are-Choreos-">Choreos</a></b>,<br />
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;">Choreo</b> 是指呼叫每個特定雲端服務的可重複使用程式碼,用以簡化程式開發工作。同時在最新版本的 Arduino IDE 中,也已經預載了 <a href="https://github.com/arduino-libraries/Temboo" target="_blank">Temboo 程式庫</a>,結合 Choreo 很容易的就能夠實現 Arduino Yun 在雲端的整合應用。<br />
<a href="https://2.bp.blogspot.com/-qxLNwvz2suI/VufexhLzpxI/AAAAAAAABP0/qSkysp2Y_LECw8SDh1F1CuaI1ASiPQYFQ/s1600/TembooIllustrated.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="210" src="https://2.bp.blogspot.com/-qxLNwvz2suI/VufexhLzpxI/AAAAAAAABP0/qSkysp2Y_LECw8SDh1F1CuaI1ASiPQYFQ/s640/TembooIllustrated.png" width="480" /></a><br />
(圖片來源:arduino.cc)<br />
<br />
在 <b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;">Temboo</b> 網站中提供有 <a href="https://temboo.com/arduino/yun/">12 個 Arduino Yun 連接雲端服務的範例</a>,同時在 Arduino IDE 的 File - Examples - Temboo - Arduino Yun 中也有相對應的範例程式,這些都是相當好的參考資源。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-qn0GKX1ocT8/VvNK2uC4vEI/AAAAAAAABQo/gzQrj53jJ-MzxPkSL8cRTCacT1ZFWlkfg/s1600/Temboo_ArduinoYun_Examples.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-qn0GKX1ocT8/VvNK2uC4vEI/AAAAAAAABQo/gzQrj53jJ-MzxPkSL8cRTCacT1ZFWlkfg/s320/Temboo_ArduinoYun_Examples.png" width="319" /></a></div>
(圖片來源:Temboo.com)<br />
<br />
本次的測試是以 Arduino Yun 在 Sketch 中使用 <a href="https://www.arduino.cc/en/Reference/YunBridgeLibrary" target="_blank">Bridge</a> 以及 <a href="https://github.com/arduino-libraries/Temboo" target="_blank">Temboo 程式庫</a> 呼叫 Temboo 的 <a href="https://temboo.com/library/Library/Google/Gmailv2/">Gmailv2</a> 與 <a href="https://temboo.com/arduino/yun/update-google-spreadsheet">Google Spreadsheets</a> 兩個 Choreos 功能,將 Arduino 端的資訊透過 Gmail 傳送至指定信箱 以及 存放到 Google 試算表中。<br />
<br />
以下是過程的相關記錄:<br />
<br />
<a name='more'></a><br /><br />
<h2>
<span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;"><b>Arduino Yun 呼叫 Temboo Choreo 的步驟與方式: </b></span></h2>
<span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;"><b>A. 設定 Temboo 帳號的認證憑證:</b></span><br />
使用 Temboo 服務需要先申請 Temboo 帳號,Temboo 主要為付費服務,同時也有每月限制呼叫 250 次的免費方案,目前則有一個限期一個月免費體驗 Enterprise Plan 的優惠方案。<br />
接著建立 Application 並產生 Application Key 作為請求呼叫 Choreos 的憑證。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-d2J0vtr8DKA/Vu7WDvAGT3I/AAAAAAAABQI/jPMuhpSl5i0hZ13zVJ37YcU0XqgMjp7lw/s1600/Temboo_Account_Application.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://2.bp.blogspot.com/-d2J0vtr8DKA/Vu7WDvAGT3I/AAAAAAAABQI/jPMuhpSl5i0hZ13zVJ37YcU0XqgMjp7lw/s640/Temboo_Account_Application.png" width="480" /></a></div>
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;">※ 在 Arduino sketch 中設定 Temboo 帳號憑證的方式如下:</b><br />
<ul>
<li>先建立一個 Temboo Choreo 的 client 物件:<br /><span style="font-size: medium;"><span style="background-color: yellow; color: blue;"><b>TembooChoreo</b> </span><b><span style="background-color: yellow;">choreo_obj;</span></b></span></li>
<li>接著啟動 Temboo Choreo client 物件:<br /><span style="font-size: medium;"><span style="background-color: yellow;"><b>choreo_obj</b>.<span style="color: blue;"><b>begin()</b></span>;</span></span></li>
<li>再設定 Temboo 帳號憑證:<br /><b style="background-color: yellow;"><span style="font-size: medium;">choreo_obj.</span><span style="color: blue; font-size: medium;">setAccountName(</span><span style="font-size: medium;">"Temboo帳號"</span><span style="color: blue; font-size: medium;">);</span><br /><span style="font-size: medium;">choreo_obj.</span><span style="color: blue; font-size: medium;">setAppKeyName(</span><span style="font-size: medium;">"Application名稱"</span><span style="color: blue; font-size: medium;">);</span><br /><span style="font-size: medium;">choreo_obj.<span style="color: blue;">setAppKey(</span>"Application Key"</span><span style="color: blue;"><span style="font-size: medium;">);</span></span></b></li>
</ul>
<span style="background-color: white; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;"><span style="font-family: "times new roman"; font-size: small; line-height: normal;"><b style="background-color: transparent; color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;">B. 設定所要呼叫的 Choreo:</b></span></span><br />
Temboo 依據功能類型以 Bundles 方式將每個雲端服務所有的 Choreos 分類整理成樹狀結構的 Choreo Library,指定所要呼叫 Choreo 的方式也就是依據 Choreo 在 Library 中的路徑位置來設定。<br />
<br />
以本次測試的 <a href="https://temboo.com/library/Library/Google/Gmailv2/">Gmailv2</a> 與 <a href="https://temboo.com/arduino/yun/update-google-spreadsheet">Google Spreadsheets</a> 兩個 Choreos 為例, 在 Arduino sketch 中會呼叫 <span style="font-size: small;"><span style="background-color: yellow; color: blue; font-size: medium; font-weight: bold;">setChoreo("</span><span style="background-color: yellow; font-size: medium; font-weight: bold;">Chroeo 路徑</span><span style="background-color: yellow; color: blue; font-size: medium; font-weight: bold;">"</span></span><span style="background-color: yellow; color: blue; font-weight: bold;"><span style="font-size: medium;">)</span></span> 函式,並分別以兩個 Choreos 的路徑作為參數 :<br />
<ol>
<li><span style="background-color: yellow;"><span style="font-size: small;"><span style="font-size: small; font-weight: bold;"><span style="background-color: white;">以 Google Gmailv2 傳送郵件:</span><br /><b style="background-color: yellow; font-size: large;">choreo_obj.</b></span><span style="background-color: yellow; color: blue; font-size: medium; font-weight: bold;">setChoreo(</span><span style="background-color: yellow; font-size: medium; font-weight: bold;">"</span><span style="background-color: yellow; font-family: "times new roman";"><a href="https://temboo.com/library/Library/Google/Gmailv2/Messages/SendMessage/"><b>/Library/Google/Gmailv2/Messages/SendMessage</b></a></span><span style="background-color: yellow; font-size: medium; font-weight: bold;">"</span></span><span style="background-color: yellow; color: blue; font-weight: bold;"><span style="font-size: medium;">);</span></span></span></li>
<li><span style="background-color: yellow;"><b style="background-color: yellow;"><span style="font-size: medium;"><span style="background-color: white; font-family: "times new roman"; font-size: small; font-weight: normal;">增加一筆資料到 Google Spreadsheets:</span><br />choreo_obj.<span style="color: blue;">setChoreo(</span>"</span></b><b style="font-family: 'times new roman';"><span style="color: blue;"><a href="https://temboo.com/library/Library/Google/Spreadsheets/AppendRow/" style="color: blue;">/Library/Google/Spreadsheets/AppendRow</a>");</span></b></span></li>
</ol>
<span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; line-height: 31.5px;"><b>C. </b><b>輸入</b><b>呼叫 Choreo 所需要</b></span><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;">的</b><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;">資訊:</b><br />
呼叫每一個 Choreo 所對應 Web service 都有所需要輸入的資料欄位,包含:雲端服務的認證憑證 與 Web service 所要求的資訊。<br />
<br />
每個資料欄位都是以 Key - Value 方式設定,在 Arduino sketch 中,每個資料欄位會以呼叫 <b style="background-color: yellow;"><span style="color: blue;">addInput(</span>"Key name", "Value"<span style="color: blue;">)</span></b> 函式方式傳送。<br />
<br />
在 Temboo 網站中的每個 Choreo 頁面包含有所需要輸入的資料欄位資訊,Choreo 頁面可以由 Temboo 首頁左側上方的 Search Library 搜尋功能尋找,或展開瀏覽下方的 <span style="background-color: white;">Choreo Library 樹狀結構</span><span style="background-color: white;">。</span><br />
<span style="background-color: white;"><a href="https://1.bp.blogspot.com/-GpMSEaNCLSI/Vu9fgdH2I-I/AAAAAAAABQY/7B0aWOzUjR4IlRafz6BAPOikpExBVE0PQ/s1600/Temboo_Library_choreos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="432" src="https://1.bp.blogspot.com/-GpMSEaNCLSI/Vu9fgdH2I-I/AAAAAAAABQY/7B0aWOzUjR4IlRafz6BAPOikpExBVE0PQ/s640/Temboo_Library_choreos.png" width="480" /></a></span><br />
<div class="separator" style="clear: both; text-align: left;">
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><br /></b></div>
<div class="separator" style="clear: both; text-align: left;">
以本次所測試的 <a href="https://temboo.com/library/Library/Google/Gmailv2/">Gmailv2</a> 與 <a href="https://temboo.com/arduino/yun/update-google-spreadsheet">Google Spreadsheets</a> 兩個 Choreos 為例,兩個 Choreo 頁面的輸入欄位資訊 與 Arduino sketch 呼叫函式的方式分別如下:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><span style="font-size: large;">※</span> </b><span style="font-size: x-small;"><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;">Google</b><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"> -</b></span><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><span style="font-size: x-small;">Gmailv2 - Messages -</span> SendMessage <span style="font-size: x-small;">Choreo</span> :</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-To9p5I9WMV0/VvTQoKRPjnI/AAAAAAAABQ4/oviNFnEXxQMUGSmVqNQYraXFwOFUKzk4A/s1600/Choreo_Gmail_Gmailv2_Messages_SendMessage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://1.bp.blogspot.com/-To9p5I9WMV0/VvTQoKRPjnI/AAAAAAAABQ4/oviNFnEXxQMUGSmVqNQYraXFwOFUKzk4A/s640/Choreo_Gmail_Gmailv2_Messages_SendMessage.png" width="505" /></a></div>
<span style="background-color: white; font-family: "times new roman";">上圖中 Choreo 頁面為呼叫 <b>Gmailv2 傳送郵件</b>的 Web service 所需輸入的欄位,其中前三個欄位 (ClientID、ClientSecret、RefreshToken) 為 Google <b>Gmailv2</b> Web services 的認證憑證資訊,取得方式可以參考 Temboo <b>"</b><a href="https://temboo.com/library/Library/Google/Gmailv2/"><span style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif;"><span style="font-size: 20px;">Google</span></span><span class="uri-sep" style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif; font-size: 20px;"> . </span><span style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif; font-size: 20px; font-weight: bold;">Gmailv2</span></a><b>"</b> bundle 頁面中的 <span style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif; font-size: 14px; font-weight: bold; text-transform: uppercase;">SETUP INSTRUCTIONS</span> 說明。</span><br />
<span style="background-color: white; font-family: "times new roman";"><br /></span>
<b><span style="background-color: white; font-family: "times new roman";">※ 在 Arduino sketch 中呼叫</span><span style="background-color: white; font-family: "times new roman";">函式</span><span style="background-color: white; font-family: "times new roman";">的程式碼如下:</span></b><br />
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"ClientID</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"你的 Google client ID</span><span style="color: black; font-size: small;">"</span>);</span></span></span><br />
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"ClientSecret</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"</span></span></span><span style="font-weight: bold;">你的 Google client 密碼</span><span style="font-weight: bold;">"</span><span style="color: blue; font-weight: bold;">);</span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"RefreshToken</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"重新取得 Google access token 的 Token</span></span></span><span style="font-weight: bold;">"</span><span style="color: blue; font-weight: bold;">);</span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"From</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"寄送使用的</span></span></span><span style="font-weight: bold;">郵件信箱</span><span style="font-weight: bold;">"</span><span style="color: blue; font-weight: bold;">);</span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"MessageBody</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"郵件內容</span><span style="color: black; font-size: small;">"</span>);</span></span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"Subject</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"郵件主旨</span><span style="color: black; font-size: small;">"</span>);</span></span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"To</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"收件人郵件信箱</span><span style="color: black; font-size: small;">"</span>);</span></span></span><span style="color: blue; font-size: medium;"><b><br /></b></span><br />
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><br /></b>
<b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><span style="font-size: large;">※</span> <span style="font-size: x-small;">Google</span></b><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><span style="font-size: x-small;"> - </span></b><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; line-height: 31.5px;"><span style="font-size: x-small;">Spreadsheets - </span>AppendRow <span style="font-size: x-small;">Choreo</span>:</b><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-k7RUL1avq8g/VvTQ2hfkA9I/AAAAAAAABQ8/ZoUOMnSDF6oAI6DXMf36p4WBBYu2qUwtw/s1600/Choreo_Spreadsheets_AppendRow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="560" src="https://2.bp.blogspot.com/-k7RUL1avq8g/VvTQ2hfkA9I/AAAAAAAABQ8/ZoUOMnSDF6oAI6DXMf36p4WBBYu2qUwtw/s640/Choreo_Spreadsheets_AppendRow.png" width="539" /></a></div>
<span style="background-color: white; font-family: "times new roman";">上圖 Choreo 頁面為呼叫 <b>增加一筆資料到 Google 試算表</b> 的 Web service 所需輸入的欄位,其中前三個欄位 (ClientID、ClientSecret、RefreshToken) 為 Google <b>Spreadsheets</b> Web services 的認證憑證資訊,取得方式可以參考 Temboo<b> "</b><a href="https://temboo.com/library/Library/Google/Spreadsheets/"><span style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif;"><span style="font-size: 20px;">Google</span></span><span class="uri-sep" style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif; font-size: 20px;"> . </span><span style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif; font-size: 20px; font-weight: bold;">Spreadsheets</span></a><b>" </b>bundle 頁面中的 <span style="color: #333333; font-family: "open sans" , "trebuchet ms" , "arial" , sans-serif; font-size: 14px; font-weight: bold; text-transform: uppercase;">SETUP INSTRUCTIONS</span> 說明。</span><br />
<span style="background-color: white; font-family: "times new roman";"><br /></span>
<b><span style="background-color: white; font-family: "times new roman";">※ 在 Arduino sketch 中呼叫</span><span style="background-color: white; font-family: "times new roman";">函式</span><span style="background-color: white; font-family: "times new roman";">的程式碼如下:</span></b><br />
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"ClientID</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"你的 Google client ID</span><span style="color: black; font-size: small;">"</span>);</span></span></span><br />
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"ClientSecret</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"</span></span></span><span style="font-weight: bold;">你的 Google client 密碼</span><span style="font-weight: bold;">"</span><span style="color: blue; font-weight: bold;">);</span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"RefreshToken</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"重新取得 Google access token 的 Token</span></span></span><span style="font-weight: bold;">"</span><span style="color: blue; font-weight: bold;">);</span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"RowData</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"</span></span></span><span style="font-weight: bold;">一筆</span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">以逗點分隔成多個項目的資料</span></span></span><span style="font-weight: bold;">"</span><span style="color: blue; font-weight: bold;">);</span></span></div>
<div>
<span style="background-color: yellow;"><span style="font-size: small;"><span style="font-weight: bold;">choreo_obj.</span><span style="color: blue; font-weight: bold;">addInput(</span><span style="font-weight: bold;">"SpreadsheetTitle</span><span style="font-weight: bold;">", </span></span><span style="color: blue; font-weight: bold;"><span style="font-size: small;"><span style="color: black; font-size: small;">"Google 試算表的名稱</span><span style="color: black; font-size: small;">"</span>);</span></span></span></div>
<div>
<span style="background-color: yellow;"><span style="color: blue; font-weight: bold;"><span style="font-size: medium;"><br /></span></span></span>
<span style="background-color: yellow;"><span style="color: blue; font-weight: bold;"><span style="font-size: medium;"><span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 18px; font-weight: normal; line-height: 31.5px;"><b>D. 執行 Choreo 並等候執行結果</b></span><span style="background-color: white;"><b style="color: #4f4e4e; font-family: 'typoninesans regular 18', 'lucida grande', lucida, verdana, sans-serif; font-size: 18px; line-height: 31.5px;">:</b></span></span></span></span></div>
最後呼叫 <span style="color: blue;"><b>choreo_obj.run()</b></span> 函式,執行 Choreo 以送出對 Google 請求執行 <b>Gmailv2</b> 與 <b>AppendRow</b> 的 Web services 並等候回傳的執行結果,相關的 Arduino Sketch 程式碼如下:<br />
<br />
<b style="background-color: yellow;">unsigned int returnCode = choreo_obj.run();</b><br />
<b style="background-color: yellow;">if (returnCode == 0) {</b><br />
<b style="background-color: yellow;"> Serial.println("Success !");</b><br />
<b style="background-color: yellow;"> }</b><br />
<b style="background-color: yellow;">else {</b><br />
<b style="background-color: yellow;"> while (choreo_obj.available()) {</b><br />
<b style="background-color: yellow;"> char c = choreo_obj.read();</b><br />
<b style="background-color: yellow;"> Serial.print(c);</b><br />
<b style="background-color: yellow;"> }</b><br />
<b style="background-color: yellow;">}</b><br />
<b style="background-color: yellow;">choreo_obj.close();</b><br />
<br />
<h1 style="color: #333333; font-family: 'Open Sans', 'Trebuchet MS', Arial, sans-serif; font-size: 24px; font-weight: 200; margin: 0px 0px 0px -370px; position: absolute; width: 290px;">
Your Arduino Yún comes loaded with Temboo</h1>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-20824228876801707592016-02-27T02:48:00.000-08:002016-03-26T21:35:00.101-07:00Arduino Yun 筆記:以Arduino Yun 製作的 MP3 播放器<span style="font-size: medium;"><a href="https://www.arduino.cc/en/Main/ArduinoBoardYun" target="_blank">Arduino Yun</a> 比較傳統的 Arduino 主板,最大優勢在於同時兼具兩個開發環境:</span><br />
<ol>
<li><span style="font-size: medium;"><b>Atmega32u4 處理器:</b><br />同<a href="https://www.arduino.cc/en/Main/ArduinoBoardLeonardo" target="_blank"> Arduino Leonardo </a>,具有 20 個數位、類比、PWM 腳位以及 3 種序列通訊功能(Serial、I2C 、SPI),並可堆疊相容的 Shields 擴充板。 </span></li>
<li><span style="font-size: medium;"><b>Atheros AR9331 處理器:</b><br />使用 OpenWRT Linux 作業系統並內建 USB Host、Ethernet、WiFi 、Micro SD slot等周邊,另提供有 Python 2.7 作為 Linux 端的</span><span style="font-size: medium;">程式開發。</span></li>
</ol>
<span style="font-size: medium;">兩者間以 Hardware Serial port 相連,並以 Arduino 的 <a href="https://www.arduino.cc/en/Reference/YunBridgeLibrary" target="_blank">Bridge 程式庫</a>,作為相互利用彼此資源的軟體介面,尤其 Linux 系統功能強大,雖是輕量版的 OpenWRT,但可運用的範圍與彈性已遠超過傳統的 Arduino 主板。</span><br />
<span style="font-size: medium;"><br /></span><span style="font-size: medium;">這次以 Arduino Yun 製作的 MP3 播放器,</span><span style="font-size: medium;">即運用 Linux 對 USB 裝置的支援能力,</span><span style="font-size: medium;">使用</span><span style="font-size: medium;"> USB 音效卡播放 Micro SD 卡內的 MP3 檔,並</span><span style="font-size: medium;">透過 I2C 外接</span><span style="font-size: medium;"> Arduino Uno + LCD Keypad shield 作為控制面板,可以顯示 MP3 檔 ID3 tag 的曲目與演出者資訊,以及透過操作按鍵逐一瀏覽及選擇</span><span style="font-size: medium;">歌曲</span><span style="font-size: medium;">播放,功能如同一般的 MP3 播放器。</span><br />
<span style="font-size: medium;"><br /></span>
<br />
<div>
<a href="https://4.bp.blogspot.com/-FofziXlXvhM/Vsw2TB6rwRI/AAAAAAAABOU/rq7mYfMmEzw/s1600/Arduino_Yun_MP3_Player_01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="480" src="https://4.bp.blogspot.com/-FofziXlXvhM/Vsw2TB6rwRI/AAAAAAAABOU/rq7mYfMmEzw/s640/Arduino_Yun_MP3_Player_01.png" width="640" /></a><br />
<h1>
<span style="color: blue; font-size: large;">系統架構</span></h1>
<div>
<span style="color: blue; font-size: large;"><a name='more'></a><br /></span></div>
<span style="font-size: medium;">如上圖,整體裝置共分成兩個部份:</span><br />
<ul>
<li><span style="font-size: medium;">上面是</span><span style="font-size: medium;"><b>控制</b></span><span style="font-size: medium;"><b>器,</b>作為操作面板,包含 <b>Arduino UNO</b> 加上 <b>LCD Keypad Shield</b>。</span></li>
<li><span style="font-size: medium;">下面是<b>播放器,</b>負責控制 MP3 播放以及提供 ID3 Tag 資訊,包含 <b>Arduino Yun</b> 加上<b> USB音效卡</b>與<b>喇叭</b>。</span></li>
<li><span style="font-size: medium;">兩者間以 I2C 方式連接,<b>播放器</b>是 Master,<b>控制器</b>為 Slave。</span></li>
<li><span style="font-size: medium;">I2C 接線方式:由 Arduino Yun 的 D2(SDA)、 D3(SCL)、5V、GND 對應連接 Arduino UNO 的 A4、A5、Vin( 或 5V )、GND。</span></li>
<li><span style="font-size: medium;">此外,LCD Keypad shield 上面的 5 個按鍵是透過 analogRead(A0 pin) 的值來判斷,所以將兩者的 A0 pin 連接在一起就可以由<b>播放器</b>直接讀取<b>按鍵值</b>。 </span></li>
</ul>
<span style="font-size: medium;"><b>● 播放器 </b>(Arduino Yun) 的功能分別由 <b>Linux 端</b>(AR9331)與 <b>Arduino 端</b>(ATmega32u4)所組成</span><span style="font-size: medium;">:</span><br />
<span style="font-size: medium;"><br /></span>
<span style="font-size: medium;"><b style="font-size: large;">(一) Linux 端:</b></span><span style="font-size: medium;">透過建立一個 </span><span style="font-size: medium;">player.py 的 </span><span style="font-size: medium;">Python 程式,</span><span style="font-size: medium;">提供給 <b>Arduino 端</b>的 Sketch 使用 Process 物件呼叫執行以下兩個功能:</span><br />
<ol>
<li><span style="font-size: medium;">回傳 MP3 檔 ID3 Tag 資訊。</span></li>
<li><span style="font-size: medium;">控制開始或停止 MP3 檔的播放。</span></li>
</ol>
<span style="font-size: medium;"><b>※</b> 在 OpenWRT Linux 要以 USB 音效卡</span><span style="font-size: medium;">播放</span><span style="font-size: medium;">MP3音樂</span><span style="font-size: medium;">,須</span><span style="font-size: medium;">先</span><span style="font-size: medium;">安裝 </span><b style="font-size: large;">kmod-usb-audio</b><span style="font-size: medium;"> 套件以及 <b>madplay</b> 播放程式:</span><br />
<span style="color: red; font-size: medium;"><b>opkg update</b></span><br />
<span style="color: red; font-size: medium;"><b>opkg install kmod-usb-audio madplay</b></span><br />
<span style="font-size: medium;"> </span><br />
<span style="font-size: medium;"><b>※</b> player.py 的程式碼如下,共有三種執行選項:</span><br />
<ul>
<li><span style="font-size: medium;">回傳指定 MP3 檔<b> ID3 Tag</b> 的 <b>曲目(title)</b> 與 <b>演出者(performer)</b>資訊:<br /><span style="color: red;"><b>./player.py -info "MP3 檔名"</b></span></span></li>
<li><span style="font-size: medium;">開始播放指定的 MP3 檔:<br /><span style="color: red;"><b>./player.py -play "MP3 檔名"</b></span></span></li>
<li><span style="font-size: medium;"><span style="color: red;"><b><span style="color: black; font-weight: normal;">停止 MP3 檔的<b style="color: red;"><span style="color: black; font-weight: normal;">播放</span></b>:</span><br style="color: black; font-weight: normal;" /><span style="color: red; font-weight: normal;"><b>./player.py -stop</b></span></b></span></span></li>
</ul>
<b>( player.py )</b><br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><span style="font-size: large;"><code style="word-wrap: normal;">
#!/usr/bin/python
import id3reader, os, signal, sys
mp3opt = "-a -5"
if len(sys.argv) > 1:
if sys.argv[1] == "-info":
try:
id3 = id3reader.Reader(sys.argv[2])
print id3.getValue("title")
print id3.getValue("performer") + " - " + id3.getValue("album")
except IOError:
print
print
elif sys.argv[1] == "-play":
os.system("madplay " + mp3opt + " \"" + sys.argv[2] + "\" &> /dev/null")
elif sys.argv[1] == "-stop":
pid = os.popen("pgrep madplay").read()
os.kill(int(pid), signal.SIGKILL)</code></span></span></pre>
<br />
<br /></div>
<span style="font-size: medium;"><b>(二) Arduino 端 </b>是整個裝置的控制中心,主要功能包含:</span><br />
<ol>
<li><span style="font-size: medium;">首先以 FileIO 類別讀取 Linux 端 MicroSD 卡內存放 MP3 檔的目錄,並透過以下的 <b><span style="color: red;">getSongFileName()</span></b> 與 <span style="color: red;"><b>showSongInfo()</b></span> 函式 ,將第一首 MP3 檔的 ID3 Tag 資訊顯示在 LCD 上。</span></li>
<li><pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><span style="font-size: large;"><code style="word-wrap: normal;">
// 讀取第 songNo 首 MP3 檔的檔名
void getSongFileName() {
songFileName = "";
File dirH = FileSystem.open("/mnt/sda1/project3/mp3");
dirH.rewindDirectory();
for(int xi=1; xi<=songNo; xi++) {
File fileH = dirH.openNextFile();
if(fileH) {
if(xi == songNo) {
songFileName = fileH.name();
}
fileH.close();
}
}
dirH.close();
}
// 呼叫 player.py 程式讀取指定 MP3 檔的 ID3 tags 資訊並顯示在 LCD shield
void showSongInfo() {
Process p;
p.runShellCommand("/mnt/sda1/project3/player.py -info \"" + songFileName + "\"");
String songTitle = p.readStringUntil('\n');
String performer = p.readStringUntil('\n');
p.close();
if((playing.running()) && (songNo == playing_songNo)) {
songTitle = "*" + songTitle;
}
clearMsgOnLCD(100);
char printMsg[16];
songTitle.toCharArray(printMsg,16);
showMsgOnLCD(CMD_DISPLAY_ON_LINE1, printMsg, 100);
performer.toCharArray(printMsg,16);
showMsgOnLCD(CMD_DISPLAY_ON_LINE2, printMsg, 100);
}
</code></span></span></pre>
</li>
<li><span style="font-size: medium;">依據讀取 LCD Keypad Shield 的按鍵值,執行相對應的功能:</span></li>
<ul><span style="font-size: medium;">
<li>瀏覽上一首/下一首,並透過上面的 <b><span style="color: red;">getSongFileName()</span></b> 與 <b><span style="color: red;">showSongInfo()</span></b> 函式 ,將目前的 MP3 檔的 ID3 Tag 資訊顯示在 LCD 上。</li>
<li><b>播放</b> :先以 <b><span style="color: red;">Process.running()</span></b> 函式判斷目前是否正在播放歌曲中,若是的話,則以 <span style="color: red;"><b>Process.runShellCommand()</b></span> 函式呼叫 <b><span style="color: red;">player.py -stop </span></b>中止播放,接著再以 <span style="color: red;"><b>Process.runShellCommandAsynchronously()</b></span> 函式呼叫 <span style="color: red; font-weight: bold;">player.py -play "MP3 檔名"</span> 開始播放。<br /><br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><span style="font-size: large;"><code style="word-wrap: normal;">
else if(getKey == PLAY_SONG) {
if(playing.running()) {
Process p;
p.runShellCommand("/mnt/sda1/project3/player.py -stop");
p.close();
}
playing.runShellCommandAsynchronously("/mnt/sda1/project3/player.py -play \"" +
songFileName + "\"");
playing_songNo = songNo;
getSongFileName();
showSongInfo();
}
</code></span></span></pre>
</li>
</span></ul>
<li><br /></li>
</ol>
<div>
<span style="font-size: medium;"><b>● 控制器 </b>(Arduino UNO + LCD Keypad Shield) 的功能是作為使用者的操作介面,提供以 I2C Save 方式接收來自 I2C Master 裝置( 播放器 ) 所傳送過來的字串資訊,以顯示於 16x2 的 LCD 面板。</span></div>
<div>
<span style="font-size: medium;">(Arduino_I2CSlave_LCDKeypad_Shield.ino)</span></div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><span style="font-size: large;"><code style="word-wrap: normal;">
#include <LCD4Bit_mod.h>
#include <Wire.h>
#define LCD_SHIELD 0x06
#define CMD_DISPLAY_ON_LINE1 0x01
#define CMD_DISPLAY_ON_LINE2 0x02
#define CMD_CLEAR 0x03
LCD4Bit_mod lcd = LCD4Bit_mod(2); // 2 Lines to display
void displayLCD(int xline, char* xtext) {
char xmsg[80];
sprintf(xmsg, "<Line %d> %s", xline, xtext);
Serial.println(xmsg);
lcd.cursorTo(xline, 0);
lcd.printIn(xtext);
}
void setup() {
lcd.init();
Wire.begin(LCD_SHIELD); // I2C Slave address
Wire.onReceive(receiveEvent);
lcd.clear();
lcd.printIn("Ready ...");
Serial.begin(9600);
Serial.println("Ready..");
}
void loop() {
delay(100);
}
void receiveEvent(int howMany) {
int idx;
char text[17];
byte cmd = Wire.read();
if(cmd == CMD_CLEAR) {
lcd.clear();
}
else if((cmd == CMD_DISPLAY_ON_LINE1) || (cmd == CMD_DISPLAY_ON_LINE2)) {
while(Wire.available()) {
char x=Wire.read();
delay(1);
if(idx<16) {
text[idx] = x;
idx++;
}
else break;
}
if(cmd == CMD_DISPLAY_ON_LINE1)
displayLCD(1, text);
else
displayLCD(2, text);
}
cmd = ' ';
}
</code></span></span></pre>
<div>
<br />
<br /></div>
<div>
<br /></div>
<div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-21539418561636366492015-07-30T04:14:00.001-07:002016-02-27T02:47:11.921-08:00EVShield筆記(4 - 2) : EVShield WiFi Web Server Arduino 軟體功能<span style="font-size: large;">在前篇 " <a href="http://chlego.blogspot.tw/2015/07/evshield4-1-arduino-wifi-shield.html" target="_blank">(4-1) 結合 Arduino WiFi Shield 的 EVShield Web Server</a> </span><span style="font-size: large;">" 中,主要探討的是</span><span style="font-size: large;">硬體介面</span><span style="font-size: large;">相關</span><span style="font-size: large;">,包含: </span><span style="font-size: large;"><b>SPI介面</b></span><span style="font-size: large;">、</span><span style="font-size: large;"><b>Shields 推疊</b> </span><span style="font-size: large;">以及 <b>Arduino 腳位配置 </b></span><span style="font-size: large;">等</span><span style="font-size: large;">。</span><br />
<br />
<span style="font-size: large;">本篇將以</span><span style="font-size: large;">軟體功能為主,包含:<b>建立 WiFi 連結</b></span><span style="font-size: large;">、</span><b><span style="font-size: large;">啟動 Web server</span><span style="font-size: large;"> </span></b><span style="font-size: large;">以及 </span><span style="font-size: large;"><b>處理瀏覽器的 </b></span><span style="font-size: large;"><b>HTTP request</b> 等</span><span style="font-size: large;">。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/XD-gx5dXeNA/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/XD-gx5dXeNA?feature=player_embedded" width="480"></iframe></div>
<br />
<h2>
<span style="color: blue; font-size: x-large;"><b style="background-color: white;">【參考資訊】</b></span></h2>
<span style="font-size: large;">(1) </span><span style="font-size: large;"><a href="https://www.arduino.cc/en/Reference/WiFi" target="_blank">Arduino WiFi.h 程式庫</a> </span><br />
<span style="font-size: large;">(2) </span><span style="font-size: large;"><a href="http://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039" target="_blank">HTTP Headers for Dummies</a> </span><br />
<span style="font-size: large;">(3) </span><span style="font-size: large;"><a href="http://chlego.blogspot.tw/2015/06/evshield2ui-module.html" target="_blank">EVShield筆記(2):UI Module使用者介面擴展板程式摘要</a> </span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ydFJq1rQ1ds/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/ydFJq1rQ1ds?feature=player_embedded" width="480"></iframe></div>
<h2>
<b style="background-color: white; color: blue;"><span style="font-size: x-large;">【1. 建立WiFi連結】</span></b></h2>
<br />
<ul>
<li><span style="font-size: large;">連接無線網路,需要</span><span style="font-size: large;">先</span><span style="font-size: large;">確認 SSID 與 </span><a href="https://www.arduino.cc/en/Reference/WiFiEncryptionType" style="font-size: x-large;" target="_blank">加密方式</a><span style="font-size: large;"> ,再以 </span><a href="https://www.arduino.cc/en/Reference/WiFiBegin" style="font-size: x-large;" target="_blank">WiFi.begin()</a><span style="font-size: large;"> 進行加密認證。</span></li>
<li><span style="font-size: large;">通過加密認證</span><span style="font-size: large;">之後,</span><span style="font-size: large;">會由 DHCP 配置</span><span style="font-size: large;">動態 IP,也可</span><span style="font-size: large;">以先以</span><a href="https://www.arduino.cc/en/Reference/WiFiConfig" style="font-size: x-large;" target="_blank">WiFi.config()</a><span style="font-size: large;"> 設定</span><span style="font-size: large;">靜態 IP後</span><span style="font-size: large;">再進</span><span style="font-size: large;">行加密認證。</span></li>
<li><span style="font-size: large;"><span style="font-size: large;">IP 位址</span>可以由 <a href="https://www.arduino.cc/en/Reference/WiFiLocalIP" target="_blank">WiFi.localIP()</a> 取得</span><span style="font-size: large;">,</span><span style="font-size: large;">資料型態為<span style="color: red;"><b>IPAddress</b></span>,實際上為</span><span style="font-size: large;">四個元素陣列<span style="font-size: large;">的IPV4 格式</span>。</span></li>
</ul>
<br />
<a name='more'></a><br /><br />
<h2>
<b style="background-color: white; color: blue;"><span style="font-size: x-large;">【2. 啟動 WiFi Server】</span></b></h2>
<span style="font-size: large;">啟動 Web Server,</span><span style="font-size: large;">需要</span><span style="font-size: large;">先以 </span><span style="color: red; font-size: large;"><a href="https://www.arduino.cc/en/Reference/WiFiServer" target="_blank">WiFiServer server(port no.)</a></span><span style="font-size: large;"> </span><span style="font-size: large;">建立</span><span style="font-size: large;">server 物件</span><span style="font-size: large;">,</span><span style="font-size: large;">再透過 </span><a href="https://www.arduino.cc/en/Reference/WiFiServerBegin" style="font-size: x-large;" target="_blank"><span style="color: blue;">server.begin() </span></a><span style="font-size: large;"> </span><span style="font-size: large;">啟動 server 開始偵聽來自 client 的封包。</span><br />
<span style="font-size: large;">以下的</span><span style="font-size: large;">範例程式中包含了:</span><span style="font-size: large;">以WPA加密認證連接無線網路取得動態IP以及啟動server物件偵聽 TCP 80 port 的 HTTP request 封包。</span><br />
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><code style="word-wrap: normal;">
WiFiServer server(80);
WiFiClient client;
void setup()
{
char ssid[] = "YourNetwork"; // Network SSID (name)
char key[] = "YourWPAKey"; // WPA key
int status = WL_IDLE_STATUS;
char ipStr[17];
evshield.init( SH_HardwareI2C );
uim.begin();
EVSH_UIM_MainPage("Arduino WIFI Web Server");
if(WiFi.status() == WL_NO_SHIELD) {
EVSH_UIM_actionMsg("No WiFi Shield");
while (true);
}
EVSH_UIM_actionMsg("Connecting WLAN..");
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, key);
delay(5000);
}
IPAddress myIP = WiFi.localIP();
sprintf(ipStr, "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
EVSH_UIM_actionMsg(ipStr);
EVSH_UIM_reportMsg("Connect this IP by browser", EVs_UIM_WHITE);
evshield.bank_a.centerLedSetRGB(0,0,0);
evshield.ledSetRGB(0,0,0);
server.begin();
delay(2000);
}
</code></span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qUgUyDxnudg/VbnuuajF5bI/AAAAAAAABJA/xxxBKy0lLQU/s1600/EVSH_WiFi_WebSvr_Init.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://3.bp.blogspot.com/-qUgUyDxnudg/VbnuuajF5bI/AAAAAAAABJA/xxxBKy0lLQU/s640/EVSH_WiFi_WebSvr_Init.png" width="436" /></a></div>
<h2>
<span style="color: blue; font-size: x-large;"><b style="background-color: white;">【3. </b></span><b style="background-color: white; color: blue; font-size: xx-large;">處理 </b><b style="background-color: white; color: blue; font-size: xx-large;">HTTP request 】</b></h2>
</div>
<span style="font-size: large;">Web server 與 client 瀏覽器之間透過 HTTP 協定進行溝通,更明確的說,Web server需要處理來自 client 的 HTTP request並回應 HTTP response 給 client,以下是進行的程序:</span><br />
<ol>
<li><span style="font-size: large;">當瀏覽器開啟Web server 的 URL之後</span><span style="font-size: large;">,就會提交一個GET method 的 HTTP request 給Web server。</span></li>
<li><span style="font-size: large;">Web server 在接收後,就會</span><span style="font-size: large;">以HTTP Response回應給瀏覽器,其中包含了要給 client 顯示的網頁 HTML文件。</span></li>
<li><span style="font-size: large;"><span style="font-size: large;">網頁中包含了四個 Submit buttons,選擇任何一個按下,瀏覽器就會</span><span style="font-size: large;">提交</span><span style="font-size: large;">一個 Post method </span><span style="font-size: large;">的 </span><span style="font-size: large;">HTTP request 給 Web server,其中包含了所按下button的 key-value值。<br /><a href="http://2.bp.blogspot.com/-gfBVUL-CyBA/VbGubmR50VI/AAAAAAAABIE/HAtnbr5PwIk/s1600/EVSH_WifiWebServer_HTML.png" imageanchor="1" style="font-size: medium; margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://2.bp.blogspot.com/-gfBVUL-CyBA/VbGubmR50VI/AAAAAAAABIE/HAtnbr5PwIk/s640/EVSH_WifiWebServer_HTML.png" width="480" /></a></span></span></li>
<li><span style="font-size: large;"><span style="font-size: large;"><span style="font-size: large;">Web server 在接收</span><span style="font-size: large;">並</span><span style="font-size: large;">解析key的value值之後,會依據value對應的指令,設定 EVShield的LED 顏色以及顯示執行的訊息在UI Module的螢幕上。</span></span></span></li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
</div>
<b style="color: red; font-size: x-large;">※</b><span style="color: red; font-size: large;"> 處理 Client HTTP request程式碼:</span><br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><span style="font-size: large;"><code style="word-wrap: normal;">
void loop()
{
char buffer[9], inChar;
client = server.available();
if (client) {
while (client.connected()) {
// A connected client has data available for reading.
if (client.available()) {
memset(buffer,0,sizeof(buffer));
if (client.readBytesUntil('/',buffer,sizeof(buffer))) {
if (strcmp(buffer,"POST ") == 0) {
client.find("\n\r"); // Skip body of http header
if (client.findUntil("ledCmd", "\n\r")) {
client.read(); // Read '='
inChar = client.read(); // Read 'r','g','b','x'
executeCmd(inChar);
}
}
else if (strcmp(buffer,"GET ") == 0) {
// Response GET request to Client
sendWebPage();
executeCmd('x');
}
client.flush();
}
}
}
delay(1);
client.stop();
client.flush();
}
}
</code></span></span></pre>
<span style="font-size: large;">
</span>
<span style="font-size: large;"><br /></span>
<span style="color: red;"><span style="font-size: large;"><b>※</b> 傳送HTTP response的程式碼:</span></span><span style="font-size: large;"><br /></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td><a href="http://4.bp.blogspot.com/-gMhYDRneIpM/VbNk5mhsO3I/AAAAAAAABIk/jPLIiZIiVp0/s1600/EVSH_sendWebPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="280" src="https://4.bp.blogspot.com/-gMhYDRneIpM/VbNk5mhsO3I/AAAAAAAABIk/jPLIiZIiVp0/s640/EVSH_sendWebPage.png" width="560" /></a></td></tr>
<tr><td class="tr-caption" style="font-size: 12.8000001907349px;">Server 傳送 HTTP Response 封包<br />
<div>
<br /></div>
</td></tr>
</tbody></table>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-81675866568195907282015-07-23T03:52:00.001-07:002015-07-30T04:15:38.381-07:00EVShield筆記(4 - 1) : 結合 Arduino WiFi Shield 的 EVShield Web Server(硬體介面)<span style="font-size: large;">以EVShield</span><span style="font-size: large;"> </span><span style="font-size: large;">結合</span><span style="font-size: large;"> </span><span style="font-size: large;">Arduino </span><span style="font-size: large;">WiFi Shield,就可以實現透過無線網路控制 EV3/NXT 的馬達與感應器。<br />而最簡單便利的人機控制介面就是在 Arduino UNO建置 Web server,這樣任何平台的裝置,即只需以瀏覽器開啟網頁方式遙控機器人的操作,而不需要開發專屬的 App。</span><br />
<span style="font-size: large;">下圖為本次所計畫建置的 EVShield WiFi Web server,將會以瀏覽器控制 EVShield 上兩組 RGB LED 的顏色顯現,並同時在 UI Module 的 LCD 螢幕上顯示目前所執行的顏色設定指令。 </span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-agh1fUeWkbE/Va4narKiLzI/AAAAAAAABHM/k3wGAtGTRiw/s1600/EVSH_WIFI_WebSvr_00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/-agh1fUeWkbE/Va4narKiLzI/AAAAAAAABHM/k3wGAtGTRiw/s320/EVSH_WIFI_WebSvr_00.png" width="480" /></a></div>
<span style="font-size: large;"><span style="color: blue;"><b><br /></b></span></span>
<span style="font-size: large;"><span style="color: blue;"><b>【示範影片】</b></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/XD-gx5dXeNA/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/XD-gx5dXeNA?feature=player_embedded" width="480"></iframe></div>
<br />
<span style="font-size: large;"><span style="color: blue;"><b><br /></b></span></span>
<span style="font-size: large;"><span style="color: blue;"><b>【擴展板推疊方式】</b></span></span>
<span style="font-size: large;"><br /></span><span style="font-size: large;">EVShield WiFi Web server 的所有組件如下圖:除Arduino UNO之外,另還包含 UI Module shield、EVShield 以及 WiFi Shield 等三個擴展板。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-axFb5orNgK0/Va40msQo4AI/AAAAAAAABHY/IJK_myrnkzo/s1600/EVSH_WIFI_WebSvr_AllBoards.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://4.bp.blogspot.com/-axFb5orNgK0/Va40msQo4AI/AAAAAAAABHY/IJK_myrnkzo/s320/EVSH_WIFI_WebSvr_AllBoards.png" width="480" /></a></div>
<span style="font-size: large;"> </span><br />
<a name='more'></a><br />
<span style="font-size: large;">至於擴展板堆疊的方式,由於 WiFi shield 與 UNO 間需以 6-pin 的 ICSP 連接,所以</span><span style="font-size: large;">如下圖</span><span style="font-size: large;">由上而下依序為:</span><span style="font-size: large;">UNO + WiFi Shield + EVShield + UI Module shield。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-CcN4BJRaSsY/Va45XVeTEWI/AAAAAAAABHk/zIjS9tAGQYM/s1600/EVSH_WIFI_WebSvr_Assembly.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://1.bp.blogspot.com/-CcN4BJRaSsY/Va45XVeTEWI/AAAAAAAABHk/zIjS9tAGQYM/s320/EVSH_WIFI_WebSvr_Assembly.png" width="480" /></a></div>
<b style="color: blue; font-size: x-large;">【Arduino腳位配置】</b><span style="font-size: large;"><br /></span><span style="font-size: large;">由於每個擴展板各有其功能與介面,經過堆疊之後所使用的Arduino腳位資源會有重複的情形,因此,需要調整以避免造成衝突而影響功能</span><span style="font-size: large;">:</span><br />
<br />
<ul>
<li><span style="font-size: large;"><b><span style="color: blue;">SPI介面</span></b>:<br />Wifi Shield 與 UI Module Shield 都是硬體 SPI 介面,參考 Arduino<a href="https://www.arduino.cc/en/Main/ArduinoWiFiShield" target="_blank">原廠官方文件</a>,WiFi Shield 以 D7 作為與 UNO 之間的Handshake,而 SS pin 則分別為D10(WiFi) 與 D4(SD)。<br />因此,會將 D4 pin 移作 </span><span style="font-size: large;">UI Module Shield 的 SS pin ,而不用於 on board SD 槽。<br /> </span></li>
<li><span style="font-size: large;"><b><span style="color: blue;">EVShield Servo pins</span></b>:<br />EVShield 使用 Servo.h 程式庫定義的 D3/ D5/ D6/ D9/ D10/ D11 6 個腳位,其中 D10 與 D11 與硬體 SPI 重複 ,在 Sketch code 中應避免產生衝突。</span></li>
</ul>
<span style="color: red; font-size: large;"><b style="background-color: white;">※ 軟體 與 網頁 功能將另整理於下一篇筆記中</b></span><br />
<ul>
</ul>
<br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"> </span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-27365899090929651802015-07-06T21:35:00.002-07:002015-07-06T21:39:01.605-07:00EVShield筆記(3):測試 EV3 以 I2C 連線控制 EVShield<span style="font-size: large; font-weight: normal;"><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" target="_blank">EVShield</a> 是作為Arduino</span><span style="font-size: large;">連接 Mindstorms NXT/EV3 馬達與感應器</span><span style="font-size: large;">的</span><span style="font-size: large;">擴展板</span><span style="font-size: large;">。</span><br />
<span style="font-size: large;">EVShield具備的功能中,</span><span style="font-size: large;">除了 Servo pins 之外,都是透過 I2C 方式進行控制</span><span style="font-size: large;">,包含:三個按鍵、兩個 RGB LED、四個 Motor ports 以及 四個 Sensor ports</span><span style="font-size: large;">。<br />而對於同樣具有 I2C 通訊</span><span style="font-size: large;">介面</span><span style="font-size: large;">的 EV3主機 Sensor ports,應該也可以取代 Arduino 直接連接及運用 EVShield 的功能,以下即是對於這個需求所進行的測試記錄。</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: large;"><a href="http://4.bp.blogspot.com/-Xq-G-XCEs0o/VZjr7SxSvkI/AAAAAAAABF4/WLL9Ys_WA0o/s1600/EV3_I2C_EVShield00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="520" src="http://4.bp.blogspot.com/-Xq-G-XCEs0o/VZjr7SxSvkI/AAAAAAAABF4/WLL9Ys_WA0o/s320/EV3_I2C_EVShield00.png" width="390" /></a></span></div>
<br />
<span style="font-size: large;"><span style="color: blue;"><b>【EV3 接線方式】:</b></span><br />如下圖,將 EVShield 背面正下方的 4 pins I2C 接腳轉接成 RJ12 cable 之後</span><span style="font-size: large;">,</span><span style="font-size: large;">連接 EV3 的 Sensor Port。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ewq_5h2D1lY/VZizvRb9-tI/AAAAAAAABFo/433F9uLNnAE/s1600/EV3_I2C_EVShield01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="390" src="http://4.bp.blogspot.com/-ewq_5h2D1lY/VZizvRb9-tI/AAAAAAAABFo/433F9uLNnAE/s320/EV3_I2C_EVShield01.png" width="520" /></a></div>
<br />
<span style="font-size: large;"><b style="color: blue;">【EV3 使用軟體】:</b><br />EV3 程式使用 RobotC 4.32 版。<br />至於 EV3 軟體,目前已知 Mindsensors 與 DI 的 EV3-I2C Programming Blocks,在功能方面並不適用。<br /> </span><br />
<h2>
<span style="color: blue; font-size: x-large;">EVShield I2C 架構</span></h2>
<div>
<span style="font-size: large; font-weight: normal;">如下圖,EVShield 由兩個 I2C Slave 裝置所組成,分別為 </span><span style="font-size: large;">Bank A</span><span style="font-size: large;"> ( </span><span style="font-size: large;">位址:</span><span style="font-size: large;">0x34</span><span style="font-size: large;"> ) 與 </span><span style="font-size: large;">Bank B </span><span style="font-size: large;">( </span><span style="font-size: large;">0x36</span><span style="font-size: large;"> </span><span style="font-size: large;">),其中 LED 與 按鍵 的控制功能都建立在 Bank A,詳細的 I2C 暫存器資訊需參考</span><span style="font-size: large;"> "<a href="http://www.mindsensors.com/index.php?module=documents&JAS_DocumentManager_op=downloadFile&JAS_File_id=1429" target="_blank">EVShield Advanced Development Guide</a>" </span><span style="font-size: large;">文件</span><span style="font-size: large;">。</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Katuwrhk9cE/VZio--AP5eI/AAAAAAAABFY/3dBIreWpQZM/s1600/EVShield_I2C_Bus.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://2.bp.blogspot.com/-Katuwrhk9cE/VZio--AP5eI/AAAAAAAABFY/3dBIreWpQZM/s400/EVShield_I2C_Bus.png" width="500" /></a></div>
<div>
<br />
<a name='more'></a><br />
<br />
<h2>
<span style="color: blue; font-size: x-large;">測試記錄 </span></h2>
<h3>
<span style="color: blue; font-size: large;">1. RGB LED 顏色顯現</span></h3>
</div>
<div>
<span style="font-size: large;">EVShield共有兩組 LED,分別位於面板的正上方 ( Front LED ) 與左下方( Rear LED )</span><span style="font-size: large;">,暫存器資訊如下表:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-5C2enzTStIE/VZj2gFP8iwI/AAAAAAAABGI/1I_VWS4oEGc/s1600/EVSH_RGB_LED_Registers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="118" src="http://1.bp.blogspot.com/-5C2enzTStIE/VZj2gFP8iwI/AAAAAAAABGI/1I_VWS4oEGc/s400/EVSH_RGB_LED_Registers.png" width="400" /></a></div>
<div>
<span style="font-size: large;">只需將顏色值分別寫入</span><span style="font-size: large;">對應的</span><span style="font-size: large;">暫存器中,即可以改變 LED 顯現的顏色,以下為 RobotC 範例程式:</span></div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large;"><code style="word-wrap: normal;">
///////////////////////////////////////////////////////////
// @EVSH_ledSetRGB: Set Front/Rear LED RGB color value
// Front LED(0xDE)
// Rear LED(0xD7)
///////////////////////////////////////////////////////////
void EVSH_ledSetRGB(ubyte ledRegAddr,
ubyte r, ubyte g, ubyte b, int delayMSec)
{
ubyte I2C_Request[6];
short errCnt=0;
while(nI2CStatus[EVSHIELD] == i2cStatusPending) {
wait1Msec(10);
}
memset(I2C_Request, 6, 0);
I2C_Request[0] = 5;
I2C_Request[1] = EVSH_BANK_A;
I2C_Request[2] = ledRegAddr;
I2C_Request[3] = r;
I2C_Request[4] = g;
I2C_Request[5] = b;
sendI2CMsg(EVSHIELD, &I2C_Request[0], 0);
wait1Msec(delayMSec);
}
</code></span></pre>
<span style="font-size: large;"><br /></span></div>
<br />
<div>
<h3>
<span style="color: blue; font-size: large;">2. 按鍵狀態</span></h3>
</div>
<div>
<span style="font-size: large; font-weight: normal;">EVShield透過 </span><span style="color: blue; font-size: large;"><b>0xDA</b></span><span style="font-size: large; font-weight: normal;"> 這個暫存器位址讀取最新</span><span style="font-size: large;">的</span><span style="font-size: large;">按鍵值</span><span style="font-size: large;">:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-F7ktrJOghAA/VZj8jN7vKZI/AAAAAAAABGY/MlyHQNqvMUc/s1600/EVSH_RGB_KEY_Registers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="105" src="http://2.bp.blogspot.com/-F7ktrJOghAA/VZj8jN7vKZI/AAAAAAAABGY/MlyHQNqvMUc/s400/EVSH_RGB_KEY_Registers.png" width="400" /></a></div>
<span style="font-size: large; font-weight: normal;">RobotC 範例程式如下:</span><br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large; font-weight: normal;"><span style="font-size: large;"><code style="word-wrap: normal;">
///////////////////////////////////////////////////////////
// @EVSH_getKeyPressValue()
// Return: 1-Left, 2-Go, 4-Right
///////////////////////////////////////////////////////////
ubyte EVSH_getKeyPressValue()
{
ubyte I2C_Request[3], I2C_Reply[1];
short errCnt=0;
while(nI2CStatus[EVSHIELD] == i2cStatusPending) {
wait1Msec(10);
}
memset(I2C_Request, 3, 1);
I2C_Request[0] = 2;
I2C_Request[1] = EVSH_BANK_A;
I2C_Request[2] = EVSH_KEY_PRESS;
sendI2CMsg(EVSHIELD, &I2C_Request[0], 1);
wait1Msec(20);
memset(I2C_Reply, 1, 0);
while(nI2CStatus[EVSHIELD] == i2cStatusPending) wait1Msec(1);
readI2CReply(EVSHIELD, &I2C_Reply[0], 1);
return I2C_Reply[0];
}
</code></span></span></pre>
<h4>
<span style="color: blue; font-size: large;">3. Motor Ports控制</span></h4>
<div>
<span style="font-size: large; font-weight: normal;">以EV3 透過 EVShield Motor ports 連接馬達的實務用途在於擴充 EV3 可控制的馬達數量,尤其若同時擁有 EV3 與 NXT sets,即可以單一 EV3 主機控制超過 4 顆馬達,不過此時,EVShield 即需要外接電源才能供應 Motor ports 的電力需求。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">而EVShield 對於每個 Motor Port 提供三種</span><span style="font-size: large;">馬達</span><span style="font-size: large;">控制模式,包含:編碼值</span><span style="font-size: large;">控制</span><span style="font-size: large;">、Speed </span><span style="font-size: large;">控制 </span><span style="font-size: large;">與 運轉時間</span><span style="font-size: large;">控制</span><span style="font-size: large;">等,分別有對應的暫存器,下表是 Motor 1 Port 的暫存器設定資訊:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-4vS0TVN32I0/VZkAgSs22PI/AAAAAAAABGk/Lqh4oZO5LCQ/s1600/EVSH_RGB_MOTOR1_Registers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="http://4.bp.blogspot.com/-4vS0TVN32I0/VZkAgSs22PI/AAAAAAAABGk/Lqh4oZO5LCQ/s400/EVSH_RGB_MOTOR1_Registers.png" width="400" /></a></div>
<div>
<span style="font-size: large; font-weight: normal;">此外,對於馬達的運轉狀態,可透過讀取下表中的暫存器值取得:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Y9rm2Nt6nYs/VZkB_IAF34I/AAAAAAAABGw/KACLg1w1LyU/s1600/EVSH_MotorState_Registers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="347" src="http://3.bp.blogspot.com/-Y9rm2Nt6nYs/VZkB_IAF34I/AAAAAAAABGw/KACLg1w1LyU/s400/EVSH_MotorState_Registers.png" width="400" /></a></div>
<div>
<span style="font-size: large; font-weight: normal;">以下是控制馬達依據 設定</span><span style="font-size: large;">速度 旋轉至 指定編碼值(</span><span style="font-size: large;">角度) 的</span><span style="font-size: large;">範例程式</span><span style="font-size: large;">:</span></div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><span style="font-size: large; font-weight: normal;"><span style="font-size: large; font-weight: normal;"><span style="font-size: large;"><code style="word-wrap: normal;">
//////////////////////////////////////////////////////////
// @EVSH_runMotorEncoderControl()
// encoderRegAddr: M1-0x42, M2-0x4A
//////////////////////////////////////////////////////////
void EVSH_runMotorEncoderControl(ubyte bankI2CAddr, ubyte encoderRegAddr,
long encoder, short motorSpeed, bool setBraked, bool setRelPos)
{
ubyte I2C_Request[11];
short errCnt=0;
while(nI2CStatus[EVSHIELD] == i2cStatusPending) {
wait1Msec(10);
}
memset(I2C_Request, 11, 0);
I2C_Request[0] = 10;
I2C_Request[1] = bankI2CAddr;
I2C_Request[2] = encoderRegAddr;
I2C_Request[3] =(encoder & 0x000000FF); // Encoder LSB
I2C_Request[4] =(encoder & 0x0000FF00) >> 8; // Encoder Byte2
I2C_Request[5] =(encoder & 0x00FF0000) >> 16; // Encoder Byte3
I2C_Request[6] =(encoder & 0xFF000000) >> 24; // Encoder MSB
I2C_Request[7] = motorSpeed; // Speed
I2C_Request[8] = 0; // Time
I2C_Request[9] = 0; // Command B
I2C_Request[10]= 0x89; // Command A 0b1000 1001
if(setBraked) I2C_Request[10] = I2C_Request[10] | CMD_STOP_WITH_BRAKE;
if(setRelPos) I2C_Request[10] = I2C_Request[10] | CMD_ENCODER_RELATIVE;
sendI2CMsg(EVSHIELD, &I2C_Request[0], 0);
wait1Msec(50);
if(setBraked)
while(!(EVSH_getMotorStatus(EVSH_BANK_B, EVSH_M2_STATUS) == 0x10)) delay(10); // Motor stop in brake mode
else
while(!(EVSH_getMotorStatus(EVSH_BANK_B, EVSH_M2_STATUS) == 0x00)) delay(10); // Motor stop in float mode
eraseDisplay();
}
</code></span></span></span></pre>
</div>
<div>
<h3>
<span style="font-size: large;"> </span><span style="font-size: large;"><span style="color: blue;">4. Sensor Ports</span></span></h3>
</div>
</div>
<div>
<span style="font-size: large;">EVShield 對於 Sensor Ports 的控制相當複雜,主要原因在於每個感應器的介面、功能與特性各異,因此,各個感應器皆需要實作專屬的 API</span><span style="font-size: large;">,這可以參考 Mindsensors 為 EVShield 所提供的 Arduino 程式庫就可以瞭解</span><span style="font-size: large;">(下載: <a href="https://github.com/openelectrons/EVShield" target="_blank">EVShield-master</a> )</span><span style="font-size: large;"> </span><span style="font-size: large;">。</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">因此,經以 RobotC 實作幾種類型的感應器測試,發現雖可行但比較耗費的程式開發成本,實在不太切合實際,倒不如直接連接 EV3 的 Sensor port 或 以 EVShield+Arduino 再透過 EV3 以 I2C 控制還比較實用。 </span></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-33840425622860844592015-06-28T08:33:00.001-07:002015-06-28T08:33:47.372-07:00EVShield筆記(2):UI Module使用者介面擴展板程式摘要<h3>
<span style="font-weight: normal;"><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" target="_blank">EVShield</a> 雖然可以透過 Arduino IDE 的 Serial Console來顯示訊息或輸入資料,不過必須是與電腦連線的狀態,而 mindsensors 則推出了一個 <a href="http://www.openelectrons.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=99" target="_blank">UI Module For EVShield or Arduino</a> 擴展板,具備 320x240 解析度的 2.2" 彩色 TFT 螢幕 以及 一個五向搖桿,提供更方便與彈性的使用介面。</span></h3>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ml_I4wSDp70/VY9574JUZGI/AAAAAAAABEw/dU-EQRqjiQ0/s1600/EVSHield_UIModule_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://2.bp.blogspot.com/-ml_I4wSDp70/VY9574JUZGI/AAAAAAAABEw/dU-EQRqjiQ0/s320/EVSHield_UIModule_1.png" width="480" /></a></div>
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ydFJq1rQ1ds/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/ydFJq1rQ1ds?feature=player_embedded" width="480"></iframe></div>
<br />
<h2>
<span style="color: blue; font-size: x-large;">UI Module Arduino程式庫</span></h2>
<h3>
<span style="font-weight: normal;">
UI Module本身是Arduino擴展版,並不需要與 EVShield搭配才能使用。<br />其中TFT LED 是 SPI介面的 Adafruit ILI9340,五向搖桿則是使用 Arduino的 A1(Up)、A2(Down)、A0(Right)、A3(Left)、D2(Center) 五個Digital pins。</span></h3>
<h3>
<span style="font-weight: normal;">
在mindsensors官網中共提供了三個下載的Arduino程式庫:</span></h3>
<div>
<h3>
<ul>
<li><a href="http://www.openelectrons.com/index.php?module=documents&JAS_DocumentManager_op=downloadFile&JAS_File_id=119" target="_blank">Adafruit_GFX</a>:<span style="font-weight: normal;">這是 Adafruit 原廠 LCD/OLED 顯示器的通用繪圖及文字顯示功能程式庫,須搭配特定顯示器的程式庫一起使用,如:Adafruit ILI9340。<br />詳細使用方式可以參考手冊</span>: "<a href="https://learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf" target="_blank">Adafruit GFX Graphics Library</a>"。</li>
</ul>
</h3>
<h3>
<ul>
<li><a href="http://www.openelectrons.com/index.php?module=documents&JAS_DocumentManager_op=downloadFile&JAS_File_id=118" target="_blank">Adafruit_ILI9340</a>:<span style="font-weight: normal;">這是定義ILI9340 TFT LCD特定屬性的程式庫,提供作為搭配</span> <a href="http://www.openelectrons.com/index.php?module=documents&JAS_DocumentManager_op=downloadFile&JAS_File_id=119" target="_blank">Adafruit_GFX</a> <span style="font-weight: normal;">程式庫功能的使用。</span></li>
</ul>
</h3>
<h3>
<ul>
<li><a href="http://www.openelectrons.com/index.php?module=documents&JAS_DocumentManager_op=downloadFile&JAS_File_id=117" target="_blank">EVs_UIModule</a>:<span style="font-weight: normal;">這是 mindsensors 提供的 UI Module程式庫,除繼承前面兩個程式庫的顯示控制功能之外,另定義讀取五向搖桿狀態以及簡化的螢幕控制與文字功能。</span></li>
</ul>
<span style="font-weight: normal;">
在Arduino sketch中需要按照以下順序 include程式庫,才能夠使用定義的功能:</span><br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
<span style="font-weight: normal;">#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9340.h>
#include <EVs_UIModule.h>
void setup()
{
Serial.begin(115200);
delay(1000);
uim.begin();
}
</span></code><span style="font-weight: normal;"> </span></pre>
</h3>
<h2>
<span style="color: blue; font-size: x-large;">UI Module使用者介面實作</span></h2>
<h3>
<span style="font-weight: normal;">
UI Module雖然具有比 EV3 更生動的彩色螢幕,不過受限於 Arduino 硬體資源,需要妥善規劃運用方式,才能夠充分發揮效果,因此,就先以預計要<a href="http://chlego.blogspot.tw/2015/06/arduinoev3arduinonxshield-or-evshield-i.html" target="_blank">移植到 EVShield</a> 的 "<a href="http://chlego.blogspot.tw/2015/05/robotc-4xtechnic-beamlego-bricks-sorter.html" target="_blank">樂高積木顏色分類機</a>" 的需求,實作一個顯示積木顏色的 UI 畫面。</span></h3>
<h3>
<span style="font-weight: normal;">
在下圖中,將螢幕UI畫面區分成三個功能區:</span></h3>
<h3>
<br /><div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qjUp5I3PhnA/VY_7hgLYrhI/AAAAAAAABFE/NlbhpGqEcW4/s1600/EVSH_UIM_Page.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="http://3.bp.blogspot.com/-qjUp5I3PhnA/VY_7hgLYrhI/AAAAAAAABFE/NlbhpGqEcW4/s400/EVSH_UIM_Page.png" width="560" /></a></div>
<a name='more'></a><br /><span style="font-weight: normal;">首先主頁面包含固定內容的首列與最後一列,以及在第二列顯示可自行定義的專案標題 ("</span>Lego Bricks Color Sorter<span style="font-weight: normal;">")。<br />接下來在第三列,作為設定顯示目前執行中動作的標題 ("</span>Display Color<span style="font-weight: normal;">")。<br />而在第三列下方區域,則作為動態顯示執行結果或狀態訊息 ("</span>Cool RED<span style="font-weight: normal;">")。</span></h3>
<h3>
<span style="font-weight: normal;">在以上三個功能區域,分別以呼叫不同的 Functions 來顯示內容,相關的程式碼如下:</span></h3>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
//////////////////////////////////////////////////////////////////////////////////////////
// EVSH_UIM_MainPage
// Mseeage display area : (0, 50) - (320, 219) w:320, h:170
// Clear the display area: uim.fillRect(0, 50, 320, 170, EVs_UIM_BLACK);
//////////////////////////////////////////////////////////////////////////////////////////
void EVSH_UIM_MainPage(char* titleMsg)
{
uim.clearScreen();
uim.setCursor(88,0);
uim.setTextSize(3);
uim.setTextColor(EVs_UIM_RED);
uim.print("EVShield");
int xPos = (320 - strlen(titleMsg)*6*2)/2;
xPos = (xPos < 0 ? 0 : xPos);
uim.setCursor(xPos, 32);
uim.setTextSize(2);
uim.setTextColor(EVs_UIM_YELLOW);
uim.print(titleMsg);
uim.drawFastHLine(0, 48, 320, EVs_UIM_YELLOW);
uim.drawFastHLine(0, 221, 320, EVs_UIM_YELLOW);
uim.setCursor(0,223);
uim.setTextSize(2);
uim.setTextColor(EVs_UIM_YELLOW);
uim.print(" CH LEGO YouTube:chchenyt");
}
</code></pre>
<br /></div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
//////////////////////////////////////////////////////////////////////////////////////////
// EVSH__UIM_actionMsg
// Space area 1: (0, 50)-(320, 61) h: 12
// Message area: (0, 62)-(320, 85) h: 24(8x3)
// Space area 2: (0, 86)-(320, 97) h: 12
// Text size is 3, max characters will be 17.
//////////////////////////////////////////////////////////////////////////////////////////
void EVSH_UIM_actionMsg(char* msg) {
const int actionTextSize = 3;
int xPos = (320 - strlen(msg)*6*actionTextSize)/2;
if(xPos<0) xPos = 0;
uim.fillRect(0, 50, 320, 48, EVs_UIM_BLACK);
uim.setCursor(xPos, 62);
uim.setTextSize(actionTextSize);
uim.setTextColor(EVs_UIM_MAGENTA);
uim.print(msg);
}
</code></pre>
<br /></div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
//////////////////////////////////////////////////////////////////////////////////////////
// EVSH__UIM_reportMsg
// Space area 1: (0, 98)-(320, 126) h: 29
// Message area: (0, 127)-(320, 190) h: 64(8x8)
// Space area 2: (0, 191)-(320, 219) h: 29
//////////////////////////////////////////////////////////////////////////////////////////
void EVSH_UIM_reportMsg(char* msg, uint16_t textColor) {
int textLen = strlen(msg);
int textSize = 5; // Max 10 characters
int yPos = 139;
if(textLen<=6) {textSize = 8; yPos=127;}
else if(textLen<=7) {textSize = 7; yPos=131;}
else if(textLen<=8) {textSize = 6; yPos=135;}
int xPos = (320 - textLen*6*textSize)/2;
if(xPos<0) xPos = 0;
uim.fillRect(0, 98, 320, 122, EVs_UIM_BLACK);
uim.setCursor(xPos, yPos);
uim.setTextSize(textSize);
if(textColor == EVs_UIM_BLACK) {
uim.fillRect(0, yPos-1, 320, 8*textSize+1, EVs_UIM_WHITE);
uim.setTextColor(EVs_UIM_BLACK, EVs_UIM_WHITE);
}
else
uim.setTextColor(textColor);
uim.print(msg);
}
</code></pre>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-32500131975126667862015-06-27T04:27:00.003-07:002015-06-27T04:27:48.175-07:00EVShield 筆記(1):Mindsensors EVShield 特性摘要<h3>
<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" target="_blank">EVShield</a> 是 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=144&MMN_position=73:73" target="_blank">mindsensors</a> 為Arduino平台連接使用 Mindstorms NXT/EV3周邊所開發的擴展板。<br /> <div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-5qSLNgCjMyo/VY5oZ7ga1CI/AAAAAAAABDY/zF693Mpz_8E/s1600/EVShield_EV3_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://1.bp.blogspot.com/-5qSLNgCjMyo/VY5oZ7ga1CI/AAAAAAAABDY/zF693Mpz_8E/s400/EVShield_EV3_01.jpg" width="480" /></a></div>
<br />比較前一代的<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=185" target="_blank">NXShield</a>,增加支援了使用 UART介面的 EV3感應器,包含:Color、Gyro、IR、Touch與Ultrasonic等,不過由於取消了 Software I2C Master功能,所以無法使用 NXT的Ultrasonic sensor。<br />至於 NXT 的其他類比式感應器與 mindsensors 的數位感應器/控制器等,在 <a href="http://www.openelectrons.com/EVShield/html/" target="_blank">EVShield 程式庫</a> 中都有提供對應的 API ( <a href="https://github.com/openelectrons/EVShield" target="_blank">下載連結</a> ) 。</h3>
<h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-V2y_0E3aq2s/VY5m2dnXI3I/AAAAAAAABDE/HC2ZrZC-Ckw/s1600/EVShield_NXShield_Front.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://1.bp.blogspot.com/-V2y_0E3aq2s/VY5m2dnXI3I/AAAAAAAABDE/HC2ZrZC-Ckw/s400/EVShield_NXShield_Front.jpg" width="480" /></a></div>
<br /> </h3>
<h1>
<span style="color: blue;">EVShield介面<br /> <div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-nrZ5fmvhsCs/VY5v09zLjdI/AAAAAAAABDo/cG7_7Y6VrL4/s1600/EVSHield_Back.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://1.bp.blogspot.com/-nrZ5fmvhsCs/VY5v09zLjdI/AAAAAAAABDo/cG7_7Y6VrL4/s320/EVSHield_Back.jpg" width="480" /></a></div>
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
</span></h1>
<h3>
<ul>
<li><span style="font-size: 18.7199993133545px;"> </span><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" style="font-size: 18.7199993133545px;" target="_blank">EVShield</a><span style="font-size: 18.7199993133545px;"> 的</span>左右兩個Bank( BANK A/BANK B )各有四個 NXT/EV3 的 RJ12接口,分別為兩個 Motor Ports( M1/M2 ) 與 兩個 Sensor Ports( BAS1/BAS2 與 BBS1/BBS2 ),所以<span style="font-size: 18.7199993133545px;">同</span> EV3一樣可以連接 四個馬達 與 四個感應器。</li>
</ul>
</h3>
<h3>
<ul>
<li>在板子背面左上方有一組 6 個 RC Servo的接腳,為對應 <a href="https://www.arduino.cc/en/Reference/Servo" target="_blank">Arduino Servo library</a> 所定義的 3, 5, 6, 9, 10, 11等六個Digital<span style="font-size: 18.7199993133545px;"> PWM </span>pins。 </li>
</ul>
</h3>
<h3>
<ul>
<li>在 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" target="_blank">EVShield</a> 板正上方有三個可程式化按鍵,分別為:GO / LEFT / RIGHT,在<a href="http://www.openelectrons.com/EVShield/html/" target="_blank">EVShield 程式庫</a>中都有提供對應的 API。</li>
</ul>
</h3>
<h3>
<ul>
<li>而在板子上方與BANK A正下方,分別各有一個 RGB LED,同樣在<a href="http://www.openelectrons.com/EVShield/html/" style="font-size: 18.7199993133545px;" target="_blank">EVShield 程式庫</a>中有提供對應的 API。<br /> <a href="http://3.bp.blogspot.com/-_RAl8LHPCM0/VY5wUPosd1I/AAAAAAAABD0/mcxkrgyxjZw/s1600/EVSHield_Front.jpg" imageanchor="1" style="font-size: 18.7199993133545px; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="400" src="http://3.bp.blogspot.com/-_RAl8LHPCM0/VY5wUPosd1I/AAAAAAAABD0/mcxkrgyxjZw/s400/EVSHield_Front.jpg" width="300" /></a><br /> </li>
<li><div class="separator" style="clear: both; text-align: left;">
在板子背面下方有一組四個 pins 的 I2C接腳,為對應 Arduino 的 Hardware I2C介面(SDA/SCL/5V/GND)。 </div>
</li>
</ul>
</h3>
<h1>
<span style="color: blue;">Arduino硬體資源</span></h1>
<div>
<h3>
由於<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" style="font-size: 18.7199993133545px;" target="_blank">EVShield</a>取消了支援四個 Sensor ports 的 Software I2C master功能,所以只使用了 Arduino 內建I2C的 A4(SDA)、A5(SCL)等兩個腳位以及前面所提到的 6 個 PWM pins。</h3>
<h3>
同時,板子上的 3 個按鍵以及兩個 RGB LED,也都由 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" style="font-size: 18.7199993133545px;" target="_blank">EVShield</a> 控制,並未佔用 Arduino 硬體資源,這樣的設計將有利於堆疊使用其他功能的擴展板,如:藍芽、XBee、WiFi等,延伸的功能會比 EV3 還要更多樣化。</h3>
</div>
<h1>
<span style="color: blue;">EVShield UI Module</span></h1>
<div>
<h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-HLb5HitQieY/VY6Fh8Dk_1I/AAAAAAAABEI/gUe91GvoUrg/s1600/EVSHield_UIModule.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-HLb5HitQieY/VY6Fh8Dk_1I/AAAAAAAABEI/gUe91GvoUrg/s640/EVSHield_UIModule.jpg" width="480" /></a></div>
<br />除了<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" style="font-size: 18.7199993133545px;" target="_blank">EVShield</a> 擴展板之外,mindsensors 也推出了一個具有2.2吋 320x240 解析度彩色 TFT 螢幕以及五向搖桿的 UI Module擴展板,提供做為<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" style="font-size: 18.7199993133545px;" target="_blank">EVShield</a> 或 Arduino 的操作互動介面,比起EV3的單色螢幕將會更生動與實用。</h3>
</div>
<ul>
</ul>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-9137267888446321279.post-81411910026919652452015-06-18T07:56:00.000-07:002015-08-23T20:56:22.228-07:00Arduino筆記:移植『EV3樂高積木顏色分類機』至Arduino平台(NXShield or EVShield) - ( II )<h2>
<span style="color: blue;">※ 本文接續自:<br /><a href="http://chlego.blogspot.tw/2015/06/arduinoev3arduinonxshield-or-evshield-i.html" target="_blank">『EV3樂高積木顏色分類機』移植Arduino平台計畫 Part I</a> </span></h2>
<h3>
<span style="color: red;">◎ 本文 Brick Feeder、Brick Loader及 Robot Arm等三個功能單元測試影片</span></h3>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/TMq96sQW8Lg/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/TMq96sQW8Lg?feature=player_embedded" width="480"></iframe></div>
<div>
<span style="color: red;"><br /></span></div>
<div>
<ol>
<li value="3"><span style="color: blue; font-size: large;"><b>Brick Feeder</b></span>:<br /><b> <b><div class="separator" style="clear: both; display: inline !important; text-align: center;">
<a href="http://3.bp.blogspot.com/-a86JiExHdd8/VYJ2FXGJRhI/AAAAAAAABCQ/yTa8ThYoFYE/s1600/NXSH-BrickFeeder.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://3.bp.blogspot.com/-a86JiExHdd8/VYJ2FXGJRhI/AAAAAAAABCQ/yTa8ThYoFYE/s400/NXSH-BrickFeeder.jpg" width="400" /></a></div>
</b><br />【控制功能】<br /> </b>Brick Feeder的功能是將已經完成顏色辨識的積木透過以下動作傳送給Brick Loader機構:<br />(1) 驅動 EV3 M-Motor(Reverse)抓取積木,當抓緊積木之後,經由Under-Actuation 機制會轉動爪取手臂將積木開始往Brick Loader傳送,同時透過另一組齒輪系抬起托盤。<br /><br />(2) 當積木已經傳送到托盤所抬起的目標位置時,會因齒輪的作用造成EV3 馬達停滯無法繼續運轉,而這個狀態需要透過程式判斷,在RobotC可以使用偵測馬達的 RPM值達成,至於 NXShield的 API則需以讀取EV3馬達 Encoder值的變化來判斷。<br /><br />(3) 再以反向驅動 EV3 M-Motor(Forward)釋放積木至托盤,同樣經由Under-Actuation 機制,除了會將爪取手臂轉回EV3顏色感應器所在的位置之外,同時也會放下托盤將積木滑至Brick Loader。<br /><br /> <b>【Arduino程式】<br /> </b><br />對於Brick Feeder,程式最重要的功能就是判斷 EV3 馬達的停滯狀態(stalled),原廠的說明文件中曾提到,每一個Motor port會有一個Status Byte,其中 bit7可以檢測 "Motor is stalled"狀態,實際上測試似乎沒有作用,因此,改成以讀取馬達的 Encoder value作為判斷,以下為Arduino程式碼:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
////////////////////////////////////////////////////////////////////////////////
// Control the Brick Feeder(EV3 M-Motor)
////////////////////////////////////////////////////////////////////////////////
void controlBrickFeeder(bool isFeeding) {
int32_t curr_encoder, prev_encoder;
nxshield.bank_b.motorStop(SH_Motor_2, SH_Next_Action_Brake);
delay(300);
nxshield.bank_b.motorResetEncoder(SH_Motor_2);
curr_encoder = nxshield.bank_b.motorGetEncoderPosition(SH_Motor_2);
prev_encoder = curr_encoder;
if (isFeeding)
nxshield.bank_b.motorRunUnlimited(SH_Motor_2, SH_Direction_Reverse, 30);
else
nxshield.bank_b.motorRunUnlimited(SH_Motor_2, SH_Direction_Forward, 50);
delay(1000);
while(true) {
curr_encoder = nxshield.bank_b.motorGetEncoderPosition(SH_Motor_2);
if(abs(curr_encoder - prev_encoder) < 10) break;
prev_encoder = curr_encoder;
delay(500);
}
nxshield.bank_b.motorStop(SH_Motor_2, SH_Next_Action_Float);
delay(500);
}
</code> </pre>
<a name='more'></a> </li>
<li><span style="color: blue; font-size: large;"><b>Brick Loader</b></span>:<br /><b> </b><div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="http://2.bp.blogspot.com/--OVVr9q7WwU/VYJ74vd1IfI/AAAAAAAABCg/FFCRgFgtqyY/s1600/NXSH-BrickLoader.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="http://2.bp.blogspot.com/--OVVr9q7WwU/VYJ74vd1IfI/AAAAAAAABCg/FFCRgFgtqyY/s400/NXSH-BrickLoader.jpg" width="400" /></a></div>
<br /><b>【控制功能】</b><br />Brick Loader的功能在於控制如上圖中裝卸桶的位置,先接收來自 Brick Feeder 所傳送的積木,然後再舉起讓積木呈垂直讓Robot Arm的夾手能夠抓取。<br />裝卸桶位置是使用 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank"><b>PFMate</b></a> + <b>PF IR Receiver </b>驅動 <b>PF Servo Motor</b> 控制,<b>PF Servo Motor</b> 的特性如同 RC Servo,轉動範圍為 180 度,共可設定 15個位置,非常適合需要精確位置控制的機構。<br /><br /><b>【Arduino程式】<br /> </b>在NXShield 程式庫中,同樣是使用 <a href="http://sourceforge.net/p/nxshield/code/HEAD/tree/NXShield/PFMate.h" target="_blank">PFMate</a> 的API,以下的程式碼是將裝卸桶由水平位置分三階段成為垂直狀態的控制:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
{
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_B, PF_Operation_Forward, 6);
NXSH_PFMate.sendSignal();
delay(3000);
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_B, PF_Operation_Forward, 4);
NXSH_PFMate.sendSignal();
delay(1000);
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_B, PF_Operation_Forward, 2);
NXSH_PFMate.sendSignal();
delay(1000);
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_B, PF_Operation_Brake, 0);
NXSH_PFMate.sendSignal();
delay(3000);
}
</code> </pre>
</li>
<li><span style="color: blue; font-size: large;"><b>Robot Arm</b></span>:<br /><b> </b><div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="http://4.bp.blogspot.com/-TE1SdX8bD5Y/VYKH2nmsbvI/AAAAAAAABCw/QZQPIfAa_Nw/s1600/NXSH-RobotArm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://4.bp.blogspot.com/-TE1SdX8bD5Y/VYKH2nmsbvI/AAAAAAAABCw/QZQPIfAa_Nw/s400/NXSH-RobotArm.jpg" width="400" /></a></div>
<br /><b>【控制功能】</b><br /> Robot Arm的功能即是由 Brick Loader的裝卸桶中抓取積木,並依據EV3 Color sensor所辨識的顏色分別放置至 紅、白、黃 三個槽中,完成積木的顏色分類工作,至於非上述的三種顏色積木,則會往後丟棄。<br />上圖中的機械手臂共由四顆 RC Servo所組成,NXShield 已經將Arduino UNO 中對應<br />< <a href="http://www.arduino.cc/en/Reference/Servo">Servo.h</a>> 的 6 個 PWM 腳位做好 6 組 3-pin的接腳,直接接上 RC Servo的信號線就可以使用。<br /><b>【Arduino程式】</b><br />在NXShield連接 RC Servo直接使用 Arduino 標準的 < <a href="http://www.arduino.cc/en/Reference/Servo">Servo.h</a>>程式庫,不需要 include NXShield程式庫。</li>
</ol>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-72056685644036118312015-06-18T07:50:00.000-07:002015-08-23T20:59:24.747-07:00Arduino筆記:移轉『EV3樂高積木顏色分類機』至Arduino平台(NXShield or EVShield) - ( I )<b>在五月底曾答應 Mindsensors 的 Mr. Deepak要將『<a href="http://chlego.blogspot.tw/2015/05/robotc-4xtechnic-beamlego-bricks-sorter.html" target="_blank">樂高Technic Beam積木顏色分類機</a>』由 EV3 + RobotC 移轉至 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" target="_blank">Arduino + EVShield</a> 平台,而在等候 EVShield寄達之前,先行以 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=182" target="_blank">NXShield</a>測試各個組成機構轉換成Arduino的功能,接下來在移轉至<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=216" target="_blank">EVShield</a>時,就可以直接整合,省掉單元測試的工作。</b><br />
<br />
<h2>
<span style="color: blue; font-size: x-large;">EV3 to Arduino 轉換計畫</span></h2>
<br />
EV3版的『<a href="http://chlego.blogspot.tw/2015/05/robotc-4xtechnic-beamlego-bricks-sorter.html" target="_blank"><b>樂高Technic Beam積木顏色分類機</b></a>』共由五個主要機構所組成,包含:<br />
<ul>
<li><b><span style="color: blue;">托盤 及 輸送帶</span></b>:使用 <b><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank">PFMate</a></b>+<b>PF IR接收器</b> 控制 <b>PF L-Motor</b> 以及 <b>EV3觸控感應器</b>。</li>
<li><b><span style="color: blue;">顏色辨識</span></b>:使用 <b>EV3顏色感應器</b>。</li>
<li><b><span style="color: blue;">Brick feeder</span></b>:使用 <b>EV3 中型馬達</b>。</li>
<li><b><span style="color: blue;">Brick loader</span></b>:使用 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank"><b>PFMate</b></a> + <b>PF IR Receiver </b>控制 <b>PF Servo Motor</b>。 </li>
<li><b><span style="color: blue;">Robot Arm</span></b>:使用 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=93" target="_blank"><b>NXTServo</b></a> 控制四顆 <b>RC Servo</b>。</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-W3DPFxtkmno/VVGQH0IM-tI/AAAAAAAAA8E/eoj2MviwdXo/s1600/BrickSorter_Mechanism.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="1" height="300" src="http://4.bp.blogspot.com/-W3DPFxtkmno/VVGQH0IM-tI/AAAAAAAAA8E/eoj2MviwdXo/s320/BrickSorter_Mechanism.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">EV3 版 的五個組成機構</td></tr>
</tbody></table>
在計畫先以 <b>Arduino</b> + <b><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=182" target="_blank">NXShield</a> </b>平台進行單元測試前,需因應 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=182" target="_blank"><b>NXShiel</b>d</a> 與 EV3 感應器的相容問題調整以下的配備:<br />
<ul>
<li>以<b>NXT觸控感應器</b>取代<b>EV3觸控感應器</b>。</li>
<li><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=182" target="_blank"><b>NXShield</b></a> 需要連接 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=191" target="_blank">mindsensors 的 <b>EV3-Sensor-Adapter</b></a> 才能<b><span style="font-weight: normal;">使用</span>EV3的顏色感應器</b>。<br />(參考:" <a href="http://chlego.blogspot.tw/2014/01/mindsensors-ev3-sensor-adapter-for-nxt.html" target="_blank"><b>Mindsensors EV3 Sensor Adapter for NXT 基本功能測試</b></a> ")</li>
<li><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=182" target="_blank"><b>NXShield</b></a> 已內建 6 組 <b>RC Servo</b>接腳,所以不需使用 <a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=93" target="_blank"><b>NXTServo</b></a>。</li>
</ul>
<h3>
以下圖示為單元測試之所有機構:</h3>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-UPjgGAS02H8/VYE2nUEk5oI/AAAAAAAABBg/1I6YIi8zgI8/s1600/NXSH-BrickSorter.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="1" height="300" src="http://4.bp.blogspot.com/-UPjgGAS02H8/VYE2nUEk5oI/AAAAAAAABBg/1I6YIi8zgI8/s320/NXSH-BrickSorter.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">NXShield版測試機構</td></tr>
</tbody></table>
<h3>
以下圖示為單元測試之功能架構圖:<a href="http://3.bp.blogspot.com/-wb4JXjEyCUY/VX_218oWujI/AAAAAAAABBI/soOCyP2NsXo/s1600/NXSH-BrickSorter-FuncDiagram.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="600" src="http://3.bp.blogspot.com/-wb4JXjEyCUY/VX_218oWujI/AAAAAAAABBI/soOCyP2NsXo/s400/NXSH-BrickSorter-FuncDiagram.jpg" width="516" /></a></h3>
<div>
<br />
<a name='more'></a><br />
<br />
<h2>
<span style="color: blue; font-size: large;"><b>NXShield版各部機構功能之單元測試</b></span></h2>
<ol>
<li><b><span style="color: blue; font-size: large;">托盤 與 輸送帶:</span></b><br /><b>【控制功能】 </b>這個機構由<b> </b><a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank"><b>PFMate</b> 控制器</a> + <b>Lego PF IR接收器</b> 控制 <b>PF L-Motor</b>驅動輸送帶,並使用<b>NXT觸控感應器</b>偵測輸送帶上的擋板以控制一次只會輸送一個Technic Beam積木給 EV3的顏色感應器進行顏色辨識。<br /> <div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-AIAkNgurnHU/VYFDDYyVr2I/AAAAAAAABBw/ASbDBq8Jxvc/s1600/NXSH-Conveyor.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://2.bp.blogspot.com/-AIAkNgurnHU/VYFDDYyVr2I/AAAAAAAABBw/ASbDBq8Jxvc/s400/NXSH-Conveyor.jpg" width="400" /></a></div>
<br /><b>【Arduino程式】</b>在NXShield 的Arduino程式庫中已經內建 <a href="http://sourceforge.net/p/nxshield/code/HEAD/tree/NXShield/PFMate.h" target="_blank">PFMate</a> 與 <a href="http://sourceforge.net/p/nxshield/code/HEAD/tree/NXShield/NXTTouch.h" target="_blank">NXT Touch sensor</a> 的API,以下是控制這個機構功能的 Arduino 程式碼:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
#include <Wire.h>
#include <NXShield.h>
#include <PFMate.h>
#include <NXTTouch.h>
NXShield nxshield;
PFMate NXSH_PFMate(0x48);
NXTTouch NXSH_Touch;
void setup()
{
char str[256]:
Serial.begin(9600);
nxshield.init( SH_HardwareI2C );
delay(100);
NXSH_PFMate.init( &nxshield, SH_BBS1 );
delay(100);
NXSH_Touch.init( &nxshield, SH_BAS2 );
delay(100);
sprintf(str, "DeviceID: %s", NXSH_PFMate.getDeviceID());
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_Both, PF_Operation_Float, 0);
NXSH_PFMate.sendSignal();
delay(100);
Serial.println(str);
}
void loop()
{
Serial.println("Running the conveyor ..");
while(!NXSH_Touch.isPressed()) {
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_A, PF_Operation_Forward, 7);
NXSH_PFMate.sendSignal();
delay(500);
}
Serial.println("Bumping is detected!!");
NXSH_PFMate.controlMotor(PF_Channel_1, PF_Contol_A, PF_Operation_Brake, 0);
NXSH_PFMate.sendSignal();
delay(2000);
}
</code> </pre>
</li>
<li><b><span style="color: blue; font-size: large;">顏色辨識:</span></b><br /><b>【控制功能】</b>這個機構會使用EV3 Color sensor辨識由輸送帶傳送過來的積木顏色,同時也會檢查當在一個指定的時間內若沒有偵測到任何的積木時,就會判斷已經完成所有積木的顏色分類工作,因此即可以終止整體系統的執行。<br />而NXShield 須透過 mindsensors的 『<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=191&MMN_position=31:31" target="_blank">EV3 Sensor Adapter for NXT, NXShield or Arduino</a>』才能連接使用EV3 Color sensor,實體機構圖如下:<br /> <div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-E0UKVdmQPb4/VYFFL-CyrwI/AAAAAAAABB8/ii7AQ5AJfsA/s1600/NXSH-ESA-ColorSensor.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="http://2.bp.blogspot.com/-E0UKVdmQPb4/VYFFL-CyrwI/AAAAAAAABB8/ii7AQ5AJfsA/s400/NXSH-ESA-ColorSensor.jpg" width="400" /></a></div>
<br /><b>【Arduino程式】</b>在NXShield的程式庫中,已提供有 <a href="http://sourceforge.net/p/nxshield/code/HEAD/tree/NXShield/EV3Color.h" target="_blank">EV3Color</a> 的 API,而 <a href="http://sourceforge.net/p/nxshield/code/HEAD/tree/NXShield/EV3Color.h" target="_blank">EV3Color</a> 則繼承自 <a href="http://sourceforge.net/p/nxshield/code/HEAD/tree/NXShield/EV3SensorAdapter.h" target="_blank">EV3SensorAdapter</a> 類別,以下是控制這個機構功能的 Arduino 程式碼:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
#include <Wire.h>
#include <NXShield.h>
#include <EV3Color.h>
NXShield nxshield;
EV3Color NXSH_EV3Color;
#include "NXShield_ColorDetection.h"
void setup()
{
char str[256];
Serial.begin(9600);
nxshield.init( SH_HardwareI2C );
delay(100);
NXSH_EV3Color.init( &nxshield, SH_BBS2 );
delay(100);
NXSH_EV3Color.setMode(MODE_Color_MeasureColor);
delay(100);
sprintf(str, "DeviceID: %s, Mode: %x", NXSH_EV3Color.getDeviceID(), NXSH_EV3Color.getMode());
delay(100);
Serial.println(str);
}
void loop()
{
int dColor = detectColor(3000);
}
</code> </pre>
<br /><span style="color: blue;"><b> NXShield_ColorDetection.h</b></span><pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
////////////////////////////////////////////////////////////////////////////////
// EV3 Color Sensor return value
////////////////////////////////////////////////////////////////////////////////
#define colorNone 0
#define colorBlack 1
#define colorBlue 2
#define colorGreen 3
#define colorYellow 4
#define colorRed 5
#define colorWhite 6
#define colorBrown 7
////////////////////////////////////////////////////////////////////////////////
// Detect the brick color
////////////////////////////////////////////////////////////////////////////////
int detectColor(unsigned long idleMillis) {
int dColor, errCnt = 0;
unsigned long checkMillis;
while(!(errCnt > 3)) {
dColor = colorNone;
checkMillis = millis();
while(dColor == colorNone) {
dColor = NXSH_EV3Color.readValue();
delay(100);
if((millis() - checkMillis) > idleMillis) break;
}
Serial.println(dColor);
if(!(dColor == colorNone)) return dColor;
errCnt++;
}
}</code> </pre>
</li>
</ol>
<h2>
<span style="color: red;">其餘三個機構: Brick Feeder, Brick Loader及 Robot Arm的功能單元測試,另整理於: <a href="http://chlego.blogspot.tw/2015/06/arduinoev3arduinonxshield-or-evshield-ii.html" target="_blank">Part II 文章 〉〉連結</a></span></h2>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-86008244624360910382015-06-05T02:12:00.002-07:002015-06-05T02:12:24.751-07:00Arduino筆記:以Sparkfun LED Strip(LED燈條)裝飾樂高聖誕樹<span style="font-size: large;">去年底應景做了『<a href="http://chlego.blogspot.tw/2014/12/ev3.html" target="_blank">讓EV3播放聖誕音樂</a>』,同時也以樂高零件搭配LED燈條組合成聖誕樹,展現的燈光效果確實很有年節的氛圍</span>。<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-NXTvoEGPzcE/VXAX85o4C1I/AAAAAAAABAI/Hx9nPAI2KCQ/s1600/LEDStrip_XMasTree.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://1.bp.blogspot.com/-NXTvoEGPzcE/VXAX85o4C1I/AAAAAAAABAI/Hx9nPAI2KCQ/s320/LEDStrip_XMasTree.JPG" width="289" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">樂高 LED燈飾聖誕樹</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
而其中LED燈條使用的是『<a href="https://www.sparkfun.com/products/retired/11272" target="_blank">Sparkfun RGB LED Strip</a>』,共串接了32顆的 RGB LED,每一個LED各自由一顆 <a href="https://www.sparkfun.com/datasheets/Components/LED/WS2801.pdf" target="_blank">WS2801</a> 驅動IC控制,因此可以獨立控制每一顆LED的顏色顯現(addressable),透過程式即可以展現出如下面影片中的特殊效果。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/4lQU6J5W-BM/0.jpg" frameborder="0" height="399" src="https://www.youtube.com/embed/4lQU6J5W-BM?feature=player_embedded" width="480"></iframe></div>
<br />
<h2>
<span style="color: blue;">重要技術資訊</span></h2>
Sparkfun官網中的範例程式部分資訊有誤,以下則是經測試後確認功能確實可以正常運作:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li>燈條首尾分別為四芯的公與母接頭,可繼續延伸串接,四芯線與Arduino的接線方式為:<br />● 紅色 - 5V <br />● 藍色 - CKI (Data Clock Input)<br />● 綠色 - SDI (Serial Gray Scale data input)<br />● 黃色 - GND<br /> </li>
<li>每一顆LED以 24-bit 顏色值資料控制顏色的顯示:<br /><div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-LmexQlU4SH4/VXAkGHC5cDI/AAAAAAAABAc/rPtzrH1Ya0c/s1600/LED_Strip_ColorDataValue.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="49" src="http://2.bp.blogspot.com/-LmexQlU4SH4/VXAkGHC5cDI/AAAAAAAABAc/rPtzrH1Ya0c/s400/LED_Strip_ColorDataValue.jpg" width="560" /></a></div>
<br /><a name='more'></a>
</li>
<li>使用WS2801控制LED顯示的步驟:<br />(1) 開始傳送每一個data bit前,需先將CKI pin設成 LOW再由 SDI pin寫入 data bit,接著再將 CKI pin設成 HIGH。<br /><br />(2) 重複步驟 (1),每當送完24 bits的資料,WS2801會立即將資料送往下一個鄰近的WS2801 IC。<br /><br />(3) 當送完 32 個 WS2801的 data bits之後,將 CKI pin 設成 LOW並delay超過 500 us,WS2801 IC即會驅動 LED的顯示。</li>
</ol>
<h2>
<span style="color: blue;">範例程式碼</span></h2>
<div>
<h3>
A. 顯示指定的 LED</h3>
</div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* WS2801_lighting_by_Address: Lighting specificed address of LED with specified color.
* ledColor : Color of LED
* ledAddr : Address of LED (0-31, 0xFF: all LEDs)
* ************************************************************ */
void WS2801_lighting_by_Address (long ledColor, short ledAddr) {
for(short ledNo = 0; ledNo<STRIP_LENGTH; ledNo++) {
for(short color_bit = 23; color_bit >= 0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if(((ledNo == ledAddr) || ledAddr == 0xFF) && bitRead(ledColor, color_bit))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
//Pull clock low for 500us or more causes the IC to post the data.
PORTD &= B11110111; //digitalWrite(CKI, LOW);
delay(1);
}
</code></pre>
<br /></div>
<h3>
B. 單向依序顯示指定數量的LED</h3>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* WS2801_sequencing_Multi_LED: Lights on specified number of
* continuous LEDs with specified color.
* ledColor : Color of specified LED
* backColor : Color of non-specified LED
* ledAddr : Starting address of LED to be lighted with ledColor(0-31)
* ledCnt : Number of continuous LED from ledAddr to be lighted on (range from 1 to 3).
* ************************************************************ */
void WS2801_sequencing_Multi_LED (long ledColor, long backColor, short ledAddr, short ledCnt) {
if (ledCnt > 3) ledCnt = 3;
else if (ledCnt < 1) ledCnt = 1;
for(short ledNo = 0; ledNo<STRIP_LENGTH; ledNo++) {
if (ledNo >= ledAddr && ledNo <= ledAddr+ledCnt-1) {
for(short color_bit = 23; color_bit >= 0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if (bitRead(ledColor, color_bit))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
else {
for(short color_bit = 23; color_bit >= 0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if (bitRead(backColor, color_bit))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
}
//Pull clock low for 500us or more causes the IC to post the data.
PORTD &= B11110111; //digitalWrite(CKI, LOW);
delay(1);
}
</code></pre>
<br /></div>
<h3>
C. 雙向依序顯示指定數量的 LED</h3>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* WS2801_2waySequencing_Multi_LED: Two directions to sequence light specified number of
* continuous LEDs with specified color.
* ledColor : Color of specified LED
* backColor : Color of non-specified LED
* ledCnt : Number of continuous LED from ledAddr to be lighted on (range from 1 to 3).
* ************************************************************ */
void WS2801_2waySequencing_Multi_LED (long ledColor, long backColor, short ledCnt) {
if (ledCnt > 3) ledCnt = 3;
else if (ledCnt < 1) ledCnt = 1;
for(short ledAddr=0; ledAddr<STRIP_LENGTH; ledAddr++) {
for(short ledNo=0; ledNo<STRIP_LENGTH; ledNo++) {
if ((ledNo >= ledAddr && ledNo <= ledAddr+ledCnt-1) ||
(ledNo >= STRIP_LENGTH-1-ledAddr-ledCnt+1 && ledNo <= STRIP_LENGTH-1-ledAddr))
{
for(short color_bit=23; color_bit>=0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if (bitRead(ledColor, color_bit))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
else {
for(short color_bit=23; color_bit>=0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if (bitRead(backColor, color_bit))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
}
//Pull clock low for 500us or more causes the IC to post the data.
PORTD &= B11110111; //digitalWrite(CKI, LOW);
delay(1);
delay(50);
}
}
</code></pre>
<br /></div>
<br />
<h3>
D. 逐次增加LED的顯示數量</h3>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* WS2801_stepping_LED: Stepping light on LED with specified color.
* ledColor : Color of LED
* speedMillis : Address of LED (0-31, 0xFF: all LEDs)
* ************************************************************ */
void WS2801_stepping_LED (long ledColor, boolean stepForward, long speedMillis) {
boolean isCompleted = false;
short ledAddr;
ledAddr = (stepForward?0:STRIP_LENGTH-1);
//for(short ledAddr=0; ledAddr<STRIP_LENGTH; ledAddr++) {
while(!isCompleted) {
for(short ledNo=0; ledNo<STRIP_LENGTH; ledNo++) {
for(short color_bit = 23; color_bit >= 0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if(((stepForward && ledNo <= ledAddr) && bitRead(ledColor, color_bit)) ||
((!stepForward && ledNo >= ledAddr) && bitRead(ledColor, color_bit)))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
//Pull clock low for 500us or more causes the IC to post the data.
PORTD &= B11110111; //digitalWrite(CKI, LOW);
delay(1);
delay(speedMillis);
if(stepForward) {
ledAddr++;
if(ledAddr>STRIP_LENGTH-1) isCompleted = true;
}
else {
ledAddr--;
if(ledAddr<0) isCompleted = true;
}
}
}
</code></pre>
<br /></div>
<ol>
</ol>
<h3>
E. 隨機閃爍LED</h3>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* WS2801_twinkling_LED: Twinkling LED with random color.
* delayMillis : Delay of milliseconds to light on
* ************************************************************ */
void WS2801_twinkling_LED (long delayMillis) {
for(short ledNo = 0; ledNo<STRIP_LENGTH; ledNo++) {
long xledColor = ledSColor[random(7)];
for(short color_bit = 23; color_bit >= 0 ; color_bit--) {
PORTD &= B11110111; //digitalWrite(CKI, LOW);
if(bitRead(xledColor, color_bit))
PORTD |= B00000100; //digitalWrite(SDI, HIGH);
else PORTD &= B11111011; //digitalWrite(SDI, LOW);
PORTD |= B00001000; //digitalWrite(CKI, HIGH);
}
}
//Pull clock low for 500us or more causes the IC to post the data.
PORTD &= B11110111; //digitalWrite(CKI, LOW);
delay(1);
delay(delayMillis);
}
</code></pre>
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-7604811135403196152015-06-02T21:48:00.001-07:002015-08-23T21:05:06.515-07:00Arduino筆記: Sparkfun 8X16 RGB LED矩陣顯示控制Sparkfun的<a href="https://www.sparkfun.com/products/760" target="_blank">8X8 LED矩陣</a>使用SPI介面控制顯示64個LED,同時背板也具備Daisy Chain功能,可串接多個同型的LED矩陣,透過Arduino(SPI Master)傳送資料給第一個控制板,會依序傳遞給所有鏈結的LED矩陣,控制所有LED的顏色顯示。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-bYeyDBwzyoQ/VWleqrq3gtI/AAAAAAAAA-k/xkyBX7n8nto/s1600/NXT_MSGBOD_108.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="http://3.bp.blogspot.com/-bYeyDBwzyoQ/VWleqrq3gtI/AAAAAAAAA-k/xkyBX7n8nto/s320/NXT_MSGBOD_108.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><b>SparkFun 8x8 LED 矩陣控制板</b></td></tr>
</tbody></table>
過去曾經使用過以單一LED矩陣製作『<a href="http://chlego.blogspot.tw/2012/07/nxt-rgb-ledmessage-boardi.html" target="_blank">NXT顯示裝置(NXT RGB LED訊息看板)</a>』,由於8X8 LED數量的限制,因此只適用於水平捲動顯示英數字型的訊息。對於筆劃較複雜的中文字型,則至少需要有16X16的解析度,所以這次將會以Daisy chain串接兩個8X8 LED矩陣成為8X16的顯示面板用來顯示中文訊息。<br />
在以下的影片中,會展示以<b>水平捲動方式顯示8X8英文字型</b>以及<b>垂直捲動顯示16X16中文字型</b>等兩種效果。<br />
<ol>
</ol>
<h4 style="text-align: center;">
<span style="color: blue;">『EV3 8x16 LED顯示看板』示範影片:</span></h4>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/r1RBqEQhfL4/0.jpg" frameborder="1" height="400" src="https://www.youtube.com/embed/r1RBqEQhfL4?feature=player_embedded" width="480"></iframe></div>
<br />
<a name='more'></a><br />
<br />
<h2>
<span style="color: blue;">重要技術資訊</span></h2>
<div>
在Sparkfun官網文件中『<a href="https://www.sparkfun.com/datasheets/Components/rgbmatrixbackpack_userguide.pdf" target="_blank">RGB Matrix – Serial Backpack User Guide</a>』,提供了許多重要的技術資訊,另外在<a href="https://www.sparkfun.com/products/760" target="_blank">產品頁面</a>中也還有許多應用範例值得參考。<br />
<ol>
<li>Arduino透過SPI介面傳送64個bytes的資料序列給LED矩陣,藉以控制每一個LED的顏色顯示, 而資料byte的顏色值格式如以下圖示,最多可顯示255種顏色:<a href="http://3.bp.blogspot.com/-YSuxFl7TPPM/VWGh5ZS7vxI/AAAAAAAAA9s/aC59uFR0rlM/s1600/RGBMatrix_SPI_ByteColorValue.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="75" src="http://3.bp.blogspot.com/-YSuxFl7TPPM/VWGh5ZS7vxI/AAAAAAAAA9s/aC59uFR0rlM/s400/RGBMatrix_SPI_ByteColorValue.jpg" width="500" /></a></li>
<li><div class="separator" style="clear: both; text-align: left;">
在Daisy Chain模式下,SPI bus的clock speed不能超過125KHz,設定SPI時脈的Arduino程式碼如下:</div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
void setup()
{
Serial.begin(9600);
pinMode (CS_pin, OUTPUT);
pinMode (MOSI_pin, OUTPUT);
pinMode (SCLK_pin, OUTPUT);
SPI.begin();
<span style="color: red;"><b>SPI.setClockDivider(SPI_CLOCK_DIV128);</b> // Daisy-chain should set this speed</span>
setDaisyChain(true);
}
</code></pre>
<br />
</li>
<li><div class="separator" style="clear: both; text-align: left;">
設定Daisy Chain模式的指令為:'<b>%</b>' + <b>n</b>, <b>n</b>表示串接的LED矩陣數量,以下的程式碼是將串接數量設定為2。</div>
同時因為 '<b>%</b>' 字符是指令前置碼,所以由SPI介面傳送的資料序列中,應避免包含 '<b>%</b>' 字符(Ascii值0x25),否則會造成不正常的顯示結果。<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* Enable Daisay-chain mode
* ************************************************************ */
void setDaisyChain(boolean setChain)
{
//Send the command mode character
digitalWrite(CS_pin, LOW);
delay(1);
<span style="color: red;">SPI.transfer('%');</span>
digitalWrite(CS_pin, HIGH);
delay(100);
//Configure the correct number of boards
digitalWrite(CS_pin, LOW);
delay(1);
<span style="color: red;">if(setChain) SPI.transfer(2);
else SPI.transfer(1);</span>
digitalWrite(CS_pin, HIGH);
delay(100);
}
</code></pre>
<br />
</li>
<li><div class="separator" style="clear: both; text-align: left;">
</div>
當以Daisy Chain串接兩個LED矩陣,SPI Master(Arduino)需將128 bytes的資料序列全部傳送給LED矩陣之後,才能夠正常地顯示,而資料序列的前64個bytes會顯示在第二個LED矩陣,後64 Bytes則會顯示在第一個。<br /><br />在下面的圖示中,所表示的是SPI buffer中128個bytes的資料序列對應每一個LED實際位置的順序關係,而兩者間的關係式為:<br /><div style="text-align: center;">
<h4 style="text-align: left;">
<i>bufferIndex</i> = <i>ledRow</i> * <b><i>8</i></b> + <i>ledColumn</i> + (<i>ledColumn</i> > <i><b>7</b></i> ? <b><i>56</i></b>: <b><i>0</i></b>);</h4>
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-UHP5zqvfphU/VWGoo2HiikI/AAAAAAAAA98/1wptlg4_KAQ/s1600/RGBMatrix_SPI_interface.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="225" src="http://1.bp.blogspot.com/-UHP5zqvfphU/VWGoo2HiikI/AAAAAAAAA98/1wptlg4_KAQ/s400/RGBMatrix_SPI_interface.jpg" width="500" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: left;">LED 位置對應SPI Buffer資料序列順序關係</span></td></tr>
</tbody></table>
以下則是SPI介面傳送128個bytes資料序列的Arduino程式碼:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* SPI write to RGB Matrix
* ************************************************************ */
void transferRGBMatrix(char* dotMatrixBuffer, int delayMillis)
{
digitalWrite(CS_pin, LOW);
delay(1);
for(int xi=0; xi<128; xi++) SPI.transfer(dotMatrixBuffer[xi]);
digitalWrite(CS_pin, HIGH);
delay(1);
delay (delayMillis);
}</code></pre>
</li>
</ol>
<h2>
<span style="color: blue;">實作英數</span><span style="color: blue;">字型</span><span style="color: blue;">顯示</span></h2>
<div>
<ol>
<li>以LED矩陣顯示英數字符,需要有字符的8x8 bitmap字型資料,可以預先以陣列方式將大小寫英文字母(A~Z,a~z)、數字(0~9)以及一些常用符號的bitmap資料建立在Arduino程式中,這樣就可以透過呼叫函式傳入英數字符作為引數方式讀取對應的bitmap資料。<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* Get font buffer extended function
* char displayChar : Ascii value of the character in the string to be displayed
* int cidx : The index of this character in the string
* char* fontBuffer : The font pattern buffer of this character
* ************************************************************ */
void getFontEX(char displayChar, int cidx, char* fontBuffer)
{
int fidx=cidx*FONT_HEIGHT;
if((displayChar >= 'A') && (displayChar <= 'Z'))
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = captialFont[(displayChar-'A')*FONT_HEIGHT+idx];
else
if((displayChar >= 'a') && (displayChar <= 'z'))
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = lowerFont[(displayChar-'a')*FONT_HEIGHT+idx];
else
if((displayChar >= '0') && (displayChar <= '9'))
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = numberFont[(displayChar-'0')*FONT_HEIGHT+idx];
else {
switch (displayChar) {
case '.':
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = dotFont[idx];
break;
case ',':
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = commaFont[idx];
break;
case '!':
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = exclamFont[idx];
break;
default:
for(int idx=0; idx<FONT_HEIGHT; idx++) fontBuffer[fidx+idx] = 0x00;
}
}
}
</code></pre>
</li>
<li>依據LED矩陣Data Byte顏色值格式,將Bitmap資料中每一個bit值轉換成顏色值資料,轉換的方式為:當bit為ON時設定為前景顏色值,OFF則為背景顏色值。<br /> </li>
<li>轉換後的LED顏色值資料依據前面提到的LED位置對應SPI buffer資料序列關係,存放至SPI buffer中,再以SPI介面傳送給LED矩陣就能夠正確的顯示出字符。<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-5m3ekIcuMfk/VWl_RG4xuJI/AAAAAAAAA-0/CCATWyxE8nc/s1600/Bitmap_To_SPI_buffer.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="200" src="http://4.bp.blogspot.com/-5m3ekIcuMfk/VWl_RG4xuJI/AAAAAAAAA-0/CCATWyxE8nc/s400/Bitmap_To_SPI_buffer.jpg" width="550" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bitmap轉換SPI buffer資料序列示意圖</td></tr>
</tbody></table>
</li>
</ol>
<h2>
<span style="color: blue;">實作英數字串</span><span style="color: blue;">水平捲動效果</span></h2>
水平捲動8X8英數字串的方式與動畫原理相似,依序將連續的畫格(Frame)傳送給LED矩陣,製作出捲動的視覺效果:<br />
<ol>
<li>首先將所有字符的bitmap資料依序結合成一個新的bitmap資料,因為bitmap是圖像的數位表示方式,這樣就如同接合每個字符的 8 x 8 正方形圖像成為一張水平方位的矩形圖像。<br />而矩形圖像的尺寸為:寬 x 長 = 8 x (8 x N) 個 bits,N是字符的數目,每一個bit資料可以視為是一個像素(Pixel) 。<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-U-8NmhPGF-8/VW26-rxtX2I/AAAAAAAAA_I/GWrOOvEp4Pk/s1600/8x32BitmapFont.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="148" src="http://3.bp.blogspot.com/-U-8NmhPGF-8/VW26-rxtX2I/AAAAAAAAA_I/GWrOOvEp4Pk/s400/8x32BitmapFont.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">8 x 32 英數字串bitmap</td></tr>
</tbody></table>
</li>
<li>接著以 8 x 16的LED矩陣作為畫布(Canvas),自矩形圖像資料中,由左往右依序漸次增加讀取 8 x 1個像素作為劃格(Frame),將畫格內的bitmap資料轉換成LED顏色值再傳送至畫布中顯現出來,這樣就可以呈現出以水平方式往左捲動的視覺效果。</li>
</ol>
<h2>
<span style="color: blue;">實作中文字串垂直捲動顯示</span></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-fJZ3jzcGOxA/VW5_lPO8WhI/AAAAAAAAA_k/6JyKzxflFMk/s1600/32x16bitmapFont.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="500" src="http://3.bp.blogspot.com/-fJZ3jzcGOxA/VW5_lPO8WhI/AAAAAAAAA_k/6JyKzxflFMk/s400/32x16bitmapFont.jpg" width="300" /></a></div>
<ol>
<li>中文無法如同英數字可在程式中預先建立每個字符的bitmap資料,而是需將所要顯示的中文訊息字串的bitmap資料製作成header file,再由程式中以include方式引用。<br />Header file的bitmap圖像尺寸會是:寬 x 長 = (16 x N) x 16 bits,N是中文字符的數目。<br />如右圖示為 32 x 16 bits的圖像。<br /><br /> <div class="separator" style="clear: both; text-align: center;">
</div>
</li>
<li>製作向上垂直捲動效果的原理同水平捲動的處理方式,差別在於改成由上往下依序漸次增加讀取 1 x 16 個像素作為劃格(Frame),同樣將 bit 值轉換成LED顏色值之後再傳送至LED矩陣,就可以顯示出垂直捲動的視覺效果。</li>
</ol>
<h3>
※ 水平捲動英數字型程式碼</h3>
</div>
</div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* display font with marguee effect extended function
* ************************************************************ */
void displayFontMarqueeEX(int strLen, char* fontBuffer, char fontColor, char backColor, int delayMillis)
{
char dotMatrixBuffer[128];
short ledidx=0;
for(int cidx=0; cidx<strLen; cidx++) { // Each character
for(int fidx=FONT_WIDTH-1; fidx>=0; fidx--) { // From MSB to LSB
for(int xrow=0; xrow<8; xrow++) { // Each row
for(int xcol=15, fcnt=fidx; xcol>=0; xcol--, fcnt++) { // Each column
ledidx = xrow*8 + (xcol>=8? xcol+56: xcol);
dotMatrixBuffer[ledidx] = backColor;
if(fcnt<=FONT_WIDTH-1) { // if fcnt = 0-7, move current char pattern to led buffer
if(bitRead(fontBuffer[cidx*FONT_HEIGHT+xrow], fcnt))
dotMatrixBuffer[ledidx] = fontColor;
} // if fcnt = 0-7, move current char pattern to led buffer
else {
if(fcnt<=FONT_WIDTH*2-1) { // if fcnt = 8-15, move last char pattern to led buffer
if(cidx>0) {
if(bitRead(fontBuffer[(cidx-1)*FONT_HEIGHT+xrow], fcnt-FONT_WIDTH))
dotMatrixBuffer[ledidx] = fontColor;
}
} // if fcnt = 8-15, move last char pattern to led buffer
else { // if fcnt = 16-23, move last+1 char pattern to led buffer
if(cidx>1) {
if(bitRead(fontBuffer[(cidx-2)*FONT_HEIGHT+xrow], fcnt-FONT_WIDTH*2))
dotMatrixBuffer[ledidx] = fontColor;
}
} // if fcnt = 16-23, move last+1 char pattern to led buffer
}
} // Each column
} // Each row
transferRGBMatrix(dotMatrixBuffer, delayMillis);
} // From MSB to LSB
} // Each character
}
</code></pre>
<br /></div>
<h3>
※ 垂直捲動中文字型程式碼</h3>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
/* ************************************************************
* display 16*16 bitmap font with marguee effect extended function
* ************************************************************ */
void displayBigFontMarqueeEX(byte* fontBuffer, char fontColor, char backColor, int delayMillis)
{
char dotMatrixBuffer[128];
short ledidx=0;
for(int fidx=0; fidx<font_height; fidx++) {
for(int yidx=7, ridx=fidx; yidx>=0; yidx--, ridx++) {
for(int bidx=7; bidx>=0; bidx--) {
ledidx = yidx*8+(7-bidx);
dotMatrixBuffer[ledidx] = backColor;
dotMatrixBuffer[ledidx+64] = backColor;
if(ridx<font_height) {
if(bitRead(fontBuffer[ridx*2], bidx)) dotMatrixBuffer[ledidx] = fontColor;
if(bitRead(fontBuffer[ridx*2+1], bidx)) dotMatrixBuffer[ledidx+64] = fontColor;
}
}
}
transferRGBMatrix(dotMatrixBuffer, delayMillis);
}
}
</code></pre>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-11639008215084207112015-05-12T03:57:00.000-07:002015-05-12T03:57:59.731-07:00RobotC 4.X實作:樂高Technic Beam積木顏色分類機(LEGO BRICKS SORTER)<span style="font-family: Verdana, sans-serif;">RobotC 4.X版原來對於EV3的I2C功能一直不是很穩定,常出現Bus error的錯誤,不過從4.27版之後就已經能夠正常支援了,所以這次以mindsensors的<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank"><i>PFMate</i></a>與<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=93" target="_blank"><i>NXTServo</i></a>(V1.0)兩個I2C數位控制器,再搭配EV3中型馬達以及觸控' 顏色兩種感應器實作一個『<b><span style="color: blue;">樂高Technic Beam的積木顏色分類機(LEGO BRICKS SORTER)</span></b>』,用來測試RobotC</span><span style="font-family: Verdana, sans-serif;">相關</span><span style="font-family: Verdana, sans-serif;">的EV3功能</span><span style="font-family: Verdana, sans-serif;">,包含:馬達、感應器、I2C通訊以及EV3的多工作業等。</span><br />
<h3>
<span style="font-family: Verdana, sans-serif;">示範影片:</span></h3>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/OuIOMhACJ3o/0.jpg" frameborder="1" height="399" src="https://www.youtube.com/embed/OuIOMhACJ3o?feature=player_embedded" width="480"></iframe></div>
<div>
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<h3>
<span style="font-family: Verdana, sans-serif;">機構總覽:</span></h3>
<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-W3DPFxtkmno/VVGQH0IM-tI/AAAAAAAAA8A/Jv-DAPVhnE0/s1600/BrickSorter_Mechanism.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="300" src="http://3.bp.blogspot.com/-W3DPFxtkmno/VVGQH0IM-tI/AAAAAAAAA8A/Jv-DAPVhnE0/s400/BrickSorter_Mechanism.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bricks Sorter整體機構</td></tr>
</tbody></table>
<a name='more'></a><br />
<span style="font-family: Verdana, sans-serif;"><b>整體機構共分成五個部分:</b></span></div>
<div>
<ol>
<li><span style="font-family: Verdana, sans-serif;"><b><span style="color: blue;">托盤 加 輸送帶:</span></b><br />透過<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank"><i>PFMate</i></a>控制<a href="http://shop.lego.com/en-US/Power-Functions-L-Motor-88003?fromListing=listing" target="_blank"><i>LEGO PF馬達</i></a>驅動輸送帶,並使用EV3 Touch sensor控制PFMate一次只運送一個積木給顏色感應器。</span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/--wYqQB2Ze-U/VVG_UgjiFuI/AAAAAAAAA8Q/cyhs9n2cKvk/s1600/IMG_1260_Bright.jpg" imageanchor="1" style="font-family: 'Times New Roman'; margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="240" src="http://1.bp.blogspot.com/--wYqQB2Ze-U/VVG_UgjiFuI/AAAAAAAAA8Q/cyhs9n2cKvk/s320/IMG_1260_Bright.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">EV3 Touch Sensor</td></tr>
</tbody></table>
</li>
<li><span style="font-family: Verdana, sans-serif;"><b style="color: blue;">顏色辨識:</b>使用EV3 Color sensor</span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-XDpGDYz1Vqc/VVG_3aed7wI/AAAAAAAAA8Y/tXwsyXXGxZ8/s1600/IMG_1261.JPG" imageanchor="1" style="font-family: 'Times New Roman'; margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="240" src="http://4.bp.blogspot.com/-XDpGDYz1Vqc/VVG_3aed7wI/AAAAAAAAA8Y/tXwsyXXGxZ8/s320/IMG_1261.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">EV3 Color Sensor</td></tr>
</tbody></table>
</li>
<li><span style="font-family: Verdana, sans-serif;"><b><span style="color: blue;">積木傳送機構(Brick feeder):</span></b><br />以一顆EV3中型馬達驅動包含:<b>抓取</b>以及<b>傳送</b>兩個動作的<a href="http://en.wikipedia.org/wiki/Underactuation" target="_blank"><i>Under-actuation機構</i></a>(即:機構的自由度大於驅動的馬達數目)。</span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-da7Y3tvI5Es/VVHCcKPCUoI/AAAAAAAAA8k/F-aLZ1hv-nQ/s1600/BrickSorter_BrickFeeder.jpg" imageanchor="1" style="font-family: 'Times New Roman'; margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="240" src="http://4.bp.blogspot.com/-da7Y3tvI5Es/VVHCcKPCUoI/AAAAAAAAA8k/F-aLZ1hv-nQ/s320/BrickSorter_BrickFeeder.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Brick Feeder機構(Under-actuation)</td></tr>
</tbody></table>
</li>
<li><span style="font-family: Verdana, sans-serif;"><b><span style="color: blue;">積木載入機構(Brick loader):</span></b><br />透過<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=107" target="_blank"><i>PFMate</i></a>控制<i><a href="http://shop.lego.com/en-US/Power-Functions-Servo-Motor-88004?fromListing=listing" target="_blank">LEGO PF伺服馬達</a></i>將Technic beam垂直抬舉,以方便機械手臂抓取。</span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-eF0dOiihVVw/VVHCcLA3bbI/AAAAAAAAA8o/Bj6HCaSDS-0/s1600/BrickSorter_BrickLoader.jpg" imageanchor="1" style="font-family: 'Times New Roman'; margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="240" src="http://3.bp.blogspot.com/-eF0dOiihVVw/VVHCcLA3bbI/AAAAAAAAA8o/Bj6HCaSDS-0/s320/BrickSorter_BrickLoader.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Brick Loader機構</td></tr>
</tbody></table>
<span style="font-family: Verdana, sans-serif;"></span></li>
<li><span style="font-family: Verdana, sans-serif;"><b><span style="color: blue;">機械手臂機構 加 積木分色置放槽:</span></b><br />透過<a href="http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=93" target="_blank"><i>NXTServo</i></a>驅動一個四個自由度的機械手臂將積木放入各個顏色的置放槽中。</span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-HPlxgazIQvw/VVHCdOoAjII/AAAAAAAAA8w/3VffmZ5yjR8/s1600/BrickSorter_Grabber.jpg" imageanchor="1" style="font-family: 'Times New Roman'; margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="320" src="http://4.bp.blogspot.com/-HPlxgazIQvw/VVHCdOoAjII/AAAAAAAAA8w/3VffmZ5yjR8/s320/BrickSorter_Grabber.jpg" width="240" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Robot Arm</td></tr>
</tbody></table>
</li>
</ol>
<span style="font-family: Verdana, sans-serif;"><b>功能總攬:</b></span></div>
<div>
<ol>
<li><span style="font-family: Verdana, sans-serif;"><span style="color: blue;"><b>輸送待分類積木</b></span>:<br />以輸送帶由托盤一次運送一個Technic beam給Color Sensor進行辨識,。</span></li>
<li><span style="font-family: Verdana, sans-serif;"><span style="color: blue;"><b>顏色辨識:</b></span><br />當Color Sensor測量到color value非等於None時,就可以判斷已經有一個積木正等待分類,接著就驅動Brick Feeder將積木傳送給Brick Loader。</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b><span style="color: blue;">轉送積木給機械手臂:</span></b>透過判</span><span style="font-family: Verdana, sans-serif;">讀Brick Feeder <a href="http://en.wikipedia.org/wiki/Underactuation" style="font-style: italic;" target="_blank">Under-actuation機構</a> 的EV3中型馬達RPM值,可以判斷積木已經轉送到Brick Loader,接著驅動Brick Loader將積木垂直</span><span style="font-family: Verdana, sans-serif;">抬起。</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b><span style="color: blue;">積木分類:</span></b>以機械手臂從Brick Loader抓取積木放置在不同顏色的分類槽中(紅' 白' 黃),而如果不是上述三種顏色的積木,機械手臂會移到後方丟棄。</span></li>
</ol>
<div>
<h3>
<span style="font-family: Verdana, sans-serif;">RobotC I2C通訊程式摘要:</span></h3>
</div>
</div>
<div>
<ul>
<li><span style="font-family: Verdana, sans-serif;">PFMate與NXTServo等I2C數位感應器的<b>Sensor Type</b>需要設定成<b><span style="color: blue;"> </span></b></span><span style="background-color: #eeeeee; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; line-height: 14px;"><b><span style="color: blue;"> sensorEV3_GenericI2C</span></b></span></li>
</ul>
</div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
#pragma config(Sensor, S1, EV3_COLOR, sensorEV3_Color, modeEV3Color_Color)
#pragma config(Sensor, S2, EV3_TOUCH, sensorEV3_Touch)
<b><span style="color: red;">#pragma config(Sensor, S3, PFMATE, sensorEV3_GenericI2C)
#pragma config(Sensor, S4, NXTSERVO, sensorEV3_GenericI2C)</span></b>
#pragma config(Motor, motorA, EV3_Mmotor, tmotorEV3_Medium, PIDControl, encoder)
</code></pre>
<br />
<div>
<ul>
<li><span style="font-family: Verdana, sans-serif;"><b>讀取I2C Sensor Value的範例程式碼:</b><br />首先需要先寫入I2C bus 以及所要讀取的register位址,等EV3完成建立通訊之後,再傳送資料buffer以及讀取的資料byte數。 </span></li>
</ul>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
//////////////////////////////////////////////////////////////////////////////////////////
// Read battery voltage value of NXTServo.
//////////////////////////////////////////////////////////////////////////////////////////
float getNXTServoBatteryVoltage()
{
TI2CStatus nStatus;
ubyte I2C_Request[3], I2C_Reply[1];
short errCnt=0;
while(nI2CStatus[NXTSERVO] == i2cStatusPending) {
errCnt++;
if(errCnt>500) {
displayBigTextLine(7, "NXTServo_TimeOut(M)");
delay(5000);
return false;
}
delay(10);
}
memset(I2C_Request, 3, 0);
<b><span style="color: red;">I2C_Request[0] = 2;
I2C_Request[1] = NXTSERVO_ADDR;
I2C_Request[2] = 0x41;
sendI2CMsg(NXTSERVO, &I2C_Request[0], 1);</span></b>
delay(100); // Do not change this value, or servos will unstable.
while(nI2CStatus[NXTSERVO] == i2cStatusPending) wait1Msec(1);
memset(I2C_Reply, 1, 0);
<span style="color: red;"><b>nStatus = readI2CReply(NXTSERVO, &I2C_Reply[0], 1);</b></span>
return ((4700.0/127.0)*I2C_Reply[0]);
}
</code></pre>
<br />
<span style="font-family: Verdana, sans-serif;">寫入I2C 裝置的範例程式碼:</span></div>
<div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="word-wrap: normal;">
//////////////////////////////////////////////////////////////////////////////////////////
// Control multiple servors simultaneously.
//////////////////////////////////////////////////////////////////////////////////////////
bool setMultiServo(const int delayMSec)
{
TI2CStatus nStatus;
ubyte I2C_Request[19];
short errCnt=0;
while(nI2CStatus[NXTSERVO] == i2cStatusPending) {
errCnt++;
if(errCnt>500) {
displayBigTextLine(7, "NXTServo_TimeOut(M)");
delay(5000);
return false;
}
delay(10);
}
// Set servo speed
<span style="color: red;"><b>memset(I2C_Request, 19, 0);
I2C_Request[0] = 2+NO_OF_SERVOS;
I2C_Request[1] = NXTSERVO_ADDR;
I2C_Request[2] = servoSpeedReg[0];
for(int xi=0; xi<NO_OF_SERVOS; xi++) {
I2C_Request[xi+3] = servoArray[xi].servoSpeed;
}
sendI2CMsg(NXTSERVO, &I2C_Request[0], 0);</b></span>
delay(200); // Do not change this value, or servos will unstable.
// Set servo position
<b><span style="color: red;">memset(I2C_Request, 0, 19);
I2C_Request[0] = 2+NO_OF_SERVOS*2;
I2C_Request[1] = NXTSERVO_ADDR;
I2C_Request[2] = servoPosReg[0];
for(int xi=0; xi<NO_OF_SERVOS; xi++) {
I2C_Request[2*xi+3] = (servoArray[xi].servoPos & 0x00FF);
I2C_Request[2*xi+4] = ((servoArray[xi].servoPos >> 8) & 0x00FF);
}
nStatus = sendI2CMsg(NXTSERVO, &I2C_Request[0], 0);</span></b>
delay(delayMSec);
return (nStatus == i2cStatusNoError);
}
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-9137267888446321279.post-54795146638109560062014-12-16T18:51:00.000-08:002014-12-16T18:52:18.667-08:00讓 EV3 來播放聖誕音樂<span style="font-family: 新細明體;">
</span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-size: large;"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">歲末年冬</span><span style="font-family: Calibri;"><span lang="EN-US">, </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">聖誕節與新年也陸續即將到來,所以也就想用</span><span style="font-family: Calibri;"><span lang="EN-US">EV3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">來點綴一下年節的氣氛。</span><span lang="EN-US"><br /><span style="font-family: Calibri;">
</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">而首先可以做的就是讓它來播放應景音樂,也就是透過</span><span style="font-family: Calibri;"><span lang="EN-US">EV3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">軟體的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Editor</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">工具錄製成</span><span style="font-family: Calibri;"><span lang="EN-US">EV3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Files</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,再以</span><span style="font-family: Calibri;"><span lang="EN-US">Sound
Block</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">來播放。</span></span><span lang="EN-US"><br /></span></div>
<span style="font-family: 新細明體;">
</span><br />
<div style="margin: 0cm 0cm 0pt;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='640' height='532' src='https://www.youtube.com/embed/ETb0XGpjbBg?feature=player_embedded' frameborder='0'></iframe><br />
<br />
<span style="font-family: Calibri;"><span lang="EN-US">EV3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Editor</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">可以開啟</span><span style="font-family: Calibri;"><span lang="EN-US">MP3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、</span><span style="font-family: Calibri;"><span lang="EN-US">WAV</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">等格式的音樂檔,再截取約</span><span style="font-family: Calibri;"><span lang="EN-US">10</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">秒左右的音樂存成</span><span style="font-family: Calibri;"><span lang="EN-US">Sound File</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,不過若要播的音樂超過</span><span style="font-family: Calibri;"><span lang="EN-US">10</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">秒,就需要分割錄製成數的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Files</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">再以相同數目的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Blocks</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">來播放。</span><span lang="EN-US"><br /><span style="font-family: Calibri;">
</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">但是因為</span><span style="font-family: Calibri;"><span lang="EN-US">EV3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Editor</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">工具只能顯示音樂檔的播放長度,而沒有起始與結束的時間資訊,所以,不適合用來做為分割的工具,唯有先以其他的音訊編輯軟體切割好數個</span><span style="font-family: Calibri;"><span lang="EN-US">10</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">秒片斷的音樂檔再由</span><span style="font-family: Calibri;"><span lang="EN-US">EV3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Editor</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">存成</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Files</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,或者使用音樂播放軟體或</span><span style="font-family: Calibri;"><span lang="EN-US">MP3</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">播放器透過</span><span style="font-family: Calibri;"><span lang="EN-US">Line In</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到電腦,一邊播放同時由</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Editor</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">進行錄製,當錄製的時間約</span><span style="font-family: Calibri;"><span lang="EN-US">8</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">秒時,</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Editor</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">就會停止錄製,這時候先暫停播放,存檔成</span><span style="font-family: Calibri;"><span lang="EN-US">Sound Files</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之後再繼續重複錄製的動作。這樣方式的缺點是</span><span style="font-family: Calibri;"><span lang="EN-US">Sound
files</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之間可能會有類似</span><span style="font-family: Calibri;"><span lang="EN-US">”</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">跳針</span><span style="font-family: Calibri;"><span lang="EN-US">”</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的間隔,不過多練習幾遍盡量降低</span><span style="font-family: Calibri;"><span lang="EN-US">Sound
files</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之間銜接的不順暢就</span><span style="font-family: Calibri;"><span lang="EN-US">OK</span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">了。</span></div>
<span style="font-family: 新細明體;">
</span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在影片中使用的正是邊播放邊錄製的方法,品質也許並非完美,不過還是有它的效果在,如果再配合一些聲光與動作效果,就更能襯托出年節的氣氛</span><span lang="EN-US"><span style="font-family: Calibri;"> ^^</span></span></div>
<span style="font-family: 新細明體;">
</span><br />
<div style="margin: 0cm 0cm 0pt;">
</div>
<span style="font-family: 新細明體;">
</span><br />
<ol style="direction: ltr; list-style-type: decimal;">
<li style="color: black; font-size: 12pt; font-style: normal; font-weight: normal;"><div style="color: black; font-size: 12pt; font-style: normal; font-weight: normal; margin-bottom: 0pt; margin-top: 0cm; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在</span><span lang="EN-US"><a href="https://www.youtube.com/audiolibrary/music"><span style="color: blue;">YouTube</span><span lang="EN-US" style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span lang="EN-US"><span style="color: blue;">的</span><span lang="EN-US"><span style="color: blue;">音</span><span lang="EN-US"><span style="color: blue;">效</span><span lang="EN-US"><span style="color: blue;">庫</span></span></span></span></span></span></a></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中有免費授權的聖誕音樂可以下載,如果要錄製成影片上傳的話,使用這些音樂可以避免被</span><span lang="EN-US">YouTube</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">消音。</span></div>
</li>
<li style="color: black; font-size: 12pt; font-style: normal; font-weight: normal;"><span lang="EN-US"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 12pt; text-align: center;">Sound Editor tool</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">錄製電腦播放的音樂,再存成</span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 12pt; text-align: center;">Sound File</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span></span><a href="http://2.bp.blogspot.com/-pZlrOMB-o_c/VJDt1tkbcEI/AAAAAAAAA6w/MU-u_qU_vcE/s1600/EV3-SoundEditor-3.jpg" imageanchor="1" style="clear: left; font-family: Calibri, sans-serif; font-size: 12pt; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-pZlrOMB-o_c/VJDt1tkbcEI/AAAAAAAAA6w/MU-u_qU_vcE/s1600/EV3-SoundEditor-3.jpg" height="428" width="640" /></a></li>
<li style="font-size: 12pt; font-style: normal;"><div style="color: black; font-family: "Calibri","sans-serif"; font-size: 12pt; font-style: normal; font-weight: normal; margin-bottom: 0pt; margin-top: 0cm; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">存檔的</span><span lang="EN-US" style="color: black; font-family: Calibri, sans-serif; font-weight: normal;">Sound files</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">可以在</span><span lang="EN-US" style="color: black; font-family: Calibri, sans-serif;"><b>Project properties</b></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US" style="color: black; font-family: Calibri, sans-serif;"><b>Sounds</b></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">頁籤中找到。</span><span lang="EN-US" style="font-weight: normal;"><br style="mso-special-character: line-break;" />
<a href="http://1.bp.blogspot.com/-JkdqaAC3ix4/VJDuIobqhSI/AAAAAAAAA64/W4r7rmwT4p4/s1600/EV3-SoundEditor-2.jpg" imageanchor="1" style="color: black; font-family: Calibri, sans-serif; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://1.bp.blogspot.com/-JkdqaAC3ix4/VJDuIobqhSI/AAAAAAAAA64/W4r7rmwT4p4/s1600/EV3-SoundEditor-2.jpg" height="640" width="408" /></a><br /><span style="font-family: Calibri, sans-serif;"><br /></span></span></div>
</li>
<li style="color: black; font-family: Calibri, sans-serif; font-size: 12pt; font-style: normal;"><div style="color: black; font-family: "Calibri","sans-serif"; font-size: 12pt; font-style: normal; font-weight: normal; margin-bottom: 0pt; margin-top: 0cm; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">再使用連續個相同數目的</span><span lang="EN-US"><b>Sound
blocks</b></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">依序挑選</span><span lang="EN-US"><b>Sound file</b></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">來播放。</span><span lang="EN-US" style="font-weight: normal;"><br style="mso-special-character: line-break;" />
<a href="http://2.bp.blogspot.com/-DiCb_v0zFpE/VJDubGhm38I/AAAAAAAAA7A/-vHC3bxXl0Y/s1600/EV3-SoundEditor-9.jpg" imageanchor="1" style="font-family: Calibri, sans-serif; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://2.bp.blogspot.com/-DiCb_v0zFpE/VJDubGhm38I/AAAAAAAAA7A/-vHC3bxXl0Y/s1600/EV3-SoundEditor-9.jpg" height="208" width="640" /></a>
</span></div>
</li>
</ol>
<span style="font-family: 新細明體;">
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-63678853052993081712014-07-27T08:11:00.000-07:002014-07-27T08:11:01.671-07:00EV3 對 Arduino 的藍芽通訊測試<div class="MsoNormal">
<span style="font-size: large;"><span lang="EN-US">EV3</span><span style="font-family: 新細明體, serif;">軟體中的</span><b><span lang="EN-US">Messaging Block</span></b><span style="font-family: 新細明體, serif;">是唯一使用藍芽通訊的程式區塊,它的功能是在</span><span lang="EN-US">EV3</span><span style="font-family: 新細明體, serif;">之間傳送與接收郵件訊息</span><span lang="EN-US">(Message)</span><span style="font-family: 新細明體, serif;">,所以只要能夠解析</span><span lang="EN-US">EV3</span><span style="font-family: 新細明體, serif;">的通訊格式,就</span></span><span style="font-family: 新細明體, serif; font-size: large;">同樣</span><span style="font-family: 新細明體, serif; font-size: large;">可以</span><span style="font-family: 新細明體, serif; font-size: large;">用來與</span><span lang="EN-US" style="font-size: large;">Arduino</span><span style="font-family: 新細明體, serif; font-size: large;">進行無線的藍芽通訊。</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-3tjSLeBPSiI/U9S_O2xXe5I/AAAAAAAAA2I/XQHGUMVf4ao/s1600/EV3-SendMsgToArduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-3tjSLeBPSiI/U9S_O2xXe5I/AAAAAAAAA2I/XQHGUMVf4ao/s1600/EV3-SendMsgToArduino.jpg" height="400" width="356" /></a></div>
<div class="MsoNormal">
<span style="font-family: 新細明體, serif; font-size: large;"><br /></span></div>
<h3>
<b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: x-large;">配對與建立連結</span></span></b></h3>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="MsoNormal">
<span style="font-size: large;"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在本次測試,</span><span lang="EN-US">Arduino</span></span><span style="font-family: 新細明體, serif; font-size: large;">所</span><span style="font-family: 新細明體, serif; font-size: large;">使用的藍芽模組</span><span style="font-family: 新細明體, serif; font-size: large;">是</span><span lang="EN-US" style="font-size: large;"><a href="http://www.mindstorms.rwth-aachen.de/trac/wiki/EV3">DFRobot Bluetooth Bee(2.0)</a></span><span class="MsoHyperlink" style="font-size: large;"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-74Et-TRcSZg/U9S3MqVo_KI/AAAAAAAAA1o/PykNJXghsRE/s1600/IMG_0722.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-74Et-TRcSZg/U9S3MqVo_KI/AAAAAAAAA1o/PykNJXghsRE/s1600/IMG_0722.JPG" height="298" width="400" /></a></div>
<div class="MsoNormal">
<span class="MsoHyperlink"><span lang="EN-US"><span style="font-family: 新細明體, serif;"><br /></span></span></span><span style="font-size: large;"><span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">經由EV3進行配對之後,在</span><span lang="EN-US">EV3 UI的</span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">藍芽</span><span lang="EN-US">Favorites</span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">清單中所顯示的裝置名稱為:</span><span lang="EN-US"><b>Bluebooth_Bee_V2</b></span></span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: large;">。</span></span><span lang="EN-US"><br />
<!--[endif]--><o:p></o:p></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-cda5JV6jOww/U9S4_CkWSCI/AAAAAAAAA1w/JuqhgzskVAs/s1600/EV3_BT_Connections.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-cda5JV6jOww/U9S4_CkWSCI/AAAAAAAAA1w/JuqhgzskVAs/s1600/EV3_BT_Connections.png" height="288" width="400" /></a></div>
<div class="MsoNormal">
<span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"></span></span><br />
<a name='more'></a><span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><br /></span></span></div>
<div class="MsoNormal">
<span style="font-size: large;"><span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">接下來</span></span></span><span style="font-family: 新細明體, serif; font-size: large;">就可以</span><span style="font-size: large;"><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">在</span><span lang="EN-US">EV3</span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">程式中</span></span></span><span style="font-size: large;"><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">使用</span><span lang="EN-US"><b>Bluetooth Connection Block</b>,並</span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">選擇</span><span lang="EN-US"><b>Initiate Mode</b></span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">與輸入</span><span lang="EN-US"><b>Bluebooth_Bee_V2</b></span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">裝置名稱,建立</span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";">與</span><span lang="EN-US">Arduino</span></span></span><span class="MsoHyperlink"><span style="font-family: "新細明體","serif";"><span style="font-size: large;">藍芽模組之間的連結。</span></span></span></div>
<div class="MsoNormal">
<span class="MsoHyperlink"><span lang="EN-US">
<!--[endif]--><o:p></o:p></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ifN4IyRnkhM/U9S6i17tYyI/AAAAAAAAA18/of-6tsZ2ghc/s1600/EV3_Bluetooth_Connection_Block.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-ifN4IyRnkhM/U9S6i17tYyI/AAAAAAAAA18/of-6tsZ2ghc/s1600/EV3_Bluetooth_Connection_Block.jpg" height="353" width="400" /></a></div>
<div class="MsoNormal">
<span class="MsoHyperlink"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: large;"><br /></span></span></span></div>
<h3>
<b><span lang="EN-US"><span style="font-size: x-large;">EV3</span></span></b><b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: x-large;">通訊格式解析</span></span><span lang="EN-US"><o:p></o:p></span></b></h3>
<div class="MsoNormal">
<span style="font-family: 新細明體, serif; font-size: large;">在</span><span style="font-size: large;"><span lang="EN-US">2012</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">年</span></span><span style="font-family: 新細明體, serif; font-size: large;">測試</span><span lang="EN-US" style="font-size: large;"><a href="http://chlego.blogspot.tw/2012/06/mindstorms-nxt-arduino.html">NXT<span lang="EN-US" style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span lang="EN-US">與</span></span>Arduino<span lang="EN-US" style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span lang="EN-US">之間的藍芽通訊</span></span></a>時</span><span style="font-family: 新細明體, serif; font-size: large;">,NXT有一份<a href="http://www.lego.com/en-us/mindstorms/downloads/software/nxt-bdk/" target="_blank"><b><span style="color: blue;">Bluetooth Developer kit</span></b></a>可以參考,而</span><span lang="EN-US" style="font-size: large;">EV3</span><span style="font-family: 新細明體, serif; font-size: large;">則是</span><span style="font-family: 新細明體, serif; font-size: large;">到目前為止都還沒有公佈</span><span lang="EN-US" style="font-size: large;">任何關於firmware</span><span style="font-family: 新細明體, serif; font-size: large;">的官方技術文件。</span></div>
<div class="MsoNormal">
<span style="font-size: large;"><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">唯一能夠參考的就是流傳於網路中的</span><span lang="EN-US"><a href="https://github.com/mindboards/ev3sources/tree/master/lms2012">EV3 Source
code</a></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,其中</span><span lang="EN-US"><a href="https://github.com/mindboards/ev3sources/blob/master/lms2012/c_com/source/c_com.h">c_com.h</a>有</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">關於</span><span lang="EN-US">EV3 System Command</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US">Direct Command</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">封包格式的相關註解。</span><span lang="EN-US"><br />
</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">由此推測與歸結出當使用</span><b><span lang="EN-US">EV3 Messaging Block</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US"><b>Send Mode</b>時</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,就是使用</span><b><span lang="EN-US" style="color: red;">WRITEMAILBOX</span></b><span lang="EN-US"> <span style="font-family: 新細明體, serif;">的 </span></span><span lang="EN-US">System command</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。<br />至於</span></span><span style="font-family: 新細明體, serif; font-size: large;">封包</span><span style="font-family: 新細明體, serif; font-size: large;">的</span><span style="font-family: 新細明體, serif; font-size: large;">格式為:</span></div>
<div class="MsoNormal" style="margin-left: 18.0pt; mso-pagination: widow-orphan;">
<span lang="EN" style="color: blue; font-size: 14.0pt; mso-ansi-language: EN; mso-bidi-font-family: 新細明體; mso-fareast-font-family: 新細明體; mso-font-kerning: 0pt;"><b>bbbb mmmm tt ss ll aaa LLLL ppp</b><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: large;">而封包</span></span><span style="font-family: 新細明體, serif; font-size: large;">的資料</span><span style="font-family: 新細明體, serif;"><span style="font-size: large;">內容如下表</span></span><span style="font-family: 新細明體, serif; font-size: large;">:</span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
0~1</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">bbbb</span></b>
= </span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">整體訊息長度</span><span lang="EN">(bytes), </span><span lang="EN">Word</span><span style="font-family: 新細明體, serif;">型態</span><span lang="EN">, little endian</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
2~3</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">mmmm</span></b>
= message counter, </span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">用途不明</span><span lang="EN">, </span><span lang="EN">Word</span><span style="font-family: 新細明體, serif;">型態</span><span lang="EN">, little endian</span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
4</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">tt</span></b>
= command</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">類型</span><span lang="EN">, <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值為</span><span lang="EN"><b><span style="color: blue;">0×81</span></b>: </span><span class="c12"><span lang="EN-US" style="color: #333333;">System command, reply not required</span></span><span lang="EN"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
5</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">ss</span></b>
= System command<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值為</span><span lang="EN"><b><span style="color: blue;">0x9E</span></b></span><span class="cp2"><span lang="EN-US" style="color: #333333;">: <b>WRITEMAILBOX</b>, </span></span><span class="c12"><span lang="EN-US" style="color: #333333;">write to mailbox</span></span><span lang="EN"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
6</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">ll</span></b>
= </span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">包含</span><span lang="EN">null</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">結尾字元的</span><span lang="EN"><b><span style="color: blue;">Message Title</span></b></span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">字串長度</span><span lang="EN"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
7~(6+ll)</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">aaa…</span></b>
= </span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">包含</span><span lang="EN">null</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">結尾字元的</span><span lang="EN"><span style="color: blue;"><b>Message Title</b></span></span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">字串</span><span lang="EN"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
(7+ll)~(8+ll)</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">LLLL</span></b>
=</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">包含</span><span lang="EN">null</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">結尾字元的</span><span lang="EN"><b><span style="color: blue;">Message Content</span></b></span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">字串長度</span><span lang="EN">, <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN">Word</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">型態</span><span lang="EN">, little endian</span><span lang="EN"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN">Byte
(9+ll)~(8+ll+LL)</span><span lang="EN"><o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 365.9pt;" valign="top" width="488"><div class="MsoNormal">
<span lang="EN"><b><span style="color: blue; font-size: large;">ppp…</span></b>
=</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">包含</span><span lang="EN">null</span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">結尾字元的</span><span lang="EN"><span style="color: blue;"><b>Messag</b></span><b><span style="color: blue;">e Content</span></b></span><span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: 新細明體; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">字串</span></div>
</td></tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ansi-language: EN; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: large;">在上表中封包內容裏的 </span></span><b><span lang="EN-US"><span style="font-size: large;">Message Title</span></span></b><span style="font-family: 新細明體, serif;"><span style="font-size: large;">與</span></span><span style="font-size: large;"><span lang="EN-US"><b>Message Content</b>兩個值,在<b> EV3</b> </span></span><span style="font-size: large;"><span lang="EN-US"><b>Messaging Block對應的</b>input值如下圖:</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-7fzi4Dbhvjc/U9TP4jbF1yI/AAAAAAAAA2Y/gmWN_-1S1W0/s1600/EV3-SendMsgToArduino-Desc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-7fzi4Dbhvjc/U9TP4jbF1yI/AAAAAAAAA2Y/gmWN_-1S1W0/s1600/EV3-SendMsgToArduino-Desc.jpg" height="400" width="356" /></a></div>
<div class="MsoNormal">
<span style="font-size: large;"><span lang="EN-US">因此,Arduino端接收來自EV3傳送的資料封包,解析後的內容如下:</span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-v9wtJHoxjGk/U9UTK5TyDlI/AAAAAAAAA2o/vBfs-r7Pxxw/s1600/Arduino_RcvMsgFmEV3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-v9wtJHoxjGk/U9UTK5TyDlI/AAAAAAAAA2o/vBfs-r7Pxxw/s1600/Arduino_RcvMsgFmEV3.jpg" /></a></div>
<h3>
<span lang="EN-US" style="font-size: x-large;">參考連結</span></h3>
</div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 12pt;"> </span><a href="http://siouxnetontrack.wordpress.com/2013/10/08/using-the-nxt-as-an-ev3-remote-control/" style="text-indent: 6pt;"><span lang="EN">Using the NXT as
an EV3 remote control</span></a></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 6.0pt;">
<span lang="EN-US"><a href="http://siouxnetontrack.wordpress.com/2013/10/12/using-the-nxt-as-an-ev3-remote-control-part-ii/"><span lang="EN">Using the NXT as
an EV3 remote control</span></a></span><span class="MsoHyperlink"><span lang="EN"> Part II</span></span><span lang="EN" style="color: #333333; mso-ansi-language: EN; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-size: 12.0pt; mso-bidi-font-weight: bold; mso-fareast-font-family: 微軟正黑體;"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 6.0pt;">
<span lang="EN-US"><a href="http://siouxnetontrack.wordpress.com/2013/09/27/connecting-the-pc-to-our-ev3/"><span lang="EN">Sending messages
from a PC application in C# to the Lego EV3</span></a></span><span lang="EN" style="color: #333333; mso-ansi-language: EN; mso-bidi-font-size: 12.0pt; mso-bidi-font-weight: bold;"><o:p></o:p></span></div>
<div class="MsoNormal" style="mso-char-indent-count: .5; text-indent: 6.0pt;">
<a href="https://ev3messenger.codeplex.com/">EV3Messenger</a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<h3>
<span style="font-size: x-large;">Arduino原始碼</span></h3>
<span style="color: blue;">#define SYSTEM_COMMAND_REPLY 0x01</span><br />
<span style="color: blue;">#define SYSTEM_COMMAND_NO_REPLY 0x81</span><br />
<span style="color: blue;">#define SYSTEM_REPLY 0x03</span><br />
<span style="color: blue;">#define SYSTEM_REPLY_ERROR 0x05</span><br />
<span style="color: blue;">#define DIRECT_COMMAND_REPLY 0x00</span><br />
<span style="color: blue;">#define DIRECT_COMMAND_NO_REPLY 0x80</span><br />
<span style="color: blue;">#define DIRECT_REPLY 0x02</span><br />
<span style="color: blue;">#define DIRECT_REPLY_ERROR 0x04</span><br />
<span style="color: blue;">// EV3 System command</span><br />
<span style="color: blue;">#define WRITEMAILBOX 0x9E</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">#define MIN_PACKET_SIZE 11</span><br />
<span style="color: blue;">#define MAX_PACKET_SIZE 64</span><br />
<span style="color: blue;">#define RCV_MSG_TIMEOUT 5000</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">byte rcvMessage [MAX_PACKET_SIZE];</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">byte rcvByte;</span><br />
<span style="color: blue;">int bytesRead=0, packetLength=0;</span><br />
<span style="color: blue;">char strMsg [256];</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">/* Listen to incoming messages */</span><br />
<span style="color: blue;">void receiveMessage()</span><br />
<span style="color: blue;">{</span><br />
<span style="color: blue;"> bytesRead = 0;</span><br />
<span style="color: blue;"> for(short xii=0; xii<MAX_PACKET_SIZE; xii++) rcvMessage[xii]=0x00;</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> Serial.println("\n\r");</span><br />
<span style="color: blue;"> Serial.println("Listening .."); </span><br />
<span style="color: blue;"> while(true)</span><br />
<span style="color: blue;"> { </span><br />
<span style="color: blue;"> if(Serial.available() > 0)</span><br />
<span style="color: blue;"> {</span><br />
<span style="color: blue;"> rcvMessage[bytesRead] = Serial.read();</span><br />
<span style="color: blue;"> bytesRead++; </span><br />
<span style="color: blue;"> }</span><br />
<span style="color: blue;"> if(((bytesRead >= MIN_PACKET_SIZE) &&<br /> (bytesRead == (word(rcvMessage[1], rcvMessage[0])+2))) || (bytesRead > MAX_PACKET_SIZE))<br /> break; </span><br />
<span style="color: blue;"> }</span><br />
<span style="color: blue;">}</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">/* Prints received message sent from EV3 */</span><br />
<span style="color: blue;">boolean printMessage()</span><br />
<span style="color: blue;">{</span><br />
<span style="color: blue;"> //String strCmdType;</span><br />
<span style="color: blue;"> short packetLength = word(rcvMessage[1], rcvMessage[0]); </span><br />
<span style="color: blue;"> if(packetLength == (bytesRead-2))</span><br />
<span style="color: blue;"> { </span><br />
<span style="color: blue;"> sprintf(strMsg, "There are total %d bytes has been read.", bytesRead);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> Serial.println("The message payload receviced from EV3: ");</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> sprintf(strMsg, "(Byte 0-1) Packet size: %d bytes", packetLength);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> sprintf(strMsg, "(Byte 2-3) Message counter: %d", word(rcvMessage[3], rcvMessage[2])); </span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> sprintf(strMsg, "(Byte 4) Command type: %X", rcvMessage[4]);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> sprintf(strMsg, "(Byte 5) Command: %X", rcvMessage[5]);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> short titleLength = short(rcvMessage[6]);</span><br />
<span style="color: blue;"> sprintf(strMsg, "(Byte 6) Message title length: %d", titleLength);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> sprintf(strMsg,"(Byte 7-%d) Message title: ", titleLength+6);</span><br />
<span style="color: blue;"> Serial.print(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> for(int xii=0; xii<titleLength-1; xii++) Serial.print((char)rcvMessage[xii+7]);</span><br />
<span style="color: blue;"> sprintf(strMsg,"\\%X", rcvMessage[titleLength+6]);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> short msgLength = word(rcvMessage[titleLength+8], rcvMessage[titleLength+7]);</span><br />
<span style="color: blue;"> sprintf(strMsg,"(Byte %d-%d) Message length: %d", titleLength+7, titleLength+8, msgLength);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> sprintf(strMsg,"(Byte %d-%d) Message content: ", titleLength+9, titleLength+msgLength+8);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> for(int xii=0; xii<msgLength-1; xii++) Serial.print((char)rcvMessage[xii+titleLength+9]);</span><br />
<span style="color: blue;"> sprintf(strMsg,"\\%X", rcvMessage[titleLength+msgLength+8]);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> </span><br />
<span style="color: blue;"> Serial.println("\n\r");</span><br />
<span style="color: blue;"> return true;</span><br />
<span style="color: blue;"> }</span><br />
<span style="color: blue;"> else return false;</span><br />
<span style="color: blue;">}</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">/* Send a non-empty message to EV3 */</span><br />
<span style="color: blue;">void sendMessage()</span><br />
<span style="color: blue;">{</span><br />
<span style="color: blue;"> char replyMessage[] = {0x1A, 0x00, </span><br />
<span style="color: blue;"> 0x01, 0x00, </span><br />
<span style="color: blue;"> SYSTEM_COMMAND_NO_REPLY, WRITEMAILBOX,</span><br />
<span style="color: blue;"> 0x09, 'C','H','_','E','V','3','_','A','\0',</span><br />
<span style="color: blue;"> 0x0A, 0x00, 'H','e','l','l','o',' ','E','V','3','\0'};</span><br />
<span style="color: blue;"> for(int xii=0; xii<(word(replyMessage[1], replyMessage[0])+2); xii++)</span><br />
<span style="color: blue;"> {</span><br />
<span style="color: blue;"> Serial.write(replyMessage[xii]);</span><br />
<span style="color: blue;"> delay(1);</span><br />
<span style="color: blue;"> }</span><br />
<span style="color: blue;"> Serial.flush(); // Waits for the transmission of outgoing serial data to complete</span><br />
<span style="color: blue;">}</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">/* Send a empty message to EV3 */</span><br />
<span style="color: blue;">void sendEmptyMessage()</span><br />
<span style="color: blue;">{</span><br />
<span style="color: blue;"> char emptyMessage[] = {0x19, 0x00,</span><br />
<span style="color: blue;"> 0x01, 0x00,</span><br />
<span style="color: blue;"> SYSTEM_COMMAND_NO_REPLY, WRITEMAILBOX,</span><br />
<span style="color: blue;"> 0x09, 'I','g','n','o','r','e','M','e','\0',</span><br />
<span style="color: blue;"> 0x09, 0x00, 'I','g','n','o','r','e','M','e','\0'};</span><br />
<span style="color: blue;"> for(int xii=0; xii<(word(emptyMessage[1], emptyMessage[0])+2); xii++)</span><br />
<span style="color: blue;"> {</span><br />
<span style="color: blue;"> Serial.write(emptyMessage[xii]);</span><br />
<span style="color: blue;"> delay(1);</span><br />
<span style="color: blue;"> }</span><br />
<span style="color: blue;"> Serial.flush();</span><br />
<span style="color: blue;">}</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">void setup()</span><br />
<span style="color: blue;">{</span><br />
<span style="color: blue;"> Serial.begin(9600); </span><br />
<span style="color: blue;"> for(int xii=5; xii>0; xii--)</span><br />
<span style="color: blue;"> {</span><br />
<span style="color: blue;"> sprintf(strMsg, "Start to listen after %d seconds ..", xii);</span><br />
<span style="color: blue;"> Serial.println(strMsg);</span><br />
<span style="color: blue;"> delay(950);</span><br />
<span style="color: blue;"> }</span><br />
<span style="color: blue;">}</span><br />
<span style="color: blue;"><br /></span>
<span style="color: blue;">void loop()</span><br />
<span style="color: blue;">{ </span><br />
<span style="color: blue;"> receiveMessage();</span><br />
<span style="color: blue;"> if(printMessage())</span><br />
<span style="color: blue;"> delay(1000);</span><br />
<span style="color: blue;"> {</span><br />
<span style="color: blue;"> sendMessage();</span><br />
<span style="color: blue;"> delay(1000);</span><br />
<span style="color: blue;"> sendEmptyMessage();</span><br />
<span style="color: blue;"> delay(1000);</span><br />
<span style="color: blue;"> } </span><br />
<span style="color: blue;">}</span><br />
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9137267888446321279.post-1743739529786344252014-07-18T04:29:00.000-07:002014-07-18T04:36:34.341-07:00EV3與Arduino之間的I2C通訊(測試Dexter的EV3_I2C Block) - (II) 測試案例<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">依據<a href="http://chlego.blogspot.tw/2014/07/ev3arduinoi2cdexterev3i2c-block-i.html" target="_blank">前一篇對於EV3_I2C Block的功能摘要說明</a>,<br />本測試案例,將Arduino模擬成NXT I2C</span><span style="font-size: large;">類型</span><span style="font-size: large;">的數位感應器,</span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;">透過預先規劃好的「I2C虛擬暫存器位址映對表(Register layout)」,提供作為回應Master(EV3)的多種功能需求,包含:</span></div>
<div class="separator" style="clear: both;">
<br /></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: currentcolor;"><tbody>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<b>暫存器位址</b><span lang="EN-US" style="font-family: 'Times New Roman', serif;"><o:p></o:p></span></div>
</td><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<b>執行功能</b><span lang="EN-US" style="font-family: 'Times New Roman', serif;"><o:p></o:p></span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;"><b><span style="color: red;">0x00</span></b><o:p></o:p></span></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div class="separator" style="margin: 0cm;">
回傳版本資訊<span style="font-family: 'Times New Roman', serif;"> <span lang="EN-US">"V1.00 " </span></span>共<span lang="EN-US" style="font-family: 'Times New Roman', serif;">8</span>個<span lang="EN-US" style="font-family: 'Times New Roman', serif;">bytes<o:p></o:p></span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;"><b><span style="color: red;">0x08</span></b><o:p></o:p></span></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div class="separator" style="margin: 0cm;">
回傳廠商名稱<span style="font-family: 'Times New Roman', serif;"> <span lang="EN-US">"Arduino " </span></span>共<span lang="EN-US" style="font-family: 'Times New Roman', serif;">8</span>個<span lang="EN-US" style="font-family: 'Times New Roman', serif;">bytes<o:p></o:p></span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;"><b><span style="color: red;">0x10</span></b><o:p></o:p></span></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div class="separator" style="margin: 0cm;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;">回傳裝置代號 "UNO " </span>共<span lang="EN-US" style="font-family: 'Times New Roman', serif;">8</span>個<span lang="EN-US" style="font-family: 'Times New Roman', serif;">bytes</span><span style="font-family: 'Times New Roman', serif;"> </span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;"><span style="color: red;"><b>0x18</b></span><o:p></o:p></span></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div class="separator" style="margin: 0cm;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;">接收來自Master傳送的7個bytes資料並顯示在Serial Console </span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;"><span style="color: red;"><b>0x19</b></span><o:p></o:p></span></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div class="separator" style="margin: 0cm;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;">執行開啟 Arduino板的L LED </span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;"><b><span style="color: red;">0x1A</span></b><o:p></o:p></span></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"><div class="separator" style="margin: 0cm;">
<span lang="EN-US" style="font-family: 'Times New Roman', serif;">執行熄滅 Arduino板的L LED </span></div>
</td></tr>
<tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 97.55pt;" valign="top" width="130"><div align="center" class="separator" style="margin: 0cm; text-align: center;">
<br /></div>
</td><td style="border-color: currentcolor windowtext windowtext currentcolor; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 387.2pt;" valign="top" width="516"></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both;">
<a href="http://1.bp.blogspot.com/-zQ2H-GBtaic/U8iK9so67RI/AAAAAAAAAzA/8wnKT3-Rj8o/s1600/IMG_0719.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://1.bp.blogspot.com/-zQ2H-GBtaic/U8iK9so67RI/AAAAAAAAAzA/8wnKT3-Rj8o/s1600/IMG_0719.JPG" height="297" width="400" /></a></div>
<div class="separator" style="clear: both;">
<b><span style="font-size: large;"></span></b></div>
<a name='more'></a><b><span style="font-size: large;"><br /></span></b>
<div class="separator" style="clear: both;">
<b><span style="color: blue; font-size: x-large;">測試案例</span></b></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"><b>一、由EV3控制開啟Arduino板上的L-LED:</b></span></div>
<span style="font-size: large;">作法即使用EV3_I2C Block的「<span style="color: red;"><strong>Write 1 byte</strong></span>」模式<br />寫入 25(0x19)到 Arduino,</span><br />
<a href="http://1.bp.blogspot.com/-JLsStQ2ncQ8/U8iMhRQPn8I/AAAAAAAAAzM/iAaJm8c50kw/s1600/EV3_LLED_ON.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://1.bp.blogspot.com/-JLsStQ2ncQ8/U8iMhRQPn8I/AAAAAAAAAzM/iAaJm8c50kw/s1600/EV3_LLED_ON.jpg" /></a><br />
<span style="font-size: large;">Arduino 將會觸發receiveEvent()程序,再以Wire.read()讀取25這個值並透過負責執行指令的executeCommand()函式,<br />開啟L-LED</span><br />
<span style="font-size: large;"><br /></span>
<br />
<div class="separator" style="clear: both;">
<b><span style="color: blue;">void receiveEvent(int howMany)</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">{ </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> </span><span style="color: red;">requestRegister = Wire.read(); </span><span style="color: blue;"> </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> while(Wire.available() > 0 && bytesRead < MAX_DATA_BUF_SIZE) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> rcvData[bytesRead]=Wire.read();</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> bytesRead++;</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> }</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> executeCommand(requestRegister); </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">}</span></b></div>
<div class="separator" style="clear: both;">
<span style="color: blue;"><b><br /></b></span></div>
<div class="separator" style="clear: both;">
<span style="color: blue;"><b>...</b></span></div>
<div class="separator" style="clear: both;">
<span style="color: blue;"><b><br /></b></span></div>
<span style="color: blue;"><b>void executeCommand(byte execCmd)</b></span><br />
<span style="color: blue;"><b>{</b></span><br />
<b><span style="color: blue;"> </span><span style="color: red;"> if(execCmd == COMMAND_LLED_ON) {</span></b><br />
<b><span style="color: red;"> Serial.println("Turn ON LED");</span></b><br />
<b><span style="color: red;"> digitalWrite(LLED, HIGH);</span></b><br />
<b><span style="color: red;"> }</span></b><br />
<span style="color: blue;"><b> else if(execCmd == COMMAND_LLED_OFF) {</b></span><br />
<span style="color: blue;"><b> Serial.println("Turn OFF LED");</b></span><br />
<span style="color: blue;"><b> digitalWrite(LLED, LOW);</b></span><br />
<span style="color: blue;"><b> }</b></span><br />
<span style="color: blue;"><b> else if(execCmd == COMMANDD_SEND_7_BYTES) { </b></span><br />
<span style="color: blue;"><b> sprintf(strMsg, "%d bytes of data has been read.", bytesRead);</b></span><br />
<span style="color: blue;"><b> Serial.println(strMsg);</b></span><br />
<span style="color: blue;"><b> if(bytesRead>0) {</b></span><br />
<span style="color: blue;"><b> for(int i=0; i<bytesRead; i++) { </b></span><br />
<span style="color: blue;"><b> Serial.println((char)rcvData[i]);</b></span><br />
<span style="color: blue;"><b> }</b></span><br />
<span style="color: blue;"><b> bytesRead=0; </b></span><br />
<span style="color: blue;"><b> } </b></span><br />
<span style="color: blue;"><b> } </b></span><br />
<b><span style="color: blue;">}</span></b><br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"><b>二、EV3傳送7個bytes資料給Arduino顯示於Serial Console:</b></span></div>
<span style="font-size: large;">作法即使用EV3_I2C Block的「<span style="color: red;"><strong>Write 8 byte</strong></span>」模式,<br />在Byte 1寫入 24(0x18),</span><span style="font-size: large;">以通知Arduino還要繼續接收7個bytes的資料,</span><span style="font-size: large;">而Byte 2~Byte8則分別寫入所要顯示7個字元的Ascii值,如以下所示:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-LszWvSkWQzo/U8iUmHuz7BI/AAAAAAAAAzo/k89jesfoKcE/s1600/EV3_Write_7_bytes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-LszWvSkWQzo/U8iUmHuz7BI/AAAAAAAAAzo/k89jesfoKcE/s1600/EV3_Write_7_bytes.jpg" height="256" width="640" /></a></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"> Arduino同樣經由</span><span style="font-size: large;">receiveEvent()</span><span style="font-size: large;">接收資料後,</span><span style="font-size: large;">再交由executeCommand()顯示於Serial Console:</span></div>
<br />
<span style="color: blue;"><b>else if(execCmd == COMMANDD_SEND_7_BYTES) { </b></span><br />
<span style="color: blue;"><b> sprintf(strMsg, "%d bytes of data has been read.", bytesRead);</b></span><br />
<span style="color: blue;"><b> Serial.println(strMsg);</b></span><br />
<span style="color: blue;"><b> if(bytesRead>0) {</b></span><br />
<span style="color: blue;"><b> for(int i=0; i<bytesRead; i++) { </b></span><br />
<span style="color: blue;"><b> Serial.println((char)rcvData[i]);</b></span><br />
<span style="color: blue;"><b> }</b></span><br />
<span style="color: blue;"><b> bytesRead=0; </b></span><br />
<span style="color: blue;"><b> } </b></span><br />
<span style="color: blue;"><b> } </b></span><br />
<div class="separator" style="clear: both;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-KwkTuUVMVM4/U8iVsWbZ4uI/AAAAAAAAAz0/xHkaoF7Ip5U/s1600/EV3_SendDataTo_Arduino_SerialConsole.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-KwkTuUVMVM4/U8iVsWbZ4uI/AAAAAAAAAz0/xHkaoF7Ip5U/s1600/EV3_SendDataTo_Arduino_SerialConsole.jpg" height="640" width="556" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"><b>三、由EV3向Arduino請求傳送8個bytes的資料(例如廠商名稱)</b></span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;">作法會分成兩個步驟:<br />●首先</span><span style="font-size: large;">使用EV3_I2C Block的「</span><span style="color: red; font-size: large;"><strong>Write 1 byte</strong></span><span style="font-size: large;">」模式,</span></div>
<span style="font-size: large;"> 寫入 8(0x08)到 Arduino,</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1q-1Og3_v2o/U8jku7_MTfI/AAAAAAAAA0E/f3CUA2J0dR4/s1600/EV3_RequestVendorID.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-1q-1Og3_v2o/U8jku7_MTfI/AAAAAAAAA0E/f3CUA2J0dR4/s1600/EV3_RequestVendorID.jpg" /></a></div>
<div>
<span style="font-size: large;"> Arduino同樣經由</span><span style="font-size: large;">receiveEvent()</span><span style="font-size: large;">接收到資料,<br /> 以Wire.read()將0x08這個值存起來,<br /> 並知道接下來會有廠商名稱("Arduino ")的請求資料需求。</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">●</span><span style="font-size: large;"> 接著,再使用</span><span style="font-size: large;">「</span><span style="color: red; font-size: large;"><strong>Read 8 byte</strong></span><span style="font-size: large;">」模式向Arduino請求傳送8個bytes的資料,</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-u0-jbLS5np8/U8jnkqrgXxI/AAAAAAAAA0Q/Ygq211AsKWM/s1600/EV3_RequestVendorID_8_Bytes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-u0-jbLS5np8/U8jnkqrgXxI/AAAAAAAAA0Q/Ygq211AsKWM/s1600/EV3_RequestVendorID_8_Bytes.jpg" height="200" width="640" /></a></div>
<div>
<span style="font-size: large;">Arduino會觸發onRequest() handler,依據先前EV3所要求的資料項目0x08(vendorID),以Wire.write()回傳資料給EV3。</span></div>
<div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">void requestEvent() </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">{ </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> if(requestRegister == COMMAND_GET_VERSION) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> Wire.write(softwareVersion, 8);</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> }</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> </span><span style="color: red;"> else if(requestRegister == COMMAND_GET_VENDOR) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: red;"> Wire.write(vendorID, 8);</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> }</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> else if(requestRegister == COMMAND_GET_DEVICE_ID) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> Wire.write(deviceID, 8);</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> } </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">} </span></b></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;">● </span><span style="font-size: large;">接下來就可以由EV3_I2C block的8個Output plug讀取Arduino回傳的資料,不過有三點需要注意的地方:</span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"><b>※</b> 首先讀到是Ascii值而非字元(character),正常應該是要使用<br /> </span><span style="font-size: large;">「</span><span style="color: red; font-size: large;"><strong>Read 8 bytes ASCII</strong></span><span style="font-size: large;">」模式才能夠讀到</span><span style="font-size: large;">,<br /> 不過目前這個模式的功能異常,無法使用。</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-gW3rA39dmXU/U8jx_R3R9aI/AAAAAAAAA0g/kyH7rCRYKy4/s1600/EV3_I2C.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-gW3rA39dmXU/U8jx_R3R9aI/AAAAAAAAA0g/kyH7rCRYKy4/s1600/EV3_I2C.jpg" height="229" width="320" /></a></div>
<div class="separator" style="clear: both;">
<b style="font-size: x-large;">※</b><span style="font-size: large;"> 接下來,比較不解的是,<br /> 回傳回來的資料在EV3_I2C block Output Plug 存放的順序<br /> 居然是由 Byte 8開始,所以,以上圖為例,<br /> Byte 1~Byte 8依序所讀到的資料為:<br /> 32, 111, 110, 105, 117, 100, 114</span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"> </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-82x0SHWLZTc/U8j_0xiHQQI/AAAAAAAAA1A/lVIImyEMEeU/s1600/EV3_RequestDataFrom_Arduino_0.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-82x0SHWLZTc/U8j_0xiHQQI/AAAAAAAAA1A/lVIImyEMEeU/s1600/EV3_RequestDataFrom_Arduino_0.jpg" height="145" width="640" /></a></div>
<br />
<div class="separator" style="clear: both;">
<b style="font-size: x-large;">※</b><span style="font-size: large;"> 最後,如果回傳的資料數目少於請求的資料數,</span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"> 則在Output Plug會讀到 -1 的值,</span><span style="font-size: large;"> 以下圖為例,Arduino只回傳了4個bytes,注意,資料還是由Byte 8開始存放 ??????? </span></div>
<div class="separator" style="clear: both;">
<span style="font-size: large;"></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-owirBAAFLLQ/U8j2kx0yttI/AAAAAAAAA0s/vMMG92_gnt4/s1600/EV3_I2C_4Bytes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-owirBAAFLLQ/U8j2kx0yttI/AAAAAAAAA0s/vMMG92_gnt4/s1600/EV3_I2C_4Bytes.png" height="230" width="320" /></a></div>
<br />
<div class="separator" style="clear: both;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="color: blue; font-size: x-large;"><b>Arduino Sketch</b></span></div>
<div class="separator" style="clear: both;">
/* ********************************************************</div>
<div class="separator" style="clear: both;">
* Program ID: Arduino_RequestFm_EV3</div>
<div class="separator" style="clear: both;">
* Created by: CH, Chen (Taiwan)</div>
<div class="separator" style="clear: both;">
* Date: 2014.6.10</div>
<div class="separator" style="clear: both;">
* ******************************************************** */</div>
<div class="separator" style="clear: both;">
#include <Wire.h></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
#define I2C_SLAVE_ADDRESS 0x04</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
#define COMMAND_GET_VERSION 0x00</div>
<div class="separator" style="clear: both;">
#define COMMAND_GET_VENDOR 0x08</div>
<div class="separator" style="clear: both;">
#define COMMAND_GET_DEVICE_ID 0x10</div>
<div class="separator" style="clear: both;">
#define COMMANDD_SEND_7_BYTES 0x18</div>
<div class="separator" style="clear: both;">
#define COMMAND_LLED_ON 0x19</div>
<div class="separator" style="clear: both;">
#define COMMAND_LLED_OFF 0x1A</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
#define LLED 13</div>
<div class="separator" style="clear: both;">
#define MAX_DATA_BUF_SIZE 32</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
uint8_t softwareVersion[9] = "V1.00 ";</div>
<div class="separator" style="clear: both;">
uint8_t vendorID[9] = "Arduino ";</div>
<div class="separator" style="clear: both;">
uint8_t deviceID[9] = "UNO ";</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
byte requestRegister, rcvData[32];</div>
<div class="separator" style="clear: both;">
char strMsg[256];</div>
<div class="separator" style="clear: both;">
int bytesRead=0;</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
void setup()</div>
<div class="separator" style="clear: both;">
{ </div>
<div class="separator" style="clear: both;">
pinMode(LLED, OUTPUT); </div>
<div class="separator" style="clear: both;">
digitalWrite(LLED, LOW); </div>
<div class="separator" style="clear: both;">
Serial.begin(9600);</div>
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
Wire.begin(I2C_SLAVE_ADDRESS);</div>
<div class="separator" style="clear: both;">
Wire.onReceive(receiveEvent); </div>
<div class="separator" style="clear: both;">
Wire.onRequest(requestEvent); </div>
<div class="separator" style="clear: both;">
Serial.println("Ready .."); </div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
void loop() { }</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
void executeCommand(byte execCmd)</div>
<div class="separator" style="clear: both;">
{</div>
<div class="separator" style="clear: both;">
if(execCmd == COMMAND_LLED_ON) {</div>
<div class="separator" style="clear: both;">
Serial.println("Turn ON LED");</div>
<div class="separator" style="clear: both;">
digitalWrite(LLED, HIGH);</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
else if(execCmd == COMMAND_LLED_OFF) {</div>
<div class="separator" style="clear: both;">
Serial.println("Turn OFF LED");</div>
<div class="separator" style="clear: both;">
digitalWrite(LLED, LOW);</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
else if(execCmd == COMMANDD_SEND_7_BYTES) { </div>
<div class="separator" style="clear: both;">
sprintf(strMsg, "%d bytes of data has been read.", bytesRead);</div>
<div class="separator" style="clear: both;">
Serial.println(strMsg);</div>
<div class="separator" style="clear: both;">
if(bytesRead>0) {</div>
<div class="separator" style="clear: both;">
for(int i=0; i<bytesRead; i++) { </div>
<div class="separator" style="clear: both;">
Serial.println((char)rcvData[i]);</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
bytesRead=0; </div>
<div class="separator" style="clear: both;">
} </div>
<div class="separator" style="clear: both;">
} </div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
void receiveEvent(int howMany)</div>
<div class="separator" style="clear: both;">
{ </div>
<div class="separator" style="clear: both;">
requestRegister = Wire.read(); </div>
<div class="separator" style="clear: both;">
while(Wire.available() > 0 && bytesRead < MAX_DATA_BUF_SIZE) {</div>
<div class="separator" style="clear: both;">
rcvData[bytesRead]=Wire.read();</div>
<div class="separator" style="clear: both;">
bytesRead++;</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
executeCommand(requestRegister); </div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
void requestEvent() </div>
<div class="separator" style="clear: both;">
{ </div>
<div class="separator" style="clear: both;">
if(requestRegister == COMMAND_GET_VERSION) {</div>
<div class="separator" style="clear: both;">
Wire.write(softwareVersion, 8);</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
else if(requestRegister == COMMAND_GET_VENDOR) {</div>
<div class="separator" style="clear: both;">
Wire.write(vendorID, 8);</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
else if(requestRegister == COMMAND_GET_DEVICE_ID) {</div>
<div class="separator" style="clear: both;">
Wire.write(deviceID, 8);</div>
<div class="separator" style="clear: both;">
} </div>
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
} </div>
<div class="separator" style="clear: both;">
<br /></div>
</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-9137267888446321279.post-32587100728438309542014-07-18T04:26:00.001-07:002014-07-18T04:33:14.754-07:00EV3與Arduino之間的I2C通訊(測試Dexter的EV3_I2C Block) - (I) 功能摘要<span style="font-size: large;">五月底,由The NXT得知:DI在他們<a href="http://www.dexterindustries.com/blog/2014/05/29/connecting-arduino-ev3/">官網部落格中</a>分享了以自行開發的EV3程式區塊(EV3_I2C)能夠透過I2C連接Arduino的方式,除了有<a href="http://www.dexterindustries.com/howto/connecting-ev3-arduino/">How-To教學</a>之外,也提供<a href="https://github.com/DexterInd/EV3_Dexter_Industries_Sensors" target="_blank">EV3 block與Arduino sample code</a>的下載。</span><br />
<span style="font-size: large;">這確實是一個好消息,因為EV3除了官方軟體外,不像NXT還有功能彈性高而且簡單容易上手的NXC可以使用,雖然陸續有其他開發工具發展中,終究有些技術門檻,所以目前EV3若要連接外部裝置,唯有依賴第三方開發的程式區塊,而終於Dexter造福Arduino users,提供了可以Import的EV3_I2C block。</span><br />
<br />
<h3>
<span style="color: blue; font-size: x-large;">
下載與匯入</span></h3>
<span style="font-size: large;">可以到<a href="https://github.com/DexterInd/EV3_Dexter_Industries_Sensors" target="_blank">這個網頁</a>的右側找到<a href="https://github.com/DexterInd/EV3_Dexter_Industries_Sensors/archive/master.zip" target="_blank">Download ZIP</a>這個按鍵下載壓縮檔,解壓縮之後再使用EV3軟體匯入Dexter.ev3b這個檔案,就可以在Sensor Blocks裏找到Dexter所有提供的感應器區塊包含EV3_I2C Block。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-3CR7QaCRIfU/U8ehb8OUTAI/AAAAAAAAAyU/mZiCIBFdq2M/s1600/DI_ZIP_File.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-3CR7QaCRIfU/U8ehb8OUTAI/AAAAAAAAAyU/mZiCIBFdq2M/s1600/DI_ZIP_File.jpg" height="267" width="400" /></a></div>
<br />
<a name='more'></a><br />
<br />
<h3>
<span style="color: blue; font-size: x-large;">
EV3_I2C程式區塊</span></h3>
<span style="font-size: large;">共有七種功能模式可以選擇,很顯然就是為了EV3能透過I2C連接Arduino而設計,不過應該也可以測試連接其他I2C介面的裝置。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-2Yho4f_zg30/U8Zb_U48tKI/AAAAAAAAAxQ/dFmVWvKEUEg/s1600/DI_EV3-I2C_Block_Modes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-2Yho4f_zg30/U8Zb_U48tKI/AAAAAAAAAxQ/dFmVWvKEUEg/s1600/DI_EV3-I2C_Block_Modes.jpg" height="391" width="400" /></a></div>
<br />
<span style="font-size: large;">對於每一種模式的功用望文生義,</span><span style="font-size: large;">很容易</span><span style="font-size: large;">就能夠理解,</span><br />
<span style="font-size: large;">不過第5項:「Read 8 bytes ASCII」,似乎功能已經移除,<br />在編譯時會出現以下的錯誤訊息,有待釐清。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-csl4QUcpnik/U8aDccetwVI/AAAAAAAAAxs/j6AFx9-sgiI/s1600/EV3_I2C_Block_ErrorMsg.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-csl4QUcpnik/U8aDccetwVI/AAAAAAAAAxs/j6AFx9-sgiI/s1600/EV3_I2C_Block_ErrorMsg.jpg" height="200" width="400" /></a></div>
<br />
<h3>
<span style="color: blue; font-size: x-large;">實體接線方式</span></h3>
<span style="font-size: large;">EV3 Sensor port向下相容於NXT的感應器,<br />所以EV3 Cable連接Arduino I2C通訊的腳位與NXT相同,<br />以下圖片來自於Dexter的教學文章:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-iO0sze4CvbU/U8adplfTjQI/AAAAAAAAAx8/xNUok-fRENU/s1600/Arduino-and-NXT-Schematic1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-iO0sze4CvbU/U8adplfTjQI/AAAAAAAAAx8/xNUok-fRENU/s1600/Arduino-and-NXT-Schematic1.png" height="297" width="640" /></a></div>
<br />
<span style="font-size: large;">至於本次測試則是使用端子座轉換EV3 Cable與Arduino UNO的接線方式:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-NJpF4BcrtmQ/U8ad0e5rCBI/AAAAAAAAAyI/lOCJgu_8Vp4/s1600/IMG_0721.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-NJpF4BcrtmQ/U8ad0e5rCBI/AAAAAAAAAyI/lOCJgu_8Vp4/s1600/IMG_0721.JPG" height="298" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3 style="clear: both; text-align: left;">
<span style="color: blue; font-size: x-large;">
Arduino處理方式</span></h3>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">Arduino的I2C程式庫為 <a href="http://arduino.cc/en/Reference/Wire" target="_blank">Wire.h</a>,因為EV3為I2C Master,Arduino為Slave,所以在I2C bus初始化時需要指定Slave位址,以作為EV3(Master)傳送與接收資料的對象,而在測試案例中Slave address為:0x04:</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue;"><b>#include <Wire.h></b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue;"><b>#define I2C_SLAVE_ADDRESS 0x04</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue;"><b><br /></b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue;"><b>Wire.begin(I2C_SLAVE_ADDRESS);</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">接下來Arduino需要註冊處理來自Master寫入與請求資料傳送的Handler程序,分別是:</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue;"><b>Wire.onReceive(receiveEvent); </b> // <span style="color: black;">註冊處理來自Master寫入資料的Handler</span><br /><b> Wire.onRequest(requestEvent);</b></span><b> </b> // 註冊處理來自Master請求傳送資料的Handler</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">void receiveEvent(int howMany)</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">{ </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> requestRegister = Wire.read(); </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> while(Wire.available() > 0 && bytesRead < MAX_DATA_BUF_SIZE) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> rcvData[bytesRead]=Wire.read();</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> bytesRead++;</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> }</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> executeCommand(requestRegister); </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">}</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"><br /></span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">void requestEvent() </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">{ </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> if(requestRegister == COMMAND_GET_VERSION) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> Wire.write(softwareVersion, 8);</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> }</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> else if(requestRegister == COMMAND_GET_VENDOR) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> Wire.write(vendorID, 8);</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> }</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> else if(requestRegister == COMMAND_GET_DEVICE_ID) {</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> Wire.write(deviceID, 8);</span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;"> } </span></b></div>
<div class="separator" style="clear: both;">
<b><span style="color: blue;">} </span></b></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">所以,當使用EV3_I2C 程式區塊,</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">(1) 執行「<span style="color: red;"><strong>Write 1 byte</strong></span>」、「<span style="color: red;"><strong>Write 8 bytes</strong></span>」或<br /> 「<span style="color: red;"><strong>DigitalWrite</strong></span>」三種模式時,</span></div>
<span style="font-size: large;"> 即會觸發Arduino sketch中的 <span style="color: blue;"><strong>receiveEvent </strong></span>程序。</span><br />
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">(2) 執行「<span style="color: red;"><strong>Read 1 byte</strong></span>」、「<span style="color: red;"><strong>Read 8 bytes</strong></span>」或<br /> 「<span style="color: red;"><strong>Read 8 bytes ASCII</strong></span>」三種模式時,</span></div>
<span style="font-size: large;"> 即會觸發Arduino sketch中的 <span style="color: blue;"><strong>requestEvent </strong></span>程序。</span><br />
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">(3) 執行「<span style="color: red;"><strong>AnalogRead</strong></span>」模式時,</span></div>
<span style="font-size: large;"> 則因為EV3會傳送所要讀取的Arduino Analog腳位,<br /> 再接收讀取結果,</span><span style="font-size: large;">所以Arduino sketch的兩個程序都會<br /> 被觸發,執行的順序是:</span><br />
<span style="font-size: large;"> <strong style="color: blue;">receiveEvent() --> loop() --> </strong><strong style="color: blue;">requestEvent() </strong>。</span><br />
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">以上幾種模式的用法,在下載自Dexter壓縮檔中的 <b>EV3_arduino</b> 資料夾,有相關的arduino 範例程式可以參考。</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3 style="clear: both; text-align: left;">
<span style="color: red; font-size: x-large;">※ 對於EV3與Arduino程式的運作方式,<br /> 另於<a href="http://chlego.blogspot.tw/2014/07/ev3arduinoi2cdexterev3i2c-block-ii.html" target="_blank">測試案例</a>中說明</span></h3>
Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-9137267888446321279.post-17585676741661260262014-05-16T08:18:00.000-07:002014-05-16T08:19:32.929-07:00Mindstorms EV3基本特性的速查筆記<span style="font-size: small;">EV3軟體的Help Files內容大致已經相當完整,不過,到底是別人整理的,要用的時侯還是得花點工夫去找,再加上</span><span style="font-size: small;">彙整</span><span style="font-size: small;">其他來源</span><span style="font-size: small;">的資訊</span><span style="font-size: small;">或自己的測試紀錄,整理一份速查筆記方便構思或撰寫程式時的參考,會是一個事半功倍的好習慣。</span><br />
<a name='more'></a><br />
<div>
<div class="MsoNormal">
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Brick</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">重置</span><span lang="EN-US" style="color: blue;">(Reset)</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">步驟</span></u></b></h2>
</div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1).<span style="font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">同時按下:</span><span lang="EN-US">Back + Center +
Left</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">三個鍵</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2).<span style="font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">當螢幕變暗時,放開</span><span lang="EN-US">Back</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">鍵</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3).<span style="font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">當螢幕顯示“</span><span lang="EN-US">Starting”</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">時,放開其他兩個鍵</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">重置之後不會刪除已存在的檔案或專案</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Brick Button ID</span></u></b></h2>
</div>
<div class="MsoNormal">
<span lang="EN-US">0: None<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1: Left; 2: Center; 3: Right;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">4: Up;<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
</div>
<div class="MsoNormal">
<span lang="EN-US">5: Down<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(圖片來源:EV3 Help File)</span></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://3.bp.blogspot.com/-OpGYCWJbZd8/U3YX-W2pEGI/AAAAAAAAApY/R-WZjVJkT7U/s1600/EV3_Brick_Buttons.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-OpGYCWJbZd8/U3YX-W2pEGI/AAAAAAAAApY/R-WZjVJkT7U/s1600/EV3_Brick_Buttons.png" height="320" width="304" /></a></div>
<h2 style="clear: both; text-align: left;">
<b><u><span lang="EN-US" style="color: blue;">EV3 Display Block LCD</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif";">螢幕座標參考資訊</span></u></b></h2>
<div class="MsoNormal">
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">螢幕解析度</span><span lang="EN-US">(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">寬</span><span lang="EN-US">X</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">高</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:</span><span lang="EN-US">178 X 128 Pixels<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">像素</span><span lang="EN-US">(Pixels)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">座標:原點</span><span lang="EN-US">(0,0)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位於左上角,右下角座標為</span><span lang="EN-US">(177,127)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l2 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Text</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">字體大小</span> <span lang="EN-US">(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">寬</span><span lang="EN-US">X</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">高</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l1 level1 lfo4; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(0)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Normal</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:</span><span lang="EN-US">8 X 9 Pixels<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l1 level1 lfo4; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Bold</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:</span><span lang="EN-US">8 X 8 Pixels<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l1 level1 lfo4; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Large</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:</span><span lang="EN-US">16 X 16 Pixels<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l2 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Text-Pixels Mode</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的座標值</span><span lang="EN-US">(X,Y)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">為顯示</span><span lang="EN-US">Text</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的左上角座標</span> <span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l2 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Text-Grid Mode </span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的座標值</span><span lang="EN-US">(X,Y)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">為顯示</span><span lang="EN-US">Text</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的框格座標</span><span lang="EN-US">(Column, Row) <o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l3 level1 lfo3; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1).<span style="font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">每一框格</span><span lang="EN-US">(Grid)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">為</span><span lang="EN-US"> 8 X 10 Pixels</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,共分成</span><span lang="EN-US">22 columns X 12
rows Grids<o:p></o:p></span></div>
<span lang="EN-US">
</span>
<br />
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l3 level1 lfo3; mso-pagination: widow-orphan; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2).<span style="font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">當</span><span lang="EN-US">Text</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">字體為</span><span lang="EN-US">Normal</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US">Bold</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">時,可顯示座標範圍:</span><span lang="EN-US">(0,0)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">(21,11)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span><br />
<span style="font-family: "新細明體","serif"; text-indent: -24pt;"> 當</span><span lang="EN-US" style="text-indent: -24pt;">Text</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">字體為</span><span lang="EN-US" style="text-indent: -24pt;">Large</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">時,顯示座標範圍由</span><span lang="EN-US" style="text-indent: -24pt;">(0,0)</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">到</span><span lang="EN-US" style="text-indent: -24pt;">(20,11)</span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l3 level1 lfo3; mso-pagination: widow-orphan; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span style="text-indent: 0px;">(圖片來源:EV3 Help File)</span></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://4.bp.blogspot.com/-OQT2Zi8OOVo/U3YZS4En2XI/AAAAAAAAApk/Ax-pdWVzKMY/s1600/EV3_LCD_PixelsCorrdinate.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-OQT2Zi8OOVo/U3YZS4En2XI/AAAAAAAAApk/Ax-pdWVzKMY/s1600/EV3_LCD_PixelsCorrdinate.png" height="240" width="320" /></a></div>
<h2 style="clear: both; text-align: left;">
<b><u><span lang="EN-US" style="color: blue;">EV3 </span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif";">資料型態參考資訊</span></u></b></h2>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div align="center" class="MsoNormal" style="text-align: center;">
<b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">資料型態</span> <span lang="EN-US">Data Type<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.55pt;" valign="top" width="222"><div align="center" class="MsoNormal" style="text-align: center;">
<b><span lang="EN-US">Input/output Plug</span></b><b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">形狀</span><span lang="EN-US"><o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.6pt;" valign="top" width="222"><div align="center" class="MsoNormal" style="text-align: center;">
<b><span lang="EN-US">Data Wire</span></b><b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">顏色</span><span lang="EN-US"><o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN-US">Numeric<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.55pt;" valign="top" width="222"><div class="MsoNormal">
<span lang="EN-US">(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">半</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">圓形</span><span lang="EN-US">(Rounded)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.6pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">黃色</span><span lang="EN-US">(Yellow)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN-US">Logic<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.55pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">三角形</span><span lang="EN-US">(Triangular)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.6pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">淺綠色</span><span lang="EN-US">(Aqua)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN-US">Text<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.55pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">方形</span><span lang="EN-US">(Square)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.6pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">橙色</span><span lang="EN-US">(Orange)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN-US">Numeric Array<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.55pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">双</span><span lang="EN-US">(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">半</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">圓形</span><span lang="EN-US">(Double Rounded)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.6pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">黃色</span><span lang="EN-US">+</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">單線</span><span lang="EN-US">(Thick and Yellow)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 118.8pt;" valign="top" width="158"><div class="MsoNormal">
<span lang="EN-US">Logic Array<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.55pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">双三角形</span><span lang="EN-US">(Double
Triangular)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 166.6pt;" valign="top" width="222"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">橙色</span><span lang="EN-US">+</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">單線</span><span lang="EN-US">(Thick and Orange)<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<h3>
<span lang="EN-US" style="color: red; font-family: Wingdings; font-size: large;">l<span style="font-family: 'Times New Roman';"> </span></span><!--[endif]--><span style="color: red; font-family: "新細明體","serif";">陣列</span><span lang="EN-US" style="color: red;">(Array) </span><span style="color: red; font-family: "新細明體","serif";">的元素數量,只受限於</span><span lang="EN-US" style="color: red;">EV3</span><span style="color: red; font-family: "新細明體","serif";">可用的實體記憶體。</span></h3>
</div>
<div class="MsoNormal">
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 </span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">資料型態轉換</span></u></b></h2>
</div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div align="center" class="MsoNormal" style="text-align: center;">
<b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">由</span> <span lang="EN-US">From<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div align="center" class="MsoNormal" style="text-align: center;">
<b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉換成</span> <span lang="EN-US">To<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div align="center" class="MsoNormal" style="text-align: center;">
<b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">結果</span><span lang="EN-US">(Result)<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Numeric<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Text<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉成文字</span><span lang="EN-US">; 3.14 -> “3.14”<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Logic<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Numeric<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉成數值</span><span lang="EN-US">; True -> 1,
False -> 0<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Logic<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Text<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉成文字</span><span lang="EN-US">; True -> “1”,
False -> “0”<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Logic<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Logic Array<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉成</span><span lang="EN-US">Logic Array</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的第一個元素</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Logic<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Numeric Array<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉成</span><span lang="EN-US">Numeric Array</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的第一個元素</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.9pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Numeric<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 101.95pt;" valign="top" width="136"><div class="MsoNormal">
<span lang="EN-US">Numeric Array<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.1pt;" valign="top" width="331"><div class="MsoNormal">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">轉成</span><span lang="EN-US">Numeric Array</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的第一個元素</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="separator" style="clear: both;">
</div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<h3>
<span lang="EN-US" style="color: red; font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span><span style="font-family: 'Times New Roman'; font-size: large;"> </span></span><!--[endif]--><span style="font-size: small;"><span lang="EN-US" style="color: red;">Data Plug</span><span style="color: red; font-family: "新細明體","serif";">的外形可以做為</span><span lang="EN-US" style="color: red;">Data Type</span><span style="color: red; font-family: "新細明體","serif";">轉換的視覺指引</span><span lang="EN-US" style="color: red;">(Visual guide)</span><span style="color: red; font-family: "新細明體","serif";">:一種</span><span lang="EN-US" style="color: red;">Data Type Plug</span><span style="color: red; font-family: "新細明體","serif";">的外形若能被置入於另一種</span><span lang="EN-US" style="color: red;">Data Type Plug</span><span style="color: red; font-family: "新細明體","serif";">的外形中,就可以被轉換成那一種</span><span lang="EN-US" style="color: red;">Data Type</span><span style="color: red; font-family: "新細明體","serif";">。</span></span></h3>
<h3>
<span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">例如:</span><span lang="EN-US" style="color: red; font-size: small; text-indent: -24pt;">Numeric</span><span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">的半圓形</span><span lang="EN-US" style="color: red; font-size: small; text-indent: -24pt;">Plug</span><span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">可以被放入</span><span lang="EN-US" style="color: red; font-size: small; text-indent: -24pt;">Text</span><span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">的方形</span><span lang="EN-US" style="color: red; font-size: small; text-indent: -24pt;">Plug</span><span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">,但無法放入</span><span lang="EN-US" style="color: red; font-size: small; text-indent: -24pt;">Logic</span><span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">的三角形</span><span lang="EN-US" style="color: red; font-size: small; text-indent: -24pt;">Plug</span><span style="color: red; font-family: "新細明體","serif"; font-size: small; text-indent: -24pt;">。</span></h3>
<span style="color: red; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
(圖片來源:EV3 Help File)</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://4.bp.blogspot.com/-N6uEPsS7c_0/U3YZr1IzLJI/AAAAAAAAAps/cvFfSZX4Nq0/s1600/EV3_BlockIO_Plug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-N6uEPsS7c_0/U3YZr1IzLJI/AAAAAAAAAps/cvFfSZX4Nq0/s1600/EV3_BlockIO_Plug.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="MsoNormal">
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Motor </span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">參考資訊</span><span lang="EN-US" style="color: blue;"><o:p></o:p></span></u></b></h2>
</div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Power Level</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值範圍由</span><span lang="EN-US">-100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,正值時馬達旋轉方向為順時針</span><span lang="EN-US">[1]</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">;使用</span><span lang="EN-US">Invert Motor Block</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">可於程式執行期間反轉所有</span><span lang="EN-US">Motor</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US">Move Blocks</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的馬達旋轉方向。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span style="text-indent: 0px;">(圖片來源:EV3 Help File)</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ah2cL5jOXhU/U3YaxoIi1OI/AAAAAAAAAp4/sssj1_Ak2zY/s1600/EV3_LargeMotor_Direction.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-ah2cL5jOXhU/U3YaxoIi1OI/AAAAAAAAAp4/sssj1_Ak2zY/s1600/EV3_LargeMotor_Direction.png" height="121" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-H9SPmkwwL_Q/U3YaxtN0tcI/AAAAAAAAAp0/2ZaPVvh0KF4/s1600/EV3_MMotor_Direction.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-H9SPmkwwL_Q/U3YaxtN0tcI/AAAAAAAAAp0/2ZaPVvh0KF4/s1600/EV3_MMotor_Direction.png" height="180" width="400" /></a></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span lang="EN-US" style="font-family: Wingdings; text-indent: -24pt;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span lang="EN-US" style="text-indent: -24pt;">Medium/Large Motor Block</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">與</span><span lang="EN-US" style="text-indent: -24pt;"> Move Steering/Move
Tank Block</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">皆為</span><span lang="EN-US" style="text-indent: -24pt;">automatic regulation</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">,會保持馬達</span><span lang="EN-US" style="text-indent: -24pt;">Power Level</span><span style="font-family: "新細明體","serif"; text-indent: -24pt;">所對應的轉速。</span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Unregulated Motor Block</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">適用於</span><span lang="EN-US">Large Motor</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US">Medium Motor</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,不具有</span><span lang="EN-US">automatic
regulation</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">功能。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><b><span lang="EN-US">Motor Steering Block<o:p></o:p></span></b></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以</span><span lang="EN-US">Port Selector</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">選擇:左馬達</span><span lang="EN-US">+</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">右馬達,兩顆馬達轉速為</span><span lang="EN-US">Regulated Synchronized control.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Steering</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值範圍由</span><span lang="EN-US">-100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,當正值時會提昇左馬達轉速,機器人向右轉。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both;">
</div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(3)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">若</span><span lang="EN-US">Mode</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">選擇</span><span lang="EN-US">On For Degrees</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">或</span><span lang="EN-US">On For Rotations</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">時,若</span><span lang="EN-US">Steering</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">值不為</span><span lang="EN-US">0</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,則</span><span lang="EN-US">input</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">Degrees</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">或</span><span lang="EN-US">Rotations</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">指的是轉速較快馬達的轉動角度或圈數,並非是機器人的轉彎角度或轉動圈數。</span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
</div>
<span style="text-indent: 0px;">(圖片來源:EV3 Help File)</span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-QTPYpA6f4qQ/U3YbdaiXf0I/AAAAAAAAAqE/aeVmLytCWy0/s1600/EV3_MoveBlock_Motors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-QTPYpA6f4qQ/U3YbdaiXf0I/AAAAAAAAAqE/aeVmLytCWy0/s1600/EV3_MoveBlock_Motors.png" height="191" width="400" /></a></div>
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 IR Sensor & Remote IR Beacon</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif";">參考資訊</span></u></b></h2>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用「</span><span lang="EN-US"><a href="http://storage.technicbricks.com/Media/2010/TBs_20100304_1/LEGO%20Power%20Functions%20RC%20v120.pdf">Lego
Power Functions RC Protocol(V1.2)</a></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">」通訊協定,所以:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">相容於</span><span lang="EN-US">PF</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">IR</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">發射器</span><span lang="EN-US">(<a href="http://shop.lego.com/en-US/LEGO-Power-Functions-IR-Speed-Remote-Control-8879;jsessionid=vHqrocD08DJRIXlQIuU8SA**.lego-ps-1-3?fromListing=listing">L8879</a>,
<a href="http://shop.lego.com/en-US/LEGO-Power-Functions-IR-Remote-Control-8885;jsessionid=vHqrocD08DJRIXlQIuU8SA**.lego-ps-1-3?fromListing=listing">L8885</a>)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與接收器</span><span lang="EN-US">(<a href="http://shop.lego.com/en-US/LEGO-Power-Functions-IR-Receiver-8884;jsessionid=vHqrocD08DJRIXlQIuU8SA**.lego-ps-1-3?fromListing=listing">L8884</a>)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">相容於</span><span lang="EN-US">HiTechnic</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US"><a href="http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NIL1046">IR
Link Sensor</a></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、</span><span lang="EN-US"><a href="http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NSK1042">IR
Seeker</a></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US"><a href="http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NIR1032">IR
Receiver Sensor.</a><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以三種</span><span lang="EN-US">Modes</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">偵測</span><span lang="EN-US">IR</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">信號</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Proximity Mode<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l1 level2 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">偵測由</span><span lang="EN-US">IR Sensor</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">本身所發射信號的反射信號以判斷距離</span><span lang="EN-US">(Proximity)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l1 level2 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">距離</span><span lang="EN-US">(Proximity)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值由</span><span lang="EN-US">0</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,值越小表示物體越近,最遠偵測距離約</span><b><span lang="EN-US">70cm</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Beacon Mode<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l1 level2 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">偵測由</span><span lang="EN-US">Remote IR Beacon</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所發射信號的距離</span><span lang="EN-US">(Proximity)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與方位</span><span lang="EN-US">(Heading)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l1 level2 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">距離</span><span lang="EN-US">(Proximity)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值由</span><span lang="EN-US">0</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,值越小表示物體越近,最遠偵測距離約</span><b><span lang="EN-US">200cm</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l1 level2 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">方位</span><span lang="EN-US">(Heading)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的值由</span><span lang="EN-US">-25</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">25</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,表示偵測到的</span><span lang="EN-US">IR Beacon</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">信號在左側</span> <span lang="EN-US">(-)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">、正前方</span><span lang="EN-US"> (0)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">或右側</span> <span lang="EN-US">(+)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span><br />
<span style="text-indent: 0px;">(圖片來源:EV3 Help File)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-uHVi6acWUj8/U3YfgfYYcnI/AAAAAAAAAqc/_SoMRvR33WY/s1600/EV3_IRSensor_Heading.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-uHVi6acWUj8/U3YfgfYYcnI/AAAAAAAAAqc/_SoMRvR33WY/s1600/EV3_IRSensor_Heading.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
(IR Beacon Mode示範影片/<a href="https://www.youtube.com/user/TechnicRobot">TechnicRobot 頻道</a>)</div>
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='480' height='399' src='https://www.youtube.com/embed/Ch4NUazpjJ8?feature=player_embedded' frameborder='0'></iframe></div>
<div class="MsoListParagraph" style="margin-left: 42.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<span lang="EN-US">(3)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Remote Mode</span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l1 level2 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"> 偵測</span><span lang="EN-US">Remote IR Beacon</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的按鍵</span><span lang="EN-US">(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">組合</span><span lang="EN-US">)</span><br />
<span lang="EN-US"><br /></span></div>
<span style="text-indent: 0px;">(圖片來源:EV3 Help File)</span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-8IHJi-0a5OQ/U3Yd9DWbnUI/AAAAAAAAAqU/EoPPiE-NJXw/s1600/EV3_IR_Beacon_Layout.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-8IHJi-0a5OQ/U3Yd9DWbnUI/AAAAAAAAAqU/EoPPiE-NJXw/s1600/EV3_IR_Beacon_Layout.jpg" /></a></div>
<span style="text-indent: 0px;"><br /></span>
<br />
<div class="MsoNormal">
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Color Sensor</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">參考資訊</span><span lang="EN-US" style="color: blue;"><o:p></o:p></span></u></b></h2>
</div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l1 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以三種</span><span lang="EN-US">Modes</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">測量顏色及亮度:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Color Mode<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">LED</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的</span><span lang="EN-US">RGB</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">皆</span><span lang="EN-US">On</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,測量物體表面的顏色,測量值為:</span><span lang="EN-US"><o:p></o:p></span></div>
<div align="center">
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">0<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">1<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">2<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">3<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">4<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">5<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">6<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">7<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Nil<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Black<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Blue<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Green<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Yellow<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Red<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">White<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 45.35pt;" valign="top" width="60"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">Brown<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
</div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-size: 7pt;"> </span></span><span lang="EN-US">Reflected Light Intensity Mode<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">測量由</span><span lang="EN-US">LED</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所發出的紅色光源,自物體表面反射的亮度,測量值由</span><span lang="EN-US">0</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,</span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">若物體的顏色愈深</span><span lang="EN-US">(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">暗</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,測量值愈小。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(3)<span style="font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Ambient Light Intensity Mode<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">LED</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">會發出藍光,表示正在測量環境光源亮度,測量值由</span><span lang="EN-US">0</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,若環境愈</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">暗,</span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">測量值愈小。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用</span><span lang="EN-US">Raw Sensor Block</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">讀取</span><b><span lang="EN-US" style="color: blue;">NXT Light Sensor</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,<b><span style="color: red;">若亮度愈</span></b></span><b><span style="color: red;"> </span></b><b><span style="color: red; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">暗,測量值愈大</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 36.0pt; mso-para-margin-left: 3.0gd;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以</span><span lang="EN-US">EV3</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">連接</span><span lang="EN-US">NXT Light Sensor</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">測量環境光源亮度,測量值範圍約</span><span lang="EN-US">380(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以手電筒照射</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">3000(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">全暗</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">使用</span><span lang="EN-US">Raw Sensor Block</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">讀取</span><b><span lang="EN-US" style="color: blue;">NXT Color Sensor</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,測量值由</span><span lang="EN-US">0</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US"> >3000</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,<b><span style="color: red;">若顏色愈</span></b></span><b><span style="color: red;"> </span></b><b><span style="color: red; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">深,測量值愈小</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 36.0pt; mso-para-margin-left: 3.0gd;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以</span><span lang="EN-US">EV3</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">連接</span><span lang="EN-US">NXT Color Sensor</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">讀取</span><span lang="EN-US">31313</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">所附的</span><span lang="EN-US">Project Pad</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">顏色的測量值:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; margin-left: 48.0pt; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">黑</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">藍</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">綠</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">淺灰</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">紅</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">黃</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">白</span><span lang="EN-US"><o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">968<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">1220<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">1288<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">1700<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">1984<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">2000<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 42.55pt;" valign="top" width="57"><div align="center" class="MsoNormal" style="text-align: center;">
<span lang="EN-US">2012<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<b><u><span lang="EN-US" style="color: blue;"><br /></span></u></b></div>
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Gyro Sensor</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">參考資訊</span><span lang="EN-US" style="color: blue;"><o:p></o:p></span></u></b></h2>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">測量單軸旋轉的角速度及位移角度</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">角速度測量值為:每秒旋轉角度</span><span lang="EN-US">(Degrees per second)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,順時針為正值,最大測量值為每秒</span><span lang="EN-US">440</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">度</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">位移角度測量值為:度</span><span lang="EN-US">(Degree)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,順時針為正值,精確度為:每</span><span lang="EN-US">90</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">度</span><span lang="EN-US"> +/-3</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">度</span></div>
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Ultrasonic Sensor</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">參考資訊</span><span lang="EN-US" style="color: blue;"><o:p></o:p></span></u></b></h2>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">具兩種模式:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Measuring Mode</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:發射超音波,由接收反射波測量物體距離,</span><span lang="EN-US">LED</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">呈現恆亮。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以公分</span><span lang="EN-US"> (centimeter)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">為單位的測量值介於</span><span lang="EN-US">3</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">250</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,精確度</span><span lang="EN-US">+/- 1cm</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,值為</span><span lang="EN-US">255</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">時表示未偵測到物體。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以英吋</span><span lang="EN-US"> (inch)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">為單位的測量值介於</span><span lang="EN-US">1</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">到</span><span lang="EN-US">99</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,精確度</span><span lang="EN-US">+/- 0.394 inches</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,值為</span><span lang="EN-US">100</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">時表示未偵測到物體。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">以</span><span lang="EN-US">Advanced Mode</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">選擇</span><span lang="EN-US">Ping</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">或</span><span lang="EN-US">Continuous</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">方式發射信號,使用</span><span lang="EN-US">Ping
Mode</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">可以自行決定測量頻率。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><span lang="EN-US" style="text-indent: -24pt;"> (2)<span style="font-size: 7pt;"> </span></span><span lang="EN-US" style="text-indent: -24pt;">Presence Mode</span><span style="font-family: 新細明體, serif; text-indent: -24pt;">:偵測附近有無超音波信號,</span><span lang="EN-US" style="text-indent: -24pt;">Sensor</span><span style="font-family: 新細明體, serif; text-indent: -24pt;">本身不發射信號,</span><span lang="EN-US" style="text-indent: -24pt;">LED</span><span style="font-family: 新細明體, serif; text-indent: -24pt;">呈現閃爍。</span></span> </div>
<h2>
<b><u><span lang="EN-US" style="color: blue;">EV3 Software</span></u></b><b><u><span style="color: blue; font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">參考資訊</span><span lang="EN-US" style="color: blue;"><o:p></o:p></span></u></b></h2>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">EV3 Programming Canvas</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">上的實用操作</span><span lang="EN-US"><br />
<v:shapetype coordsize="21600,21600" filled="f" id="_x0000_t75" o:preferrelative="t" o:spt="75" path="m@4@5l@4@11@9@11@9@5xe" stroked="f">
<v:stroke joinstyle="miter">
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0">
<v:f eqn="sum @0 1 0">
<v:f eqn="sum 0 0 @1">
<v:f eqn="prod @2 1 2">
<v:f eqn="prod @3 21600 pixelWidth">
<v:f eqn="prod @3 21600 pixelHeight">
<v:f eqn="sum @0 0 1">
<v:f eqn="prod @6 1 2">
<v:f eqn="prod @7 21600 pixelWidth">
<v:f eqn="sum @8 21600 0">
<v:f eqn="prod @7 21600 pixelHeight">
<v:f eqn="sum @10 21600 0">
</v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:formulas>
<v:path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f">
<o:lock aspectratio="t" v:ext="edit">
</o:lock></v:path></v:stroke></v:shapetype><v:shape id="圖片_x0020_27" o:spid="_x0000_i1025" style="height: 168.75pt; mso-wrap-style: square; visibility: visible; width: 344.25pt;" type="#_x0000_t75">
<v:imagedata o:title="" src="file:///D:\CH\TEMP\msohtmlclip1\01\clip_image001.png">
</v:imagedata></v:shape><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-1giFmwTUIhI/U3Yj3cLFGHI/AAAAAAAAAqo/hKXAPFqhq8k/s1600/BlocksAndWire.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-1giFmwTUIhI/U3Yj3cLFGHI/AAAAAAAAAqo/hKXAPFqhq8k/s1600/BlocksAndWire.jpg" /></a></div>
<div class="MsoListParagraph" style="margin-left: 24.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Program Blocks</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US">Sequence Wire<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">點擊</span><b><span lang="EN-US" style="color: red;">(1) Sequence Plug Exit</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:切換</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">展開</span><span lang="EN-US">/</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">收起</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">兩個</span><span lang="EN-US">Program Blocks</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之間的</span><span lang="EN-US">Sequence<br /> Wire.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">雙擊</span> <b><span lang="EN-US" style="color: red;">(2) Sequence Wire</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:整理兩個</span><span lang="EN-US">Program Blocks</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之間的</span><span lang="EN-US">Sequence Wire(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">縮短</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">或</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">拉直</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,簡潔程式的閱讀性</span><span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">點擊</span><b><span lang="EN-US" style="color: red;">(3) End Plug</span></b><span lang="EN-US"> of
Sequence Wire</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:移除兩個</span><span lang="EN-US">Program Blocks</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之間的</span><span lang="EN-US">Sequence Wire. <o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">點擊</span><b><span lang="EN-US" style="color: red;">(4) Sequence Plug Entry</span></b><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:功能同雙擊</span><b><span lang="EN-US" style="color: red;">(2) Sequence
Wire</span></b><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span lang="EN-US">Data Wire的編輯<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">移除</span><span lang="EN-US">Data Wire</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的方式:將</span><span lang="EN-US">Data Wire</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">尾端拖曳離開</span><span lang="EN-US">Block Input<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">雙擊</span><span lang="EN-US">Data Wire</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">:整理</span><span lang="EN-US">Block Output</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">與</span><span lang="EN-US">Block Input</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">之間的</span><span lang="EN-US">Data Wire(</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">縮短</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">或</span> <span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">拉直</span><span lang="EN-US">)</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,簡潔程式的閱讀性</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 48.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(3)<span style="font-size: 7pt;">
</span></span><!--[endif]--><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">好用的</span><span lang="EN-US">Shortcuts<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span lang="EN-US">Ctrl +</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">滑鼠滾輪:可以無段</span><span lang="EN-US">Zoom in/out</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的功能</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">
</span></div>
<div class="MsoListParagraph" style="margin-left: 72.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; text-indent: -24.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="font-family: "新細明體","serif"; mso-bidi-font-family: 新細明體;">><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><!--[endif]--><span lang="EN-US">Alt + </span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">滑鼠拖曳:同</span><span lang="EN-US">Pan</span><span style="font-family: "新細明體","serif"; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的功能</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 24.0pt;">
<br /></div>
<div class="MsoNormal" style="margin-left: 24.0pt;">
<span lang="EN-US"><br /></span></div>
</div>
</div>
Unknownnoreply@blogger.com0