2017年4月21日 星期五

Motoblockly Sensor board學Blockly (運算式 (Expressions))

大多數的程式組成涵蓋有判斷式、運算式,判斷式主要作為判斷程式執行是否滿足相應的條件,如果滿足,就執行程式。這裡所謂的「條件」正是我們這個 Section 要討論的 「運算式」。嚴格的說,運算式不等於條件,但運算式的結果可以滿足條件。
那麼,甚麼是運算式?
EX. integerl=2+3
一個運算式是由運算元(Operands)、運算子(Operators)所組成,運算式常常是程式判斷式裡非常重要的條件式。上例運算式,是由 運算元 (integerl;2;3) 與 運算子 (=;+) 所組成,常見的運算式有算術運算式(Arithmetic Expressions)、關係(比較)運算式(Comparison Expressions),邏輯運算式(Logical Expressions)...等。

Example 01. 算術運算式(Arithmetic Expressions)。

說明:
我們將結合變數與串列埠的使用,透過數學運算積木中的算數運算式(+、-、×、÷、^)積木。計算數值,並利用計算的數值作為程式判斷的條件或結果。
範例:
  • 如圖一,在「程式開始」的設定迴圈中,設定序列埠的傳輸率值及變數的初始值;本範例利用 Arduino IDE的序列埠監控視窗呈現程式執行的結果數值,傳輸率為 9600 bps。
  • 設定變數的初始值為"1",算術運算的範圍"1~100",在 Arduino IDE 的序列埠監控視窗列印出結果。
  • 範例檔:請選擇匯入 XML_Arithmetic_Expressions_01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_Arithmetic_Expressions_01.ino 執行程式的結果。

Example 02. 比較運算式或關係運算式(Comparison Expressions)。


說明:
這個 Example 我們將利用【積木範例】中的「藍芽LED」程式,透過邏輯積木中的比較運算式積木,作為條件判斷。比較運算式積木有:<、>、=、≦、≧、≠ 六種運算子。
範例:
  1. 如圖二,在「程式開始」的迴圈中,設定藍芽連結與變數;設定變數積木,於設定中宣告變數"C"的初始電位為「空白」字元。
  2. 利用運算式判斷變數從藍芽串送來的字元,如果是"H",則設定數位腳位D13(操作是可以變更為D10、D11、D12) 為高電位;如果是"L",則設定數位腳位D13(操作是可以變更為D10、D11、D12) 為低電位。
  3. 範例檔:請選擇匯入 XML_Comparison_Expressions_01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_Comparison_Expressions_01.ino 執行程式的結果。

Example 03. 邏輯運算式(Logical Expressions)。


說明:
motoBlockly 邏輯運算積木包含有 且(And)"、"或(Or)"、"非(Not)"  積木。藉由邏輯積木的運用,作為程式判斷的條件。
範例:
  1. 如圖三,在這個範例,我們的學習內容將結合 Example 02 (比較運算式或關係運算式) 與前一個 Section (Step 07;如果...執行...(if/elif/else) 條件判斷句) 所提到【 if...elif...else】的應用。
  2. 藉由邏輯積木的應用與比較運算式的條件結果,執行程式中不同的流程,透過【 if...elif...else】的應用,作為程式執行的流程迴圈。
  3. 範例檔:請選擇匯入 XML_Logical_Expressions_01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_Logical_Expressions_01.ino 執行程式的結果。

Motoblockly Sensor board學Blockly (流程控制:如果...執行...(if/elif/else) 條件判斷句)

在這個 Section,我們將利用 Button (D2)進行流程控制:如果...執行...(if/elif/else) 條件判斷句學習,常見的條件判斷句有:
  1. if...(then)
  2. if...else
  3. if...elif...else
為什麼會有 elif 這種關鍵字呢?那是因為我們在每個 if 分支裏只能有一個 if 和一個 else,所以如果你需要判斷好幾次,你就需要很多 elif 語句。只要你有需要,寫多少個 elif 都是可以的。在這一個 Section ,我們暫時不會練習到 elif 的程序,會在後面的Section 練習時再進行說明。

Example 01. 利用if...(then),讓 Button 控制 LED 燈(1)

說明:
這個 Example 延續變數的利用,同時加入運算式的概念(下一個 Section 說明)。 利用 if...(then) 迴圈,判斷 Button (D2) 是否被按下(執行),如果Button(D2)被執行,就執行 LED 燈(D10)亮燈,然後關燈。
範例:
  1. 如圖一,在「程式開始」的迴圈中,先放入邏輯積木【如果(if)...執行(then)】的積木模組;第二步驟設定變數積木,於設定中宣告 i (=Button 電位) 的初始電位為「低」電位,並賦予 i 表示 Button (D2)腳位。
  2. 利用運算式判斷,如果 Button (D2) 為高電位(Button被按下),執行 LED (D10) 燈亮 5 秒,然後關閉 LED 燈。
  3. 範例檔:請選擇匯入 XML_Button_IF01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_Button_IF01.ino 執行程式的結果。

