ค้นหาโค้ด

บทเรียน 107-5: ส่งมอเตอร์ 28BYJ-48 หมุนหนึ่งรอบในทิศทางตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา, STPB-3

บทเรียน 107-5: ส่งมอเตอร์ 28BYJ-48 หมุนหนึ่งรอบในทิศทางตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา, STPB-3

โปรเจกต์ 5: การหมุนหนึ่งรอบด้วยปุ่มกด STPB-3 – มอเตอร์สเต็ปเปอร์ 28BYJ-48

บทความนี้เป็นส่วนหนึ่งของชุดการศึกษา 8 โปรเจกต์เกี่ยวกับ มอเตอร์สเต็ปเปอร์ 28BYJ-48 โดยใช้ Arduino ใน โปรเจกต์ 5 เราใช้ปุ่มกดใหม่ที่มีชื่อว่า STPB-3 เพื่อสั่งให้มอเตอร์หมุน หนึ่งรอบเต็ม ต่อการกดหนึ่งครั้ง วิธีนี้มักใช้ในระบบการเคลื่อนที่แบบกำหนดตำแหน่งที่ต้องการควบคุมรอบเดียวอย่างแม่นยำ

stepper_28BYJ-48-0

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

📘 บทนำ

โปรเจกต์นี้ขยายจากการควบคุมด้วยปุ่มกดก่อนหน้านี้โดยแนะนำ พฤติกรรมการล็อก: การกดปุ่มหนึ่งครั้งจะเริ่มและทำให้มอเตอร์หมุน ครบหนึ่งรอบพอดี ระบบจะไม่สนใจสถานะของปุ่มระหว่างที่มอเตอร์ทำงานเพื่อให้แน่ใจว่าการเคลื่อนที่มีความแม่นยำและทำซ้ำได้

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

stepper_28BYJ-48_wiring_PB-_keep_pressed

นอกจากการเชื่อมต่อมอเตอร์สเต็ปเปอร์และไดรเวอร์ ULN2003 แล้ว โปรเจกต์นี้ยังเชื่อมต่อปุ่ม STPB-3 ดังนี้:

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

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

  • ใช้การกำหนดค่าพูลอัพภายใน

คำอธิบายภาพ: การเดินสายไฟโปรเจกต์ 5: กด STPB-3 หนึ่งครั้งเพื่อสั่งให้มอเตอร์หมุนหนึ่งรอบเต็ม


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

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

  1. กำหนดค่าคงที่และออบเจกต์:

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

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  myStepper.setSpeed(10);
  Serial.begin(9600);
}
  1. ฟังก์ชัน Loop พร้อมการตรวจจับขอบ:

void loop() {
  int currentState = digitalRead(buttonPin);
  if (lastButtonState == HIGH && currentState == LOW) {
    myStepper.step(stepsPerRevolution);
  }
  lastButtonState = currentState;
}
  • สิ่งนี้ทำให้มอเตอร์หมุนหนึ่งรอบ เฉพาะเมื่อเริ่มกดปุ่ม (ขอบตก)

  • หลีกเลี่ยงการทำงานซ้ำในขณะที่กดปุ่มค้างไว้

 

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

สำหรับการอ้างอิงด้วยภาพ โปรดดูจุดเหล่านี้ในบทช่วยสอนเต็ม:

  • 51:20 – โปรเจกต์ 5: บทนำ

  • 52:15 – โปรเจกต์ 5: การเดินสายไฟ

  • 55:40 – โปรเจกต์ 5: โค้ด

  • 1:03:30 – โปรเจกต์ 5: การสาธิต

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

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

ถัดไปคือ [โปรเจกต์ 6: มุมและความเร็วที่ปรับได้ด้วย STPB-4]

ภาพ

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
ภาษา: 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

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

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

ไฟล์📁

ไฟล์ Fritzing