2007年6月27日 星期三

不再惠顧機械人王國!

哎~一時大意,再一次衰在機械人王國手上 (T_T)...。事緣大前天心血來潮,想訂購 Robot Life No.3-6 期雜誌,於是在網上搜尋購入的地方;最終都只找到機械人王國。但由於王國的網上商店沒有日本以外的地區選擇,所以我便發電郵查詢郵寄到本港的事宜。王國在第三天便給了我一個回覆,能把我要的東西寄到香港。於是我便立即填妥資料購買 Robot Life No. 3-6 以及 Robo-one 11th DVD。今天,我在網上檢查郵件時,發現總數是 11,188 yen。本來都沒有發現問題,但再細看後,才發現運費是 6,000 yen!天呀!我買的東西只是 5,188 yen!運費比我的東西還要貴!而且又沒有跟我確認使用哪種郵寄方式!對上一次發生同樣的情況,我還以為是樂天收得貴,現在才發現原來是王國本身收得貴!所以,我決定不會再向王國訂東西回香港!哼!今次真是過於心急,才令自己白白損失了 $400! OTL

2007年6月24日 星期日

二足步行巴斯光年

今日帶了小海澄去 Toysrus 時,很驚喜地發現了一件新的玩具!它就是「二足步行巴斯光年」,而且是遙控的!它的價錢為 HK$348。我感到驚喜一來是因為本身我很喜歡巴斯光年,二來是我很喜歡 Pixar 的作品,三來是我很喜歡二足步行機械人,四來就是巴斯光年上身大下身小都能平穩步行,而且足部是會動的,所以使我留意到它的存在。當時很想買一台回來,但如果只當玩具的話,價錢就貴了點;而玩具本身對我開發機體又沒有甚麼幫助,最後都沒有買...。

2007年6月19日 星期二

PlayStation 手掣研究(七)




之前在研究 PlayStation 手掣的事情上,我找不到硬體及軟體中的錯誤;於是乎,我把焦點放在「確認第一個訊號是正確」的題目上。PlayStation 手掣的通訊方式是 Async. 模式,亦即是說通訊的一方為 Master,而另一方則為 Slave。在這裡,Master 是 ATmega-128;Slave 則是 PlayStation 手掣。

有了這個概念後,我便量度 SEL 及 CLK 這兩隻最先由 ATmega-128 發出的訊號,竟發現訊號本身已經發生問題!正常來說,SEL 是最早被拉低,也是最遲被拉回的訊號;它所佔用的時間理應是包含著 CLK 的,但事實卻沒有發生。翻查過 ATmega-128 的線路圖之後,發現我所用的 PORTE 原來已經在主板上作為 RS-232 通訊而被使用了。這樣,我唯有改用完成荒廢的 PORTB 來使用,可惜情況仍然依舊。經過向 Dr.Victor 請教之後,我把源碼發了給他,幫忙看一下代碼有沒有問題,發現了我現時控制端口的寫法有點問題。他把經驗告訴我後,我把程式修改了,情況便有好轉。現在的 SEL 真的是包裹著 CLK 了。下一步便是繼續循這個方向了解各訊號的情況。

2007年6月18日 星期一

Amigo 03 踏出第一步



由於 PlayStation 手掣研究方面一直都沒有進展,於是乎我便拿出 AmigoCOM 來替 Amigo 03 編排步行動作。由於現在使用了 232 步,使得運行速度慢了起來。這是因為之前動作做得太快,所以在每步之間加入了延遲的代碼;假如把它的數值改小,甚至移除,動作便會立即快起來。

2007年6月17日 星期日

全港大專生機械人大賽 2007(二)

今日帶了老婆及小海澄去了數碼港參觀「全港大專生機械人大賽 2007」,也為網友 Rex 打氣。現場氣氛很好,而且觀眾也很多;我四圍走訪了各家大學的攤位,拍攝了她們的機械人。大家的設計也各有心思,但其中一間大學的設計十分好,她們使用由內擴張的方式去提起物件,十分有創意,而且機械人也十分靈活。

而到阿 Rex 比賽時,不知道是不是緊張,導致他們給裁判判他們偷步,幸好沒有受罰。不過,他們的自動機械人就在比賽中失靈,唯有靠 Rex 控制手動機械人得分!最後,他們以 4:0 勝出。

在觀看的途中,有兩位年青人跟我搭訕,他們也是機械人的愛好者。我估他們應該是從國內來到現場參考的,事關他們除了用廣東話之外,還使用國語溝通。

2007年6月16日 星期六

PlayStation 手掣研究(六)


