arduino控制步進電機移動絲杆實現撥片架水平移動

2022-01-02 古月居

這篇博客不同於前面的樹莓派和底盤子系統的控制了,而是要進行講解分析如何通過arduino控制步進電機移動絲杆實現撥片架的水平移動了,那麼為什麼要實現這麼一個功能呢?


原因很簡單,因為我們的購物機器人依靠撥片撥取貨物,但是在貨架上或者倉庫裡的時候,購物機器人的撥片可能撥不到貨物,因此就需要依靠絲杆帶動撥片架去撥取貨物

TB6600型驅動器接線方法

TB6600升級版步進電機驅動器的A+-和B+-是連接步進電機的黑綠紅藍,EN(使能端) DIR(方向信號線) PUL(脈衝線),驅動可以採用共陰極也可以採用共陽極,共陽共陰接好後只需用arduino給PUL送進脈衝信號以及給DIR送進方向信號即可,至於EN的信號端可以懸空,這樣比較方便,供電埠24V

按照上述方法連接好信號線後,就可以編寫arduino程序控制步進電機了,在這裡我使用了2種方法控制步進電機。

按鍵控制

之前做電賽的時候還有一塊調參的板子,上面有按鍵還有撥碼,因此我就將其用作按鍵控制絲杆的調試工具了。

首先最主要的就是步進電機的控制方法了,線連接好之後,只需用arduino給PUL送進脈衝信號以及給DIR送進方向信號即可

#define pul1 9#define dir1 8#define speed_pul 4

  digitalWrite(pul1, HIGH);  delayMicroseconds(speed_pul);  digitalWrite(pul1, LOW);  delayMicroseconds(speed_pul);

可以看到程序的實現方法很簡單,就是通過給引腳輸送一個高電平,延時一段時間,再輸送一個低電平,再延時一段時間,從而產生方波信號。speed_pul這個參數就是方波中,高低電平的持續時間,那麼這個方波頻率的高低對於步進電機的運動會有怎樣的影響呢?


我設計了一個實驗,如圖所示,我測量了不同方波頻率下,絲杆從點1移動到點2所花費的時間

橫坐標是運動完全程所花費的時間,縱坐標是speed_pul數值大小,因為當speed_pul小於3時,步進電機不能移動,因此就將這種情況下的時間設定為0,不做考慮。從圖中可以發現,隨著speed_pul數值的減小,步進電機移動完全程的時間也在減少,因此為了減少購物機器人在場上移動絲杆的時間,我將speed_pul參數設置為了4。


產生了方波信號之後,只需要再給步進電機方向它就可以運動了,於是乎控制步進電機左移的程序如下所示

void turn_left(){  digitalWrite(dir1, HIGH);  digitalWrite(pul1, HIGH);  delayMicroseconds(speed_pul);  digitalWrite(pul1, LOW);  delayMicroseconds(speed_pul);}

void turn_right(){  digitalWrite(dir1, LOW);  digitalWrite(pul1, HIGH);  delayMicroseconds(speed_pul);  digitalWrite(pul1, LOW);  delayMicroseconds(speed_pul);}

至此完成了步進電機的驅動,接下來只需要結合按鍵即可,首先我們需要設置按鍵信號接入arduino的引腳
const int up_btn, down_btn, left_btn = 2, right_btn = 3;


接下來就是邏輯分析了,因為按鍵按下之後引腳呈現的是低電平,因此每檢測到一個低電平之後我就輸送50個方波信號給步進電機的驅動,從而控制步進電機帶動絲杆轉動一定距離,那麼為什麼是50個方波信號呢?其實也很好理解,一次性輸送的方波信號個數越多,相當於驅動步進電機轉動的時間越長,絲杆移動的距離也就越遠,撥片架移動的距離也就越遠。為了保證按鍵控制的精細度,我就設置了按一次按鍵發送50個方波信號。


具體實現如下

