【雕爺學程式設計】Arduino動手做(87)---ULN2003步進電機模組
37款感測器與執行器的提法,在網路上廣泛流傳,其實Arduino能夠相容的感測器模組肯定是不止這37種的。鑑於本人手頭積累了一些感測器和執行器模組,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這裡準備逐一動手嘗試系列實驗,不管成功(程式走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計)
實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組
ULN2003
ULN2003是高耐壓、大電流複合電晶體陣列,由七個矽NPN 複合電晶體組成,每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩衝器來處理的資料。ULN2003 的每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩衝器來處理的資料。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,並且能夠在關態時承受50V 的電壓,輸出還可以在高負載電流並行執行,採用DIP—16 或SOP—16 塑料封裝。
LN2003晶片引腳介紹
引腳1:CPU脈衝輸入端,埠對應一個訊號輸出端。
引腳2:CPU脈衝輸入端。
引腳3:CPU脈衝輸入端。
引腳4:CPU脈衝輸入端。
引腳5:CPU脈衝輸入端。
引腳6:CPU脈衝輸入端。
引腳7:CPU脈衝輸入端。
引腳8:接地。
引腳9:該腳是內部7個續流二極體負極的公共端,各二極體的正極分別接各達林頓管的集電極。用於感性負載時,該腳接負載電源正極,實現續流作用。如果該腳接地,實際上就是達林頓管的集電極對地接通。
引腳10:脈衝訊號輸出端,對應7腳訊號輸入端.
引腳11:脈衝訊號輸出端,對應6腳訊號輸入端。
引腳12:脈衝訊號輸出端,對應5腳訊號輸入端。
引腳13:脈衝訊號輸出端,對應4腳訊號輸入端。
引腳14:脈衝訊號輸出端,對應3腳訊號輸入端。
引腳15:脈衝訊號輸出端,對應2腳訊號輸入端。
引腳16:脈衝訊號輸出端,對應1腳訊號輸入端。
ULN2003 是高耐壓、大電流複合電晶體陣列,由七個矽NPN 複合電晶體組成。
ULN2003內部還集成了一個消線圈反電動勢的二極體,可用來驅動繼電器。它是雙列16腳封裝,NPN電晶體矩陣,最大驅動電壓=50V,電流=500mA,輸入電壓=5V,適用於TTL COMS,由達林頓管組成驅動電路。 ULN是整合達林頓管IC,內部還集成了一個消線圈反電動勢的二極體,它的輸出端允許通過電流為200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。使用者輸出口的外接負載可根據以上引數估算。採用集電極開路輸出,輸出電流大,故可直接驅動繼電器或固體繼電器,也可直接驅動低壓燈泡。通常微控制器驅動ULN2003時,上拉2K的電阻較為合適,同時,COM引腳應該懸空或接電源。ULN2003是一個非閘電路,包含7個單元,單獨每個單元驅動電流最大可達350mA,9腳可以懸空。比如1腳輸入,16腳輸出,你的負載接在VCC與16腳之間,不用9腳。
特點如下:
ULN2003 的每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩衝器來處理的資料。
ULN2003 工作電壓高,工作電流大,灌電流可達500mA,並且能夠在關態時承受50V 的電壓,輸出還可以在高負載電流並行執行。
ULN2003 採用DIP—16 或SOP—16 塑料封裝。
達林頓管
又稱複合管。他將兩個三極體串聯,以組成一隻等效的新的三極體。這隻等效三極體的放大倍數是原二者之積,因此它的特點是放大倍數非常高。達林頓管的作用一般是在高靈敏的放大電路中放大非常微小的訊號,如大功率開關電路。在電子學電路設計中,達林頓接法常用於功率放大器和穩壓電源中。
圖示ULN2003,內部是7個達林頓管(比ULN2803少一個達林頓管),可以看出來,每個達林頓管是兩個三極體組合起來了,相當於一個NPN三極體。IN端加控制電壓,OUT端接負載,輸出是低電平有效。
實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組
ULN2003驅動板
外形尺寸:31×35mm
使用ULN2003大功率達林頓晶片驅動步進電機;
A、B、C、D發光二極體指示四相步進電機工作時的狀態;
配有步進電機的標準介面,使用時可直接插撥
模組電原理圖
步進電機
是將電脈衝訊號轉變為角位移或線位移的開環控制電機,是現代數字程式控制系統中的主要執行元件,應用極為廣泛。在非超載的情況下,電機的轉速、停止的位置只取決於脈衝訊號的頻率和脈衝數,而不受負載變化的影響,當步進驅動器接收到一個脈衝訊號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱為“步距角”,它的旋轉是以固定的角度一步一步執行的。可以通過控制脈衝個數來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈衝頻率來控制電機轉動的速度和加速度,從而達到調速的目的。步進電機是一種感應電機,它的工作原理是利用電子電路,將直流電變成分時供電的,多相時序控制電流,用這種電流為步進電機供電,步進電機才能正常工作,驅動器就是為步進電機分時供電的,多相時序控制器。雖然步進電機已被廣泛地應用,但步進電機並不能像普通的直流電機,交流電機在常規下使用。它必須由雙環形脈衝訊號、功率驅動電路等組成控制系統方可使用。因此用好步進電機卻非易事,它涉及到機械、電機、電子及計算機等許多專業知識。步進電機作為執行元件,是機電一體化的關鍵產品之一,廣泛應用在各種自動化控制系統中。隨著微電子和計算機技術的發展,步進電機的需求量與日俱增,在各個國民經濟領域都有應用。
電機名稱:減速永磁步進電機
電機型號:28BYJ-48
驅動電壓:5V
驅動方式:四相八拍
齒輪減速比:1/64
採用ULN2003驅動,使用方便
優質步進電機,帶齒輪減速,噪音極低,運轉平穩
5V即可驅動,方便微控制器開發者使用
開放性介面,也可用通過本板驅動其他步進電機
適用於51/AVR/Arduino/ARM等各種平臺,機器人設計開發必備
28BYJ-48工作原理
假定電機的起始狀態,逆時針方向轉動,起始時是 B 相繞組的開關閉合,B 相繞組導通,那麼導通電流就會在正上和正下兩個定子齒上產生磁性,這兩個定子齒上的磁性就會對轉子上的 0 和 3 號齒產生最強的吸引力,就會如圖所示的那樣,轉子的 0 號齒在正上、3 號齒在正下而處於平衡狀態;此時我們會發現,轉子的 1 號齒與右上的定子齒也就是 C 相的一個繞組呈現一個很小的夾角,2 號齒與右邊的定子齒也就是 D 相繞組呈現一個稍微大一點的夾角,很明顯這個夾角是 1 號齒和 C 繞組夾角的 2 倍,同理,左側的情況也是一樣的。
接下來,把 B 相繞組斷開,而使 C 相繞組導通,那麼很明顯,右上的定子齒將對轉子 1 號齒產生最大的吸引力,而左下的定子齒將對轉子 4 號齒,產生最大的吸引力,在這個吸引力的作用下,轉子 1、4 號齒將對齊到右上和左下的定子齒上而保持平衡,如此,轉子就轉過了起始狀態時 1 號齒和 C 相繞組那個夾角的角度。
再接下來,斷開 C 相繞組,導通 D 相繞組,過程與上述的情況完全相同,最終將使轉子2、5 號齒與定子 D 相繞組對齊,轉子又轉過了上述同樣的角度。
那麼很明顯,當 A 相繞組再次導通,即完成一個 B-C-D-A 的四節拍操作後,轉子的 0、3 號齒將由原來的對齊到上下 2 個定子齒,而變為了對齊到左上和右下的兩個定子齒上,即轉子轉過了一個定子齒的角度。依此類推,再來一個四節拍,轉子就將再轉過一個齒的角度,8 個四節拍以後轉子將轉過完整的一圈,而其中單個節拍使轉子轉過的角度就很容易計算出來了,即 360 度/(8*4)=11.25 度,這個值就叫做步進角度。而上述這種工作模式就是步進電機的單四拍模式——單相繞組通電四節拍。
具有更優效能的工作模式,那就是在單四拍的每兩個節拍之間再插入一個雙繞組導通的中間節拍,組成八拍模式。比如,在從 B 相導通到 C 項導通的過程中,假如一個 B 相和 C 相同時導通的節拍,這個時候,由於 B、C 兩個繞組的定子齒對它們附近的轉子齒同時產生相同的吸引力,這將導致這兩個轉子齒的中心線對比到 B、C 兩個繞組的中心線上,也就是新插入的這個節拍使轉子轉過了上述單四拍模式中步進角度的一半,即 5.625度。這樣一來,就使轉動精度增加了一倍,而轉子轉動一圈則需要 8*8=64 拍了。另外,新增加的這個中間節拍,還會在原來單四拍的兩個節拍引力之間又加了一把引力,從而可以大大增加電機的整體扭力輸出,使電機更“有勁”了。
除了上述的單四拍和八拍的工作模式外,還有一個雙四拍的工作模式——雙繞組通電四節拍。其實就是把八拍模式中的兩個繞組同時通電的那四拍單獨拿出來,而捨棄掉單繞組通電的那四拍而已。其步進角度同單四拍是一樣的,但由於它是兩個繞組同時導通,所以扭矩會比單四拍模式大,在此就不做過多解釋了。
八拍模式是這類 4 相步進電機的最佳工作模式,能最大限度的發揮電機的各項效能,也是絕大多數實際工程中所選擇的模式。
實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組
實驗接線示意圖
實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組
專案一:逆時針旋轉一圈,順時針旋轉半圈,串列埠監控
實驗開原始碼
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+模擬程式設計+圖形程式設計) 實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組 專案一:逆時針旋轉一圈,順時針旋轉半圈,串列埠監控 連線引腳:分別將28BYJ-48驅動器的IN1 IN2 IN3 IN4連線到 Arduino Uno R3 4 6 5 7引腳 */ #include <Stepper.h> // 這裡設定步進電機旋轉一圈是多少步 #define STEPS 100 //設定步進電機的步數和引腳(就是注意點2裡面說的驅動板上IN1~IN4連線的四個數字口)。 Stepper stepper(STEPS, 4, 6, 5, 7); void setup(){ // 設定電機的轉速:每分鐘為90步 stepper.setSpeed(90); // 初始化串列埠,用於除錯輸出資訊 Serial.begin(9600); } void loop(){ // 逆時針旋轉一週 Serial.println("Counterclockwise rotation"); stepper.step(2048); //4步模式下旋轉一週用2048 步 delay(500); // 順時針旋轉半周 Serial.println("Clockwise rotation"); stepper.step(-1024); //4步模式下旋轉一週用2048 步 delay(500); }
實驗串列埠返回情況
實驗開源模擬程式設計(Linkboy V4.5)
實驗開源圖形程式設計(Mind+、Mixly、編玩邊學)
實驗開源模擬程式設計(Linkboy V4.52)
專案四實驗開原始碼
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+圖形程式設計+模擬程式設計) 實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組 專案四:順時針旋轉1圈,逆時針旋轉1/4圈,串列埠監控 連線引腳:分別將28BYJ-48驅動器的IN1 IN2 IN3 IN4連線到 Arduino UNO R3 8,9,10,11引腳 */ //使用arduino IDE自帶的Stepper.h庫檔案 #include <Stepper.h> // 這裡設定步進電機旋轉一圈是多少步,依據步距角計算,及走一圈需要多少脈衝 #define STEPS 64 //設定步進電機的步數和引腳(就是驅動板上IN1~IN4連線的四個數字口)。 Stepper stepper(STEPS, 8, 9, 10, 11); void setup(){ // 設定電機的轉速:每分鐘為90步 stepper.setSpeed(290); // 初始化串列埠,用於除錯輸出資訊 Serial.begin(9600); } void loop(){ // 順時針旋轉 Serial.println("順時針旋轉1圈"); stepper.step(2048); delay(500); // 逆時針旋轉 Serial.println("逆時針旋轉1/4圈"); stepper.step(-512); delay(500); }
實驗串列埠返回情況
專案五,實驗開原始碼
/* 【Arduino】168種感測器模組系列實驗(資料程式碼+圖形程式設計+模擬程式設計) 實驗八十七:步進電機+ULN2003驅動板 4相 5線 5V步進電機模組 專案三:極慢轉動4步用於觀察ULN2003電機驅動板LED變化, 慢速順時針旋轉一圈,快速逆時針旋轉一圈,間隔0.5秒 連線引腳:分別將28BYJ-48驅動器的IN1 IN2 IN3 IN4連線到 Arduino UNO R3 8,10,9,11引腳 */ //本實驗程式使用Stepper庫 #include <Stepper.h> // 定義電機控制用常量 // 電機內部輸出軸旋轉一週步數 const int STEPS_PER_ROTOR_REV = 32; // 減速比 const int GEAR_REDUCTION = 64; /* 轉子旋轉一週需要走32步。轉子每旋轉一週,電機輸出軸只旋轉1/64周。 (電機內部配有多個減速齒輪,這些齒輪會的作用是讓轉子每旋轉一週, 輸出軸只旋轉1/64周。) 因此電機輸出軸旋轉一週則需要轉子走32X64=2048步,即以下常量定義。 */ // 電機外部輸出軸旋轉一週步數 (2048) const float STEPS_PER_OUT_REV = STEPS_PER_ROTOR_REV * GEAR_REDUCTION; // 定義電機控制用變數 // 電機旋轉步數 int StepsRequired; // 建立步進電機物件 // 定義電機控制引腳以及電機基本資訊。 // 電機控制引腳為 8,9,10,11 // 以上引腳依次連線在ULN2003 驅動板 In1, In2, In3, In4 Stepper steppermotor(STEPS_PER_ROTOR_REV, 8, 9, 10, 11); void setup() { //setup函式內無內容 } void loop() { // 極慢轉動4步用於觀察ULN2003電機驅動板LED變化 steppermotor.setSpeed(1); StepsRequired = 4; steppermotor.step(StepsRequired); delay(500); // 慢速順時針旋轉一圈 StepsRequired = STEPS_PER_OUT_REV; steppermotor.setSpeed(500); steppermotor.step(StepsRequired); delay(500); // 快速逆時針旋轉一圈 StepsRequired = - STEPS_PER_OUT_REV; steppermotor.setSpeed(800); steppermotor.step(StepsRequired); delay(500); }
補充實驗場景圖