聽取過 Keith 的意見之後,我做了一個簡單的測試,結果似乎有點眉目。我分別把示波器接線接上 ACK 訊號線及 DAT 訊號線。這兩個訊號都是由 PlayStation 手掣發出來的。之後,我分別測試了三個情況:

1) 不接 +3.3V 電源,而 ATmega-128 跟 PlayStation 手掣接上同一個 GND
2) 不接 +3.3V 電源,而 PlayStation 手掣完全不接 GND
3) 接上獨立的 +3.3V 電源,而 PlayStation 手掣接上 3.3V 電源的 GND

結果如圖所示,情況二及三都能接收到訊號,而情況三的效果較佳。不過,似乎兩者的訊號,其電力都十分低,不足以讓 ATmega-128 識別出來...。今次連 Victor 也弄錯了,難怪我搞了這麼久也搞不好。對於我這個電子門外漢,看來這是一個頗為困難的題目,要成功的話,還有很長的路要走。

ATmega-128 的 16-Channels PWM 輸出(八)

清晨六點,我被小海澄吵醒了;在服侍她過後,我便繼續嘗試把 PlayStation 手掣的問題改正,可惜仍是徒勞無功...。於是,我唯有處理第二個錯誤:PWM 輸出。今次比較順利,不消十五分鐘便把之前的問題改好了。導致問題出現的地方,不單只是 Char(現已改為 long),還有就是邏輯的問題!現凡在 RS-232 讀取資料後,都會停止對 PWM 的運算,然後等一會,當 RS-232 再沒有數據傳送到 ATmega-128,那才開始新一輪的 PWM 運算。這樣,問題就解決了。

2007年6月15日 星期五

PlayStation 手掣研究(五)



哎呀...搞了幾天仍然沒有進展!不知為何,我已多次確認線路無誤,也多次確認代碼沒錯,程式仍然無法正確讀取數據!連線路中那個 +3.3V 接口是否真的需要接上 +3.3V 也都試過,所有疑點都沒有問題;也試過用充足的 +5V 驅動都沒有線索,今次真的很迷失!我唯有用示波器檢查各條線的訊號,得出來的竟然只有 SEL 及 CLK 有訊號!偏偏只有這兩條由 ATmega-128 產生訊號的線才有訊號,其他的線甚麼也沒有,真奇怪...。

2007年6月13日 星期三

全港大專生機械人大賽 2007


今個星期日,在數碼港將會舉辦「全港大專生機械人大賽 2007」。今次更是我們的網友 REX 參賽的日子;我不知道當日能否出席,所以在這裡先祝賀 REX 及其小隊「馬到功成!成功奪寶」!

2007年6月12日 星期二

PlayStation 手掣研究(四)


放工去了鴨寮街買了價值 HK$10 的 500 支 3.3K 電阻一包。回家後便立即著手轉換板的焊接工程。完成後,我首先試試把 3V 電源,透過轉換板供電給手掣,結果成功開動。但當我嘗試供給 5V 電力時,手掣就沒有開著。之後,我把轉換板插上 ATmega-128 的新接口,並打開 Terminal 來測試;發現手掣能開著,但 ATmega-128 就無法正確地跟手掣進行溝通!這有待找出原因...,但現在來看,不知 Debug 從可入手...。>_<

另外,今日也順道逛了黃金商場一趟,了解一下無線 PlayStation 手掣的價錢。由雜牌的 HK$140 到 LogiTech 的 HK$268 都有。本來想先買下來,但想清楚都是成功製作出轉換板才買方為上策,嘻嘻~

2007年6月11日 星期一

ATmega-128 的 16-Channels PWM 輸出(七)


現在 ATmega-128 的 PWM 輸出模組已經改好,步數由 180 改為 255 步。但由於 232 以外的數值,其 PWM 長度已經超越 2.5ms,所以不計算在內。實際上只有 232 步,已經很夠用。得出這個數字,是由於懶的原故,以及沒有示波器去量度準確的數值。不過,還有一個問題花了我三天也解決不了!當數值跳得太過時(例如由 0 到 200 ),由於本身使用 char 的關係,導致 PWM 輸出到某個位置時,會反彈到先前的位置,增長一部份後再直接跳到最終位置!基於以上特性,很容易便意識到是跨越 128 時的問題。可是,我把數值先放到 16-bits int 或 32-bits long 都沒有改善...。

至於 PlayStation 手掣方面,程式部份已經編寫完成,現在只欠 3.3K 電阻三顆!明天放工後會去買回來,到時便可以著手製作硬件部份!希望一切順利!

2007年6月10日 星期日

PlayStation 手掣研究(三)