Example 02. 利用if...(then),讓 Button 控制 LED 燈(2)

說明:
  1. 這個 Example 是簡化 Example 01,利用 if...(then) 迴圈,判斷 Button (D2) 是否被按下(執行),如果Button(D2)被執行,就執行LED燈(D10)亮燈。
  2. 學習這個範例時,可以直接將本範例與 Example 01、Example 03 的範例進行參照,觀察範例執行的差異。
範例:
  1. 如圖二,在「程式開始」的迴圈中,先放入邏輯積木【如果(if)...執行(then)】的積木模組;第二步驟設定變數積木,於設定中宣告 i (=Button 電位) 的初始電位為「低」電位,並賦予 i 表示 Button (D2)腳位。
  2. 利用邏輯運算式判斷,如果 Button (D2) 為高電位(Button被按下),執行讓 LED (D10) 燈亮。
  3. 範例檔:請選擇匯入 XML_Button_IF02.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_Button_IF02.ino 執行程式的結果。

Example 03. 利用if...else,讓 Button 控制 LED 燈

說明:
  1. 這個 Example 主要延續 Example 02,利用 if...else 迴圈,判斷 Button (D2) 是否被按下(執行),如果Button(D2)被執行,就執行LED燈(D10)亮燈,如果如果 Button(D2) 沒有被執行,就不執行LED燈(D10)。
  2. 學習這個範例時,可以直接將本範例與 Example 02、Example 01 的範例進行參照,觀察範例執行的差異。
