1. 程式人生 > >L293D電機驅動板的使用

L293D電機驅動板的使用

做小車L293D的使用是關鍵,自己對這板子也是一點也不瞭解,通過查資料和實際的摸索,算是終於完成了。把自己的經驗分享一下,希望能有點幫助。
首先這塊板子是和其它擴充套件板一樣,是整個插在Arduino主機板上使用的
<ignore_js_op> 


主機板上的引腳被它全部佔住,但並不是都被其使用,具體請看帶星號的擴充套件部分(帶星號內容非必看)
**************************************

那麼在L293D上哪些引腳我們可以使用呢?     所有的六個模擬輸入引腳都是可用的。它們也可以當做數字晶片來使用。(引腳14到19)
    數字引腳2和13可用。

 

    下面的引腳只有在下面提到的直流或者步進電機工作時才會被用到        數字引腳11: 1號直流電機或者1號步進電機        數字引腳3: 2號直流電機或者1號步進電機        數字引腳5: 3號直流電機或者2號步進電機        數字引腳6:4號直流電機或者2號步進電機

 

    下面的引腳只有在下面的直流或者步進電機工作時才會被用到        數字訊號4,7,8,和12通過74hc595(serial-to-parallel)來驅動直流或者步進電機

 

    下面的引腳只有在舵機工作時才會被用到        數字訊號9:1號舵機        數字訊號10: 2號舵機

 

所以只要相應的引腳沒被L293D驅動板使用到,你也是可以拿來用的但前提是你得自己焊出引腳來。
*************************************** <ignore_js_op> 一.供電
驅動板插在Arduino主機板上能夠得到主機板的電力供應,但這點電流是根本無法帶動電機什麼的。所以必須外接強勁點的電源。
外接電源接在上圖黃圈位置,特別注意正負極接反了要燒板子的  接外接電源時要把旁邊的黃色跳帽拿掉。 電機驅動板電源輸入要求為4.5V~25V。 大多數1.5~3V電機不會工作。 電流要求:這個電機驅動晶片可以給每個電機最多600ma電流,1.2A的峰值電流。需要注意的是,一旦你預測你的電流達到1A的話,需要在電機驅動晶片上放一個散熱塊,否則可能會燒了晶片。 那種9v電池並不能帶動電機。使用大的鉛酸蓄電池或者鎳氫電池包,18650電池。 二.硬體連線

 

