2016年4月30日 星期六

ROSA 系統開發 36 ─ 計畫用 Arduino Mega 控制 RWG Spider

http://4rdp.blogspot.com/2016/04/rosa-36-arduino-mega-rwg-spider.html

剛組好的 RWG Spider,加麥克風、藍牙、蜂鳴器、超音波模組、紅外線接收器
前文提到 FB 社團 P&B Maker Lab 已經改名為給氣狼聯盟 (Robot Wolf Group)」,因此 P&B Spider 順理成章改名為 RWG Spider,還有以前 ROSA 系統開發都是架構在 Arduino Uno 的板子上,用它來控制 Spider 6 x 2 綽綽有餘,這些天網友 Pizg 問我,如果要將蜘蛛擴展到六足三關節有辦法嗎?以 ROSA 系統架構設計沒問題,如果繼續沿用 Uno,18 顆伺服馬達再加上藍牙接收及發射,就把 Uno 所有的腳位全部用完, 無法再拓展其它功能了,因此需要另外尋找合適的控制板,個人評估結果 Arduino Mega 是不錯的選項,Mega 板的單價大約是 Uno 的 1.5 倍,但是腳位總數高達 70 個,絕對夠用。

雖然

2016年4月27日 星期三

訓練數學感 97 ─ 分幣比賽

http://4rdp.blogspot.com/2016/04/97.html

兩人輪流分幣,直到所有錢幣被分成獨立一個一個為止,沒辦法分幣的人就輸了,例如有三枚硬幣,第一個人分幣成 1+2,第二個人把兩個硬幣再分成 1+1,此時第一人已經沒辦法再分幣,他就輸了。

請問錢幣總數 99 個,由你開始分幣,如何分幣才能獲勝?

2016年4月23日 星期六

ROSA 系統開發 35 ─ 藍牙指令遙控

http://4rdp.blogspot.com/2016/04/rosa-35.html



到今天終於可以藍牙指令遙控,這也要謝謝 Daniel 的腦力激盪,讓我想到結合現有的進階紅外線遙控,雖說我想設計更複雜的 ROSA 指令,不過在實施複雜方法之前,先用這個簡單的方法也是不錯,可以很直覺操控機器人。

在進階紅外線遙控中,採用數值編碼分別對應不同的動作,用下面例子來說明,之前 ROSA 程式定義紅外線遙控器前進鈕內碼為13,右轉鈕內碼為15,手機藍牙可以發射 #13## 表示前進一步,機器人收到指令開始執行並回應 #13-0,#13 是被執行的控制內碼,以減號分隔剩餘多少指令待執行,等執行完畢再回應 *,這樣設計目的是因為有些機器人動作需要很久時間,這樣可以知道正在執行那一個動作,以及還有多少動作需要等待執行。發射端程式可以根據這些訊息回應決定適當再傳控制碼的時機,以免機器人動作操控異常。


手機或電腦發射端
機器人被控制端回應
前進一步控制
#13##

機器人開始前進並回應

#13-0
機器人結束動作並回應

*0
再前進一步並右轉控制
#13#15##

機器人開始前進並回應

#13-1
機器人結束動作並回應 (剩一組指令)

*1
機器人開始右轉並回應

#15-0
機器人結束動作並回應

*0

為了機器人動作遙控有及時回應特性,ROSA 系統設計採取強行插隊處理,也就是說如果有一堆指令排隊等待執行,此時傳入新的遙控指令進來,它除了會中止正在執行的動作外,也會清除原來排隊中的動作,改為執行新的動作命令,以確保及時遙控動作反應。因此,如果想要循序動作,主控端需要等待機器人排隊中所有指令執行完畢,回應 *0 後,主控端再傳送新的指令串為宜。

2016年4月20日 星期三

訓練數學感 96 ─ 社團學生人數有多少?

http://4rdp.blogspot.com/2016/04/96.html

某學校有六個社團,要求每位同學至少要參加三個社團,而每個社團最少要有四位同學組成,請問這學校最少有多少學生?

2016年4月16日 星期六

訓練數學感 95 ─ 多少個正方形?

http://4rdp.blogspot.com/2016/04/95.html


左圖中,總共有幾個正方形?

難度 ✩✩

2016年4月12日 星期二

ROSA 系統開發 34 ─ 發展回顧與展望

http://4rdp.blogspot.com/2016/04/rosa-34.html

P&B 6x2 Spider
網友 Pizg 請我代筆介紹 P&B Spider (四足機器蜘蛛六足機器蜘蛛) 貼文於蘇恆誠老師主持的台灣機器人公開社群 (Robot.tw),由於 P&B Spider 還是現在進行式,就從發展的故事開始談起吧。

如果沒記錯 2014 年 8 月是我和 Pizg 開始合作的時間,透過雙方的網誌而結識的 (芭蕉葉上聽雨聲研發養成所),他是一位資深的 Maker 並且擅長結構設計,因為個人善於韌體設計,因此委託我開發機器人的泛用控制系統,由於架構在 Arduino 之上,所以稱呼這機器人系統為 ROSA (Robot Operating System for Arduino),初期從 mBot 開始發展,經過多次初期規格討論後,兩人就利用業餘時間獨立進行機構與韌體設計,並且歷經多次測試修正才有現在的成品。

