2009年2月11日 星期三

何謂循跡自走車?

循跡自走車是一個具備自主運動競速型輪型機器人,在循跡競速的過程中,利用光感測器計算出來軌跡路徑位置,透過微控制的控制讓自走車可以持續地在設定的軌跡路徑上快速地行駛。


循跡自走車示意圖



第一次參加和春盃比賽即獲得冠軍




循跡自走車的製作包含了軔體演算法程式、硬體電路設計與實作以及運動控制程式等,實在是一個非常好的嵌入式整合機電系統的學習專題。因此,在詳細閱讀國內外參賽者部落格網站所提供的資訊後,我們由2006年十二月起開始製作一個「能參與國際競賽並取得好成績」的循跡自走車,並且能因此「落實技職教育在本校學生實作能力上的提升」。


目前使用中的競速型自走車




我們的投入也獲得學校大力的支持。接下來,我們希望能透過教育部與學校的協助,參與國際競賽拓展視野,並努力進ㄧ步提升相關的技術整合能力!



6 則留言:

  1. 原來爐此,謝謝老師...

    有幾個人找上我這邊,都說他們超羨慕又忌妒雙倍時間的啦

    [版主回覆02/12/2009 16:20:42]怎麼了嗎?
    我只是一個小咖而已啊

    回覆刪除
  2. 我有一個疑問想請問一下!!
    我看你做的循跡自走車在CNY70部分沒有設計可以調整敏感度的電路,難道不需要嗎??
    你的車子不會受現場的光線影響(太亮或是太暗)造成誤判或是無法判斷嗎??
    [版主回覆01/16/2010 00:06:22]因為我們設計的電路基本上都有驗證過,另外環境的影響都是利用軟體上處理的,因為利用硬體的話太沒有一致性了,完全是要靠感覺,所以軟體上的處理會比硬體上來得還要好,我是這樣認為了。

    回覆刪除
  3. 軟體上的處理是指程式編寫嗎??
    如果是程式撰寫的話可以請問您撰寫的方式嗎(程式撰寫概念)??
    我是使用CNY70透過ADC轉換取得數值做控制!!
    [版主回覆01/17/2010 22:31:44]是指程式沒有錯,利用ADC 轉成數值後,需要做處理,假設CNY1 和CNY2 是線性的,那麼你就可以利用線性內插來做,可是因為CNY70的曲線不是線性的,你可以利用2次曲線內插來做。利用內插法求得線在車子的那個位置,再利用PD 控制。

    回覆刪除
  4. 了解了謝謝!!我在試試看!!
     

    回覆刪除
  5. 請問一下
    我把CNY70的數據數值化成16進位數值後,從沒感測到到感測到黑線會是0x00至0xff,可是如果是cny1與cny2連在一起來感應,先碰到第一顆在碰到第二顆,數值會是cny1    0x00->0xff->0x00  接著cny2數值也是會從0x00->0xff->0x00,我的做法是這樣,我把前次數值減掉現在數值大於一定的數值(雜訊)後開始做處理,如果相減後數值是正的表示開始靠近這顆CNY70,負的表示遠離這顆CNY70,然後把取得的數值分成三段,如;大於0x00小於0x70為一個數值,大於0x70為一個值,用這樣的方法來知道車子的位置,可是問題是code會很長執行速度也比較慢,不曉得有沒有甚麼方法可以解決或是把數值分得更細把位置做的更精準?
    您說的「那麼你就可以利用線性內插來做,可是因為CNY70的曲線不是線性的,你可以利用2次曲線內插來做。利用內插法求得線在車子的那個位置」我一直想不通不曉得有沒有範例,謝謝!
    2次曲線做內插我想不懂!!可以教我一下嗎??謝謝
     
    [版主回覆02/04/2010 14:26:48]這是網路上找到的內插法,給你做參考
    http://library.hwai.edu.tw/science/content/1986/00120204/0017.htm
    你的第一段其實我不是很懂,可以再清楚的描述一下嗎?
    謝謝

    回覆刪除
  6. 我的意思是說我將CNY70的電壓變化轉化成8bit的16進位數值(利用RS232通訊將數值傳志超級終端機),當CNY開始靠近黑線時數值回從0x00->0xff再從黑線離開時會是0xff->0x00,假如我現在有兩顆cny黑線從左邊到右邊
                  cny1                                   cny2
    0x00->0xff->0x00        0x00->0xff->0x00
    ↑第一顆cny70的數值      ↑第二顆cny70的數值
    我現在的做法是將這次的數值與前是數值做相減,如:
    if(value-value_old>x){              開始做動作,x數值為雜訊
        if(value>value_old){             數值相減為正表示開始接近CNY70 
            if(0x00<value<0xfa)         當確定不是雜訊後把value數值做分段
                P=1;                                      表示車子的位置
            else if(0xfa<value<0xff)
                P=2;
        }
        else if(value<value_old){      數值相減為負表示開始遠離CNY70 
            if(0xfa<value<0xff)
                P=2;
            else if(0x00<value<0xfa)
                P=3;
           }
           value_old=value;
    }
    if(value2-value2_old>x){            第二顆cny70
        if(value2>value2_old){             數值相減為正表示開始接近CNY70 
            if(0x00<value2<0xfa)         當確定不是雜訊後把value數值做分段
                P=4;                                         
            else if(0xfa<value2<0xff)
                P=5;
        }
        else if(value2<value2_old){      數值相減為負表示開始遠離CNY70 
            if(0xfa<value2<0xff)
                P=5;
            else if(0x00<value2<0xfa)
                P=6;
           }
           value2_old=value2;
    }
    我是用這樣的方式來知道車子現在的位置,可是問題在於說我有七顆cny70,我相同的判斷是就必須有7*7=49個if判斷是,code就會變得很長且執行效率有些差,且假若我要把車子的位置知道的越精準判斷是就越多,所以不曉得說您是怎樣做的呢?您說的兩次曲線是甚麼意思啊??

     
    [版主回覆02/04/2010 15:50:31]我的意思是說我將CNY70的電壓變化轉化成8bit的16進位數值(利用RS232通訊將數值傳志超級終端機),當CNY開始靠近黑線時數值回從0x00->0xff再從黑線離開時會是0xff->0x00,假如我現在有兩顆cny黑線從左邊到右邊
                  cny1                                   cny2
    0x00->0xff->0x00        0x00->0xff->0x00
    這裡很奇怪,為什麼2顆的變化是一樣的?不是很懂,不是應該要有先後或者是 有不一樣才對,除非你的cny70放的位置是平行於黑膠帶,而非垂直於黑膠帶。
    我現在的做法是將這次的數值與前是數值做相減
    這是要做濾波?還是差分?還是微分?  前2者還可以理解,微分要得到速度嗎?
    大概可以懂你的程式在寫什麼,真的和你說的一樣,如果用這方法寫下去的話,其實是會有問題的,而且我猜不只有49個判斷式,照你這樣寫應該會有bug才對。因為你是寫if - else if  即使你都改成if   我覺得應該是會有問題的(因為你考慮的不周到)。
    給你一篇paper參考看看
    http://fie-conference.org/fie2008/papers/1099.pdf
     

    回覆刪除