Tìm kiếm mã

Bài 107-5: Gửi động cơ 28BYJ-48 quay một vòng theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ, STPB-3

Bài 107-5: Gửi động cơ 28BYJ-48 quay một vòng theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ, STPB-3

Dự án 5: Một Vòng Quay Được Kích Hoạt Bằng Nút Nhấn STPB-3 – Động Cơ Bước 28BYJ-48

Bài viết này thuộc chuỗi 8 dự án giáo dục về động cơ bước 28BYJ-48 sử dụng Arduino. Trong Dự án 5, chúng ta sử dụng một nút nhấn mới, có nhãn STPB-3, để kích hoạt một vòng quay đầy đủ duy nhất của động cơ mỗi lần nhấn. Phương pháp này thường được sử dụng trong các hệ thống chuyển động theo chỉ số, nơi cần điều khiển chính xác một chu kỳ.

stepper_28BYJ-48-0

Mã nguồn hoàn chỉnh và sơ đồ đấu dây cho dự án này được cung cấp bên dưới bài viết này.

📘 Giới thiệu

Dự án này mở rộng các điều khiển dựa trên nút nhấn trước đó bằng cách giới thiệu hành vi chốt: nhấn nút một lần sẽ bắt đầu và hoàn thành chính xác một vòng quay đầy đủ của động cơ. Hệ thống bỏ qua trạng thái nút trong quá trình động cơ hoạt động để đảm bảo chuyển động chính xác và lặp lại được.

⚙️ Sơ đồ đấu dây

stepper_28BYJ-48_wiring_PB-_keep_pressed

Ngoài các kết nối động cơ bước và driver ULN2003, dự án này kết nối nút STPB-3 như sau:

  • Một đầu của nút nhấn STPB-3Chân Arduino 2

  • Đầu còn lại → GND

  • Sử dụng cấu hình kéo lên nội bộ

Chú thích: Sơ đồ đấu dây Dự án 5: nhấn STPB-3 một lần để kích hoạt một vòng quay đầy đủ của động cơ.


💻 Giải thích mã

Mã này sử dụng phát hiện cạnh để xác định một sự kiện nhấn duy nhất và thực hiện một vòng quay đầy đủ của động cơ bước.

  1. Khởi tạo Hằng số và Đối tượng:

#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
const int buttonPin = 2;
int lastButtonState = HIGH;
  1. Hàm Thiết lập:

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  myStepper.setSpeed(10);
  Serial.begin(9600);
}
  1. Hàm Vòng lặp với Phát hiện Cạnh:

void loop() {
  int currentState = digitalRead(buttonPin);
  if (lastButtonState == HIGH && currentState == LOW) {
    myStepper.step(stepsPerRevolution);
  }
  lastButtonState = currentState;
}
  • Điều này đảm bảo động cơ quay một lần chỉ khi bắt đầu nhấn nút (cạnh xuống).

  • Nó tránh kích hoạt lặp lại khi nút được giữ.

 

🎬 Mốc thời gian từ Video đầy đủ

Để tham khảo trực quan, hãy xem các điểm này trong hướng dẫn đầy đủ:

  • 51:20 – Dự án 5: Giới thiệu

  • 52:15 – Dự án 5: Đấu dây

  • 55:40 – Dự án 5: Mã

  • 1:03:30 – Dự án 5: Trình diễn

📁 Phần Tải xuống

Bạn có thể tải xuống mã hoàn chỉnh và sơ đồ đấu dây cho dự án này bên dưới. Cách tiếp cận này lý tưởng khi một hệ thống cơ khí yêu cầu định vị chính xác với mỗi lần nhấn nút.

Tiếp theo là [Dự án 6: Góc và Tốc độ Thay đổi với STPB-4].

Hình ảnh