由於睡得不好,所以一早便起床。除了可以照顧慣了早起的小海澄,也能讓太太睡多一會,而且也可以著手 PlayStation 手掣的研究。按照參考文件所示,我遂一把各個針腳標記好,方便日後不會搞錯。之後,我作了一個簡單的測試,就是把 3.3v 電力供給手掣,看看針腳是不是正確。我找來了 DualShock 2 手掣進行測試,是因為它有一顆 LED,能讓我識別出是否真的有電力供給手掣。由於測試非常簡單,所以一試便成功了。

以下是 PS 手掣中,各針腳的功能:
(1) Data
(2) CMD
(3) +7V
(4) GND
(5) +3V
(6) SEL
(7) CLK
(8) 沒有接駁
(9) ACK

(以手掣的插頭面向自己,亦即是插頭內的針也面向自己,插頭上方下圓,從左至右看)

2007年6月9日 星期六

昂貴的零件


放工後,我去了鴨寮街買製作 PlayStation 手掣用的電子零件,當中只有一包五芯的插座及兩顆 74LS06 的 IC,價值 HK$27,真是超貴,原來一顆 74LS06 要 $6!簡直搶錢!不過,沒有辦法,我要趕著去新屋拆傢俬...。回家後,我發現兩年前買下了一顆 74HC08 及一顆 74HC32,不知道這兩顆 IC 是不是跟 74LS06 有相同的功效呢?!今天很晚才回家,沒有時間製作 PlayStation 手掣的電子線路,希望明天有時間吧!但明天要出去跟我那個目中無人的外父飲茶,又要花掉很多時間... OTL

2007年6月8日 星期五

PlayStation 記憶卡研究

最近研究開 PlayStation 手掣的訊號格式,也順便研究一下記憶卡方面的格式,原來讀取資料時是以 Frame 為單位,一個 Frame 就等如 128 個字符。要是把機體的動作資料儲存在記憶體時,效用可能不錯!而且廢物利用也不錯~

2007年6月7日 星期四

ATmega-128 的 16-Channels PWM 輸出(六)

昨晚跟 Dr.Victor 通過電話,他傳授了我畢生的 Servo Controller 絕學,使我受益匪淺。今天,本來我沒有打算編寫機體程式,但我終於都忍不住了心癮,把 Amigo 03 的 PWM 輸出程序換了終極的高速結構!根據這個結構,我只是輕輕的修改,便可以得到 180 步的效果,甚至更多!但我認為 180 步已經夠用。最多我只會用上 360 步,再多也是沒有意思。代碼編譯好了,沒有任何錯誤或警告,於是便在 ATmega-128 上跑。可是,試了幾次,都無法輸出到正確的訊號。翻看了代碼幾遍,結果仍是毫無頭緒...,可能是我今天的運程如此,所以還是留待明天才解決。

2007年6月6日 星期三

PlayStation 手掣研究(二)

在網上分別看過一個日本代碼以及一個外國代碼後,發現要讀取 PlayStation 手掣的訊號並不困難!其中以外國的那個代碼更是 ATmega 系列的,大部份的代碼都可以直接拿來使用。但相比起日本那個 CQ7144A 版本,則日本方面的代碼處理嚴謹得多!原本今日會從 Victor 手上拿到 74LS06,但最終都取消了,唯有留待星期六放工後到鴨寮街購買,才做硬件,也順道到黃金商場購買多一條 PS2USB 線。現階段就找時間先做軟件吧!

2007年6月5日 星期二

共同目標

我發覺現時香港的機體開發者造出來的機體,都有各自的需要及功能,但似乎沒有一個共同目標,就算他日有多一些的機體,把她們放在一起也好像不知可以做甚麼。例如像 Robo-one 般的格鬥比賽就辦不來,因為有些機體(Amigo 03)是沒有手的,又何來格鬥;而有手的,又好像沒有準備格鬥的條件。假若,我們都有一個共同目標(如:筋肉雷台),那麼大家所開發出來的機體便會向著有關功能邁進,到時大家會有更多的共通技術的交流,也可以吸引更多機械人發燒友的參與。

2007年6月4日 星期一

PlayStation 手掣研究(一)

今天沒有心情工作,所以想了一下機體方面的事情。我在想:「現時已經可以利用 AmigoCOM 來做出一些動作,下一步就應該把動作資料存入 ATmega-128 之內,可是存了後又如何執行?除了可以用 AmigoCOM 來達成之外,也可以是開機便自動執行。但是我不想這樣做,我希望可以人手控制,反正遲早也要做這個部份。那麼,下一步就應該是研究『操控』方面的事情。」。較早前,我已經購入了關於 PlayStation 手掣的零件,方便日後著手「操控」時可以拿來用。我想也是時候了!



