# Step.6 FlipCode 玩 E300

首先，在學習FlipCode之前，應先了解FlipCode的兩個基本性質。

可以一邊瀏覽說明，一邊使用FlipCode實際操作。要使用FlipCode之前，請準備好FlipCode軟體（線上版或是APP版本皆可），安裝說明請至：[準備軟體工具](../getting-started/prepare-software)。

## 基本性質 <a href="#basic-characteristics" id="basic-characteristics"></a>

### 程序性 <a href="#sequential" id="sequential"></a>

程序性代表的是當我們在撰寫FlipCode時，程式都是有順序性的執行指令，也就是說，當拉了兩個程式在重複執行的拼圖中，程式會「由上到下」按照順序執行指令，如下方圖示。&#x20;

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LMkf3T5TFv8DQHoxabU%2Fuploads%2FnsDKDlb4zFYjhwgeASe0%2Ffile.png?alt=media)

以上方圖示為例，程式會先執行「直流馬達1速度200」的程式，接著執行「直流馬達2速度0」的程式。&#x20;

不過，在使用FlipCode進行程式編輯時，若使用者沒有將程式拼圖放置在初始化或重複執行的拼圖中，而是放置畫面在其他空白處，拼圖會呈現灰底，表示不會執行此程式，如下方圖示。&#x20;

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LMkf3T5TFv8DQHoxabU%2Fuploads%2FBxarcGx5oO3azNCZJ6V0%2Ffile.png?alt=media)

因此，在使用FlipCode時，記得養成良好的習慣，將需要的程式連接在一起，並放在初始設定或重複執行的拼圖中，不需要的程式可以刪除，或是放在初始設定或重複執行的拼圖之外。&#x20;

### 重複性 <a href="#repeatability" id="repeatability"></a>

在FlipCode畫面中，程式主要分成兩個區塊：&#x20;

* 初始設定：初始設定裡的程式只有在開機時，會最先執行，執行一次，執行完畢則不會再執行直到重新開機。&#x20;
* 重複執行：重複執行裡的程式，會一直重複執行直到關機。&#x20;

因此，重複性就是代表當我們在撰寫FlipCode時，放在重複執行拼圖中的指令會不停的重複執行，以下方圖示為例。&#x20;

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LMkf3T5TFv8DQHoxabU%2Fuploads%2FZBdfe2lnNGpw5xtnwQi1%2Ffile.png?alt=media)

程式將會呈現「直流馬達1速度200延遲一秒」，接著執行「直流馬達1速度0延遲一秒」，接著再回到「直流馬達1速度200延遲一秒」，一直不同反覆執行動作，直到關機或是下一次燒錄為止。&#x20;

因此，在使用FlipCode時，出現不如預期的結果，很大的可能是因為重複性，以下方圖示為例，想想看，程式會如何執行。&#x20;

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LMkf3T5TFv8DQHoxabU%2Fuploads%2FLFXe8eCJ24OwsyVkdmzU%2Ffile.png?alt=media)

比較前方的例子，這個範例在「直流馬達1速度0」後方並沒有加「延遲」，因此，程式在執行到「直流馬達1速度0」後，會非常快速的接續執行「直流馬達1速度200延遲一秒」的程式，也就是說我們將不會在機器人身上看到「直流馬達1速度0」程式的執行。&#x20;

在了解完FlipCode的基本性質後，請利用USB線將機器人與電腦連接起來，讓我們來認識FlipCode的基本功能。&#x20;

## 基本功能 <a href="#basic-functions" id="basic-functions"></a>

### 拖曳程式 <a href="#drag" id="drag"></a>

點選想要的程式，按著拖拉至右方初始化、重複執行的拼圖中或拖拉至空白處，接著放開。&#x20;

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWBNL48hUqpRLM7Yig%2F-LOW8Pv9hDRy5KFrvhsr%2F11.gif?alt=media\&token=d9367af2-4b54-4d37-b781-c496095e24b5)

### 刪除程式 <a href="#delete" id="delete"></a>

刪除程式的方式有四種，其中又分為單個程式刪除與全部程式刪除：&#x20;

#### 1.將程式拉回左方工具列

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWBNL48hUqpRLM7Yig%2F-LOW8afTIWVEOczf6riB%2F12.gif?alt=media\&token=4f335cda-aec7-4108-bdb0-19506f758964)