如果你要連線舵機那麼就接到上圖畫紫圈的地方,正,負,控制線對應接好。 可以看到能接兩個舵機。分別用數字引腳9,10進行控制。   電機就接在左右兩邊畫紅圈的位置,板子上兩兩為一組分成了M1,M2,M3,M4,其中中間的為GND接線處一般沒使用。 可以接四個直流電機或兩個步進電機。   三.軟體 安裝驅動板的庫檔案 <ignore_js_op> AFMotor.rar (5.98 KB, 下載次數: 1075) 
在程式中就可以對M1-M4這四個直流電機進行控制了。
直流電機適應於許多機器人專案 這塊電機模組可以最多驅動4個電機同時正反向運動。使用高精度的PWM輸出,速度可以以每次0.5%的幅度變化。這意味著電機會運轉非常柔和。 需要注意的是,這裡的H橋晶片並不是用來驅動額定電流超過0.6A或峰值電流超過1.2A的電機的,只是適用於小的電機。在使用你的電機前,首先請確認電機的引數是否符合。 下面會教你如何運轉起一個直流電機: 1.確認你匯入#include <AFMotor.h> 2.建立AF_DCMotor(motor#,frequency)函式,其中第一引數motor#示意你的電機連到了1,2,3或者4中的哪個埠;frequency則代表了訊號控制的頻率。如果連線電機1和2,你可以選擇MOTOR12_64KHZ,MOTOR12_8KHZ,MOTOR12_2KHZ,或者MOTOR12_1KHZ。像64KHZ這麼高的頻率不會發出噪聲,但是低頻率會有效降低電源。電機3和4只能以1KHZ執行,並且會忽略任何給定的設定。 3.你可以使用setSpeed(speed)函式來設定電機的速度,speed引數的範圍從0(停止)到255(全速)。你可以在這個範圍內任意設定。 4.想讓電機轉動,你可以呼叫run(direction),其中direction引數可以是FORWARD,BACKWARD,RELEASE。當然arduino並不知道哪個方向是正向,哪個是反向,所以如果運轉的方向與你設定的相反,你只需要將電機接在驅動板上的兩個線反向連線。 #include <AFMotor.h> AF_DCMotor motor(2,MOTOR12_64KHZ); Void setup(){ Serial.begin(); Serial.println(“Motor test!”); motor.setSpeed(200); } Void loop(){ Serial.print(“tick”); motor.run(FORWARD); delay(1000); Serial.print(“tock”); motor.run(BACKWARD); delay(1000); Serial.print(“tack”); motor.run(RELEASE); delay(1000); } AF_DCMotor 類 AFMotor類配合Adafruit Motor Shied可以最多同時控制4個直流電機的速度和方向。要使用這些功能,首先要在開頭新增庫檔案: #include <AFMotor.h> AF_DCMotor motorname(portnum,freq) 這是一個建立一個直流電機的函式。在程式中需要宣告每個電機各一次。像下面的例子中一樣,每個電機必須使用不同的名字。 引數: port num - 選擇你的電機連線到電機驅動板上的介面(1-4) freq - 選擇PWM頻率。如果你沒有選擇這個選項,預設設定為1KHZ。 適用於通道1和2的頻率: MOTOR12_64KHZ MOTOR12_8KHZ MOTOR12_2KHZ MOTOR12_1KHZ 適用於通道3和4的頻率: MOTOR34_64KHZ MOTOR34_8KHZ MOTOR34_1KHZ 例如: AF_DCMotor motor4(4);//通道4,預設1KHZ頻率 AF_DCMotor left_motor(1,MOTOR12_64KHZ);//通道1,64KHZ頻率 注意:更高的頻率會減小電機在運動過程中的噪音,但同時也會降低扭矩。 setSpeed(speed) 設定電機的速度 引數: speed-範圍為0到255,0代表停止,255代表全速。 注意:直流電機的回饋並不是典型線性的,所以真正的轉速並不會與程式中設定的速度成正比。 run(cmd) 設定電機的運轉模式 引數: cmd - 選擇你想要的電機運轉模式 可選擇的模式: FORWARD - 正轉(真正的轉動方向取決於你電機的連線) BACKWARD - 反轉 (轉動方向與正轉相反) RELEASE - 停止。使電機斷電,與setSpeed(0)函式功能相同。呼叫了這個函式後,電機需要一定時間才能徹底停止。 舉例: motor.run(FORWARD); delay(1000); motor.run(RELEASE); delay(1000); motor.run(BACKWARDS); AF_Stepper 類 AF_Stepper類配合Adafruit Motor驅動板可以同時最多控制2個步進電機。要想使用這個功能,你必須首先新增: #include <AFMotor.h> AF_Stepper steppername(steps,portnumber) 這個函式定義了一個步進電機。首先在程式中需要宣告步進電機一次。像下面的例子中一樣,每個電機必須使用不同的名字。 引數: steps - 選擇電機每轉的步數 num - 選擇電機的通道 num引數可以選擇1(通道1和2)和2(通道3和4) 9.PNG (473.77 KB, 下載次數: 108) 下載附件 2015-5-4 14:52 上傳 AF_Stepper Stepper1(48,1); AF_Stepper Stepper2(200,2); Step(steps,direction,style) 引數: steps - 轉動的步數 direction - 轉動的方向(FORWARD 或者 BACKWARD) style - 步進的模式 style項可以選擇的模式: SINGLE - 一次只給一相線圈供電 DOUBLE - 一次給兩項項圈都供電,得到更大的扭矩 INTERLEAVE - 電機會運轉得更柔滑,因為步數增加了一倍,同時速度也減小一半 MICROSTEP - 電機會運轉的更柔滑,精度更高,但扭矩也會減小 舉例: Stepper.step(100,FORWARD,DOUBLE); Stepper.step(100,BACKWARD,MICROSTEP); setSpeed(RPMspeed) 引數: Speed - 每分鐘的轉數 舉例: Stepper1.setSpeed(10);//設定電機1速度為每分鐘10轉 Stepper2.setSpeed(30);//設定電機2速度為每分鐘30轉 onestep(direction,stepstyle) 設定單步 引數: Direction - 轉動的方向(FORWARD或者BACKWARD) Stepstyle - 步進的模式 style項可以選擇的模式: SINGLE - 一次只給一相線圈供電 DOUBLE - 一次給兩項項圈都供電,得到更大的扭矩 INTERLEAVE - 電機會運轉得更柔滑,因為步數增加了一倍,同時速度也減小一半 MICROSTEP - 電機會運轉的更柔滑,精度更高,但扭矩也會減小 例如: Stepper1.onestep(FORWARD,DOUBLE); release() 釋放電機的鎖定扭矩,可以有效減低發熱和電流損耗。 例如: Stepper1.release();//停止轉動,解除鎖定的你扭矩 ************************************************************** 使用步進電機
步進電機可以用來精確控制,很適合用於許多機器人或者CNC製作。這個電機驅動板做多支援2個步進電機。雙極性和單極性電機都適合這個庫。 對於雙極性電機(42二相四線電機):其中由兩相,相1的兩線連線到驅動板上的M1或者M3,相2的兩線連線到驅動板上對於的M2或者M4上。 運轉一個步進電機比運轉一個直流電機稍微複雜些,但總體還是比較簡單的。 1.確認你已經程式碼中聲明瞭#include <AFMotor.h> 2.使用AF_Stepper(steps,stepper#)函式來配置:steps指的是電機每圈需要的步數。一個步距角為7.5度的電機,需要360/7.5 = 48步;stepper指的是連線的埠。如果你使用了M1和M2,那埠就是1;反之,埠就是2. 3.使用setSpeed(rpm)設定電機的速度,這裡的速度是指電機每分鐘轉動的圈數。 4.每次你想讓電機轉動,你都必須使用step(#steps,direction,steptype)程式。其中,#steps是指你想讓電機走的步數,direction選項可以是FORWARD或者BACKWARD,然後steptype可以是SINGLE,DOUBLE,也可以是INTERLEAVE或者MICROSTEP. “Single”指的是單相啟用,“double”意味著雙相瞬間啟用(為了得到大的扭矩),“interleave”意味著single和double模式交替執行,帶來的是雙倍的精確度,但同時速度也下降了一半;“Microstepping”是一種使用PWM方式,以此得到平滑運動的模式。 你可以更加自己的想法隨意切換模式。 5.預置地,每次電機運動完後都會“鎖住”。如果你想釋放它,你可以使用release()6.The stepping commands are “blocking” and will return once the steps have finished.You have to instruct the Stepper motors each time you want to move.(不知道怎麼翻)如果你想更精細地控制步進電機,可以使用AccelStepper library,這個庫帶有電機加減速度功能。
例程: #include <AFMotor.h> void step(){ Serial.begin(9600); Serial.println(“Stepper test!”); motor.setSpeed(10); //10prm motor.step(200,FORWARD,SINGLE);//步距角為1.8度,方向為順時針,single運轉模式 motor.release(); delay(1000); } Void loop(){ motor.step(100,FORWARD,SINGLE); motor.step(100,BACKWARD,SINGLE); motor.step(100,FORWARD,DOUBLE); motor.step(100,BACKWARD,DOUBLE); motor.step(100,FORWARD,INTERLEAVE); motor.step(100,BACKWARD,INTERLEAVE); motor.step(100,FORWARD,MICROSTEP); motor.step(100,BACKWARD,MICROSTEP); } ************************************************************** 現在小車就能撒丫子跑了,接著再來說說如何用藍芽來進行對它控制。 上圖中綠圈的位置就是預留的孔位,可以焊上引腳,用來使用2號數字,A0-A5模擬和增加若干5V正電和GND引腳。 相應的引腳焊好後,把藍芽模組的TXD引腳接在2腳上,插好正負電源線,寫好就程式就OK了 <ignore_js_op>  

 