int btn_move_dis = 50;void key_board(){  int i = 0;  int left_flag;  int right_flag;  left_flag = digitalRead(left_btn);  right_flag = digitalRead(right_btn);  if (left_flag == LOW)  {    for (i = 0; i < btn_move_dis; i++)    {      turn_left();    }  }  else if (right_flag == LOW)  {    for (i = 0; i < btn_move_dis; i++)    {      turn_right();    }    exeTime2 = millis() - exeTime1;  }}

在實際的運行過程中,都是由樹莓派發送指令控制其他子系統的,因此步進電機的控制數據肯定也是通過串口接收的,所以我們還要加一個串口控制的部分

  while (Serial.available() > 0) {    delay(100);    move_ctl_dis = Serial.parseInt();    Serial.println(move_ctl_dis);  }  while (Serial.read() >= 0) {}

這段程序還是比較簡單好搞明白的,那麼現在就是有一個問題。在按鍵控制步進電機的時候是arduino檢測到一個低電平就會就會發送50個方波信號,那麼發送了50個方波信號之後,絲杆實際上能移動多少我們不得而知。其實這其中的問題是我們目前還不能精細的控制步進電機的移動距離,而只能控制它往特定方向進行連續運動。因此我們就需要修改一下驅動程序

int move_ctl_dis;unsigned long cm_cnt = 32000;   if (move_ctl_dis != 0) {    if (move_ctl_dis > 0) {      for (int i = 0; i < move_ctl_dis; i++)      {        for (unsigned long j = 0; j < cm_cnt; j++ ) {          turn_left();        }      }    } else if (move_ctl_dis < 0) {      move_ctl_dis = -move_ctl_dis;      for (int i = 0; i < move_ctl_dis; i++)      {        for (unsigned long j = 0; j < cm_cnt; j++ ) {          turn_right();        }      }    }    move_ctl_dis = 0;  }

這段程序有什麼特別的呢?我們抓取主要的一部分來做特別分析

 for (int i = 0; i < move_ctl_dis; i++) {   for (unsigned long j = 0; j < cm_cnt; j++ ) {     turn_left();   } }

其中外循環的move_ctl_dis是arduino接收到的上層發送過來的移動距離,而內循環則代表了每發送cm_cnt個方波信號,絲杆就會帶動撥片架移動1cm,這個數據是通過實際測試得出的,因此move_ctl_dis的絕對值即撥片架實際移動的距離,正負不過是左右移動的區別而已,因此在主循環裡這樣寫就可以了

void loop(){  key_board();  CatchMove();  while (Serial.available() > 0) {    delay(100);    move_ctl_dis = Serial.parseInt();    Serial.print("Serial.parseInt:");    Serial.println(move_ctl_dis);    move_ctl_dis = move_ctl_dis;  }  while (Serial.read() >= 0) {}}

最後還有一個問題,那就是我們還不能知道撥片架的實際位置,這樣不利於我們進一步控制,因此我想了個辦法。那就是在剛開始的時候總是通過按鍵將撥片架移動到特定位置,那麼之後的位置都是相對於這個初始位置移動的,這樣我們就有了參照,才能準確、穩定控制撥片架照我們預想的方式運動。

《通過電機控制學習PID算法》本課程從最開始的電機部分再到核心的PID算法,一步一步循序漸進,通過這個課程的學習可以讓同學們認識到算法的重要性,同時本課程理論與實踐相結合,將難以理解的理論部分通俗的向大家分析講解。

點擊「閱讀原文」查看課程詳情