範例:
    1. 如圖三,在「程式開始」的迴圈中,先放入邏輯積木【如果(if)...執行(then)】的積木模組;第二步驟在【如果(if)...執行(then)】的積木中點選藍色齒輪樣式的「設定」符號,在「如果」迴圈中堆疊入「否則」積木,【如果(if)...執行(then)】就會變成【如果(if)...執行(then)...否則(else)】,這就是【IF...ELSE】迴圈。
    2. 接下來設定變數積木,於設定中宣告 i (=Button 電位) 的初始電位為「低」電位,並賦予 i 表示 Button (D2)腳位。
    3. 利用邏輯運算式判斷,如果 Button (D2) 為高電位(Button被按下),執行讓 LED (D10) 燈亮。
    4. 範例檔:請選擇匯入 XML_Button_ELSE03.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_Button_ELSE03.ino 執行程式的結果。

    Motoblockly Sensor board學Blockly (利用副程式(函數)與變數)

    延續前面Section的課程:閃耀的彩色LED燈、利用「變數(Variables)」控制LED燈,我們會發現有一個共同的現象,程式因為執行的步驟較多,會造成迴圈非常的壟長,這在程式編輯過程容易出錯,在Debug時有不容易處理。這一個Section,我們將學習利用副程式(函數)及變數的應用,解決在程式編輯時的這些問題。

    Example 01. 利用副程式(函數)控制 LED 燈


    說明:
    1. 這個 Example 是延續上一個 Step 的內容;在程式中,我們會將紅燈、黃燈、綠燈的程式,利用副程式(函數)的方式,分別獨立在不同的副程式迴圈中。
    2. 利用程式的呼叫功能,在主程式中呼叫副程式(函數),執行副程式的迴圈內容。
    範例:
    1. 如圖一,依序啟動 (數位腳位為) 和關閉(數位腳位為) LED 數位腳位 D10、D11、D12,將積木方塊堆疊在副程式積木的【流程】中,並在主程式建立呼叫副程式積木【流程】的積木,依序呼叫綠燈、黃燈、紅燈的副程式,觀察執行程式的變化。
    2. 範例檔:請選擇匯入 XML_ColorLED_SP01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_ColorLED_SP01.ino 執行程式的結果。
    備註:
    副程式的迴圈可以依據腳位,設定不同的流程名稱,本範例依據腳位分別有綠燈、黃燈、紅燈三個副程式(函數)。

    Example 02. 利用副程式(函數)及變數控制 LED 燈


    說明:
    1. 這個 Example 是延續上一個 Step 及 Example 01 的內容;在程式中,我們會將紅燈、黃燈、綠燈的程式,利用副程式(函數)的方式,分別獨立在不同的副程式迴圈中。
    2. 除了利用副程式(函數)迴圈的功能,方便掌握不同腳位燈號的控制;在這個 Example,我們也嘗試將之前學習變數的概念應用,利用變數來控制時間的變化。
    3. 利用程式的呼叫功能,在主程式中呼叫副程式(函數),執行副程式的迴圈內容。並利用「變數」來增加效率,只要設定一次變數,未來要改變時間間隔時,只要更動變數內容即可。
    範例:
    1. 如圖二,依序啟動 (數位腳位為高) 和關閉(數位腳位為低) LED 數位腳位 D10、D11、D12,將積木方塊堆疊在副程式積木的【流程】中,並在主程式建立呼叫副程式積木【流程】的積木,依序呼叫綠燈、黃燈、紅燈的副程式,觀察執行程式的變化。
    2. 匯入XML範例檔,在「程式開始」的【設定 (Setup)】中,宣告Time01、Time02、DelayTime為時間變數,利用變數,觀察時間變化時,程式執行的結果。
    3. 範例檔:請選擇匯入 XML_ColorLED_SPV01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_ColorLED_SPV01.ino 執行程式的結果。
    備註:
    副程式的迴圈可以依據腳位,設定不同的流程名稱,本範例依據腳位分別有綠燈、黃燈、紅燈三個副程式(函數)。

    Motoblockly Sensor board學Blockly (利用「變數(Variables)」控制LED燈)

    所謂「變數(Variables)」,可以用於表示或定義一段文字、數字、陣列、函式、物件...等內容,又可稱之為「變量」。程式裡的變數定義為:可以修改儲存記憶體內容的命名空間。跟數學變數最大的不同就是,程式的變數存放的不一定是數值(其實還是以數值的方式儲存),也可以是文字,這些類型的不同就稱為「資料型別」。變數就像一個儲藏箱一樣,程式設計者可以把一些要用到的數值或是字元字串,丟到裡面儲存。(節錄自電腦不難,作者幻嵐)
    在這個 Section,我們將利用變數的特點,將一些需要調整、變更,或在程式中需要改變的變量,透過變數的功能來進行控制。
    在認識變數(變量)的使用之前,要先認識在C語言的變數的設定,有幾種變數型態。C 語言的基本資料型態可分為三大類,分別是字元 (character) 、整數 (integer) 及浮點數 (floating-point number) 。下列是在motoBlockly會用到的變數型態:
    1. long(長整數)
    2. float浮點數(小數)
    3. string(字串(文句))
    4. byte
    5. unsigned
    6. int (整數)
    7. char(字元(半形字))

    Example 01. 利用變數控制 LED 燈

    說明:
    1. 這個 Example 是延續上一個 Step 的 Example 2內容,將時間設定成變數,利用變數的功能來進行時間的控制,透過變數方便時間的調整。
    2. 假設我們要將紅綠燈的亮燈與閃爍時間從間隔5秒改為間隔3秒或0.5秒,要手動改變每個設定就會很累,這時就可利用「變數」來增加效率,我們只要設定一次變數,未來要改變時間間隔時就只要更動一次變數內容即可。
    範例:
    1. 如圖,依序啟動 (數位腳位為) 和關閉(數位腳位為) LED 數位腳位 D10、D11、D12,將積木方塊堆疊在程式開始棕色積木的【迴圈 (Loop)】中,觀察執行程式的變化。
    2. 匯入XML範例檔,觀察在「程式開始」的【設定 (Setup)】中,設定Time為時間變數,利用變數,觀察時間變化時,程式執行的結果。
    3. 範例檔:請選擇匯入 XML_ColorLED_V01.xml ,可開啟本 Example 的範例,或利用 Arduino IDE 開啟 IDE_ColorLED_V01.ino 執行程式的結果。

    2017年4月16日 星期日

    Motoblockly Sensor board學Blockly (閃耀的彩色LED燈 (Loop & For... 迴圈))

    在 S4A Sensor Board 上有三顆,分別是D10(綠色)、D11(紅色)、D12(黃色);在這個Section開始,我們將學習如何一次控制三顆LED,進而學習迴圈的進階應用。

    Step 01. 一閃一閃彩色 LED 燈

    說明:
    1. 這個 Step 將利用程式的時間差,同時控制D10、D11、D12三顆LED燈。
    2. 練習過程,請學習者自行調整不同腳位LED的順序與時間量,並觀察調整後的變化。
    範例:
    1. 如圖一,依序啟動 (數位腳位為 ) 和關閉(數位腳位為 ) LED 數位腳位 D10、D11、D12,將積木方塊堆疊在程式開始棕色積木的【迴圈】中,觀察執行程式的變化。
    2. 範例檔:請選擇匯入 XML_ColorLED_01.xml ,可開啟本Step的範例,或利用 Arduino IDE 開啟 IDE_ColorLED_01.ino 執行程式的結果。

    Step 02. 模擬紅綠燈

    說明:
    1. 這個 Step 將利用程式迴圈與時間差,同時控制D10、D11、D12三顆LED燈。
    2. 模擬紅綠燈號時,須注意紅綠燈的變化順序,燈號長亮時間與閃爍時間,可以透過不同的時間輛進行控制。
    3. 練習過程,請學習者自行調整不同腳位LED的順序與時間量,並觀察調整後的變化。
    範例:
    1. 如圖二,依序啟動 (數位腳位為 ) 和關閉(數位腳位為 低) LED 數位腳位 D10、D11、D12,將積木方塊堆疊在程式開始棕色積木的【迴圈】中,觀察執行程式的變化。
    2. 在這個Step有 XML_ColorLED_02.xml、XML_ColorLED_03.xml 兩個範例,XML_ColorLED_02.xml 這個範例是利用時間差依序執行所有的程式,XML_ColorLED_03.xml 則是利用了迴圈(for...)的概念,在程式迴圈中,將部分重複的程式,利用迴圈(for...),判斷執行次數,執行需要程式重複執行的部分,比較兩個範例可以發現,透過迴圈(for...)的應用,可以有效縮短程式的行列數與檔案大小。
    3. 範例檔:請選擇匯入 XML_ColorLED_02.xml、XML_ColorLED_03.xml 兩個範例,可開啟本Step的範例,或利用 Arduino IDE 開啟 IDE_ColorLED_02.ino、IDE_ColorLED_03.ino 執行程式的結果。從執行結果可以發現這兩個程式的執行結果是一樣,唯一的差別在程式的編輯差異,這也是程式因人而異與有趣的地方。
    備註
    在執行上列 Step 練習時,有一個小問題必須注意,S4A Sensor Board V2 擴充板因為批號的不同,D10、D11、D12腳位的 LED 燈號顏色不見得與本課程的範例一致。例如,以筆者的擴充板來說,分別有D10(綠色)、D11(紅色)、D12(黃色)和D10(紅色)、D11(黃色)、D12(綠色)兩種。為了解決類似問題或時間量變更的問題,方便程式的變更與程式版本的控制,我們在後續的課程 Session,將提到利用「變數」或副程式的概念來解決這類問題。

    Motoblockly Sensor board學Blockly (點亮LED燈)

    點亮LED燈
    S4A Sensor Board V2 擴充板上有三顆,分別是D10(綠色)、D11(紅色)、D12(黃色);點亮LED燈是編程學習中較為簡易的入門課程,我們也從這個步驟作為學習開始。

    Step 01. 點亮第一盞 LED 燈

    說明:
    1. 這個 Step 是認識 motoBlockly 的第一步,在打開 motoblockly 時,會從「程式開始」進入程式編輯,您會在程式編輯區看見第一個積木【設定、迴圈】棕色積木。實際上,在 Blockly 的工作積木中,它是可以被省略;但是在 motoblockly 中,為了在學習過程更容易理解 IDE 編輯的邏輯,所以做了這個積木,方便學習比對與教學說明。
    2. 點亮第一盞 LED 燈這個步驟,我們將先點亮 D10 這一顆 LED 燈作為學習的開始。
    範例:
    1. 點亮 LED D10:如圖三,LED位於數位腳位 D10,所以積木塊選擇設定【數位腳位 D10 為 高】,設定電位為高,啟動LED。
    2. 範例檔:請選擇匯入 XML_LED_01.xml ,可開啟本Step的範例,或利用 Arduino IDE 開啟 IDE_LED_01.ino 執行程式的結果。

    Step 02. 讓 LED 燈閃爍(1)

    說明:
    1. 讓 LED 燈閃爍,就必須在程式執行中加入時間控制,時間控制積木裡的時間量有【毫秒】與【微秒】兩種,1秒=1000毫秒=1000*1000微秒,依此類推。
    2. 在 motoBlockly 中,除了可以利用電子積木進行編程,使用者如果對於 C 語言熟悉,點選功能表列上【Arduino】欄位,可以直接進行 IDE 語言的編輯或修改。(如圖四)
    範例:
    1. 將積木塊堆疊入【程式開始】的【迴圈】中,設定【數位腳位 D10 為 高】,加入時間量進行控制。觀察程式執行的結果。
    2. 範例檔:請選擇匯入 XML_LED_02.xml ,可開啟本Step的範例,或利用 Arduino IDE 開啟 IDE_LED_02.ino 執行程式的結果。


    Step 03. 讓 LED 燈閃爍(2)

    說明:
    1. 將 Step 02 【迴圈】中的程式積木,堆疊放入【程式開始】的【設定】中,觀察程式執行的結果。
    2. 比較 Setp 02 與 Setp 03 兩組程式堆疊的位置差異,觀察程式執行結果的不同。
    範例:
    1. 將積木塊堆疊入【程式開始】的【迴圈】中,設定【數位腳位 D10 為 高】,加入時間量進行控制。觀察程式執行的結果。
    2. 範例檔:請選擇匯入 XML_LED_03.xml ,可開啟本Step的範例,或利用 Arduino IDE 開啟 IDE_LED_03.ino 執行程式的結果。
    Related Posts Plugin for WordPress, Blogger...