<!-- .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/SJ6aLRE_K#)
###### <kbd>ESC</kbd> 鍵進入總覽模式
###### <kbd>←</kbd> <kbd>↑</kbd> <kbd>↓</kbd> <kbd>→</kbd> 切換頁面
---
<center><img src="https://i.imgur.com/PUFq6ZU.jpg" width=40%></img></center>
在**電子電路實驗與JavaScript物聯網應用**這套教具的 [LAB04 - 控制二軸機械手臂](https://hackmd.io/@BEExANT-ta/js-iot/%2Fs%2F9ntHyjh0RBWR2NewpjNQLw) 中我們已熟悉如何調整並控制機械手臂,這單元要讓==自走車與第一套教具進行連線==,實作==M2M==(Machine To Machine)來讓自走車==遠程控制手臂==進行待機、搬貨等動作。
----
:::info
:globe_with_meridians: 參考資源
- [M2M - 維基百科](https://zh.wikipedia.org/wiki/%E6%A9%9F%E5%99%A8%E5%B0%8D%E6%A9%9F%E5%99%A8)
:::
---
## 目標
**在自走車網頁中設定外部wifi連線至第一套教具,設定遠端IP為第一套教具之IP後,以自走車的顏色判斷來控制手臂進行待機、搬貨的動作。**
---
## 設計原理
- 手臂控制模式照[LAB04 - 控制二軸機械手臂](https://hackmd.io/@BEExANT-ta/js-iot/%2Fs%2F9ntHyjh0RBWR2NewpjNQLw)進行調整。
- 第一套教具(10.10.10.10)與自走車(10.10.20.10)的==IP必須不同才能進行遠程控制==,預設已設定好不同IP,若要另外設定可依[內建Js參數及功能總覽](/s/wlfjvQBzRPCmJ8LCL3f2Fg)內的指令進行調整。
- 網路設定請參考 [遠程控制網路設定](/s/UrpBFetqTfagugoaksoDCg) 中的步驟進行設定。
---
## 範例程式碼
新增程式檔並命名 ==遠程手臂控制==,將以下程式碼複製貼上程式編輯區執行。
```javascript=
window.state = "待機";
let armTop = 7;
let armMiddle = 6;
let armBottom = 5;
let idle_color = "黑";
let work_color = "紅";
let F = DATA.colorF[3];
let B = DATA.colorB[3];
let L = DATA.colorL[3];
let R = DATA.colorR[3];
console.log("手臂狀態: " + state);
if(F == idle_color && B == idle_color && L == idle_color && R == idle_color)
{
state = "待機";
}
if(F == work_color && B == work_color && L == work_color && R == work_color)
{
state = "搬貨";
}
if(state == "待機"){
console.log("恢復至待機位置...");
remote_servo[armBottom].set(160);
delay(1000);
remote_servo[armMiddle].set(0);
delay(1000);
remote_servo[armTop].set(0);
delay(1000);
state = "停止";
console.log("已恢復待機位置");
}
if(state == "搬貨"){
console.log("搬貨中...");
remote_servo[armTop].set(60);
delay(1000);
remote_servo[armMiddle].set(30);
delay(1000);
remote_servo[armBottom].set(30);
delay(1000);
remote_servo[armMiddle].set(0);
delay(1000);
remote_servo[armTop].set(0);
delay(1000);
remote_servo[armMiddle].set(30);
delay(1000);
remote_servo[armBottom].set(160);
delay(1000);
remote_servo[armMiddle].set(0);
delay(1000);
state = "停止";
console.log("搬貨結束");
}
```
---
## 程式解說
逐行講解程式意義。
----
```javascript=
window.state = "待機";
```
- 定義全域變數state,記錄手臂控制模式。
----
```javascript=
let armBottom = 5;
let armMiddle = 6;
let armTop = 7;
```
- 定義區域變數,分別設定為手臂==下方馬達==(armBottom)、手臂==中間馬達==(armMiddle)、手臂==夾子==(armTop)的腳位==編號==。
----
```javascript=
let idle_color = "黑";
let work_color = "紅";
```
- 定義待機模式(idle_color)與搬貨模式(work_color)顏色。
----
```javascript=
let F = DATA.colorF[3];
let B = DATA.colorB[3];
let L = DATA.colorL[3];
let R = DATA.colorR[3];
```
- 定義區域變數,分別設定為四個方向顏色的值。
----
```javascript=
console.log("手臂狀態: " + state);
```
- 顯示目前狀態資訊。
----
```javascript=
if(F == idle_color && B == idle_color && L == idle_color && R == idle_color)
{
state = "待機";
}
if(F == work_color && B == work_color && L == work_color && R == work_color)
{
state = "搬貨";
}
```
- 使用==顏色判斷來切換手臂模式==,當皆為設定的==待機顏色==時設為==待機==,皆為==工作顏色==時設為==搬貨==。
----
```javascript=
if(state == "待機"){
console.log("恢復至待機位置...");
remote_servo[armBottom].set(160);
delay(1000);
remote_servo[armMiddle].set(0);
delay(1000);
remote_servo[armTop].set(0);
delay(1000);
state = "停止";
console.log("已恢復待機位置");
}
```
- 當判斷狀態為==待機==時,依據設定好的步驟使用 ==```remote_servo[].set()```== 遠程控制手臂,並在==結束控制命令時將state設為停止==。
----
```javascript=
if(state == "搬貨"){
console.log("搬貨中...");
remote_servo[armTop].set(60);
delay(1000);
remote_servo[armMiddle].set(30);
delay(1000);
remote_servo[armBottom].set(30);
delay(1000);
remote_servo[armMiddle].set(0);
delay(1000);
remote_servo[armTop].set(0);
delay(1000);
remote_servo[armMiddle].set(30);
delay(1000);
remote_servo[armBottom].set(160);
delay(1000);
remote_servo[armMiddle].set(0);
delay(1000);
state = "停止";
console.log("搬貨結束");
}
```
- 當判斷狀態為==搬貨==時,依據設定好的步驟使用 ==```remote_servo[].set()```== 遠程控制手臂,並在==結束控制命令時將state設為停止==。
---
## 參數修改
為方便實作,以下會將範例程式中可修改的參數標示出來,進行實作時只需修改對應參數,並觀察結果即可。
:::warning
:zap: 詳細內建JS參數參考 - [內建Js參數及功能總覽](/s/wlfjvQBzRPCmJ8LCL3f2Fg)
:::
----
:::success
**let armBottom = ==x==;
let armMiddle = ==y==;
let armTop = ==z==;**
:::
- x,y,z分別代表手臂馬達在pca9685上的腳位,==0 ~ 7 對應至 1 ~ 8號腳位==。
----
:::success
**remote_servo[==x==].set(==y==);**
:::
- x代表手臂馬達的編號,可直接代入==編號==或是==使用變數==(armBottom,armMiddle,armTop)。
- y代表馬達轉角,範圍在 0 ~ 180間。
---
## 範例影片
{%youtube eHL7-Rvzj40 %}
<a class="btn btn-warning" style="width:100%;color:#333333;" href="/s/rVVZVo_rTg201uLszRsOYg" role="button"> 自動停車系統 **⇨** </a>
<a class="btn btn-primary" style="width:100%;" href="/s/d1hp6YXwTRuI71wx2ogw_g" role="button"> **⇦** 水平移動避障
</a>
{"metaMigratedAt":"2023-06-16T14:51:23.991Z","metaMigratedFrom":"YAML","title":"傑出的一手! - 遠程手臂控制","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"transitionSpeed\":\"fast\",\"theme\":\"league\"}","contributors":"[{\"id\":\"a1db0c29-d848-4070-be84-9191a2398ca8\",\"add\":8963,\"del\":3838}]"}