標題: 【Arduino】168種傳感器系列實驗(170)---L293D四路電機驅動板 [打印本頁]
作者: eagler8 時間: 2020-10-26 18:53
標題: 【Arduino】168種傳感器系列實驗(170)---L293D四路電機驅動板
37款傳感器與模塊的提法,在網(wǎng)絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒于本人手頭積累了一些傳感器和執(zhí)行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里準備逐一動手試試做實驗,不管成功與否,都會記錄下來---小小的進步或是搞不定的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
實驗一百七十:L293D四路電機驅動模塊 擴展板 motor control shield 馬達板
00.jpg (206 KB, 下載次數(shù): 127)
下載附件
2020-10-26 18:53 上傳
0.jpg (155.24 KB, 下載次數(shù): 142)
下載附件
2020-10-26 18:53 上傳
作者: eagler8 時間: 2020-10-27 10:26
L293D
L293D是ST公司生產的一種高電壓、小電流電機驅動芯片,其設計用于在4.5 V至36 V的電壓下提供高達600 mA的雙向驅動電流。可以用于驅動電感性負載,例如繼電器,螺線管,DC和雙極步進電機,以及在正電源應用中的其他大電流/高壓負載。
每個輸出都是一個完整的圖騰柱驅動電路,帶有一個達林頓晶體管沉和一個偽達林頓源。驅動程序成對啟用,驅動程序1和2由1,2EN啟用,驅動程序3和4由3,4EN啟用。
L293D的工作溫度范圍為0°C至70°C。
01- (1) (1).jpg (52.5 KB, 下載次數(shù): 124)
下載附件
2020-10-27 10:26 上傳
作者: eagler8 時間: 2020-10-27 10:55
L293D特性
電源電壓范圍:4.5V至36V
單獨的輸入邏輯電源
內部ESD保護
熱關斷
高噪聲抗擾度輸入的
通標L293和L293DSGS的功能替代
輸出電流1A每通道(600毫安L293D)
峰值輸出電流每通道2A(1.2 L293D)
輸出鉗位二極管的感性瞬態(tài)抑制(L293D)
L293D參數(shù)
制造商: STMicroelectronics
產品種類: 電機/運動控制器和驅動器
類型: Driver
工作電源電壓: 4.5 V to 36 V
封裝 / 箱體: POWERDIP
封裝: Tube
02.jpg (46.4 KB, 下載次數(shù): 115)
下載附件
2020-10-27 10:55 上傳
作者: eagler8 時間: 2020-10-27 11:06
該器件是單片集成的高電壓,高電流的四通道驅動器,旨在接受標準的DTL或TTL邏輯電平并驅動感性負載(例如繼電器螺線管,直流和步進電機)和開關功率晶體管。為了簡化用作兩個橋接器的使用,每對通道都配備了一個使能輸入。 獨立為邏輯電路提供了電源輸入,允許在較低電壓下工作,并包括內部鉗位二極管。該設備適合在高達5 kHz的頻率下切換應用。L293D用16引線塑料組裝具有4個中心引腳連接到gether并用于散熱的包裝L293DD裝配在20引線表面中具有8個中心引腳連接到gether并用于散熱的安裝座。
內部電路框圖
03.jpg (87.73 KB, 下載次數(shù): 107)
下載附件
2020-10-27 11:06 上傳
作者: eagler8 時間: 2020-10-27 12:40
L293D引腳圖
03-.jpg (41.23 KB, 下載次數(shù): 109)
下載附件
2020-10-27 12:40 上傳
03-0.jpg (38.2 KB, 下載次數(shù): 111)
下載附件
2020-10-27 12:40 上傳
作者: eagler8 時間: 2020-10-27 13:04
本帖最后由 eagler8 于 2020-10-27 17:49 編輯
03-3.jpg (56.78 KB, 下載次數(shù): 122)
下載附件
2020-10-27 17:49 上傳
1,2EN:啟用驅動器通道1和2(高可用有效輸入)
<1-4> A:驅動器輸入,同相
<1-4>Y:驅動輸出
3,4EN:啟用驅動器通道3和4(高允許有效輸入)
4、5、12、13:設備接地和散熱器引腳。通過多個實心通孔連接到印刷電路板接地層
V CC1:用于內部邏輯轉換的5V電源
V CC2:驅動器的電源VCC 4.5 V至36 V
作者: eagler8 時間: 2020-10-27 13:11
L293D電氣特性
(對于每個通道,VS = 24 V,VSS = 5 V,Tamb = 25°C,除非另有規(guī)定)
04.jpg (162.14 KB, 下載次數(shù): 122)
下載附件
2020-10-27 13:11 上傳
作者: eagler8 時間: 2020-10-27 13:14
04-0.jpg (127.65 KB, 下載次數(shù): 131)
下載附件
2020-10-27 13:14 上傳
作者: eagler8 時間: 2020-10-27 15:28
04-1.jpg (59.53 KB, 下載次數(shù): 100)
下載附件
2020-10-27 15:28 上傳
作者: eagler8 時間: 2020-10-27 15:30
04-2.jpg (50.24 KB, 下載次數(shù): 122)
下載附件
2020-10-27 15:30 上傳
作者: eagler8 時間: 2020-10-27 15:32
04-3.jpg (61.48 KB, 下載次數(shù): 111)
下載附件
2020-10-27 15:32 上傳
作者: eagler8 時間: 2020-10-27 15:35
04-4.jpg (113.6 KB, 下載次數(shù): 121)
下載附件
2020-10-27 15:35 上傳
04-5.jpg (44.56 KB, 下載次數(shù): 97)
下載附件
2020-10-27 15:35 上傳
作者: eagler8 時間: 2020-10-27 15:37
04-6.jpg (65.13 KB, 下載次數(shù): 116)
下載附件
2020-10-27 15:37 上傳
作者: eagler8 時間: 2020-10-27 16:30
本帖最后由 eagler8 于 2020-10-28 10:46 編輯
L293D(雙H橋路)工作原理(視頻21分鐘)
https://www.bilibili.com/video/B ... 6911526506650231789
04-7.jpg (132.19 KB, 下載次數(shù): 126)
下載附件
2020-10-27 16:30 上傳
作者: eagler8 時間: 2020-10-27 16:51
L293D四路電機驅動模塊 擴展板 motor control shield 馬達板
07.jpg (121.13 KB, 下載次數(shù): 98)
下載附件
2020-10-27 16:51 上傳
作者: eagler8 時間: 2020-10-27 16:55
這是一款常用的直流電機驅動模塊,采用293D芯片小電流直流電機驅動芯片。管腳被做成了rduino兼容的,也方便了愛好者快速的基于rduino的開發(fā)。
rduino 是一款很好的電子制作入門,有了電機擴展板可以很好的成為機器人開發(fā)平臺。這里介紹一款能驅動各種簡單到稍復雜項目的全功能的電機擴展板。
適用范圍:rduino初學者,rduino實驗器材平臺,rduino互動電子,Arduino機器人等。
特點:功能多,操作方便,有強大的驅動庫支持及功能更新。
缺點:I/O占用較多在同時驅動四路電機的情況下(相對rduino I/O少的版本而言),小功率。
可驅動4路直流電機或者2路步進電機的同時還能驅動2路舵機,支持最新rduino UNO, rduino Mega 2560
可以這樣搭配:
驅動四路直流電機和兩路舵機
驅動兩路直流電機和一路步進電機和兩路舵機
驅動兩路步進電機和兩路舵機
06 (1).jpg (76.32 KB, 下載次數(shù): 120)
下載附件
2020-10-27 16:55 上傳
作者: eagler8 時間: 2020-10-27 17:00
L293D四路電機擴展板特點
* 2個5V伺服電機(舵機)端口 聯(lián)接到Arduino的高解析高精度的定時器-無抖動!
* 多達4個雙向直流電機及4路PWM調速(大約0.5%的解析度)
* 多達2個步進電機正反轉控制,單/雙步控制,交錯或微步及旋轉角度控制。
* 4路H-橋:L293D 芯片每路橋提供.0.6A(峰值1.2A)電流并且?guī)в袩釘嚯姳Wo,4.5V to 36V。
* 下拉電阻保證在上電時電機保持停止狀態(tài)。
* 大終端接線端子使接線更容易(10 - 22AWG)和電源。
* 帶有Arduino復位按鈕。
* 2個大終端外部電源接線端子 保證邏輯和電機驅動電源分離。
* 兼容Mega, Diecimila, & Duemilanove。
*下載方便使用的Arduino軟件庫快速進行項目開發(fā)。
05 (1).jpg (101.5 KB, 下載次數(shù): 144)
下載附件
2020-10-27 17:00 上傳
作者: eagler8 時間: 2020-10-27 18:19
本帖最后由 eagler8 于 2020-10-28 13:18 編輯
L293D四路電機擴展板電原理圖
08.jpg (162.46 KB, 下載次數(shù): 102)
下載附件
2020-10-27 18:19 上傳
08-0.png (195.37 KB, 下載次數(shù): 98)
下載附件
2020-10-28 13:18 上傳
作者: eagler8 時間: 2020-10-28 10:55
本帖最后由 eagler8 于 2020-10-28 13:19 編輯
L293D四路電機擴展板模塊原理
使用L293D來驅動電機的,中間有一個74HC595芯片,是將串行信號轉為并行信號的,因為該模塊是為arduino設計的,arduino的I/O口較少,控制4個直流電機需要12個引腳,使用74HC595可以減少4個引腳的使用,也可以取掉74HC595芯片,焊接接線,直接使用51單片機并行控制2個L293D芯片從而控制電機。
74HC595
74HC595是一個8位串行輸入、并行輸出的位移緩存器:并行輸出為三態(tài)輸出。在SCK 的上升沿,串行數(shù)據(jù)由SDL輸入到內部的8位位移緩存器,并由Q7'輸出,而并行輸出則是在LCK的上升沿將在8位位移緩存器的數(shù)據(jù)存入到8位并行輸出緩存器。當串行數(shù)據(jù)輸入端OE的控制信號為低使能時,并行輸出端的輸出值等于并行輸出緩存器所存儲的值。簡單的說,先將模塊的引腳7置0,然后模塊的引腳4(74HC595芯片的數(shù)據(jù)輸入時鐘端)接受到一個上升沿,就將芯片中的8位數(shù)據(jù)左移一位,空出低位將引腳8(74HC595芯片的串行數(shù)據(jù)輸入端)的0或1信號寫入低位,寫入八次就將控制4個電機的8位信號寫入74HC595的芯片中了(M3M4M3M2M1M1M2M4),然后在給引腳12一個上升沿,就將芯片中的數(shù)據(jù)輸出在芯片的引腳上(Q0~Q7)。
08-.jpg (62.37 KB, 下載次數(shù): 106)
下載附件
2020-10-28 13:19 上傳
程序計數(shù)器——74HC595(視頻6分32秒)
https://www.bilibili.com/video/BV1ME411T7EY?from=search&seid=17494597794294138238
作者: eagler8 時間: 2020-10-28 11:28
本帖最后由 eagler8 于 2020-10-29 05:10 編輯
電機和驅動器
電機是許多機器人和電子項目不可分割的一部分,根據(jù)應用的不同,它們可以使用不同的類型。以下是有關不同類型電機的一些信息:
直流電機(DC Motor):直流電機是最常見的電機,可用于許多應用。我們可以在遙控車、機器人等中看到它。這種電機結構簡單。它將通過向其端部施加適當?shù)碾妷翰⑼ㄟ^切換電壓極性來改變其方向來開始滾動。直流電機的速度由施加的電壓直接控制。當電壓電平小于最大容許電壓時,速度會降低。
步進電機(Stepper Motor):在一些項目中,如3D打印機、掃描儀和數(shù)控機床,我們需要準確了解電機旋轉步數(shù)。在這些情況下,我們使用步進電機。步進電機可將整個旋轉分成多個相等的步長。每步的旋轉量由電機結構決定。這些電機具有非常高的精度。
伺服電機(Servo Motor):伺服電機是一種簡單的直流電機,帶有位置控制服務。通過使用伺服電機,您將能夠控制軸的旋轉量并將其移動到特定位置。它們通常尺寸小,是機器人手臂的最佳選擇。
這里做實驗準備使用TT馬達
webwxgetmsgimg (5).jpg (114.63 KB, 下載次數(shù): 111)
下載附件
2020-10-28 11:27 上傳
TT馬達直流減速電機,作為一款被廣泛應用于電子DIY,機器人制作,智能車制作環(huán)節(jié)重點動力裝置,以其組裝簡單,擴展性能強,價格低廉等諸多特點受到廣大師生和電子愛好者的喜歡。
主要參數(shù)
額定電壓:4.5-6V
空載轉速:90±10rpm (具體視減速比而定)
負載電流:190mA(250mA 最大)
最大扭矩:0.8Kg·cm
作者: eagler8 時間: 2020-10-28 14:29
本帖最后由 eagler8 于 2020-10-29 04:51 編輯
為什么用L293D驅動電機?
驅動電動機需要大電流。另外,旋轉方向和速度是兩個需要控制的重要參數(shù)。這些要求可以通過使用微控制器(或像Arduino這樣的開發(fā)板)來處理。但有個問題;微控制器無法提供足夠的電流來運行電機,如果直接將電機連接到微控制器,可能會損壞微控制器。例如,Arduino UNO引腳限制為40mA電流,遠小于控制小型電機所需的100-200mA電流。要解決這個問題,我們應該使用電機驅動器。電機驅動器可以連接到微控制器以接收命令并以高電流運行電機。L293D是最受歡迎的電機驅動器之一,可驅動直流電機,電流負載高達1A.L293D有4個輸出,適用于4線步進電機。 L293D也可用于驅動伺服電機。
07-1 (1).jpg (82.56 KB, 下載次數(shù): 114)
下載附件
2020-10-28 14:29 上傳
L293D四路電機擴展板支持Arduino UNO. Arduino Mega2560
可以這樣搭配
驅動四路直流電機和兩路舵機
驅動兩路直流電機和一路步進電機和兩路舵機
驅動兩路步進電機和兩路舵機
可以同時控制4個直流電機和2個步進電機和兩個伺服電機(舵
機)。有專門的代碼庫。導入庫后,簡單使用。
作者: eagler8 時間: 2020-10-29 04:58
L293D四路電機擴展板接線圖
09 (1).jpg (139.49 KB, 下載次數(shù): 101)
下載附件
2020-10-29 04:58 上傳
作者: eagler8 時間: 2020-10-29 17:34
本帖最后由 eagler8 于 2020-10-29 17:41 編輯
在L293D上哪些引腳我們可以使用呢?
所有的六個模擬輸入引腳都是可用的。它們也可以當做數(shù)字芯片來使用。(引腳14到19),數(shù)字引腳2和13可用。
下面的引腳只有在下面提到的直流或者步進電機工作時才會被用到
數(shù)字引腳11: 1號直流電機或者1號步進電機
數(shù)字引腳3: 2號直流電機或者1號步進電機
數(shù)字引腳5: 3號直流電機或者2號步進電機
數(shù)字引腳6:4號直流電機或者2號步進電機
下面的引腳只有在下面的直流或者步進電機工作時才會被用到
數(shù)字信號4,7,8,和12通過74hc595(serial-to-parallel)來驅動直流或者步進電機
數(shù)字引腳4:DIR CLK觸發(fā)
數(shù)字引腳7:DIR EN指令的允許端EN
數(shù)字引腳8:DIR SER
數(shù)字引腳12:DIR ATCH中斷連接
下面的引腳只有在舵機工作時才會被用到
數(shù)字信號9:1號舵機
數(shù)字信號10: 2號舵機
所以只要相應的引腳沒被L293D驅動板使用到,你也是可以拿來用的但前提是你得自己焊出引腳來。另外,GND、5V引腳必須也要連接,否則的話就無法穩(wěn)定地控制直流電動機。
10 (1).jpg (121.82 KB, 下載次數(shù): 103)
下載附件
2020-10-29 17:33 上傳
作者: eagler8 時間: 2020-11-3 20:22
外接電源供電
如下圖所示,AFMotor電機擴展板上配有外接電源接口。該接口所連接的直流電源可以為電機和Arduino開發(fā)板供電。
14 (1).jpg (123.72 KB, 下載次數(shù): 101)
下載附件
2020-11-3 20:21 上傳
使用AFMotor電機擴展板驅動電機時,首要考慮的問題就是如何為擴展板供電。如果電源輸出功率達不到驅動電機的要求,那么電機是無法正常工作的。在考慮如何選擇電源時,我們需要重點關注兩個方面 ,一個是電源電壓,一個是電源電流。
注意:外接電源極性千萬不要接反,否則會對擴展板造成損壞!
外接電源電壓要求
AFMotor擴展板中起關鍵作用的芯片是L293D。該芯片所允許的直流電源電壓范圍是4.5V ~25V。因此AFMotor擴展板外接電源接口允許我們連接的電源也是4.5V ~25V。請注意:這是一個很寬泛的電壓指標。具體我們應該連接的電源電壓有多大,這是由被驅動的電機工作電壓來決定的。
外接電源電流要求
與上面提到的電源電壓要求相同,外接電源的電流要求也是由被驅動的電機來決定的。通常我們使用AFMotor電機擴展板所驅動的電機就是普通的模型電機(如以上電源講解中的圖片所示)。對于這一類型的電機,它們的工作電流大約是500mA左右,因此我們只要為擴展板配一個500 mA~1000 mA的外接電源就足夠了。請注意,假如您所驅動的電機工作電流超過500mA,那么就要考慮為擴展板上的L293D加裝芯片了。
作者: eagler8 時間: 2020-11-4 05:04
電源使用
為直流電動機,電壓和電流需求供電電動機需要大量能量,尤其是便宜的電動機,因為它們的效率較低。首先要弄清楚電動機要使用的電壓。如果幸運的話,您的電動機帶有一些規(guī)格。一些小型的業(yè)余電動機僅打算以1.5V的電壓運行,但6-12V電動機的使用卻一樣普遍。該屏蔽罩的電機控制器設計為在 4.5V至25V 范圍內運行。
MOST 1.5-3V電動機將無法工作
電流要求:要弄清的第二件事是電動機需要多少電流。該套件隨附的電機驅動器芯片旨在為每個電機提供高達600 mA的電流,峰值電流為1.2A。請注意,一旦接近1A,您可能會希望在電機驅動器上放一個散熱器,否則會出現(xiàn)熱故障,從而可能燒壞芯片。
使用SN754410
某些人使用SN754410電機驅動器芯片是因為它與引腳兼容,具有輸出二極管,每個電機可提供1A電流,峰值2A電流。在仔細閱讀數(shù)據(jù)表并與TI技術支持和電源工程師進行討論之后,看來輸出二極管僅設計用于ESD保護,并且將其用作反沖保護是一種黑客行為,并且不能保證性能。因此,該套件不隨SN754410一起提供,而是使用帶有集成反沖保護二極管的L293D。如果您愿意冒險,并且需要額外的流動資金,請隨時購買SN754410并更換提供的芯片。
需要更多電源嗎?請購買另一組L293D驅動器并將其焊接在板上的頂部(背負式)。瞧,當前功能加倍!您可以在頂部再焊接2個芯片,否則可能不會為您帶來很多好處
您不能用9V電池來驅動電動機,因此甚至不浪費時間/電池! 使用大號鉛酸或鎳氫電池。它還非常建議您設置兩個電源(分離電源),一個用于Arduino,另一個用于電機。 99%的“怪異電機問題” 是由于共享電源線上的噪聲引起的供應和/或沒有足夠的供應!
如何設置Arduino + Shield來為電機供電 Servos的電源是與Arduino使用的相同的5V電壓。建議使用小型業(yè)余伺服器。如果您想要更好的東西,請切斷去往伺服連接器上+的走線,并為您自己的5-6V電源接線!
直流電動機由“高壓電源”供電,而不是經(jīng)過調節(jié)的5V電源。請勿將電動機電源連接到5V線。除非您確定自己知道自己在做什么,否則這是一個非常非常糟糕的主意!
可以在兩個地方獲得電動機的“高壓電源”。一個是Arduino板上的DC插孔,另一個是屏蔽板上標有 EXT_PWR 的2端子塊.Arduino上的DC插孔具有保護二極管,因此您將無法弄亂如果插入錯誤的電源,情況可能會變得非常糟糕。但是,屏蔽層上的 EXT_PWR端子沒有保護二極管(出于相當充分的理由)。請小心不要將其向后插入,否則您將破壞電機護罩和/或Arduino!
這是它的工作方式:
13 (1).jpg (52.5 KB, 下載次數(shù): 93)
下載附件
2020-11-4 05:04 上傳
如果您想要一個為Arduino和電機提供單個DC電源,只需將其插入Arduino的DC插孔或屏蔽板上的2針PWR_EXT模塊。將電源跳線放在電動機的護罩上。
如果您有Diecimila Arduino,請將Arduino電源跳線設置為EXT。
請注意,如果電池電源無法提供恒定的電源,您可能會遇到Arduino重置問題,但這不是建議您為電機項目供電的方法
如果您想讓 Arduino的USB電源關閉,而電機的電源是直流電源,插入USB電纜。然后將電動機電源連接到屏蔽板上的PWR_EXTblock。請勿將跳線放在防護罩上。這是為電機項目供電的建議方法
(如果您有Diecimila Arduino,請不要忘記將Arduino電源跳線設置為USB。如果您有Diecimila,則可以交替執(zhí)行以下操作:將DC電源插入
如果您要 2個用于Arduino和電機的獨立直流電源。請插入Arduino的電源插入DC插孔,然后將電動機電源連接到PWR_EXT塊。確保將跳線從電動機護罩上卸下。
如果您有Diecimila Arduino,請將Arduino跳線設置為EXT。這是為電動機項目供電的建議方法。
無論哪種方式,如果要使用直流電動機/步進系統(tǒng),電動機的護罩LED均應點亮,指示電動機功率良好。
作者: eagler8 時間: 2020-11-4 05:12
作者: eagler8 時間: 2020-11-4 14:52
本帖最后由 eagler8 于 2020-11-4 16:17 編輯
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:百度搜索“AFMotor庫”— 下載 — 拷貝到Arduino-libraries 文件夾中
- 2、實驗之一:測試驅動M2直流電機
- */
- #include <AFMotor.h>
- AF_DCMotor motor(2, MOTOR12_64KHZ);
- void setup() {
- motor.setSpeed(200);
- }
- void loop() {
- motor.run(FORWARD);
- delay(1000);
- motor.run(BACKWARD);
- delay(1000);
- motor.run(RELEASE);
- delay(1000);
- }
復制代碼
作者: eagler8 時間: 2020-11-4 14:52
本帖最后由 eagler8 于 2020-11-5 19:32 編輯
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:百度搜索“AFMotor庫”— 下載 — 拷貝到Arduino-libraries 文件夾中
- 2、實驗之二:引擎測試—用串口查看2號直流電機運轉情況
- */
- #include "AFMotor.h"
- AF_DCMotor motor(2);
- void setup() {
- Serial.begin(9600); // set up Serial library at 9600 bps
- Serial.println("引擎測試 Motor test!");
- // turn on motor
- motor.setSpeed(200);
- motor.run(RELEASE);
- }
- void loop() {
- uint8_t i;
- Serial.println("向前 FORWARD!");
- motor.run(FORWARD);
- for (i = 0; i < 255; i++) {
- motor.setSpeed(i);
- delay(10);
- }
- for (i = 255; i != 0; i--) {
- motor.setSpeed(i);
- delay(10);
- }
- Serial.println("向后 BACKWARD!");
- motor.run(BACKWARD);
- for (i = 0; i < 255; i++) {
- motor.setSpeed(i);
- delay(10);
- }
- for (i = 255; i != 0; i--) {
- motor.setSpeed(i);
- delay(10);
- }
- Serial.println("停止 RELEASE!");
- motor.run(RELEASE);
- delay(1000);
- }
復制代碼
作者: eagler8 時間: 2020-11-4 16:16
本帖最后由 eagler8 于 2020-11-5 19:34 編輯
19.jpg (80.75 KB, 下載次數(shù): 98)
下載附件
2020-11-5 19:34 上傳
作者: eagler8 時間: 2020-11-6 11:16
AF_DCMotor 類函數(shù)
AFMotor類配合Adafruit Motor Shied可以最多同時控制4個直流電機的速度和方向。要使用這些功能,首先要在開頭添加庫文件:
#include <AFMotor.h>
AF_DCMotor motorname(portnum,freq)
這是一個建立一個直流電機的函數(shù)。在程序中需要聲明每個電機各一次。像下面的例子中一樣,每個電機必須使用不同的名字。
參數(shù):
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)
設置電機的速度
參數(shù):
speed-范圍為0到255,0代表停止,255代表全速。
注意:直流電機的回饋并不是典型線性的,所以真正的轉速并不會與程序中設定的速度成正比。
run(cmd)
設置電機的運轉模式
參數(shù):
cmd - 選擇你想要的電機運轉模式
可選擇的模式:
FORWARD - 正轉(真正的轉動方向取決于你電機的連線)
BACKWARD - 反轉 (轉動方向與正轉相反)
RELEASE - 停止。使電機斷電,與setSpeed(0)函數(shù)功能相同。調用了這個函數(shù)后,電機需要一定時間才能徹底停止。
作者: eagler8 時間: 2020-11-11 11:03
驅動直流電機
16- (1) (1).jpg (50.57 KB, 下載次數(shù): 105)
下載附件
2020-11-11 11:03 上傳
作者: eagler8 時間: 2020-11-11 11:26
驅動伺服電機(舵機)
首先需要安裝庫:IDE—工具—管理庫—搜索“servo”—安裝
20 (1).jpg (62.17 KB, 下載次數(shù): 108)
下載附件
2020-11-11 11:26 上傳
|
作者: eagler8 時間: 2020-11-11 16:37
本帖最后由 eagler8 于 2020-11-11 16:51 編輯
實驗之三:驅動單只伺服電機(2號舵機)
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:IDE—工具—管理庫—搜索“Servo”—安裝
- 2、實驗之三:驅動單只伺服電機(2號舵機)
- */
- #include <Servo.h>
- Servo myservo; // create servo object to control a servo
- // twelve servo objects can be created on most boards
- int pos = 0; // variable to store the servo position
- void setup() {
- myservo.attach(9); // attaches the servo on pin 9 to the servo object
- }
- void loop() {
- for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
- // in steps of 1 degree
- myservo.write(pos); // tell servo to go to position in variable 'pos'
- delay(15); // waits 15ms for the servo to reach the position
- }
- for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
- myservo.write(pos); // tell servo to go to position in variable 'pos'
- delay(15); // waits 15ms for the servo to reach the position
- }
- }
復制代碼
作者: eagler8 時間: 2020-11-11 16:55
實驗之四:驅動二只伺服電機(1號與2號舵機)
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:IDE—工具—管理庫—搜索“Servo”—安裝
- 2、實驗之四:驅動二只伺服電機(1號與2號舵機)
- */
- #include <Servo.h>
-
- Servo servo1; //建立舵機對象servo1
- Servo servo2; //建立舵機對象servo2
-
- int pos = 0;
- void setup() {
- servo1.attach(10); //servo1對象接在擴展板servo1端口。
- //servo1端口是由Arduino的10號引腳來控制的。
- servo2.attach(9); //servo2對象接在擴展板servo2端口。
- //servo2端口是由Arduino的9號引腳來控制的。
- }
-
- void loop() {
- //以下程序將控制servo1輸出軸左右旋轉180度
- for (pos = 0; pos <= 180; pos += 1) {
- servo1.write(pos);
- delay(15);
- }
- for (pos = 180; pos >= 0; pos -= 1) {
- servo1.write(pos);
- delay(15);
- }
-
- //以下程序將控制servo2輸出軸左右旋轉180度
- for (pos = 0; pos <= 180; pos += 1) {
- servo2.write(pos);
- delay(15);
- }
- for (pos = 180; pos >= 0; pos -= 1) {
- servo2.write(pos);
- delay(15);
- }
- }
復制代碼
作者: eagler8 時間: 2020-11-11 17:12
Servo庫
允許Arduino / Genuino開發(fā)板控制各種伺服電機(舵機)。 該庫可以控制大量的伺服器。它仔細使用了計時器:該庫僅使用1個計時器就可以控制12個伺服器。在Arduino Due上,最多可以控制60個伺服器。
該庫與avr,megaavr,sam,samd,nrf52,stm32f4,mbed 架構兼容。要使用此庫,請在Arduino IDE中打開庫管理器,然后從那里安裝它。
該庫允許Arduino開發(fā)板控制RC(業(yè)余)伺服電機。伺服系統(tǒng)具有集成的齒輪和可精確控制的軸。標準伺服器允許將軸以各種角度定位,通常在0到180度之間。連續(xù)旋轉伺服器允許將軸的旋轉設置為各種速度。
伺服庫在大多數(shù)Arduino板上最多支持12個電機,在Arduino Mega上最多支持48個電機。在Mega以外的板上,使用該庫會禁用analogWrite()引腳9和10上的(PWM)功能,無論這些引腳上是否有Servo。在Mega上,最多可以使用12個伺服器,而不會影響PWM功能。使用12到23個電機將禁用引腳11和12上的PWM。
要使用此庫:
#include <Servo.h>
電路圖
伺服電機(舵機)有三根電線:電源線,地線和信號線。電源線通常為紅色,應連接至Arduino板上的5V引腳。接地線通常為黑色或棕色,應連接至Arduino板上的接地引腳。信號引腳通常為黃色,橙色或白色,應連接至Arduino板上的數(shù)字引腳。請注意,伺服器消耗的功率很大,因此如果需要驅動一兩個以上,則可能需要使用單獨的電源(即,不是Arduino上的+ 5V引腳)為它們供電。確保將Arduino的接地和外部電源連接在一起。
16-- (1).jpg (64.41 KB, 下載次數(shù): 97)
下載附件
2020-11-11 17:12 上傳
作者: eagler8 時間: 2020-11-11 18:39
使用Servo庫
1、Servo-attach()函數(shù)(連接)
將伺服變量附加到引腳上。請注意,在Arduino 0016及更早版本中,Servo庫僅在兩個引腳上僅支持舵機:9和10。
句法
servo.attach(pin)
servo.attach(pin, min, max)
參量
伺服:類型變量Servo
pin:伺服器連接的引腳號
min(可選):脈沖寬度(以微秒為單位),對應于伺服器上的最小(0度)角度(默認為544)
最大(可選):脈沖寬度(以微秒為單位),對應于伺服器上的最大(180度)角度(默認為2400)
例
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
}
void loop() {}
2、Servo-write(x)函數(shù)(寫入)
將值寫入伺服器,從而相應地控制軸。在標準伺服器上,這將設置軸的角度(以度為單位),將軸移動到該方向。在連續(xù)旋轉伺服系統(tǒng)(360度舵機)上,這將設置伺服系統(tǒng)的速度(0表示一個方向的全速,180表示另一方向的全速,而90左右的值表示無運動)。
句法
servo.write(angle)
參量
伺服:伺服類型的變量
angle:寫入伺服的值,從0到180
例
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
myservo.write(90); // set servo to mid-point
}
void loop() {}
作者: eagler8 時間: 2020-11-11 18:40
3、Servo-writeMicroseconds()函數(shù)(精確控制)
以微秒(uS)為單位寫入一個值,從而相應地控制軸。在標準伺服系統(tǒng)上,這將設置軸的角度。在標準伺服器上,參數(shù)值1000完全是逆時針方向,2000完全是順時針方向,中間是1500。
請注意,某些制造商并未非常嚴格地遵循此標準,因此,伺服器通常會對700到2300之間的值做出響應。可以隨意增加這些端點,直到伺服器不再繼續(xù)增加其范圍為止。但是請注意,嘗試將伺服驅動器驅動通過其端點(通常由嘶嘶聲表示)是高電流狀態(tài),應避免使用。連續(xù)旋轉伺服器將以類似于寫入功能的方式響應writeMicrosecond功能。
句法
servo.writeMicroseconds(uS)
參量
伺服:伺服類型的變量
us:參數(shù)值(以微秒為單位)(int)
例
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
myservo.writeMicroseconds(1500); // set servo to mid-point
}
void loop() {}
4、Servo-read()函數(shù)(讀取)
讀取伺服器的當前角度(該值傳遞給對write()的最后一次調用)。
句法
servo.read()
參量
伺服:類型變量Servo
反饋
伺服角度為0到180度。
5、Servo-Attached()函數(shù)(附加)
檢查是否將Servo變量附加到引腳上。
句法
servo.attached()
參量
伺服:類型變量Servo
反饋
true如果伺服系統(tǒng)連接到引腳上;false除此以外。
6、Servo-detach()函數(shù)(分離)
從其引腳上拆下伺服變量。如果所有伺服變量均已分離,則可以使用AnalogWrite()將引腳9和10用于PWM輸出。
句法
servo.detach()
參量
伺服:類型變量Servo
作者: eagler8 時間: 2020-11-11 19:16
驅動28BYJ-48步進電機
AFMotor電機擴展板最多可以驅動2個28BYJ-48步進電機。以下我們將給您介紹兩種電機擴展板的使用方法。第一種是在您開發(fā)項目時的使用方法,第二種是項目開發(fā)完畢后,在使用擴展板驅動電機工作時的方法。這兩種方法最大的區(qū)別在于:開發(fā)時的Arduino開發(fā)板是通過USB數(shù)據(jù)線連接在電腦上的。但是在工作時開發(fā)板是不連接電腦的。
步進電機可以用來精確控制,很適合用于許多機器人或者CNC制作。這個電機驅動板做多支持2個步進電機。雙極性和單極性電機都適合這個庫。對于雙極性電機(42二相四線電機):其中由兩相,相1的兩線連接到驅動板上的M1或者M3,相2的兩線連接到驅動板上對于的M2或者M4上。運轉一個步進電機比運轉一個直流電機稍微復雜些,但總體還是比較簡單的。
16--- (1).jpg (61.25 KB, 下載次數(shù): 102)
下載附件
2020-11-11 19:16 上傳
作者: eagler8 時間: 2020-11-11 19:30
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:百度搜索“AFMotor庫”— 下載 — 拷貝到Arduino-libraries 文件夾中
- 2、實驗之五:驅動28BYJ-48步進電機
- */
- #include <AFMotor.h> // 本程序中使用AFMotor庫
-
- AF_Stepper motor1(2048, 1); // 這2條語句的作用是建立2個步進電機對象,它們的名稱分別是:motor1/2。
- AF_Stepper motor2(2048, 2); // 對象名稱后面括號中的兩個參數(shù)分別代表了步進電機旋轉一周的步數(shù)以及
- // 步進電機連接在擴展板上的端口號。如AF_Stepper motor1(2048, 1)語句中
- // 參數(shù)2048代表motor1旋轉一周需要走2048步。假如您的電機旋轉一周需要32步,
- // 那么請在第一個參數(shù)位置輸入32這一數(shù)字參數(shù)。
- // 括號中第二個參數(shù)1代表motor1連接在M1和M2端口。
- // 對于motor2對象,它括號中的參數(shù)2代表該電機連接在M3和M4端口。
-
- void setup() {
- Serial.begin(9600); //啟動串口通訊
-
- motor1.setSpeed(10); // 這2條語句的作用是通過setSpped庫函數(shù)設置電機運行速度。
- motor2.setSpeed(10); // setSpped庫函數(shù)中的參數(shù)是運行速度參數(shù)。
- // 速度參數(shù)越大,運轉速度越快。參數(shù)為0時電機停止轉動。
- }
-
- /*
- 以下的loop函數(shù)中有4段程序語句。它們的內容十分類似,主要語句都是是通過step庫函數(shù)來控制
- 步進電機的運行模式。step庫函數(shù)一共有3個參數(shù)。如loop函數(shù)的第二行語句:motor1.step(2048, FORWARD, SINGLE)。
- 括號中的第一個參數(shù)是控制電機走的步數(shù),這里的參數(shù)2048就是讓電機走2048步。
- 接下來的關鍵字參數(shù)"FORWARD"作用是控制電機旋轉方向。"FORWARD"是控制電機"正轉",
- 這里也可以使用關鍵字"BACKWARD"讓電機"反轉"。
- 最后一個關鍵字參數(shù)是用于控制步進電機運轉模式的。這里可選的關鍵字參數(shù)有:
- SINGLE - 全步進模式(單線圈)。電機每走一步,擴展板只給一相線圈供電。
- DOUBLE - 全步進模式(雙線圈)。電機每走一步,擴展板會同時給兩相線圈供電。
- 此模式運行的電機比SINGLE模式下的扭矩要更大,但是電機耗電也會更多。
- INTERLEAVE - 半步進模式。這種模式是SINGLE和DOUBLE的混合。電機每走一步,擴展板對線圈供電方式
- 在一相和兩相之間交替切換。舉例來說,電機走第一步時,只有一相線圈通電。
- 走第二步時,會有兩相線圈供電,然后又是一相,再兩相......這樣交替通電。
- 這種控制模式的優(yōu)點是電機運行更流暢,但是缺點是運行速度大打折扣。
- MICROSTEP - 微步進模式。此模式下的電機運行更光滑,但缺點是扭矩會打折扣。
- */
-
- void loop() {
- Serial.println("Single Mode"); //串口監(jiān)視器輸出當前運行模式為“Single”
- motor1.step(2048, FORWARD, SINGLE); //步進電機以SINGLE模式"正轉"2048步
- motor1.step(2048, BACKWARD, SINGLE); //步進電機以SINGLE模式"反轉"2048步
-
- Serial.println("Double Mode"); //串口監(jiān)視器輸出當前運行模式為“Double”
- motor2.step(2048, FORWARD, DOUBLE); //步進電機以DOUBLE模式"正轉"2048步
- motor2.step(2048, BACKWARD, DOUBLE); //步進電機以DOUBLE模式"反轉"2048步
-
- Serial.println("Interleave Mode"); //串口監(jiān)視器輸出當前運行模式為“Interleave”
- motor1.step(2048, FORWARD, INTERLEAVE); //步進電機以INTERLEAVE模式"正轉"2048步
- motor1.step(2048, BACKWARD, INTERLEAVE); //步進電機以INTERLEAVE模式"反轉"2048步
-
- Serial.println("Micrsostep Mode"); //串口監(jiān)視器輸出當前運行模式為“Micrsostep”
- motor2.step(2048, FORWARD, MICROSTEP); //步進電機以MICROSTEP模式"正轉"2048步
- motor2.step(2048, BACKWARD, MICROSTEP); //步進電機以MICROSTEP模式"反轉"2048步
- }
復制代碼
作者: eagler8 時間: 2020-11-11 19:37
與步進電機有關的函數(shù)
確保導入AFMotor庫文件并#include < AFMotor.h>后,有這么幾個函數(shù)需要用到
1、AF_Stepper steppername(steps,portnumber)
(1)steppername
給電機起個名字,然后這個名字就是此電機在程序中的代號了
(2)steps
設置電機每轉的步數(shù),比如設置36,則每步走1/36轉
(3)portnumber
選擇電機的通道,范圍為1(通道1,2)和2(通道3和4)
2、Step(steps,direction,style)
(1)step
轉動的步數(shù)
(2)direction
轉動的方向FORWARD 或者 BACKWARD
(3)style
步進的模式,可以選擇的參數(shù):
a\SINGLE - 一次只給一相線圈供電
b\DOUBLE - 一次給兩項項圈都供電,得到更大的扭矩
c\INTERLEAVE - 電機會運轉得更柔滑,因為步數(shù)增加了一倍,同時速度也減小一半
d\MICROSTEP - 電機會運轉的更柔滑,精度更高,但扭矩也會減小
如果想更精細地控制步進電機,可以使用AccelStepper library,這個庫帶有電機加減速度功能。
作者: eagler8 時間: 2020-11-12 19:38
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:百度搜索“AFMotor庫”— 下載 — 拷貝到Arduino-libraries 文件夾中
- 2、實驗之六:連接每轉48步(7.5度)的步進電機,電機端口2#(M3和M4)
- */
- #include <AFMotor.h>
- // Connect a stepper motor with 48 steps per revolution (7.5 degree)
- // to motor port #2 (M3 and M4)
- AF_Stepper motor(48, 2);
- void setup() {
- Serial.begin(9600); // set up Serial library at 9600 bps
- Serial.println("Stepper test! 測試步進電機!");
- motor.setSpeed(10); // 10 rpm
- }
- void loop() {
- Serial.println("Single coil steps 單線圈步");
- motor.step(100, FORWARD, SINGLE);
- motor.step(100, BACKWARD, SINGLE);
- Serial.println("Double coil steps 雙線圈步");
- motor.step(100, FORWARD, DOUBLE);
- motor.step(100, BACKWARD, DOUBLE);
- Serial.println("Interleave coil steps 交錯線圈臺階");
- motor.step(100, FORWARD, INTERLEAVE);
- motor.step(100, BACKWARD, INTERLEAVE);
- Serial.println("Micrsostep steps 微步前進");
- motor.step(100, FORWARD, MICROSTEP);
- motor.step(100, BACKWARD, MICROSTEP);
- }
復制代碼
作者: eagler8 時間: 2020-11-12 19:41
22.jpg (78.77 KB, 下載次數(shù): 386)
下載附件
2020-11-12 19:41 上傳
作者: eagler8 時間: 2020-11-12 20:26
使用Arduino AFMotor驅動四只直流電機
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:百度搜索“AFMotor庫”— 下載 — 拷貝到Arduino-libraries 文件夾中
- 2、實驗之七:使用Arduino AFMotor驅動四只直流電機
- */
- #include <AFMotor.h> // 本程序中使用AFMotor庫
- AF_DCMotor motor1(1); // 這4條語句的作用是建立4個直流電機對象,它們的名稱分別是:motor1/2/3/4.
- AF_DCMotor motor2(2); // 這四條語句括號中的數(shù)字代表各個電機對象所連接在AFMotor擴展板的電機端口號碼。
- AF_DCMotor motor3(3); // AF_DCMotor motor1(1); 代表motor1對象連接在AFMotor擴展板的M1端口上。
- AF_DCMotor motor4(4); // AFMotor電機擴展板最多可以驅動4個直流電機,最少可以驅動1個直流電機。
- void setup() {
- motor1.setSpeed(200); // 這4條語句的作用是通過setSpped庫函數(shù)設置電機運行速度。
- motor2.setSpeed(200); // setSpped庫函數(shù)中的參數(shù)是運行速度參數(shù)。
- motor3.setSpeed(200); // 運行速度參數(shù)允許范圍是0~255。
- motor4.setSpeed(200); // 速度參數(shù)越大,運轉速度越快。參數(shù)為0時電機停止轉動。
- motor1.run(RELEASE); // 這4條語句的作用是讓4個電機在啟動時停止轉動
- motor2.run(RELEASE); // run庫函數(shù)允許使用的關鍵字參數(shù)有RELEASE、FORWARD、BACKWARD
- motor3.run(RELEASE); // 使用關鍵字RELEASE作為參數(shù)使用時,run庫函數(shù)將會讓擴展板停止提供電機運轉動力
- motor4.run(RELEASE); // 電機旋轉一旦失去動力就會自然的停止轉動。
- }
- void loop() {
- motor1.run(FORWARD); // 這4條語句的作用是利用run庫函數(shù)控制4個電機"正向"旋轉。
- motor2.run(FORWARD); // 這里所謂的“正向”旋轉只是一種說法,假如您發(fā)現(xiàn)電機旋轉方向和您所要的“正向”不一致。
- motor3.run(FORWARD); // 您可以將電機的兩個引線從擴展板上斷開,然后交換順序再接到擴展板接口上
- motor4.run(FORWARD); // 這時您會看到同樣使用FORWARD關鍵字作為run庫函數(shù)的參數(shù),電機的旋轉方向卻反過來了。
- for (int i = 0; i <= 255; i++) { // 這里使用for循環(huán)語句控制4個電機速度由停止逐步加速,最終電機運轉達到最大速度。
- motor1.setSpeed(i); // 在for循環(huán)語句的作用下,setSpeed庫函數(shù)的速度參數(shù)i由0逐漸增大,最終達到255。
- motor2.setSpeed(i); // 因此電機運行速度也是由停止逐漸加速,最終達到最大速度。
- motor3.setSpeed(i); // 對于一些模型電機來說,當速度參數(shù)小于一定數(shù)值以后就不能轉動了。也就是說,也許您的電機
- motor4.setSpeed(i); // 在速度參數(shù)在小于某一個速度參數(shù)數(shù)值的時候就無法轉動了。這屬于正常現(xiàn)象。
- delay(10); // 具體這個最小值是多少,對于不同的電機來說是不同的。有的可能是50也有的可能是100。
- } // 換句話說,很可能您的某一個直流電機在速度參數(shù)小于50的情況下就無法轉動了。
- // 也可能您的另一個直流電機在參數(shù)100以下的情況下就無法轉動了。
- for (int i = 255; i >= 0; i--) { // 這里使用for循環(huán)語句控制4個電機由最大旋轉速度逐步減速最終停止旋轉。
- motor1.setSpeed(i); // 這一系列語句的操作與上一段for循環(huán)語句類似。唯一區(qū)別是上一段for循環(huán)控制速度參數(shù)i由0漲到255
- motor2.setSpeed(i); // 而這一段語句控制速度參數(shù)i由255減小到0。同樣您可能會發(fā)現(xiàn)當速度參數(shù)沒有減小到零的時候,電機就已經(jīng)
- motor3.setSpeed(i); // 停止旋轉了。這其中的原因在上一段for循環(huán)語句中已經(jīng)介紹了。不在這里贅述了。
- motor4.setSpeed(i);
- delay(10);
- }
- motor1.run(BACKWARD); // 這4條語句的作用是利用run庫函數(shù)控制4個電機"反向"旋轉。
- motor2.run(BACKWARD); // 同樣的,這里所謂的“反向”旋轉也只是一種說法。這部分程序內容
- motor3.run(BACKWARD); // 與本程序33-36行中的內容十分類似。唯一區(qū)別就是使用了“BACKWARD”
- motor4.run(BACKWARD); // 關鍵字參數(shù)來通過庫函數(shù)run控制電機“反向”旋轉。
- for (int i = 0; i <= 255; i++) { // 利用for循環(huán)語句控制速度參數(shù)i由小到大
- motor1.setSpeed(i); // 電機也會以“反向”旋轉的方式由停止逐步達到最大速度
- motor2.setSpeed(i);
- motor3.setSpeed(i);
- motor4.setSpeed(i);
- delay(10);
- }
- for (int i = 255; i >= 0; i--) { // 利用for循環(huán)語句控制速度參數(shù)i由大到小
- motor1.setSpeed(i); // 電機也會以“反向”旋轉的方式由最大速度逐步減小到停止
- motor2.setSpeed(i);
- motor3.setSpeed(i);
- motor4.setSpeed(i);
- delay(10);
- }
- motor1.run(RELEASE); // 這四條語句作用是使用關鍵字RELEASE作為run函數(shù)的參數(shù)。
- motor2.run(RELEASE); // 在這種情況下,AFMotor擴展板將會停止為電機旋轉提供動力。
- motor3.run(RELEASE); // 電機也就會自然的停止轉動。
- motor4.run(RELEASE); // 本段程序后面的delay(1000)的作用就是讓4個電機保持無旋轉動力狀態(tài)1秒鐘
- delay(1000);
- }
復制代碼
作者: eagler8 時間: 2020-11-13 08:07
Arduino AFMotor 電機擴展板實驗場景圖
21.jpg (164.83 KB, 下載次數(shù): 378)
下載附件
2020-11-13 08:07 上傳
作者: eagler8 時間: 2020-11-13 08:59
附錄:AFMotor.h庫文件
目錄—adafruit/Adafruit-Motor-Shield-library
鏈接—https://github.com/adafruit/Adaf ... ob/master/AFMotor.h
- // Adafruit Motor shield library
- // copyright Adafruit Industries LLC, 2009
- // this code is public domain, enjoy!
- /*
- * Usage Notes:
- * For PIC32, all features work properly with the following two exceptions:
- *
- * 1) Because the PIC32 only has 5 PWM outputs, and the AFMotor shield needs 6
- * to completely operate (four for motor outputs and two for RC servos), the
- * M1 motor output will not have PWM ability when used with a PIC32 board.
- * However, there is a very simple workaround. If you need to drive a stepper
- * or DC motor with PWM on motor output M1, you can use the PWM output on pin
- * 9 or pin 10 (normally use for RC servo outputs on Arduino, not needed for
- * RC servo outputs on PIC32) to drive the PWM input for M1 by simply putting
- * a jumber from pin 9 to pin 11 or pin 10 to pin 11. Then uncomment one of the
- * two #defines below to activate the PWM on either pin 9 or pin 10. You will
- * then have a fully functional microstepping for 2 stepper motors, or four
- * DC motor outputs with PWM.
- *
- * 2) There is a conflict between RC Servo outputs on pins 9 and pins 10 and
- * the operation of DC motors and stepper motors as of 9/2012. This issue
- * will get fixed in future MPIDE releases, but at the present time it means
- * that the Motor Party example will NOT work properly. Any time you attach
- * an RC servo to pins 9 or pins 10, ALL PWM outputs on the whole board will
- * stop working. Thus no steppers or DC motors.
- *
- */
- // <BPS> 09/15/2012 Modified for use with chipKIT boards
- #ifndef _AFMotor_h_
- #define _AFMotor_h_
- #include <inttypes.h>
- #if defined(__AVR__)
- #include <avr/io.h>
- //#define MOTORDEBUG 1
- #define MICROSTEPS 16 // 8 or 16
- #define MOTOR12_64KHZ _BV(CS20) // no prescale
- #define MOTOR12_8KHZ _BV(CS21) // divide by 8
- #define MOTOR12_2KHZ _BV(CS21) | _BV(CS20) // divide by 32
- #define MOTOR12_1KHZ _BV(CS22) // divide by 64
- #define MOTOR34_64KHZ _BV(CS00) // no prescale
- #define MOTOR34_8KHZ _BV(CS01) // divide by 8
- #define MOTOR34_1KHZ _BV(CS01) | _BV(CS00) // divide by 64
-
- #define DC_MOTOR_PWM_RATE MOTOR34_8KHZ // PWM rate for DC motors
- #define STEPPER1_PWM_RATE MOTOR12_64KHZ // PWM rate for stepper 1
- #define STEPPER2_PWM_RATE MOTOR34_64KHZ // PWM rate for stepper 2
-
- #elif defined(__PIC32MX__)
- //#define MOTORDEBUG 1
-
- // Uncomment the one of following lines if you have put a jumper from
- // either pin 9 to pin 11 or pin 10 to pin 11 on your Motor Shield.
- // Either will enable PWM for M1
- //#define PIC32_USE_PIN9_FOR_M1_PWM
- //#define PIC32_USE_PIN10_FOR_M1_PWM
- #define MICROSTEPS 16 // 8 or 16
- // For PIC32 Timers, define prescale settings by PWM frequency
- #define MOTOR12_312KHZ 0 // 1:1, actual frequency 312KHz
- #define MOTOR12_156KHZ 1 // 1:2, actual frequency 156KHz
- #define MOTOR12_64KHZ 2 // 1:4, actual frequency 78KHz
- #define MOTOR12_39KHZ 3 // 1:8, acutal frequency 39KHz
- #define MOTOR12_19KHZ 4 // 1:16, actual frequency 19KHz
- #define MOTOR12_8KHZ 5 // 1:32, actual frequency 9.7KHz
- #define MOTOR12_4_8KHZ 6 // 1:64, actual frequency 4.8KHz
- #define MOTOR12_2KHZ 7 // 1:256, actual frequency 1.2KHz
- #define MOTOR12_1KHZ 7 // 1:256, actual frequency 1.2KHz
- #define MOTOR34_312KHZ 0 // 1:1, actual frequency 312KHz
- #define MOTOR34_156KHZ 1 // 1:2, actual frequency 156KHz
- #define MOTOR34_64KHZ 2 // 1:4, actual frequency 78KHz
- #define MOTOR34_39KHZ 3 // 1:8, acutal frequency 39KHz
- #define MOTOR34_19KHZ 4 // 1:16, actual frequency 19KHz
- #define MOTOR34_8KHZ 5 // 1:32, actual frequency 9.7KHz
- #define MOTOR34_4_8KHZ 6 // 1:64, actual frequency 4.8KHz
- #define MOTOR34_2KHZ 7 // 1:256, actual frequency 1.2KHz
- #define MOTOR34_1KHZ 7 // 1:256, actual frequency 1.2KHz
-
- // PWM rate for DC motors.
- #define DC_MOTOR_PWM_RATE MOTOR34_39KHZ
- // Note: for PIC32, both of these must be set to the same value
- // since there's only one timebase for all 4 PWM outputs
- #define STEPPER1_PWM_RATE MOTOR12_39KHZ
- #define STEPPER2_PWM_RATE MOTOR34_39KHZ
-
- #endif
- // Bit positions in the 74HCT595 shift register output
- #define MOTOR1_A 2
- #define MOTOR1_B 3
- #define MOTOR2_A 1
- #define MOTOR2_B 4
- #define MOTOR4_A 0
- #define MOTOR4_B 6
- #define MOTOR3_A 5
- #define MOTOR3_B 7
- // Constants that the user passes in to the motor calls
- #define FORWARD 1
- #define BACKWARD 2
- #define BRAKE 3
- #define RELEASE 4
- // Constants that the user passes in to the stepper calls
- #define SINGLE 1
- #define DOUBLE 2
- #define INTERLEAVE 3
- #define MICROSTEP 4
- /*
- #define LATCH 4
- #define LATCH_DDR DDRB
- #define LATCH_PORT PORTB
- #define CLK_PORT PORTD
- #define CLK_DDR DDRD
- #define CLK 4
- #define ENABLE_PORT PORTD
- #define ENABLE_DDR DDRD
- #define ENABLE 7
- #define SER 0
- #define SER_DDR DDRB
- #define SER_PORT PORTB
- */
- // Arduino pin names for interface to 74HCT595 latch
- #define MOTORLATCH 12
- #define MOTORCLK 4
- #define MOTORENABLE 7
- #define MOTORDATA 8
- class AFMotorController
- {
- public:
- AFMotorController(void);
- void enable(void);
- friend class AF_DCMotor;
- void latch_tx(void);
- uint8_t TimerInitalized;
- };
- class AF_DCMotor
- {
- public:
- AF_DCMotor(uint8_t motornum, uint8_t freq = DC_MOTOR_PWM_RATE);
- void run(uint8_t);
- void setSpeed(uint8_t);
- private:
- uint8_t motornum, pwmfreq;
- };
- class AF_Stepper {
- public:
- AF_Stepper(uint16_t, uint8_t);
- void step(uint16_t steps, uint8_t dir, uint8_t style = SINGLE);
- void setSpeed(uint16_t);
- uint8_t onestep(uint8_t dir, uint8_t style);
- void release(void);
- uint16_t revsteps; // # steps per revolution
- uint8_t steppernum;
- uint32_t usperstep, steppingcounter;
- private:
- uint8_t currentstep;
- };
- uint8_t getlatchstate(void);
- #endif
復制代碼
作者: eagler8 時間: 2020-11-13 09:04
附錄:AFMotor.cpp庫文件
目錄—adafruit/Adafruit-Motor-Shield-library
鏈接—https://github.com/adafruit/Adaf ... /master/AFMotor.cpp
- // Adafruit Motor shield library
- // copyright Adafruit Industries LLC, 2009
- // this code is public domain, enjoy!
- #if (ARDUINO >= 100)
- #include "Arduino.h"
- #else
- #if defined(__AVR__)
- #include <avr/io.h>
- #endif
- #include "WProgram.h"
- #endif
- #include "AFMotor.h"
- static uint8_t latch_state;
- #if (MICROSTEPS == 8)
- uint8_t microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};
- #elif (MICROSTEPS == 16)
- uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255};
- #endif
- AFMotorController::AFMotorController(void) {
- TimerInitalized = false;
- }
- void AFMotorController::enable(void) {
- // setup the latch
- /*
- LATCH_DDR |= _BV(LATCH);
- ENABLE_DDR |= _BV(ENABLE);
- CLK_DDR |= _BV(CLK);
- SER_DDR |= _BV(SER);
- */
- pinMode(MOTORLATCH, OUTPUT);
- pinMode(MOTORENABLE, OUTPUT);
- pinMode(MOTORDATA, OUTPUT);
- pinMode(MOTORCLK, OUTPUT);
- latch_state = 0;
- latch_tx(); // "reset"
- //ENABLE_PORT &= ~_BV(ENABLE); // enable the chip outputs!
- digitalWrite(MOTORENABLE, LOW);
- }
- void AFMotorController::latch_tx(void) {
- uint8_t i;
- //LATCH_PORT &= ~_BV(LATCH);
- digitalWrite(MOTORLATCH, LOW);
- //SER_PORT &= ~_BV(SER);
- digitalWrite(MOTORDATA, LOW);
- for (i=0; i<8; i++) {
- //CLK_PORT &= ~_BV(CLK);
- digitalWrite(MOTORCLK, LOW);
- if (latch_state & _BV(7-i)) {
- //SER_PORT |= _BV(SER);
- digitalWrite(MOTORDATA, HIGH);
- } else {
- //SER_PORT &= ~_BV(SER);
- digitalWrite(MOTORDATA, LOW);
- }
- //CLK_PORT |= _BV(CLK);
- digitalWrite(MOTORCLK, HIGH);
- }
- //LATCH_PORT |= _BV(LATCH);
- digitalWrite(MOTORLATCH, HIGH);
- }
- static AFMotorController MC;
- /******************************************
- MOTORS
- ******************************************/
- inline void initPWM1(uint8_t freq) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer2A on PB3 (Arduino pin #11)
- TCCR2A |= _BV(COM2A1) | _BV(WGM20) | _BV(WGM21); // fast PWM, turn on oc2a
- TCCR2B = freq & 0x7;
- OCR2A = 0;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 11 is now PB5 (OC1A)
- TCCR1A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc1a
- TCCR1B = (freq & 0x7) | _BV(WGM12);
- OCR1A = 0;
- #elif defined(__PIC32MX__)
- #if defined(PIC32_USE_PIN9_FOR_M1_PWM)
- // Make sure that pin 11 is an input, since we have tied together 9 and 11
- pinMode(9, OUTPUT);
- pinMode(11, INPUT);
- if (!MC.TimerInitalized)
- { // Set up Timer2 for 80MHz counting fro 0 to 256
- T2CON = 0x8000 | ((freq & 0x07) << 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
- TMR2 = 0x0000;
- PR2 = 0x0100;
- MC.TimerInitalized = true;
- }
- // Setup OC4 (pin 9) in PWM mode, with Timer2 as timebase
- OC4CON = 0x8006; // OC32 = 0, OCTSEL=0, OCM=6
- OC4RS = 0x0000;
- OC4R = 0x0000;
- #elif defined(PIC32_USE_PIN10_FOR_M1_PWM)
- // Make sure that pin 11 is an input, since we have tied together 9 and 11
- pinMode(10, OUTPUT);
- pinMode(11, INPUT);
- if (!MC.TimerInitalized)
- { // Set up Timer2 for 80MHz counting fro 0 to 256
- T2CON = 0x8000 | ((freq & 0x07) << 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
- TMR2 = 0x0000;
- PR2 = 0x0100;
- MC.TimerInitalized = true;
- }
- // Setup OC5 (pin 10) in PWM mode, with Timer2 as timebase
- OC5CON = 0x8006; // OC32 = 0, OCTSEL=0, OCM=6
- OC5RS = 0x0000;
- OC5R = 0x0000;
- #else
- // If we are not using PWM for pin 11, then just do digital
- digitalWrite(11, LOW);
- #endif
- #else
- #error "This chip is not supported!"
- #endif
- #if !defined(PIC32_USE_PIN9_FOR_M1_PWM) && !defined(PIC32_USE_PIN10_FOR_M1_PWM)
- pinMode(11, OUTPUT);
- #endif
- }
- inline void setPWM1(uint8_t s) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer2A on PB3 (Arduino pin #11)
- OCR2A = s;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 11 is now PB5 (OC1A)
- OCR1A = s;
- #elif defined(__PIC32MX__)
- #if defined(PIC32_USE_PIN9_FOR_M1_PWM)
- // Set the OC4 (pin 9) PMW duty cycle from 0 to 255
- OC4RS = s;
- #elif defined(PIC32_USE_PIN10_FOR_M1_PWM)
- // Set the OC5 (pin 10) PMW duty cycle from 0 to 255
- OC5RS = s;
- #else
- // If we are not doing PWM output for M1, then just use on/off
- if (s > 127)
- {
- digitalWrite(11, HIGH);
- }
- else
- {
- digitalWrite(11, LOW);
- }
- #endif
- #else
- #error "This chip is not supported!"
- #endif
- }
- inline void initPWM2(uint8_t freq) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer2B (pin 3)
- TCCR2A |= _BV(COM2B1) | _BV(WGM20) | _BV(WGM21); // fast PWM, turn on oc2b
- TCCR2B = freq & 0x7;
- OCR2B = 0;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 3 is now PE5 (OC3C)
- TCCR3A |= _BV(COM1C1) | _BV(WGM10); // fast PWM, turn on oc3c
- TCCR3B = (freq & 0x7) | _BV(WGM12);
- OCR3C = 0;
- #elif defined(__PIC32MX__)
- if (!MC.TimerInitalized)
- { // Set up Timer2 for 80MHz counting fro 0 to 256
- T2CON = 0x8000 | ((freq & 0x07) << 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
- TMR2 = 0x0000;
- PR2 = 0x0100;
- MC.TimerInitalized = true;
- }
- // Setup OC1 (pin3) in PWM mode, with Timer2 as timebase
- OC1CON = 0x8006; // OC32 = 0, OCTSEL=0, OCM=6
- OC1RS = 0x0000;
- OC1R = 0x0000;
- #else
- #error "This chip is not supported!"
- #endif
- pinMode(3, OUTPUT);
- }
- inline void setPWM2(uint8_t s) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer2A on PB3 (Arduino pin #11)
- OCR2B = s;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 11 is now PB5 (OC1A)
- OCR3C = s;
- #elif defined(__PIC32MX__)
- // Set the OC1 (pin3) PMW duty cycle from 0 to 255
- OC1RS = s;
- #else
- #error "This chip is not supported!"
- #endif
- }
- inline void initPWM3(uint8_t freq) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer0A / PD6 (pin 6)
- TCCR0A |= _BV(COM0A1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on OC0A
- //TCCR0B = freq & 0x7;
- OCR0A = 0;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 6 is now PH3 (OC4A)
- TCCR4A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc4a
- TCCR4B = (freq & 0x7) | _BV(WGM12);
- //TCCR4B = 1 | _BV(WGM12);
- OCR4A = 0;
- #elif defined(__PIC32MX__)
- if (!MC.TimerInitalized)
- { // Set up Timer2 for 80MHz counting fro 0 to 256
- T2CON = 0x8000 | ((freq & 0x07) << 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
- TMR2 = 0x0000;
- PR2 = 0x0100;
- MC.TimerInitalized = true;
- }
- // Setup OC3 (pin 6) in PWM mode, with Timer2 as timebase
- OC3CON = 0x8006; // OC32 = 0, OCTSEL=0, OCM=6
- OC3RS = 0x0000;
- OC3R = 0x0000;
- #else
- #error "This chip is not supported!"
- #endif
- pinMode(6, OUTPUT);
- }
- inline void setPWM3(uint8_t s) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer0A on PB3 (Arduino pin #6)
- OCR0A = s;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 6 is now PH3 (OC4A)
- OCR4A = s;
- #elif defined(__PIC32MX__)
- // Set the OC3 (pin 6) PMW duty cycle from 0 to 255
- OC3RS = s;
- #else
- #error "This chip is not supported!"
- #endif
- }
- inline void initPWM4(uint8_t freq) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer0B / PD5 (pin 5)
- TCCR0A |= _BV(COM0B1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on oc0a
- //TCCR0B = freq & 0x7;
- OCR0B = 0;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 5 is now PE3 (OC3A)
- TCCR3A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc3a
- TCCR3B = (freq & 0x7) | _BV(WGM12);
- //TCCR4B = 1 | _BV(WGM12);
- OCR3A = 0;
- #elif defined(__PIC32MX__)
- if (!MC.TimerInitalized)
- { // Set up Timer2 for 80MHz counting fro 0 to 256
- T2CON = 0x8000 | ((freq & 0x07) << 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
- TMR2 = 0x0000;
- PR2 = 0x0100;
- MC.TimerInitalized = true;
- }
- // Setup OC2 (pin 5) in PWM mode, with Timer2 as timebase
- OC2CON = 0x8006; // OC32 = 0, OCTSEL=0, OCM=6
- OC2RS = 0x0000;
- OC2R = 0x0000;
- #else
- #error "This chip is not supported!"
- #endif
- pinMode(5, OUTPUT);
- }
- inline void setPWM4(uint8_t s) {
- #if defined(__AVR_ATmega8__) || \
- defined(__AVR_ATmega48__) || \
- defined(__AVR_ATmega88__) || \
- defined(__AVR_ATmega168__) || \
- defined(__AVR_ATmega328P__)
- // use PWM from timer0A on PB3 (Arduino pin #6)
- OCR0B = s;
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- // on arduino mega, pin 6 is now PH3 (OC4A)
- OCR3A = s;
- #elif defined(__PIC32MX__)
- // Set the OC2 (pin 5) PMW duty cycle from 0 to 255
- OC2RS = s;
- #else
- #error "This chip is not supported!"
- #endif
- }
- AF_DCMotor::AF_DCMotor(uint8_t num, uint8_t freq) {
- motornum = num;
- pwmfreq = freq;
- MC.enable();
- switch (num) {
- case 1:
- latch_state &= ~_BV(MOTOR1_A) & ~_BV(MOTOR1_B); // set both motor pins to 0
- MC.latch_tx();
- initPWM1(freq);
- break;
- case 2:
- latch_state &= ~_BV(MOTOR2_A) & ~_BV(MOTOR2_B); // set both motor pins to 0
- MC.latch_tx();
- initPWM2(freq);
- break;
- case 3:
- latch_state &= ~_BV(MOTOR3_A) & ~_BV(MOTOR3_B); // set both motor pins to 0
- MC.latch_tx();
- initPWM3(freq);
- break;
- case 4:
- latch_state &= ~_BV(MOTOR4_A) & ~_BV(MOTOR4_B); // set both motor pins to 0
- MC.latch_tx();
- initPWM4(freq);
- break;
- }
- }
- void AF_DCMotor::run(uint8_t cmd) {
- uint8_t a, b;
- switch (motornum) {
- case 1:
- a = MOTOR1_A; b = MOTOR1_B; break;
- case 2:
- a = MOTOR2_A; b = MOTOR2_B; break;
- case 3:
- a = MOTOR3_A; b = MOTOR3_B; break;
- case 4:
- a = MOTOR4_A; b = MOTOR4_B; break;
- default:
- return;
- }
-
- switch (cmd) {
- case FORWARD:
- latch_state |= _BV(a);
- latch_state &= ~_BV(b);
- MC.latch_tx();
- break;
- case BACKWARD:
- latch_state &= ~_BV(a);
- latch_state |= _BV(b);
- MC.latch_tx();
- break;
- case RELEASE:
- latch_state &= ~_BV(a); // A and B both low
- latch_state &= ~_BV(b);
- MC.latch_tx();
- break;
- }
- }
- void AF_DCMotor::setSpeed(uint8_t speed) {
- switch (motornum) {
- case 1:
- setPWM1(speed); break;
- case 2:
- setPWM2(speed); break;
- case 3:
- setPWM3(speed); break;
- case 4:
- setPWM4(speed); break;
- }
- }
- /******************************************
- STEPPERS
- ******************************************/
- AF_Stepper::AF_Stepper(uint16_t steps, uint8_t num) {
- MC.enable();
- revsteps = steps;
- steppernum = num;
- currentstep = 0;
- if (steppernum == 1) {
- latch_state &= ~_BV(MOTOR1_A) & ~_BV(MOTOR1_B) &
- ~_BV(MOTOR2_A) & ~_BV(MOTOR2_B); // all motor pins to 0
- MC.latch_tx();
-
- // enable both H bridges
- pinMode(11, OUTPUT);
- pinMode(3, OUTPUT);
- digitalWrite(11, HIGH);
- digitalWrite(3, HIGH);
- // use PWM for microstepping support
- initPWM1(STEPPER1_PWM_RATE);
- initPWM2(STEPPER1_PWM_RATE);
- setPWM1(255);
- setPWM2(255);
- } else if (steppernum == 2) {
- latch_state &= ~_BV(MOTOR3_A) & ~_BV(MOTOR3_B) &
- ~_BV(MOTOR4_A) & ~_BV(MOTOR4_B); // all motor pins to 0
- MC.latch_tx();
- // enable both H bridges
- pinMode(5, OUTPUT);
- pinMode(6, OUTPUT);
- digitalWrite(5, HIGH);
- digitalWrite(6, HIGH);
- // use PWM for microstepping support
- // use PWM for microstepping support
- initPWM3(STEPPER2_PWM_RATE);
- initPWM4(STEPPER2_PWM_RATE);
- setPWM3(255);
- setPWM4(255);
- }
- }
- void AF_Stepper::setSpeed(uint16_t rpm) {
- usperstep = 60000000 / ((uint32_t)revsteps * (uint32_t)rpm);
- steppingcounter = 0;
- }
- void AF_Stepper::release(void) {
- if (steppernum == 1) {
- latch_state &= ~_BV(MOTOR1_A) & ~_BV(MOTOR1_B) &
- ~_BV(MOTOR2_A) & ~_BV(MOTOR2_B); // all motor pins to 0
- MC.latch_tx();
- } else if (steppernum == 2) {
- latch_state &= ~_BV(MOTOR3_A) & ~_BV(MOTOR3_B) &
- ~_BV(MOTOR4_A) & ~_BV(MOTOR4_B); // all motor pins to 0
- MC.latch_tx();
- }
- }
- void AF_Stepper::step(uint16_t steps, uint8_t dir, uint8_t style) {
- uint32_t uspers = usperstep;
- uint8_t ret = 0;
- if (style == INTERLEAVE) {
- uspers /= 2;
- }
- else if (style == MICROSTEP) {
- uspers /= MICROSTEPS;
- steps *= MICROSTEPS;
- #ifdef MOTORDEBUG
- Serial.print("steps = "); Serial.println(steps, DEC);
- #endif
- }
- while (steps--) {
- ret = onestep(dir, style);
- delay(uspers/1000); // in ms
- steppingcounter += (uspers % 1000);
- if (steppingcounter >= 1000) {
- delay(1);
- steppingcounter -= 1000;
- }
- }
- if (style == MICROSTEP) {
- while ((ret != 0) && (ret != MICROSTEPS)) {
- ret = onestep(dir, style);
- delay(uspers/1000); // in ms
- steppingcounter += (uspers % 1000);
- if (steppingcounter >= 1000) {
- delay(1);
- steppingcounter -= 1000;
- }
- }
- }
- }
- uint8_t AF_Stepper::onestep(uint8_t dir, uint8_t style) {
- uint8_t a, b, c, d;
- uint8_t ocrb, ocra;
- ocra = ocrb = 255;
- if (steppernum == 1) {
- a = _BV(MOTOR1_A);
- b = _BV(MOTOR2_A);
- c = _BV(MOTOR1_B);
- d = _BV(MOTOR2_B);
- } else if (steppernum == 2) {
- a = _BV(MOTOR3_A);
- b = _BV(MOTOR4_A);
- c = _BV(MOTOR3_B);
- d = _BV(MOTOR4_B);
- } else {
- return 0;
- }
- // next determine what sort of stepping procedure we're up to
- if (style == SINGLE) {
- if ((currentstep/(MICROSTEPS/2)) % 2) { // we're at an odd step, weird
- if (dir == FORWARD) {
- currentstep += MICROSTEPS/2;
- }
- else {
- currentstep -= MICROSTEPS/2;
- }
- } else { // go to the next even step
- if (dir == FORWARD) {
- currentstep += MICROSTEPS;
- }
- else {
- currentstep -= MICROSTEPS;
- }
- }
- } else if (style == DOUBLE) {
- if (! (currentstep/(MICROSTEPS/2) % 2)) { // we're at an even step, weird
- if (dir == FORWARD) {
- currentstep += MICROSTEPS/2;
- } else {
- currentstep -= MICROSTEPS/2;
- }
- } else { // go to the next odd step
- if (dir == FORWARD) {
- currentstep += MICROSTEPS;
- } else {
- currentstep -= MICROSTEPS;
- }
- }
- } else if (style == INTERLEAVE) {
- if (dir == FORWARD) {
- currentstep += MICROSTEPS/2;
- } else {
- currentstep -= MICROSTEPS/2;
- }
- }
- if (style == MICROSTEP) {
- if (dir == FORWARD) {
- currentstep++;
- } else {
- // BACKWARDS
- currentstep--;
- }
- currentstep += MICROSTEPS*4;
- currentstep %= MICROSTEPS*4;
- ocra = ocrb = 0;
- if ( (currentstep >= 0) && (currentstep < MICROSTEPS)) {
- ocra = microstepcurve[MICROSTEPS - currentstep];
- ocrb = microstepcurve[currentstep];
- } else if ( (currentstep >= MICROSTEPS) && (currentstep < MICROSTEPS*2)) {
- ocra = microstepcurve[currentstep - MICROSTEPS];
- ocrb = microstepcurve[MICROSTEPS*2 - currentstep];
- } else if ( (currentstep >= MICROSTEPS*2) && (currentstep < MICROSTEPS*3)) {
- ocra = microstepcurve[MICROSTEPS*3 - currentstep];
- ocrb = microstepcurve[currentstep - MICROSTEPS*2];
- } else if ( (currentstep >= MICROSTEPS*3) && (currentstep < MICROSTEPS*4)) {
- ocra = microstepcurve[currentstep - MICROSTEPS*3];
- ocrb = microstepcurve[MICROSTEPS*4 - currentstep];
- }
- }
- currentstep += MICROSTEPS*4;
- currentstep %= MICROSTEPS*4;
- #ifdef MOTORDEBUG
- Serial.print("current step: "); Serial.println(currentstep, DEC);
- Serial.print(" pwmA = "); Serial.print(ocra, DEC);
- Serial.print(" pwmB = "); Serial.println(ocrb, DEC);
- #endif
- if (steppernum == 1) {
- setPWM1(ocra);
- setPWM2(ocrb);
- } else if (steppernum == 2) {
- setPWM3(ocra);
- setPWM4(ocrb);
- }
- // release all
- latch_state &= ~a & ~b & ~c & ~d; // all motor pins to 0
- //Serial.println(step, DEC);
- if (style == MICROSTEP) {
- if ((currentstep >= 0) && (currentstep < MICROSTEPS))
- latch_state |= a | b;
- if ((currentstep >= MICROSTEPS) && (currentstep < MICROSTEPS*2))
- latch_state |= b | c;
- if ((currentstep >= MICROSTEPS*2) && (currentstep < MICROSTEPS*3))
- latch_state |= c | d;
- if ((currentstep >= MICROSTEPS*3) && (currentstep < MICROSTEPS*4))
- latch_state |= d | a;
- } else {
- switch (currentstep/(MICROSTEPS/2)) {
- case 0:
- latch_state |= a; // energize coil 1 only
- break;
- case 1:
- latch_state |= a | b; // energize coil 1+2
- break;
- case 2:
- latch_state |= b; // energize coil 2 only
- break;
- case 3:
- latch_state |= b | c; // energize coil 2+3
- break;
- case 4:
- latch_state |= c; // energize coil 3 only
- break;
- case 5:
- latch_state |= c | d; // energize coil 3+4
- break;
- case 6:
- latch_state |= d; // energize coil 4 only
- break;
- case 7:
- latch_state |= d | a; // energize coil 1+4
- break;
- }
- }
-
- MC.latch_tx();
- return currentstep;
- }
復制代碼
作者: eagler8 時間: 2020-11-13 09:51
補充實驗
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:IDE—工具—管理庫—搜索“Servo”—安裝
- 2、實驗之八:測試M1M2電機
- */
- #include <AFMotor.h>
- AF_DCMotor motor1(1);
- AF_DCMotor motor2(2);
- void setup() {
- Serial.begin(9600);
- Serial.println("測試M1M2電機!");
- // turn on motor
- motor1.setSpeed(200);
- motor2.setSpeed(200);
- motor1.run(RELEASE);
- motor2.run(RELEASE);
- }
- void loop() {
- uint8_t i;
- Serial.println("正轉");
- motor1.run(FORWARD);
- motor2.run(FORWARD);
- for (i = 0; i < 255; i++) {
- motor1.setSpeed(i);
- motor2.setSpeed(i);
- delay(10);
- }
- for (i = 255; i != 0; i--) {
- motor1.setSpeed(i);
- motor2.setSpeed(i);
- delay(10);
- }
- Serial.println("反轉");
- motor1.run(BACKWARD);
- motor2.run(BACKWARD);
- for (i = 0; i < 255; i++) {
- motor1.setSpeed(i);
- motor2.setSpeed(i);
- delay(10);
- }
- for (i = 255; i != 0; i--) {
- motor1.setSpeed(i);
- motor2.setSpeed(i);
- delay(10);
- }
- Serial.println("斷電一秒");
- motor1.run(RELEASE);
- motor2.run(RELEASE);
- delay(1000);
- }
復制代碼
作者: eagler8 時間: 2020-11-13 10:40
23.jpg (53.04 KB, 下載次數(shù): 360)
下載附件
2020-11-13 10:40 上傳
作者: eagler8 時間: 2020-11-13 11:01
太極創(chuàng)客團隊制作的B站視頻,相當不錯的視頻教程
B站太極創(chuàng)客官方站:https://space.bilibili.com/10358 ... _765f7570696e666f.2
24.jpg (83.17 KB, 下載次數(shù): 382)
下載附件
2020-11-13 11:01 上傳
作者: eagler8 時間: 2020-11-13 11:05
Arduino AFMotor電機擴展板(上)
https://www.bilibili.com/video/BV1vb411q7xz?p=1
Arduino AFMotor電機擴展板(下)
https://www.bilibili.com/video/BV1vb411q7xz?p=2
作者: eagler8 時間: 2020-11-13 13:22
AFMotor電機驅動擴展板使用圖形編程
【mind+用戶庫】第三方庫方案
先下載安裝Mind+(目前版本V1.6.5 RC3.0)
鏈接(自行替換.):mindplus點cc/download.html
25.jpg (76.51 KB, 下載次數(shù): 358)
下載附件
2020-11-13 13:22 上傳
作者: eagler8 時間: 2020-11-13 13:38
打開Mind+,進入“擴展”
26 (1).jpg (79.56 KB, 下載次數(shù): 403)
下載附件
2020-11-13 13:38 上傳
作者: eagler8 時間: 2020-11-13 13:42
進入“用戶庫”
27 (1).jpg (83.95 KB, 下載次數(shù): 362)
下載附件
2020-11-13 13:42 上傳
作者: eagler8 時間: 2020-11-13 13:45
在用戶庫中搜索“hockel”即可
28 (1).jpg (48.98 KB, 下載次數(shù): 374)
下載附件
2020-11-13 13:45 上傳
作者: eagler8 時間: 2020-11-13 13:48
添加的 AFMotor模塊
29 (1).jpg (72.26 KB, 下載次數(shù): 377)
下載附件
2020-11-13 13:48 上傳
作者: eagler8 時間: 2020-11-13 14:04
AFMotor電機驅動擴展板積木列表
30.jpg (80.62 KB, 下載次數(shù): 392)
下載附件
2020-11-13 14:04 上傳
作者: eagler8 時間: 2020-11-13 16:54
用圖形編程驅動四只直流電機
31.jpg (49.32 KB, 下載次數(shù): 357)
下載附件
2020-11-13 16:53 上傳
作者: eagler8 時間: 2020-11-13 16:55
32.jpg (59.17 KB, 下載次數(shù): 398)
下載附件
2020-11-13 16:55 上傳
作者: eagler8 時間: 2020-11-13 17:38
- /*
- 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
- 實驗一百七十:L293D四路電機驅動板 motor control shield 馬達板
- Adafruit Motor Shield模塊 Arduino AFMotor 電機擴展板
- 1、安裝庫:百度搜索“AFMotor庫”— 下載 — 拷貝到Arduino-libraries 文件夾中
- 2、實驗之九:測試M1M2M3M4電機前進與后退
- */
- #include <AFMotor.h>
- // 創(chuàng)建對象
- AF_DCMotor motor1(1);
- AF_DCMotor motor2(2);
- AF_DCMotor motor3(3);
- AF_DCMotor motor4(4);
- // 主程序開始
- void setup() {
- }
- void loop() {
- motor1.setSpeed(200);
- motor1.run(FORWARD);
- motor2.setSpeed(200);
- motor2.run(FORWARD);
- motor3.setSpeed(200);
- motor3.run(FORWARD);
- motor4.setSpeed(200);
- motor4.run(FORWARD);
- delay(2000);
-
- motor1.setSpeed(0);
- motor1.run(RELEASE);
- motor2.setSpeed(0);
- motor2.run(RELEASE);
- motor3.setSpeed(0);
- motor3.run(RELEASE);
- motor4.setSpeed(0);
- motor4.run(RELEASE);
- delay(1000);
-
- motor1.setSpeed(200);
- motor1.run(BACKWARD);
- motor2.setSpeed(200);
- motor2.run(BACKWARD);
- motor3.setSpeed(200);
- motor3.run(BACKWARD);
- motor4.setSpeed(200);
- motor4.run(BACKWARD);
- delay(2000);
-
- motor1.setSpeed(0);
- motor1.run(RELEASE);
- motor2.setSpeed(0);
- motor2.run(RELEASE);
- motor3.setSpeed(0);
- motor3.run(RELEASE);
- motor4.setSpeed(0);
- motor4.run(RELEASE);
- delay(1000);
- }
復制代碼
作者: eagler8 時間: 2020-12-29 20:38
實驗開源仿真編程(linkboy V4.1)
34.jpg (87.44 KB, 下載次數(shù): 364)
下載附件
2020-12-29 20:38 上傳
作者: eagler8 時間: 2020-12-30 17:06
用這款電機驅動擴展板做了一輛麥克納姆輪小車
37.jpg (245.21 KB, 下載次數(shù): 379)
下載附件
2020-12-30 17:06 上傳
作者: eagler8 時間: 2020-12-30 18:04
麥克納姆輪車子運動模式圖
35.jpg (169.97 KB, 下載次數(shù): 404)
下載附件
2020-12-30 18:04 上傳
作者: eagler8 時間: 2020-12-30 18:06
實驗仿真編程(linkboy V4.1)之二
36.jpg (113.6 KB, 下載次數(shù): 407)
下載附件
2020-12-30 18:06 上傳
作者: eagler8 時間: 2020-12-30 18:16
使用
AFMotor電機擴展板的麥克納姆輪小車(視頻)
https://v.youku.com/v_show/id_XNTAzNDYyMzE1Mg==.html?spm=a2hzp.8253869.0.0
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
一级免费av
|
日韩成人免费
|
精品久久免费
|
www.超碰
|
久久综合一区
|
欧美91视频
|
久草免费在线视频
|
九九在线观看高清免费
|
国产精品久久免费
|
解开岳的丰满奶罩bd
|
国产视频一二区
|
国产精品入口夜色视频大尺度
|
成人aaaa|
影音先锋在线观看视频
|
日韩精品一区二区三区免费视频
|
久久久久精
|
国产成人网
|
一级黄色片在线观看
|
久久伊人av
|
日韩三级久久
|
色激情网|
成人福利在线观看
|
成人在线视频免费观看
|
久久机热这里只有精品
|
97av在线|
国产日产精品一区二区三区的介绍
|
一级黄色片免费观看
|
亚洲av毛片成人精品
|
欧美一区二区在线播放
|
99热精品在线
|
色爱综合区
|
91啪国产|
午夜性影院
|
中文字幕理论片
|
99超碰在线观看
|
精品欧美一区二区精品久久
|
黄色福利|
欧美在线免费
|
国产福利在线
|
日本免费在线视频
|
在线播放a
|