stepper_28BYJ-48-3
stepper_28BYJ-48-3
stepper_28BYJ-48-2
stepper_28BYJ-48-2
ULN2003_board-1
ULN2003_board-1
stepper_28BYJ-48-0
stepper_28BYJ-48-0
stepper_28BYJ-48-1
stepper_28BYJ-48-1
stepper_28BYJ-48_wiring_PB-_keep_pressed
stepper_28BYJ-48_wiring_PB-_keep_pressed
586-Project 107-5: Controlling a 28BYJ-48 Stepper Motor Using multiple buttons for any angle STPB-5
Ngôn ngữ: C++
/*
* Lesson 107-5: Controlling stepper motor using 2 push buttons STPB-2.
STPB-2: We control the stepper motor using two push buttons. One push button rotates the motor clockwise (CW), and the other rotates it counter-clockwise (CCW). Keys must be kept pressed.

In this lesson, we learn how to use a mini stepper motor 28BYJ-48 for our project. I am presenting 8 projects so you can use it in almost any application. In the video, I have explained the code, shown the full wiring diagram, and how to connect the wires, push buttons, and breadboard.

Project 2: We will push different keys on the keyboard and control the motor


Project 1: Running motor
Project 2: Controlling stepper motor from Serial Monitor
Project 3: Controlling stepper motor using push button STPB-1
Project 4: Controlling using push button STPB-2, keep pressing
Project 5: One Revolution using push button STPB-3 (this code)
Project 6: Push button: Any Angle and speed STPB-4
Project 7: Using multiple buttons for any angle: STPB-5 (angle, speed, and direction)
Project 8: Controlling stepper motor using potentiometer

* Watch Video instruction for this code: https://youtu.be/TQ7R2bY-MWU
*
* This code is part of the Arduino Step by Step Course, which starts here:  https://youtu.be/-6qSrDUA5a8
*
* For the library for this code, visit http://robojax.com/
*

If you found this tutorial helpful, please support me so I can continue creating
content like this. Make a donation using PayPal or a credit card: https://bit.ly/donate-robojax

* Written by Ahmad Shamshiri for Robojax Robojax.com
* on Feb 20, 2019, at 19:34 in Ajax, Ontario, Canada

* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
* This code has been downloaded from Robojax.com
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.

*/


int Pin1 = 10;//IN1 is connected to 10
int Pin2 = 11;//IN2 is connected to 11
int Pin3 = 12;//IN3 is connected to 12
int Pin4 = 13;//IN4 is connected to 13
int switchCW  =2;//define input pin for CW push button
int switchCCW =3;//define input pin for CCW push button
int speedFactor =1;//1=fastest, 2=slower or 3 more slower



int correction_CW = 150;
int correction_CCW = 150;

const int CW =1;
const int CCW =2;
const int STOP =3;
int poleStep = 0;
const int SPR=64*64;

int pole1[] ={0,0,0,0, 0,1,1,1, 0};//pole1, 8 step values
int pole2[] ={0,0,0,1, 1,1,0,0, 0};//pole2, 8 step values
int pole3[] ={0,1,1,1, 0,0,0,0, 0};//pole3, 8 step values
int pole4[] ={1,1,0,0, 0,0,0,1, 0};//pole4, 8 step values





int count=0;
int  dirStatus = STOP;// stores direction status 3= stop (do not change)

void setup()
{
  //Robojax.com Stepper Push button One Revolution STPB-3
  Serial.begin(9600);
  Serial.print("Robojax Video for Stepper Motor STPB-2");
  pinMode(Pin1, OUTPUT);//define pin for ULN2003 in1
  pinMode(Pin2, OUTPUT);//define pin for ULN2003 in2
  pinMode(Pin3, OUTPUT);//define pin for ULN2003 in3
  pinMode(Pin4, OUTPUT);//define pin for ULN2003 in4

  pinMode(switchCW,INPUT_PULLUP);
  pinMode(switchCCW,INPUT_PULLUP);

}
void loop()
{
  //Robojax.com Stepper Push button One Revolution STPB-3
  if(digitalRead(switchCCW) == LOW)
  {
    dirStatus =CCW;
    count =0;
  }else if(digitalRead(switchCW) == LOW)
  {
   dirStatus  = CW;
    count =0;
  }
  if(digitalRead(switchCW) == LOW && digitalRead(switchCCW) == LOW)
  {
    dirStatus  = STOP;
    delay(200);
  }
 if(dirStatus ==CW){
   poleStep++;
   count++;
   if(count+correction_CCW <= SPR)
   {
    driveStepper(poleStep);
   }else{
      driveStepper(8);
   }

 }else if(dirStatus ==CCW){
   poleStep--;
   count++;
   if(count+correction_CW <=SPR)
   {
    driveStepper(poleStep);
   }else{
      driveStepper(8);
   }
 }else{
  driveStepper(8);
 }
 if(poleStep>7){
   poleStep=0;
 }
 if(poleStep<0){
   poleStep=7;
 }
 delay(speedFactor);
  //Robojax.com Stepper Push button One Revolution STPB-3

}// loop


/*
 * @brief moves motor to specific angle
 * @param "angle" is an integer representing the angle
 * @return does not return anything
 *
 * www.Robojax.com code April 19, 2020, at 01:22 in Ajax, Ontario, Canada
 */
void driveStepper(int c)
{
     digitalWrite(Pin1, pole1[c]);
     digitalWrite(Pin2, pole2[c]);
     digitalWrite(Pin3, pole3[c]);
     digitalWrite(Pin4, pole4[c]);
     if(c ==8)
     {
      digitalWrite(switchCW, HIGH);
      digitalWrite(switchCCW, HIGH);
     }
}//driveStepper ends here

Tập tin📁

Tập tin Fritzing