arduino(Beginner)_ Flight Events飛行
Step 1:
初始設定程式
幾乎所有CoDrone編程都從初始設定區塊開始,嘗試熟悉它吧! #include <CoDrone.h> void setup() { CoDrone.begin(115200); CoDrone.pair(); } void loop() { } 程式碼註解:
這門課運作無人機的所有函式,我們都放在void setup{}之區塊中。 |
Step 2:
Void setup(設定區塊)和 void loop(迴圈區塊)
所有Arduino sketch 草稿碼都包含void setup()和 void loop()兩個區塊。若沒有他們,你的程序就無法運作!
簡單來說:在 void setup() 中的程式碼只運作一次,而在 void loop()中會不斷的運作下去! |
Step 3:
執行飛行功能
在加入可以連結你的CoDrone的程式碼後你必須加入CoDrone.takeoff()函式。 第一次飛行你將使用CoDrone.takeoff()。這個函式總是讓無人機在空中盤旋3秒來穩定後執行下一個指令。如果8秒內沒有收到指令它就會自動著陸。下一個要學的就是使用CoDrone.land(),讓你的CoDrone回到地面。
以下是程式碼的內容 #include <CoDrone.h> void setup() { CoDrone.begin(115200); CoDrone.pair(); CoDrone.takeoff(); //goes up and hovers for 3 seconds CoDrone.land(); //lands the CoDrone } void loop() { } |
Step 4:
盤旋
如果你想要你的CoDrone在空中滯留超過3秒鐘,最好的方法就是在起飛和著陸中間加入CoDrone.hover()函式。盤旋指令會依據你在括弧內填入的秒數決定在空中滯留的時間。例如:你想要你的CoDrone起飛後盤旋2秒後,再開始著陸,則函式是CoDrone.hover(2),其中「2」代表2秒,並插在起飛和著陸指令之間。 以下是加入 CoDrone.hover()的程式碼: 附註:假如你起飛後的盤旋時間小於3秒的話,可以不使用CoDrone.hover(), 因為 CoDrone.takeoff()已經有盤旋3秒的自動指令。 #include <CoDrone.h> void setup() { CoDrone.begin(115200); CoDrone.pair(); CoDrone.takeoff(); //goes up and hovers for 3 seconds CoDrone.hover(2); //hovers for an additional 2 seconds CoDrone.land(); //lands the CoDrone } void loop() { } |
Step 5:
Turn it off! 關掉它!
你是無人機操作新手,所以我們完全不驚訝意外發生。防止意外發生最好的方法是加入緊急開關在你的程式碼中。假如你的CoDrone失控了,你會慶幸有加入緊急開關,你可以直接蓋住一些感應器,馬達就會立刻停止運作以脫離險境。 請確定以下程式碼加載於void loop區塊哩,讓你在覆蓋感應器11和14時(如下圖),馬達會自動關閉,我們會在條件式課程更詳細說明。 void loop(){ byte bt8 = digitalRead(18); byte bt4 = digitalRead(14); byte bt1 = digitalRead(11); if(bt1 && bt4 && !bt8){ CoDrone.emergencyStop(); } } |
Step 6:
最終程式碼
最後你的程式碼內容應該呈現如下: #include <CoDrone.h> void setup() { CoDrone.begin(115200); CoDrone.pair(); CoDrone.takeoff(); //goes up and hovers for 3 seconds CoDrone.hover(2); //hovers for 2 seconds CoDrone.land(); //lands the CoDrone } void loop(){ byte bt8 = digitalRead(18); byte bt4 = digitalRead(14); byte bt1 = digitalRead(11); if(bt1 && !bt4 && !bt8){ CoDrone.emergencyStop(); } } |
Step 7:
Challenge挑戰
挑戰: CoDrone 伏地挺身 試試用一組程式碼讓你的CoDrone連續起飛著陸5次!目前你手上的程式碼只能讓你的無人機這樣做一次。 規則:
來比賽看誰的CoDrone在10秒內做最多組伏地挺身! |
arduino (Beginner) _ Flight Movements飛行動作
Step 1:
橫滾、俯仰、偏航和油門
飛行器的移動方式與陸地車輛有點不同。儘管陸地車輛可以向前、向後,有時還可以左右移動,但飛行器不只有這些動作,甚至還有上下移動。想要確認 CoDrone是 如何在三維空間中移動,你可以使用以下術語: 橫滾控制的是CoDrone的橫向或是側向移動。Positive roll(正向橫滾)是把CoDrone向右移動;而negative roll(負向橫滾)是把CoDrone向左移動。 俯仰是 CoDrone 向前和向後傾斜。CoDrone往前傾斜移動是Positive pitch(正向俯仰),而negative pitch(負向俯仰)是往後傾斜移動CoDrone。 偏航是CoDrone左右旋轉。Positive yaw(正向偏航)讓你的CoDrone向右轉;而negative yaw (負向偏航)是向左旋轉。
請小心操作偏航和橫滾,偏航會左右旋轉CoDrone,而橫滾會左右移動CoDrone。 |
Step 2:
活動:盲機體驗
學習新詞彙的最佳方法之一就是觀察它們的實際操作,因此你不僅要記住所有的飛行動作,你還要完成障礙賽! 找個朋友坐下並矇註他們的雙眼(或是要他們雙眼閉上就好) 接下來,只使用飛行動作詞引導他們讓他們最後坐在另一把椅子上通過障礙課程。請先確保任何危險的東西都遠離他們!
例如:如果你要你朋友往前走,請說“正向俯仰(Positive pitch )2步”,就可以讓你朋友了解要他往前走2步。一旦你的朋友成功完成障礙賽,則換他幫你指向! |
Step 3:
移動指令
以下有3個步驟讓你的CoDrone自主飛行:
移動指令就是你剛才學到的: 偏航、俯仰、橫滾和催、收油門。在Auduino中請使用以下格式設定變化數值: CoDrone.setThrottle(0); CoDrone.setPitch(0); CoDrone.setRoll(0); CoDrone.setYaw(0); 這些值可以設定翻為從數字-100到100。例如:如果你想要設定油門到70,請寫下 CoDrone.setThrottle(70)。這樣設定催油門的值在70但…這樣尚未把指令傳到你的CoDrone。 |
Step 4:
移動維持時間
最後一個步驟就是設定你的無人機飛行多久時間,以下是給你參考多種的飛行指令: CoDrone.setRoll(60); CoDrone.setPitch(-60); CoDrone.move(1.5); CoDrone.move(1.5)會在你送出飛行指令後暫停你的程式碼1.5秒。這將使你的 CoDrone 在移動到下一行代碼之前有 1.5 秒的時間來執行動作。
|
Step 5:
最終程式碼
現在你可以把他們全部組一起了!讓你的CoDrone起飛、以速度50催油門2秒、往前飛再用速度30左飛2秒然後著陸。別忘了在voild loop裡加入緊急開關喔! 以下是你的程式碼呈現內容: #include <CoDrone.h> void setup() { CoDrone.begin(115200); CoDrone.pair(); CoDrone.takeoff(); //Take off for 3 seconds CoDrone.setThrottle(50); //Throttle for 2 seconds CoDrone.move(2); CoDrone.setThrottle(0); // Set throttle back to 0 CoDrone.setPitch(30); CoDrone.setRoll(-30); //Pitch and roll for 2 seconds CoDrone.move(2); CoDrone.land(); //Land } void loop () { byte bt8 = digitalRead(18); byte bt4 = digitalRead(14); byte bt1 = digitalRead(11); if(bt1 && bt4 && !bt8){ CoDrone.emergencyStop(); } } 程式碼註解:
|
Step 6:
Challenge挑戰
Challenge: Pin Point點到點移動 在相距幾英尺分別放一個起始板和著陸板。嘗試使用你的程式碼讓 CoDrone 移動從一個板子飛到下一個板子。 規則:
如果你希望在更有挑戰,你可以:
|
Arduino (Beginner)_ Variables變數
Step 1:
何謂變數?
變數在所有編程語言和大多數程序中都很重要!就像數學,變數是佔位符和數字的數據存儲。一般來說你可以在編程的一開始先創造變數並儲存它的值,之後你可以在編程中用變數時把時把它叫出來使用。 我們來看個示範吧!有時CoDrone的鮑率很難記—-到底是112500還是115200? (是115200沒錯)常常在腦中找尋數字不如保存波特率的值成變數,以下是呈現方式: int x = 115200; 現在115200就縮短成變數x了!每當你用x在你的程序中,你可以想像它被115200取代了。 #include <CoDrone.h> int x = 115200; void setup() { CoDrone.begin(x); //same as CoDrone.begin(115200) CoDrone.pair(); } void loop () { } |
Step 2:
變數使用方式
以下是使用變數的3步驟
宣告變數 使用變數前你要先宣告它。請使用以下函式做宣告變數: DataType VariableName 例如: int Example宣告`一個名為 Example 的整數變數。 |
Step 3:
數據類型
在上一步中,你可能對數據類型感到困惑! 數據類型很重要,因為它們決定了每個變數可以存儲多少數據。 請確認你為你的程序選擇正確數據種類!
|
Step 4:
變數的名字
你可以任意為你的變數命名,只要不要有空格或特殊符號。以int HappyFace123舉例。 定義一個值 當你要定義一個變數時,他的值會自動成0。如果你不想要它是0,你可以設定初始值。例如:你想把HappyFace123的值換成10,你要寫: int HappyFace123 = 10 |
Step 5:
範圍
在編程時要記住變數的範圍是一個非常重要的規定。範圍決定了您的變數在程序中的位置。如果你試著輸入超出變數的範圍,編譯器會顯示錯誤訊息”範圍內未被定義” 範圍的基本規定:變數只能在其初始化的括號裡使用。 以下提供幾個範例: 範例1 void setup(){ //BRACKET START //x is initialzed inside the setup's brackets int x; x=2; } //BRACKET END void loop(){ x=1; //running this will give an error } x 在void setup()的括號內初始化,所以它只能在這些括號內使用。x = 2可以使用是因為他也有在void setup()範圍裡。然而如果你試著在void loop()中設定x = 1,你會看到範圍錯誤因為它不在同一個括號內。 範例2
void setup(){ if(true){//BRACKET START int x; x=1; }//BRACKET END x=2; //running this will give an error } x在if(true)括號中初始化,所以它只能在這些括號內使用。x=1可以使用是因為它有在if(true)括號裡。當你試著設定x=2在if語句外的void setup() ,你會看到錯誤訊息因為它不再相同的括號內。 Example 3範例3
int x; void setup(){ x=1; } void loop(){ x=2; } 運作成功!變數x在void setup()之前和任何括號之外初始化。這稱做全域(global)變數,且可以在整個城市裡的任何區塊使用。 |
Step 6:
變數與數學
使用數學運算可以非常輕鬆地更改編程中的變數。 你的數學老師聽到這個會很開心! 範例1 int y = 4; int z = 3; int x = y + z; 範例2 你看到的此等於符號並不代等於”或是”相等” 。在編程中只是代表 “指派”,意為設定這個變數的值, 這應該有助於你理解我們將談到的內容。 有件你能在編程中做的事就是在變數的方程式中變化它的值。 例如: int y = 4; int x = 3; x = y + x; X原本的值是3,但當他在方程式x=4+3中使用後新的x值就是7。 我們理解這個解釋讓人困惑但我們保證這很正常。 |
Step 7:
Challenge挑戰 方形變數
使用以下設置程式碼讓你的 CoDrone 起飛,然後以方形圖案飛行! 規則:
設置程式碼 #include <CoDrone.h> int A = 1; int B = 500; int C = 5; int D = 2; int E = 10; int F = 3; void setup(){ CoDrone.begin(115200); CoDrone.pair(); CoDrone.takeoff(); } void loop(){ byte bt8 = digitalRead(18); byte bt4 = digitalRead(14); byte bt1 = digitalRead(11); if(bt1 && bt4 && !bt8){ CoDrone.emergencyStop(); } } 程式碼範例 #include <CoDrone.h> int A = 1; int B = 500; int C = 5; int D = 2; int E = 10; int F = 3; void setup(){ CoDrone.begin(115200); CoDrone.pair(); CoDrone.takeoff(); CoDrone.move(D); CoDrone.setThrottle((C * C) * F); //5 * 5 * 3 = 75; move at 75% power throttle for 2 seconds CoDrone.move(A * D); // 1 * 2 = 2 CoDrone.setThrottle(0); // Zero out the throttle CoDrone.move(); CoDrone.land(); } void loop(){ byte bt8 = digitalRead(18); byte bt4 = digitalRead(14); byte bt1 = digitalRead(11); if(bt1 && bt4 && !bt8){ CoDrone.emergencyStop(); } } |