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); }
補充實驗場景圖