L293D電機驅動板的使用
阿新 • • 發佈:2018-11-28
做小車L293D的使用是關鍵,自己對這板子也是一點也不瞭解,通過查資料和實際的摸索,算是終於完成了。把自己的經驗分享一下,希望能有點幫助。
首先這塊板子是和其它擴充套件板一樣,是整個插在Arduino主機板上使用的
<ignore_js_op>
主機板上的引腳被它全部佔住,但並不是都被其使用,具體請看帶星號的擴充套件部分(帶星號內容非必看)
**************************************
下面的引腳只有在下面提到的直流或者步進電機工作時才會被用到 數字引腳11: 1號直流電機或者1號步進電機 數字引腳3: 2號直流電機或者1號步進電機 數字引腳5: 3號直流電機或者2號步進電機 數字引腳6:4號直流電機或者2號步進電機
下面的引腳只有在舵機工作時才會被用到 數字訊號9:1號舵機 數字訊號10: 2號舵機
所以只要相應的引腳沒被L293D驅動板使用到,你也是可以拿來用的但前提是你得自己焊出引腳來。
驅動板插在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
在程式中就可以對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; | |
} | |
} | |
} |