相關焦點

  • arduino驅動帶撥片的ST90S微型舵機完成貨物撥取任務
    之前我寫了arduino驅動步進電機帶動絲杆運動的博客,連結在下面:arduino控制步進電機移動絲杆實現撥片架水平移動既然已經可以驅動絲杆帶動撥片架運動了,接下就是需要驅動ST90S微型舵機來帶動撥片撥取貨物了,本博客就介紹arduino如何驅動ST90S微型舵機
  • 【大有用處】步進電機的選型計算方法
    來源:網際網路步進電機是一種能將數字輸入脈衝轉換成旋轉或直線增量運動的電磁執行元件。每輸入一個脈衝電機轉軸步進一個步距角增量。電機總的迴轉角與輸入脈衝數成正比例,相應的轉速取決於輸入脈衝頻率。步進電機是機電一體化產品中關鍵部件之一,通常被用作定位控制和定速控制。步進電機慣量低、定位精度高、無累積誤差、控制簡單等特點。
  • 步進電機速度控制方法
    步進電機只能夠由數位訊號控制運行的,當脈衝提供給驅動器時,在過於短的時間裡,控制系統發出的脈衝數太多,也就是脈衝頻率過高,將導致步進電機堵轉。就是說,在步進電機起步時,要給逐漸升高的脈衝頻率,減速時的脈衝頻率需要逐漸減低。這就是我們常說的「加減速」方法。 步進電機轉速度是根據輸入的脈衝信號的變化來改變的,從理論上講,給驅動器一個脈衝,步進電機就旋轉一個步距角(細分時為一個細分步距角)。
  • 步進電機精確控制
    一、步進電機分類1.按構造分類①反應式;由定子和轉子構成,定子上有繞組,轉子由軟磁材料製成。
  • 第三篇:步進電機控制代碼
    第一篇:步進電機工作原理第二篇:步進電機驅動控制第三篇:單片機代碼實現步進電機控制
  • 用Arduino Nano和步進電機做一個自平衡機器人
    今天和大家介紹一個利用簡單的步進電機和Arduino Nano做一個自平衡機器人的項目。另一個用於穩定速度或位置。步進控制機器人通過施加一個與角度大致成正比的力來平衡自己。這意味著電機應該隨著加速度轉動。由於我們有步進電機,我們需要計算下一步的延遲,最好是在每一步之後(或儘可能快)。
  • 步進電機
    機器人的行走、轉向等動作均需要步進電機的配合,機器人的功能越多、動作複雜程度越高,所需要的電機數量也就越多。2、通信基站基站的天線需要調節角度以優化移動通信的網絡質量。5G時代需要更多的基站,也需要更多的步進電機以調整天線的角度。投資者互動:1、公司的基站電機技術積累深厚,並主要面向國內主流通信基站進行設計,具備高智能、多天線、低密度、低輻射、低功耗等優點。
  • 步進電機控制方法,總算有人講明白了!
    隨著嵌入式系統(例如印表機、磁碟驅動器、玩具、雨刷、震動尋呼機、機械手臂和錄像機等)的日益流行,步進電機的使用也開始暴增。不論在工業、軍事、醫療、汽車還是娛樂業中,只要需要把某件物體從一個位置移動到另一個位置,步進電機就一定能派上用場。步進電機有許多種形狀和尺寸,但不論形狀和尺寸如何,它們都可以歸為兩類:可變磁阻步進電機和永磁步進電機。本文重點討論更為簡單也更常用的永磁步進電機。
  • 淺談步進電機的PLC控制方法
    ,它與計算機有效結合,可進行模擬量控制,具有遠程通信功能等。2、步進電機的速度控制   FP1有一條SPD0指令,該指令配合HSC和Y7的脈衝輸出功能可實現速度及位置控制。3、控制系統的程序運行  Y7輸出的脈衝作為步進電機的時鐘脈衝,經驅動器產生節拍脈衝,控制步進電機運轉。同時Y7接至PLC的輸入接點X0,並經X0送至PLC內部的HSC。HSC計數Y7的脈衝數,當達到預定值時發生中斷,使Y7的脈衝頻率切換至下一參數,從而實現較準確的位置控制。
  • 總算有人把步進電機控制方法講得明明白白!
    步進電機已經滲透入我們生活的方方面面,本文介紹了一些重要的步進電機相關技術,為開發人員基本了解步進電機的工作原理提供了足夠的信息,同時也介紹了用微控制器或數位訊號處理器控制步進電機的方法
  • 創客實戰 | 用Arduino實現循跡小車(初級)
    (2)要求智能,即可以通過CPU控制小車自由移動,那麼必須有控制輪子的驅動,一般輪子的驅動用電機製作,可為直流電機或步進電機,因此這部分內容包括CPU控制電機實現小車前後移動,左拐、右拐,調速;必須有一個CPU處理器,使用單片機、ARM等處理器晶片都可以;電機驅動電路,實現電機正反轉、調速。
  • 一文了解步進電機原理
    轉子為永磁體,分為兩段,開小齒,轉矩大,動態性能好,步距角小,但結構複雜,成本高;HB式擁有PM和VR式兩種結構的特點,同時具備:1)PM式的靜止保持力矩;2)VR式的微小步距和大轉矩;永磁式步進電機一般為兩相,轉矩和體積較小,步進角一般為7.5°或15°;反應式步進電機一般為三相,可實現大轉矩輸出,步進角一般為1.5°,
  • 樹莓派入門(八)之樹莓派與A4988 驅動42步進電機
    在樹莓派入門(三)裡面我介紹了如何驅動步進電機,當時驅動的步進電機是那種比較簡單精度不是那麼高的電機,今天我們驅動的是比較複雜的步進電機
  • 步進電機控制器與伺服電機控制器的區別
    步進電機和伺服電機是工控領域應用最廣泛的兩類產品,而它們的核心分別是步進電機控制器與伺服電機控制器,本文將給大家講解這兩種器件不一樣的地方。一、工作原理的不同步進電機控制器:它是一種能夠發出均勻脈衝信號的電子產品,它發出的信號進入步進電機驅動器後,會由驅動器轉換成步進電機所需要的強電流信號,帶動步進電機運轉。
  • 三菱制定位單元起動伺服電機(步進電機等)順序書
    三菱制定位單元起動伺服電機(步進電機等)順序書前期準備①最小限的參數設定基本參數 1:Pr1單位設定 根據控制對象進行選擇。水平、垂直移 動裝置為mm、旋轉裝置為degree最佳。          Pr2每1轉的脈衝數 輸入伺服電機式樣書中記載的 編碼器、伺服電機每1轉的分辨力。
  • 伺服電機和步進電機的區別
    伺服電機和步進電機的區別是什麼?        機電設備中有的地方用的伺服電機。有的地方用的是步進電機,價格是相差很遠的。 步進電機是將電脈衝信號轉變為角位移或線位移的開環控制元步進電機件,在非超載的情況下,電機的轉速、停止的位置只取決於脈衝信號的頻率和脈衝個數,而不受負載變化的影響,當步進驅動器接收到一個脈衝信號
  • 【簡述】步進電機原理
    ;更通俗一點講:當步進驅動器接收到一個脈衝信號,它就驅動步進電機按設定的方向轉動一個固定的角度。我們可以通過控制脈衝的個數來控制電機的角位移量,從而達到精確定位的目的;同時還可以通過控制脈衝頻率來控制電動機轉動的速度和加速度,從而達到調速的目的。目前,比較常用的步進電動機包括反應式步進電動機(VR)、永磁式步進電動機(PM)、混合式步進電動機(HB)和單相式步進電動機等。
  • 步進電機接線圖,8線步進電機接線圖圖解
    在非超載的情況下,電機的轉速、停止的位置只取決於脈衝信號的頻率和脈衝數,而不受負載變化的影響,即給電機加一個脈衝信號,電機則轉過一個步距角。步進電機是將電脈衝信號轉變為角位移或線位移的開環控制電機,是現代數字程序控制系統中的主要執行元件,應用極為廣泛。
  • 步進電機工作原理
    步進電機的運行要有一電子裝置進行驅動,這種裝置就是步進電機驅動器,它是把控制系統發出的脈衝信號轉化為步進電機的角位移,或者說,控制系統每發一個脈衝信號