magiccar 發表於 2010-3-3 01:12

單晶片魔法車08-高架軌道車

在實驗7裏,我們把紅外線LED及接收器組合成偵測地面黑色軌道的模組,我就有學生在家裏用黑膠帶,從房間到客廳、廚房,貼了很長的軌道,跟家人玩起郵差送信的遊戲,真的很好玩哦!
接下來的實驗我修改了一些電路的結構,如:取消原來使用兩組電源的架構,改由一顆7.4V可充電的鋰電池透過穩壓IC-7805供應電路5V電源,而馬達驅動則採用之前在"不是玩具-單晶片科學魔法車"一文中提到的IC-TA7291P來控制,因此現在魔法車除了前進、後退之外,也能透過程式下達停止的指令了。


實驗八:高架軌道車
實驗內容:如何在寬度峽長的軌道上順利過彎。
https://www.youtube.com/watch?v=1HkPSM9W8Sc
先看程式囉:
這次程式加一樣新菜色,就是利用89C2051計時器來產生中斷,讓程式可以規劃出PWM的信號,目的是輸出到TA7291P來控制馬達的速度,非常好用喔!
/*實驗八:高架軌道車*/
#include <AT89x051.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int

uchar t=0;            //中斷計數器
uchar m1=0;         //左馬達速度值
uchar m2=0;         //右馬達速度值
uchar tmp1,tmp2;       //左右馬達當前速度值

/* 馬達控制函數 index-左右馬達(1,2); speed-馬達速度(-100 ~ 100) */
void motor(uchar index, char speed)
{
      if(speed>=-100 && speed<=100){
                if(index==1){         //左馬達的處理
                        m1=abs(speed);   //取速度的絕對值
                        if(speed<0){   //速度值為負則反轉
                              P1_2=0;
                              P1_3=1;
                        }
                        else{             //不為負數則正轉
                              P1_2=1;
                              P1_3=0;
                        }
                }
                if(index==2){         //右馬達的處理
                        m2=abs(speed);   //速度控制
                        if(speed<0){      //方向控制
                              P1_4=0;
                              P1_5=1;
                        }
                        else{
                              P1_4=1;
                              P1_5=0;
                        }
                }
      }
}

/* 延時函數 */
void delay(unsigned int j)      
{                               //改變參數J大小,可調整時間
      for(j;j>0;j--);
}

/* 主程式開始 */
void main(void)
{
      P3_2=1;         //啟始左側紅外線輸入功能
      P3_3=1;         //啟始右側紅外線輸入功能
      TMOD=0x02;       //設定T0的工作模式為2
      TH0=0x3C;         //設定定時器的初值
      TL0=0x3C;          //設定定時器的重載值
      EA=1;            //中斷開啟
      ET0=1;         //定時器0允許中斷
      TR0=1;         //啟動定時器0
      while(1){
                while(P3_3==1 && P3_2==1){      //當車體在軌道中時
                        motor(1,50);                     //左右馬達加速前進
                        motor(2,50);
                }
                while(P3_2==0 && P3_3==1){       //當左側紅外線偵測到軌道邊緣時
                        motor(2,-50);                     //右馬達反轉
                        motor(1,30);                      //左馬達減速..直到避開軌道邊緣
                }
                while(P3_2==1 && P3_3==0){       //當右側紅外線偵測到軌道邊緣時
                        motor(1,-50);                     //左馬達反轉
                        motor(2,30);                      //右馬達減速..直到避開軌道邊緣
                }
                while(P3_3==0 && P3_2==0){       //無任何反射信號時
                        delay(10);               //作用為何呢?
                }
      }
}

/* T0中斷服務程序 */
void timer0() interrupt 1
{
      if(t==0){                     //1個PWM週期完成後才會接受新數值
                tmp1=m1;
                tmp2=m2;
      }
      if(t<tmp1) P1_0=1; else P1_0=0;   //產生左馬達的PWM信號
      if(t<tmp2) P1_1=1; else P1_1=0;   //產生右馬達的PWM信號
      t++;
      if(t>=100) t=0;          //1個PWM週期由100次中斷產生
}
編譯完成的檔案:

曹齊平 發表於 2010-3-5 22:52

周老師今天終於找到L293D了, 下週一寄給你試試看, 和TA7291P比較一下哪個好用. 謝謝您

magiccar 發表於 2010-3-12 23:49

用L293D,只要一顆就搞定了,電路占用的面積更小了,程式連改都不用改,直接套用上去就行了!


TA7291P 1顆只能驅動1顆馬達, 但輸出功率比較高, 散熱也比較沒問題!

d2513850 發表於 2010-4-30 23:04

若軌道變窄至2倫的寬度的話,此車能否遇到問題

martin 發表於 2010-5-1 01:37

本帖最後由 martin 於 2010-5-1 01:41 編輯

我覺得老師的軌道已經夠窄了吧! 我的車即使慢慢走, 還是常常走到掉下去:'(

不過我倒覺得, 多留一些寬度, 比較有加速的緩衝空間, 然後再來做個超速的版本...

v751953789 發表於 2011-2-22 14:05

砍起來有點小困難。加油!

magiccar 發表於 2011-2-23 10:49

v751953789 發表於 2011-2-22 14:05 static/image/common/back.gif
砍起來有點小困難。加油!

晶片到手,一切就變得容易了!

陕大鹍 發表於 2011-8-14 02:24

好难啊!真的很佩服!
頁: [1]
查看完整版本: 單晶片魔法車08-高架軌道車