現在已經有很多輪式機器人,我們想做些不一樣的機器人教具,所以設計簡易的仿生機器人平台,讓學子們未來可以利用它再搭載自己想設計的東西,另外受到 LASS 開源盟主哈爸的啟發,利用蜘蛛載著 MeArm,以一片 Arduino Uno 同時驅動 16 顆伺服馬達,可見只要掌握關鍵技術再加上良好的系統設計,都可以把別人口中的不可能化為可能。

P&B Spider 的設計思想,

2016年4月9日 星期六

ROSA 系統開發 33 ─ 進階紅外線遙控

http://4rdp.blogspot.com/2016/04/rosa-33.html

紅外線遙控器雖然按鍵數量有限,但是仍然有變通方法可以擴充到上百種操作功能,先來看看這是怎麼辦到的?

以 KEYES 遙控器為例,它有數字鍵 0 ~ 9,可以用數字編號來擴展功能,但是平常一按鍵就執行動作,那要如何執行數字編碼的功能?這裡使用 # 鍵來區別,例如依序按下 #2#11##,第一個 # 表示指令模式開始,中間的 # 表示分隔前後指令號碼,最後 ## 結束指令模式並開始執行,這個指令串表示先執行 2 號命令,執行完畢後再繼續執行 11 號命令,至於甚麼是 2 號、 11 號命令,端看程序碼怎樣定義就怎樣執行。

為了 # 指令模式,原來的 # 按鍵功能就無法執行蠻可惜的,因此 ROSA 追加遙控器長按住一秒鐘操作,這樣可以為 # 按鍵長按住一秒設定執行原來 # 鍵蜘蛛站立功能。另外還預留重複鍵操作功能,也就是按鍵一直按住不放,按鍵長按超過一秒後,每 0.2 秒重複執行功能。

為了可以執行一串 # 命令,ROSA 追加了 PIPE 機制,讓佇列命令可以先進先出,每執行完一命令可以接續執行下一個命令,直到所有佇列命令全部執行完畢為止,不過要記得每一個命令。

另外命令程序中還新增 GOSUB 指令,可以執行副程式,也就是可以把重複的動作集結在一起,這樣能夠節省程式碼空間,不過不要忘了副程式的結尾要加 RETURN 或 STOP 指令,因為有副程式,所以 ROSA 系統要加入 STACK 機制,讓副程式執行完成後,可以回到主程式去。

2016年4月6日 星期三

訓練數學感 94/演算法訓練 12 ─ 撿拾硬幣

http://4rdp.blogspot.com/2016/04/94-12.html

圖片引用 芭蕉葉上聽雨聲部落格
看到網友 Pizg 貼文:如何撿拾最多的硬幣,覺得這是一個非常不錯的演算法訓練的題目,因而收錄。

有一個矩形區域,格線中放有硬幣(圖中紅色的點)。
機器人開始是在區域的左下角落,他的任務是在穿越到右上角落的過程中盡可能撿起最多的硬幣。
然而,在每一個步驟中,限制機器人不能退後,只能往右或往上移動。
圖中藍線表示的最佳路徑,也就是機器人可以拾取最大數目的硬幣。

請試寫一程式求解某已知圖案之最佳路徑。

2016年4月2日 星期六

ROSA 系統開發 32 ─ 通訊回應

http://4rdp.blogspot.com/2016/04/rosa-32.html

前文提到我要建一個程式庫以字元陣列的方式,取代 C++ 字串變換,目的確保系統運作穩定,程式碼如下:


// (C) 2015-2016, Bridan Wang, CC BY-NC-SA 3.0 TW 
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

#include <SoftwareSerial.h> byte echo_index = 0; char echo[64] = ""; char gIrCommandString[16] = "Connect to "; byte gIrCommandIndex = 11; SoftwareSerial BT(13, 3); // pin 13 connect to BT's TX // pin 3 connect to BT's RX void BT_BEGIN() { BT.begin(57600); // BT 使用 Baud Rate 57600 } void REPLY(void) { if (echo_index != 0) { echo[echo_index] = 0; BT.println(echo); echo[0] = echo_index = 0; } } void ECHO_STRING(char *st){ byte i; for (i=0 ; i < 16 ; i++) { if (*st == 0) break; else echo[echo_index++] = *(st++); } } void ECHO_CHARS(char *st){ do { echo[echo_index++] = *(st++); } while (*st != 0); } void ECHO_INT(int jj) { byte kk; byte ii = 1; if (jj >= 10000) { ii = 5; } else if (jj >= 1000) { ii = 4; } else if (jj >= 100) { ii = 3; } else if (jj >= 10) { ii = 2; } echo_index += ii; kk = echo_index; do { echo[--kk] = '0' + (jj % 10); jj /= 10; } while (--ii != 0); } void setup() { char i = 8; BT_BEGIN(); // BT open delay(3000); // wait for BT to connect. ECHO_STRING(gIrCommandString); ECHO_CHARS((char*)"ROSA,V"); ECHO_INT(i); REPLY(); }