:我們要做一個讓觀眾可以動起來的作品
於是經過了半年的努力,安尼就這樣誕生了
安尼維爾 團隊成員:
左起:羅大有 吳羿璉 洪羕喆 簡令謙
Who Is Any?
安尼(Any)是一個會自動跟隨體驗者的都市更新機器人
在與安尼配對成功後,安尼會跟隨著你到處行走
當你選定好一個地點,可以停下腳步將鏟子輕輕地往下壓
平板螢幕上的虛擬城市便會立即產生一棟隨機的建築物
結束體驗前,須關閉鏟子的電源放回安尼上並隨地停放安尼,以供下一位觀眾參與互動。
體驗流程圖
這篇文只會介紹安尼控制系統的部分
控制系統
先來一張Topology
其實就是3個東西在運作
- Raspberry Pi 樹莓派
- 負責控制安尼的跟隨方向、速度
- 避開障礙物動作的切換
- ESP8266(NodeMCU)
- 判斷控制系統的跟隨啟動與否
- 當觀眾按壓鏟子,會透過HTTP Requests
觸發 «ARrow» 隨機產出一棟建築物
- «ARrow» - An iPad AR APP
- 一款AR的應用程式
在體驗過程中會隨鏟子生成建築物,也能同時瀏覽到«ARrow»畫布上的創作內容
- 一款AR的應用程式
UWB 跟隨模組
全名 PDOA-UWB 定位系統
(phase-difference-of-arrival assisted ultra-wideband)
分為兩個元件:
-
標籤(Tag)
被嵌在體驗者的那端
經配對後,會主動發送位置訊息給基地台(Base)
-
基地台(Base)
透過板子上的兩個PCB天線接收鏟子上的標籤(Tag)訊號,再經由UART通訊介面傳送給控制板進行運算,判斷裝置跟隨的方向、速度
基地台(Base)接收到的數據有兩種格式:
- JSON
- Hex
在本機校正跟隨模組時,一定要先調回JSON格式
寫控制程式用的是Hex格式
位元欄 | 位元組數 | 意思(低位優先) |
---|---|---|
Head | 1 Byte | 固定為0x2A |
Length | 1 Byte | <sn-Acc_Z>的長度 |
SN | 1 Byte | 序號 |
Address | 2 Byte | Tag Address |
Angual | 4 Byte | 角度(degree) |
Distance | 4 Byte | 距離(cm) |
F_Path_Power_Level | 4 Byte | 第一條路徑訊號強度 |
RX_Level | 4 Byte | 訊號強度 |
Acc_X | 2 Byte | Tag X軸加速度 |
Acc_Y | 2 Byte | Tag Y軸加速度 |
Acc_Z | 2 Byte | Tag Z軸加速度 |
Check | 1 Byte | 校驗位(XOR) |
Foot | 1 Byte | 固定 0x23 |
這是Serial.println 抓到的數據,可以看到他們的規律
再利用抓到的角度、距離等數據來控制步進馬達該行走的步數
避障系統
TOF10120 雷射測距感測器
為了讓測距的結果更精確,使用了 ToF (Time of Flight) 飛時測距技術的感測器,降低了感測器受目標物體的反射率干擾
這種感測器是利用發光二極體(LED:Light Emitting Diode)或雷射二極體(LD:Laser Diode)
發射出紅外光,照射到物體表面反射回來
由於光速(v)已知,可以利用一個紅外光影像感測器,量測物體不同深度的位置反射回來的時間(t)
利用簡單的數學公式就可以計算出物體不同位置的距離(深度)
TOF10120有兩種控制介面
- I2C
- UART
由於Raspberry Pi上唯一的UART介面已被UWB跟隨模組佔走了
安尼的避障模組採用I2C Bus控制
佈置
一組安尼共使用了六個TOF10120
分別是R, FR, MR, ML, FL, L
安尼會依據所讀取到的距離數值來判斷避障的方向、動作
避障的動作分為:
- 左/右前轉
- 左/右後轉
- 自轉
開發過程
控制板的選擇
Arduino
在測試的第一階段,我們選用Arduino作為控制板
搭配Arduino的第三方Library - AccelStepper 控制步進馬達
實驗後發現,步進馬達的轉速很仰賴控制板的的運算速度
而Arduino的處理效能無法達到我們的期望,使得步進馬達的轉速受到限制
- Arduino UNO
Clock Speed: 16MHz - Arduino Due Clock Speed: 84MHz
即使換到 Arduino Due,運算的速度是有明顯提升
但轉速還是不夠快,大約只有90RPM而已
Raspberry Pi
為了提高運算效率,以及未來可能的其他功能擴充
我們也將控制板升級為樹莓派
樹莓派處理器的Clock Speed有1,500MHz(1.5GHz)
這個版本的控制程式是用Python撰寫的,我們也成功地將AccelStepper移植到Python運作
參考: https://github.com/alangibson/steppyr
然而,又遭遇到了另一個困境…
CPython的執行緒(Thread)有全局解釋器鎖 Global Interpreter Lock (GIL) 的問題
無法發揮樹莓派的多核心處理效能
也就是,無法同時進行運算、執行控制兩顆步進馬達的功能
為了解決此問題,我們將AccelStepper改使用C來撰寫
這是一大工程,我們也成功解決的馬達轉速受限的問題!
-> https://github.com/yilianwu/steppyr/tree/cpp
訊號
有時候車子會跟隨到一半沒有反應,感覺訊號斷斷續續的 後來發現,因為戶外路況顛簸,車體在行走的時候會震動、搖晃,造成跟隨模組訊號線的接口接觸不良
我們將樹莓派的GPIO升級成這種端子台,穩定訊號
UWB跟隨模組的基地台(Base)也從原本的綠色裸板升級為有外殼的版本
訊號線也從杜邦線改為PH 2.0的端子接頭
控制程式的模式切換
程式的架構分為4個模式:
- STANDBY : 安尼靜止不動
- FOLLOWING : 安尼依體驗者鏟子上的標籤(Tag)來判斷跟隨的方向、速度
- SPINNING : 若體驗者短時間內大幅度變換方向,安尼會自轉來保持正面朝向體驗者
(由於基地台的天線只有單一方向性,若背對安尼,會造成數據的錯誤判斷) - AVOID : 避障感測器若偵測到有障礙物,會執行避障動作
關係圖如下所示:
與«ARrow»的整合
ARrow是我們畢展另一個組別的作品 - 一款可以讓你自由創作的畫布 AR APP
安尼的iPad安裝了ARrow的特製版本,一旦鏟子被體驗者往地面輕壓
就會立即在ARrow的AR世界中隨機產出一棟建築物
建築造型參考臺灣的多元建案設計
建築類型包括商辦大樓、飯店、集合式住宅、博物館、宗教建築等
並賦予每一棟建築專屬名稱
ARrow是用Unity開發的應用程式
我們在鏟子裡放置一塊 NodeMCU,讓ESP8266 (HTTP Client)能在鏟子被按壓時
透過 HTTP Requests 與 Unity (HTTP Server)溝通
Unity (HTTP Server)
在Unity新增一個HttpListener
Port是5555
如果接收到Client的路徑為/build
就產生建築物,並且回傳202
ESP8266 (HTTP Client)
NodeMCU會讀取霍爾感測器的數值
在Button Down的時候會傳送http://192.168.0.3:5555/build
給Server
並且GET
Server的狀態碼 (HTTP StatusCode)
電系構成
安尼主要的電力來源是24V 16800mAh的鋰電池
兩顆步進馬達、LED燈可直接接上電池使用
Raspberry Pi、避障模組、跟隨模組、NodeMCU、繼電器
則須在接上24V - 5V的降壓模組才能使用
這是安尼艙門內的線路:
SOS緊急斷電系統
我們在展期臨時新增了一塊NodeMCU板
寫了一個可以遠端控制馬達電源的開關
這樣在展覽遇到突發狀況需要緊急斷電時,只要拿出手機就能直接操控
網路
所有的控制元件都必須連上網路才能互相溝通
需求
«安尼維爾»總共有4種裝置需在同一個網域下運行:
- Raspberry Pi
- ESP8266(NodeMCU)
- iPad
- 筆電
而且這些裝置的活動範圍涵蓋了整個場域(安尼可以跑遍整個四四南村)
顧及預算的限制,我們決定使用4G SIM卡的網路分享器
無線網路分享器通常有兩種頻率波段可以選擇:2.4GHz、5GHz
由於我們展覽的場地在高樓大廈林立(辦公室)的都會市中心,選用5GHz的網路會比較不容易受到干擾
其中NodeMCU板只能使用2.4GHz的網路
所以我們需要可以同時發送兩種頻率波段的網路分享器!
選擇
粗略的比較兩家網路分享器租借公司
租借場商 | iVideo | Wi-Ho! 特樂通 |
---|---|---|
廠牌 | HUAWEI | D-Link |
型號 | 5573 | DWR-933 |
電信公司 | 中華電信 | 遠傳電信 |
Wi-Fi 頻率波段 | 只能2.4GHz、5GHz 兩者二選一 | 可以同時發送2.4GHz、5GHz兩種頻段的網路 |
月租租金 | NTD$640 | NTD$690 |
最後選擇了D-Link DWR-933
他還有管理介面可以設定SSID
、passwd
之類的東西,還不錯用
username:admin
passwd:預設空白
記得歸還的時候再幫設備Reset,才不會讓櫃姐驚慌失措XD