#### 2.將程式拉至右下方的垃圾桶

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWBNL48hUqpRLM7Yig%2F-LOW8eVXi_ZZzbtPbsNy%2F13.gif?alt=media\&token=3dbd395e-674d-4fb8-8c6c-7aeca59f0ce9)

#### 3.點選上方Clear All可以刪除畫面上所有程式

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWBNL48hUqpRLM7Yig%2F-LOW8hZw6xVc5qaMK6vR%2F14.gif?alt=media\&token=6337e043-505d-427b-9450-3371d2b634d5)

#### 4.按滑鼠右鍵選擇刪除區塊

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWBNL48hUqpRLM7Yig%2F-LOW8qUNUZIE054Z95oo%2F15.gif?alt=media\&token=c4e18562-60cd-464d-8ec5-c7efa7313200)

### 燒錄程式

首先先將機器人打開，接著將USB線插入機器人與電腦。

Port處會顯示「Detecting」，表示正在偵測可燒錄的機器人。

接著選擇最新出現的Port。

{% hint style="info" %}
請記得開啟機器人電源，才能顯示Detecting。
{% endhint %}

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-Ly8EerTC24b9rdw2-uh%2F-Ly8FqXMmnqiFyWMKFZG%2Fimage.png?alt=media\&token=262954c0-7ee7-479a-ae4d-0b05b6cfcd6b)



自動出現對應的FlipBrain和Port後，接著點選Upload。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-Ly8EerTC24b9rdw2-uh%2F-Ly8G0ariDA7iKsg3_0t%2Fimage.png?alt=media\&token=d1d07b3b-c908-4066-bd5b-a2111cab4b7b)

看到綠色勾勾就代表燒錄成功了，可以拔下USB線，試看看你寫的程式囉。

{% hint style="info" %}
燒錄完成後，請按模式切換鈕，機器人才會開始執行動作。
{% endhint %}

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-Ly8H9n-hhgYR_PjwWQq%2F-Ly8HoZ-HH-3xvWKE0Xj%2Fimage.png?alt=media\&token=c198bf8d-995f-4b92-be6c-6fa7a5ad896d)

### 儲存程式 <a href="#save" id="save"></a>

點選Save後，可在框中輸入檔案名稱，所有的FlipCode都會統一先儲存在下載(Download)的資料夾中。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEyLnfRvv8vOh3c1A%2F-LOWFTFoCf0cfZfbCb7H%2Fimage.png?alt=media\&token=64f9738e-5a47-43e2-8f7e-238452a43e3f)

在了解完基本的FlipCode的基本性質與基本功能後，讓我們試試幾個基本的程式吧。

詳細的FlipCode指令介紹可至[機器人的神經元-FlipCode](../nervous-system-of-fliprobot-flipcode)查閱。

## 任務一：讓E300前進 <a href="#mission-1" id="mission-1"></a>

* 使用程式：函式、直流馬達

首先，我們必須知道在讓E300前進時，需要控制兩顆輪子，而兩顆輪子分別由直流馬達1與直流馬達2控制，觀察E300主控板可知，直流馬達1控制左邊輪子、直流馬達2控制右邊輪子。​​​

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEyLnfRvv8vOh3c1A%2F-LOWFWr3iEA-HyyAja0x%2Fimage.png?alt=media\&token=50bb6773-d010-401a-81d5-b14768d4022e)

想想看當E300要前進時，兩邊馬達旋轉為何？

很多人會認為直流馬達1與直流馬達2旋轉的方式會相同，但事實上，當我們將E300拿起來，正面看著左方與右方的輪胎，會發現左方是以逆時鐘方向旋轉，而右方則是以順時鐘方向旋轉，如下方圖示。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LylPodFI1pUnQTJ_EJU%2F-LylQaaOPdNetQthuLni%2Fimage.png?alt=media\&token=fdb1fe27-a459-4013-a610-d6bff073b7ff)

​ 到目前為止，我們知道在撰寫「前進」的程式時，需要控制直流馬達1與直流馬達2，並且直流馬達1為逆時鐘，直流馬達2為順時鐘。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEyLnfRvv8vOh3c1A%2F-LOWF_WsGnFJFtpUQbrg%2Fimage.png?alt=media\&token=155b4cf8-6433-44e3-a88a-a2ad7e891a73)

