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;                                          
 
      }
 
      
 
}
 
  
 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM