ค้นหาโค้ด

บทเรียนที่ 107-4: การควบคุมมอเตอร์สเต็ปเปอร์ 28BYJ-48 โดยใช้ปุ่มกดสองปุ่ม ตามเข็มนาฬิกา ทวนเข็มนาฬิกา (กดค้างไว้) STPB-2

บทเรียนที่ 107-4: การควบคุมมอเตอร์สเต็ปเปอร์ 28BYJ-48 โดยใช้ปุ่มกดสองปุ่ม ตามเข็มนาฬิกา ทวนเข็มนาฬิกา (กดค้างไว้) STPB-2

โปรเจกต์ 4: ปุ่มกดค้างเพื่อหมุนต่อเนื่องโดยใช้ STPB-2 – มอเตอร์สเต็ปเปอร์ 28BYJ-48

บทความนี้ครอบคลุมโปรเจกต์ที่สี่ในชุดบทช่วยสอน 8 บทเกี่ยวกับการควบคุมมอเตอร์สเต็ปเปอร์ 28BYJ-48 ร่วมกับ Arduino ในโปรเจกต์นี้ มอเตอร์สเต็ปเปอร์ถูกควบคุมโดยใช้ปุ่มกดที่ระบุว่า STPB-2 ต่างจากโปรเจกต์ก่อนหน้าที่กดหนึ่งครั้งเพื่อหมุนหนึ่งรอบเต็ม การตั้งค่านี้ช่วยให้มอเตอร์หมุนเฉพาะขณะที่กดปุ่มค้างไว้เท่านั้น

stepper_28BYJ-48-0

ซอร์สโค้ดและแผนผังการเดินสายทั้งหมดสำหรับโปรเจกต์นี้มีอยู่ด้านล่างบทความ

📘 บทนำ

โปรเจกต์นี้สาธิตกลไกการควบคุมมอเตอร์แบบต่อเนื่องโดยใช้ปุ่มกดชั่วขณะ เมื่อผู้ใช้กดปุ่มค้างไว้ มอเตอร์จะหมุนไปข้างหน้าอย่างต่อเนื่อง ทันทีที่ปล่อยปุ่ม มอเตอร์จะหยุด วิธีนี้พบได้ทั่วไปในการควบคุมแบบ jog สำหรับเครื่องจักรอุตสาหกรรมและแท่นทดสอบ

⚙️ แผนผังการเดินสาย

stepper_28BYJ-48_wiring_PB-_keep_pressed

การเดินสายสำหรับมอเตอร์สเต็ปเปอร์และ ULN2003 ยังคงเหมือนเดิม ปุ่มเชื่อมต่อดังนี้:

  • ขาหนึ่งของปุ่มกด STPB-2พิน 2 ของ Arduino

  • อีกขาหนึ่ง → GND

  • เปิดใช้งานตัวต้านทาน pull-up ภายในผ่านโค้ด

คำอธิบายภาพ: การเดินสายโปรเจกต์ 4: ควบคุมมอเตอร์ให้หมุนต่อเนื่องขณะกด STPB-2 ค้างไว้

ULN2003_board-1

💻 คำอธิบายโค้ด

การตั้งค่าโค้ดนี้จะตรวจสอบสถานะของปุ่มอย่างต่อเนื่องและเคลื่อนมอเตอร์ทีละขั้นขณะที่ปุ่มยังถูกกดอยู่

  1. เริ่มต้นไลบรารีและพิน:

#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
const int buttonPin = 2;
  1. ฟังก์ชัน Setup:

void setup() {
  myStepper.setSpeed(10);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}
  1. ฟังก์ชัน Loop พร้อมการหมุนต่อเนื่อง:

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    myStepper.step(1); // ทีละขั้น
  }
}
  • มอเตอร์จะเคลื่อนทีละขั้นในแต่ละรอบของลูปขณะที่กดปุ่มค้างไว้

  • การปล่อยปุ่มจะหยุดการหมุนทันที

วิธีนี้ให้การควบคุมด้วยมือที่ละเอียดสำหรับการเคลื่อนที่ทีละขั้นหรือแบบต่อเนื่องที่นุ่มนวล

 

🎬 ไทม์สแตมป์จากวิดีโอเต็ม

อ้างอิงส่วนต่อไปนี้ของวิดีโอสำหรับโปรเจกต์นี้:

  • 41:07 – โปรเจกต์ 4: บทนำ

  • 42:29 – โปรเจกต์ 4: การเดินสาย

  • 45:31 – โปรเจกต์ 4: โค้ด

  • 49:38 – โปรเจกต์ 4: การสาธิต

📁 ส่วนดาวน์โหลด

คุณจะพบโค้ดที่สมบูรณ์และแผนผังการเดินสายสำหรับโปรเจกต์นี้ด้านล่าง การออกแบบนี้มีประโยชน์อย่างยิ่งสำหรับการ jog เครื่องจักรด้วยมือหรือการใช้งานที่ต้องการป้อนวัสดุอย่างต่อเนื่อง

ถัดไปคือ [โปรเจกต์ 5: การหมุนหนึ่งรอบที่ triggered ด้วย STPB-3]

ภาพ

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
585-Project 107-4: Controlling a 28BYJ-48 Stepper Motor with push button STPB-2 keep pressing
ภาษา: C++
/*
* Lesson 107-4: Controlling a stepper motor using 2 push buttons STPB-2.
STPB-2: We control a 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 shown how to connect the wires, push buttons, and breadboard.

  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 (this code)
  Project 5: One Revolution using push button STPB-3
  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 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 poleStep = 0;
int  dirStatus = 3;// stores direction status 3= stop (do not change)

void setup()
{
 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()
{

  if(digitalRead(switchCCW) == LOW)
  {
    dirStatus =1;
  }else if(digitalRead(switchCW) == LOW)
  {
   dirStatus  = 2;
  }else
  {
    dirStatus =3;
  }
 if(dirStatus ==1){
   poleStep++;
    driveStepper(poleStep);
 }else if(dirStatus ==2){
   poleStep--;
    driveStepper(poleStep);
 }else{
  driveStepper(8);
 }
 if(poleStep>7){
   poleStep=0;
 }
 if(poleStep<0){
   poleStep=7;
 }
 delay(1);

}// loop



/*
 * @brief sends signal to the motor
 * @param "c" is an integer representing the pole of the motor
 * @return does not return anything
 *
 * www.Robojax.com code June 2019
 */
void driveStepper(int c)
{
     digitalWrite(Pin1, pole1[c]);
     digitalWrite(Pin2, pole2[c]);
     digitalWrite(Pin3, pole3[c]);
     digitalWrite(Pin4, pole4[c]);
}//driveStepper end here

สิ่งที่คุณอาจต้องการ

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

ไฟล์ Fritzing