參考過「作業日誌」網頁,如利用 5V 的 MCU 接駁 PlayStation 手掣,便需要在其中三條線中加入一顆叫 74LS06 的 IC,我只知道它是 Open Connector 來,不清楚它的作用,應該是加強訊號之用,但線路還接有一個 3.3V 上拉線路,所以搞不清它的作用。另外,我也不知道如何達成 5V 轉 3.3V 的線路,這個需要問一問 Dr.Victor。



我相信線路不是困難的,最困難的應該是訊號的溝通處理!參考過藤田先生對於 PlayStation 及 PlayStation 2 手掣的研究文件後,我真的一頭霧水,內容十分充實但深奧,對於沒有電子知識的我是很難理解...。相信要製作出 PlayStation 跟 ATmega-128 溝通的軟硬體,想必要花很多時間在此。



以下是已知的 PlayStation 手掣的特性:
.手掣的指令碼為 0x01,記憶卡為 0x81
.數據的傳輸順序為 Bit 0 -> Bit 7,即是說 0x4A 就等如 01010010
.100us 以內沒有收到 ACK- 訊號,意味著手掣沒有連接
.時脈間距為 250KHz,亦即是 4us
.若使用一出四分插,時脈間距可以增至 1 MHz
.最後一個 Byte 的通訊,不偵測 ACK- 也沒有問題
.ACK- 訊號長度最好是 2us 以上
.SEL- 跟下一個 SEL- 訊號的間距大約是 16ms
.記憶卡的讀寫工作會在手掣訊號的空檔期間執行

2007年6月3日 星期日

程式中出現的「蟲」

今日心血來潮,把 iRobot 關於 PWM 控制的方法套用到我的 Amigo 03。正當我很快地改好程式並執行之際,也順便打開了示波器工具看 PWM 的輸出。我滿心歡喜地看成果時,竟發現了一個錯誤!當 PWM 數值大於 128 時便沒有訊號產生!原本這個問題很容易解決,是「有負數」及「無負數」的問題;可是,這個考慮已經在編寫程式時已經加入,為何仍然會發生?!難怪之前在測試時,有些角度是機體做不出來!翻看代碼以後,只有一個地方能產生錯誤!就是:

(pServoData[7] >= iLoop)

但問題是「如何改善?」,我真的不知道...;可能要用上匯編語言吧,這個不成問題!但那裡可以找到各個 ATmega-128 的指令及說明呢?!

~~~~~~~~~~~~

我憑自己的努力,找出了一些 ATmega-128 的機碼,也找出了以下一代碼的機碼:

iPortData = ((iPortData< <> iLoop));

89 81 99 27 88 0F 99 1F 8C 8B 8A 81 9B 81 FC 01 [37] 96 90 81 1B 8A 8C 81 89 17 10 F4 81 E0 8B 8B 8C 89 9B 89 89 2B 89 83

這段機碼實我令我驚訝!驚訝的是為何要用這麼長才做到少少的工作!難怪解像度這麼低!

追查了一會,發現問題並不是由「有負數」及「無負數」所造成,而是不知為何由 rs0_getc() 讀取的數值會產生錯誤:把 128 讀成 0x3F、把 129 讀成 0x00、把 130 讀成 0x00...!基於讀取回來的數值已經錯誤,理所當然地 PWM 的輸出會不正確。

~~~~~~~~~~~~

我再一次追查,發現 rs0_getc() 原來不是錯誤的來源!我利用 AmigoCOM 來作為除錯的工具,發現當要發出的數值是大於 128 時,ATmega-128 便會收到錯誤的數值,於是乎我便向 RS232 的溝通部份埋手,最後發現 ATmega-128 內的代碼是沒有問題,反而是 AmigoCOM 才是真正的兇手!由於我是使用 Chr(iValue) 的,這個程序會經過 Windows 內部的字符轉換部份,使得數值出錯。解決的辦法是利用 Array 以及另一個 Write 程序來處理(我是使用 SerialPort 類來處理 RS232 的部份)。

以下是新的改動所造出來的效果:
數值 30 = ~0.5ms
數值 150 = ~2.5ms
範圍 = 150 - 30 = 120
解像度 = 180/120 = 1.5 度
同時支持的馬達數量 = 8 隻
現時支持的馬達數量 = 16 隻
最大支持的馬達數量 = 32 隻

2007年6月1日 星期五

機體新聞



最近發現本地一本電腦雜誌(從 77 期)開始也報導機械人的消息,看來香港人也越來越對機械人有興趣了!