<!-- .slide: data-background="https://i.imgur.com/gJLfldF.jpg" data-background-color="#111111" data-background-opacity="0.2" -->
###### tags: `iot-car` `lab` 返回[物聯網智慧自走車](/s/5c7ggGf0Spqql5Gy31Cqzg)
## 打造簡易車位辨識系統?! <br> <span style="color:#F9BF45;">指定顏色區域停車</span>
###### [點我開啟簡報模式](/@BEExANT-ta/rJLyc77Ot#)
###### <kbd>ESC</kbd> 鍵進入總覽模式
###### <kbd>←</kbd> <kbd>↑</kbd> <kbd>↓</kbd> <kbd>→</kbd> 切換頁面
---
<center><img src="https://i.imgur.com/Je5UX3n.jpg" width=40%></img></center>
==自動停車(輔助)系統==能夠幫助駕駛用==更輕鬆==的方式把車停好,大多數中高階的車款皆有這樣的系統,主要是利用車子四周的==感測器及影像==進行周遭車輛的檢測,==計算停車位的距離及大小==後控制車子駛入。
這單元我們先從把車==停進指定的區域==內為目標,利用==顏色感測器==判斷==指定顏色==車格並完成停車。
----
:::info
:globe_with_meridians: 參考資源
- [自動泊車輔助系統](https://www.easyatm.com.tw/wiki/%E8%87%AA%E5%8B%95%E6%B3%8A%E8%BB%8A%E8%BC%94%E5%8A%A9%E7%B3%BB%E7%B5%B1)
:::
---
{%youtube LotFCfP4dzE %}
{%youtube hUMA8cyZH7E %}
----
:::info
:globe_with_meridians: 參考資源
- [彩色視覺](https://zh.wikipedia.org/wiki/%E5%BD%A9%E8%89%B2%E8%A7%86%E8%A7%89)
- [Maker電子學 - 淺談色彩感測器的原理與應用](https://makerpro.cc/2018/11/principles-and-application-of-colorsensor/)
:::
---
## 目標
**使自走車維持在黑色的車道上行走,當判斷到指定顏色時進入車格,待完全進入時停止移動。**
---
## 設計原理
- 判斷==前後==感測器==皆為黑色時向前移動==,若左或右其中一個為白色表示偏離車道,往反方向移動進行校正。
- 當==左或右==感測器==碰到指定顏色時==,暫停一下後==往對應方向移動==,當==四個感測器==皆為==指定顏色==時表示已==完全進入==,停止車子移動。
---
## 範例程式碼
新增程式檔並命名 ==指定顏色區域停車==,將以下程式碼複製貼上程式編輯區執行。
```javascript=
window.state = "初始化";
let target = "紅";
let F = DATA.colorF[3];
let B = DATA.colorB[3];
let L = DATA.colorL[3];
let R = DATA.colorR[3];
let speed = 30;
if(F == "黑" && B == "黑" && L == "黑" && R == "黑")
{
state = "車格探索";
move_forward.set(speed);
delay(300);
led_color.set("白");
}
if(L == "白" && R == "黑" && state == "車格探索" )
{
console.log("車身向左偏移,向右校正");
move_right.set(speed);
}
if(L == "黑" && R == "白" && state == "車格探索" )
{
console.log("車身向右偏移,向左校正");
move_left.set(speed);
}
if(L == target && R == "黑" && state == "車格探索")
{
state = "進入車格";
move_stop.set();
delay(300);
led_color.set(target);
delay(300);
move_left.set(speed);
}
if(L =="黑" && R == target && state == "車格探索")
{
state = "進入車格";
move_stop.set();
delay(300);
led_color.set(target);
delay(300);
move_right.set(speed);
}
if(F == target && B == target && L == target && R == target && state == "進入車格")
{
state = "停車完畢";
move_stop.set();
delay(300);
led_color.set("黑");
}
console.log(state);
```
---
## 程式解說
逐行講解程式意義。
----
```javascript=
window.state = "初始化";
```
- 定義全域變數state,記錄目前自走車的狀態。
----
```javascript=3
let target = "紅";
```
- 定義區域變數target,設定為指定顏色值。
----
```javascript=15
let F = DATA.colorF[3];
let B = DATA.colorB[3];
let L = DATA.colorL[3];
let R = DATA.colorR[3];
```
- 定義四個方向的區域變數,設定為對應方向的顏色值。
----
```javascript=
let speed = 30;
```
- 定義區域變數speed,設定為30,速度建議==不超過70==,太快會來不及判斷。
----
```javascript=
if(F == "黑" && B == "黑" && L == "黑" && R == "黑")
{
state = "車格探索";
move_forward.set(speed);
delay(300);
led_color.set("白");
}
```
- 當四個方向==皆為黑色==時,將state設為 =="車格探索"== ,控制車子==向前移動==並設定led為白色。
----
```javascript=
if(L == "白" && R == "黑" && state == "車格探索" )
{
console.log("車身向左偏移,向右校正");
move_right.set(speed);
}
if(L == "黑" && R == "白" && state == "車格探索" )
{
console.log("車身向右偏移,向左校正");
move_left.set(speed);
}
```
- 當state為 =="車格探索"== 時表示行走在==車道==上,若==左或右碰到白色==代表==偏離==車道,控制車子==往反方向移動進行校正==。
----
```javascript=
if(L == target && R == "黑" && state == "車格探索")
{
state = "進入車格";
move_stop.set();
delay(300);
led_color.set(target);
delay(300);
move_left.set(speed);
}
if(L =="黑" && R == target && state == "車格探索")
{
state = "進入車格";
move_stop.set();
delay(300);
led_color.set(target);
delay(300);
move_right.set(speed);
}
```
- 當state為 =="車格探索"== 時,若左或右==判斷到指定顏色==時,將state設為 =="進入車格"== ,控制車子==暫停一下==並設==led為指定顏色==後,再控制車子==往指定顏色方向移動==。
----
```javascript=
if(F == target && B == target && L == target && R == target && state == "進入車格")
{
state = "停車完畢";
move_stop.set();
delay(300);
led_color.set("黑");
}
```
- 當state為 =="進入車格"== 時,若四個方向皆為指定顏色,將state設為 =="停車完畢"== ,控制車子停止後設定led為黑色(即關閉)。
----
```javascript=
console.log(state);
```
- 每次迴圈程式執行最後==顯示目前狀態資訊==於訊息欄中。
---
## 參數修改
為方便實作,以下會將範例程式中可修改的參數標示出來,進行實作時只需修改對應參數,並觀察結果即可。
:::warning
:zap: 詳細內建JS參數參考 - [內建Js參數及功能總覽](/s/wlfjvQBzRPCmJ8LCL3f2Fg)
:::
----
:::success
**let target = =="x"==;**
:::
- 在關卡圖的環境下,x可代入 紅、綠、藍、黃,使自走車判斷到對應顏色時進入停車。
----
:::success
**let speed = ==x==;**
:::
- 設定自走車移動速度,在此單元中建議==不超過70==,以免影響判斷結果。
---
## 範例影片
{%youtube -b7RsmZxl9Q %}
<a class="btn btn-warning" style="width:100%;color:#333333;" href="/s/-UEmP-gsSIyDL1SSy3XXgA" role="button"> 車道置中移動 **⇨** </a>
<a class="btn btn-primary" style="width:100%;" href="/s/BWE9-5cJRJ2KEDSG8f9kvA" role="button"> **⇦** 場地邊界判定
</a>
{"metaMigratedAt":"2023-06-16T14:45:56.140Z","metaMigratedFrom":"YAML","title":"打造簡易車位辨識系統?! - 指定顏色區域停車","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"transitionSpeed\":\"fast\",\"theme\":\"league\"}","contributors":"[{\"id\":\"a1db0c29-d848-4070-be84-9191a2398ca8\",\"add\":7781,\"del\":2906}]"}