<ignore_js_op>  

kittenblock中小學創客名師推薦的圖形化程式設計軟體

  #include <AFMotor.h>
  #include <SoftwareSerial.h>
   
  #define mRFSpeedXiShu 0.8125//右前輪速度調節(與其它三個輪胎保持一致)
  #define mLFSpeedXiShu 0.9375//左前輪速度調節
  SoftwareSerial softSerial(2,13);
   
  AF_DCMotor motorRB(1);//右後輪
  AF_DCMotor motorRF(2);//右前輪
  AF_DCMotor motorLF(3);//左前輪
  AF_DCMotor motorLB(4);//左後輪
   
  int cheSpeed; //小車的速度
  int RFzw=1,RBzw=1,LFzw=1,LBzw=1;//四個輪胎的速度係數
  void setup() {
    
    softSerial.begin( 9600);
    softSerial.listen();
     // turn on motor
    cheSpeed= 80;
    motorRB.run(RELEASE);
    motorRF.run(RELEASE);
    motorLB.run(RELEASE);
    motorLF.run(RELEASE);
  }
   
  void loop() {
   
  int i;
  if(cheSpeed>255){
       cheSpeed= 255;
  }
  if(cheSpeed<0){
       cheSpeed= 0;
  }
  motorRF.setSpeed(cheSpeed*mRFSpeedXiShu*RFzw);
  motorLF.setSpeed(cheSpeed*mLFSpeedXiShu*LFzw);
  motorLB.setSpeed(cheSpeed*LBzw);
  motorRB.setSpeed(cheSpeed*RBzw);
   
  if(softSerial.available()>0)
  {
        i=softSerial.read(); //接收藍芽傳來的資料
         switch(i)
        {
           case 1://前進
                
                motorRB.run(RELEASE);
                motorRF.run(RELEASE);
                motorLB.run(RELEASE);
                motorLF.run(RELEASE);
                LFzw= 1;
                LBzw= 1;
                RFzw= 1;
                RBzw= 1;
                 //delay(300);
                motorRB.run(FORWARD);
                motorRF.run(FORWARD);
                motorLB.run(FORWARD);
                motorLF.run(FORWARD);
                 break;
           case 2://後退
                
                motorRB.run(RELEASE);
                motorRF.run(RELEASE);
                motorLB.run(RELEASE);
                motorLF.run(RELEASE);
                LFzw= 1;
                LBzw= 1;
                RFzw= 1;
                RBzw= 1;
                motorRB.run(BACKWARD);
                motorRF.run(BACKWARD);
                motorLB.run(BACKWARD);
                motorLF.run(BACKWARD);
                 break;
           case 3://左轉彎
                RBzw= 2;
                RFzw= 2;
                LBzw= 0.5;
                LFzw= 0.5;
                 //motorRB.run(FORWARD);
                 //motorRF.run(FORWARD);
                 //motorLB.run(BACKWARD);
                 //motorLF.run(BACKWARD);
                 break;
           case 4://右轉彎
                LBzw= 2;
                LFzw= 2;
                RBzw= 0.5;
                RFzw= 0.5;
                 //motorRB.run(BACKWARD);
                 //motorRF.run(BACKWARD);
                 //motorLB.run(FORWARD);
                 //motorLF.run(FORWARD);
                 break;
           case 5: //停止
                LFzw= 1;
                LBzw= 1;
                RFzw= 1;
                RBzw= 1;
                motorRB.run(RELEASE);
                motorRF.run(RELEASE);
                motorLB.run(RELEASE);
                motorLF.run(RELEASE);
                 break;
           case 11:
                cheSpeed+= 5;
                 break;
           case 12:
                cheSpeed+= 15;
                 break;
           case 21:
                cheSpeed-= 5;
                 break;
           case 22:
                cheSpeed-= 15;
                 break;
           default:
                 break;                                          
        }
        
  }
    
  }