函式可以定義機器人所擁有的功能，一種功能一個函式，如下方圖示。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWDdB--17auZb7Rh9_%2F17.gif?alt=media\&token=a6f5015f-94fb-4364-be4d-ce254fbef8e1)

將函式命名完成後，裡面的程式仍須自己撰寫，如下方圖示。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWDgI0TGZ9htf90NzH%2F18.gif?alt=media\&token=dab73db1-48ff-44a3-b1c5-0869c85b5cb1)

在函式裡面的程式並不會立刻被執行，需另外將函式名稱拉入畫面表示呼叫機器人執行這個功能。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWDokqzYN79qgPQsup%2F19.gif?alt=media\&token=52a22294-f6fb-44a6-86aa-497ed8c0d28e)

完成撰寫後，試著Upload到E300當中，看看你的E300是否可以前進了吧！

{% hint style="success" %}
延伸任務

1. 讓E300走出直線：當你發現E300無法走出直線，而是呈現左偏或右偏，意味著你的馬達存在著速度差。你可以試著調整一邊的馬達速度，將他們調成一致。
2. 停止、左轉、右轉的函式：當你完成前進的函式，試著寫寫看停止、左轉、右轉的函式吧。
{% endhint %}

## 任務二：讓E300前進一秒後停止五秒 <a href="#mission-2" id="mission-2"></a>

* 使用程式：函式、直流馬達、延遲

首先，我們必須了解「延遲」這個程式，「延遲」代表上一個動作持續的時間，單位為毫秒，一千毫秒等於一秒鐘，也就是說這個程式代表延遲1秒。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LylKF-HGU_6azEypRfM%2F-LylKztbUdWDZG9EUBbx%2Fimage.png?alt=media\&token=7746be9b-ec4a-4ecf-9ff2-a67ac5443268)

接著先讓我們完成「前進」與「停止」的函式。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LylKF-HGU_6azEypRfM%2F-LylKxWPduNlRvaIr3DS%2Fimage.png?alt=media\&token=8a5d1844-738b-428c-9a1b-60b39cc06bb9)

接著試著將「延遲」的程式加進去吧，完成前進一秒後停止五秒。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWE1N_8U17oENkC3CJ%2F20.gif?alt=media\&token=02654922-6dc4-4ddd-9597-cdb251af88fe)

{% hint style="success" %}
延伸任務

1. 倒車入庫：試看看在桌面上貼出一個小框框，讓E300停進框框中。
{% endhint %}

## 任務三：超音波感應器的碰到障礙物時，E300停止前進 <a href="#mission-3" id="mission-3"></a>

* 使用程式：函式、直流馬達、延遲、如果執行、超音波感應器

到這裡，我們已經學會「函式、直流馬達、延遲」，這個任務主要是要學習「如果執行」，這次的「如果執行」是搭配「超音波感應器」使用。

因此，我們必須先了解一下「超音波感應器」的感測原理，「超音波感應器」是利用發射超音波反射回傳一個數值(單位為公分)，代表著它與前方物品的距離。

假設今天障礙物的位置位於15公分處。

可以根據下方圖示先拉出一個「超音波感應器數值小於15公分」的條件。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWE7Op_BsGc9W8tkpY%2F21.gif?alt=media\&token=3e6e4562-753b-4127-92b4-f4c6104a6e7c)

接著加入「如果執行」，代表當超音波感應器回傳的數值小於15公分，則執行動作。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWECzSLVm5h05YPCyr%2F22.gif?alt=media\&token=b1ac0858-c3f8-45ef-bec1-73c0e994e099)

接著，只要再加入我們先前學會的函式與延遲，就可以完成超音波感應器的碰到障礙物時，E300停止前進的動作囉。

![](https://3604010070-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMkf3T5TFv8DQHoxabU%2F-LOWEhzXEt4Bv-m6FPG3%2F-LOWEHwlEqGv7lBh4_WV%2F23.gif?alt=media\&token=aad27387-77d7-44d9-9282-651bdbc995d7)

這個程式僅會讓E300停止一秒後就會繼續前進，還記得FlipCode的基本性質中的重複性嗎，這就是為何程式會這樣執行的原因。

{% hint style="success" %}
延伸任務

1. 超音波感應器遇到障礙物後停止：試看看還有什麼其他的程式寫法。
2. 超音波感應器遇到障礙物後左轉：試試看，完成一台小特斯拉，看到障礙物會繞過去。
{% endhint %}

