Soek Kode

Les 107-8: Beheer van die Spoed van 'n 28BYJ-48-trapmotor deur 'n Potensiometer te gebruik

Les 107-8: Beheer van die Spoed van 'n 28BYJ-48-trapmotor deur 'n Potensiometer te gebruik

Projek 8: Beheer van Stapmotor met 'n Potensiometer – 28BYJ-48 Stapmotor

Hierdie artikel bied die laaste deel van die 8-projekreeks oor die beheer van die 28BYJ-48 stapmotor met Arduino. In Projek 8 word die stapmotor beheer deur 'n potensiometer, wat die gebruiker in staat stel om die motorspoed en -rigting dinamies te verander deur eenvoudig die knop te draai. Hierdie analoog invoermetode is 'n intuïtiewe en veelsydige beheerbenadering, wyd toepasbaar in robotika en bewegingsbeheerstelsels.

stepper_28BYJ-48-0

Volledige bedradingsdiagramme en kode vir hierdie projek is beskikbaar vir aflaai onder die artikel.

📘 Inleiding

Hierdie opstelling gebruik 'n analoog potensiometer wat aan 'n Arduino gekoppel is om veranderlike spanningswaardes tussen 0 en 1023 te lees. Gebaseer op hierdie invoer, word die motor se spoed en rigting dinamies aangepas:

  • Draai die potensiometer kloksgewys om spoed in een rigting te verhoog.

  • Draai dit teenkloksgewys om die rigting om te keer.

⚙️ Bedrading

stepper_28BYJ-48_wiring_PB-_keep_pressed

Hierdie projek verbind die potensiometer en stapmotor aan die Arduino soos volg:

  • Middelpen van potensiometerAnaloog pen A0

  • Ander twee penne5V en GND

  • ULN2003-drywer → Penne 8, 10, 9, 11 vir die stapmotor

Byskrif: Projek 8-bedrading: Potensiometer lees analoog invoer om spoed en rigting te beheer.

 

💻 Kodeverduideliking

Die kode lees analoog waardes en omskep dit in spoed en rigting:

  1. Sluit Biblioteek in en Definieer Penne:

#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
  1. Opstellingsfunksie:

void setup() {
  Serial.begin(9600);
  myStepper.setSpeed(10);
}
  1. Lusfunksie met Potensiometerbeheer:

void loop() {
  int sensorValue = analogRead(A0);
  int speed = map(sensorValue, 0, 1023, -15, 15);

  if (speed != 0) {
    myStepper.setSpeed(abs(speed));
    myStepper.step((speed > 0) ? 1 : -1);
  }
  delay(2);
}
  • Die map()-funksie omskep 0–1023 na -15 tot +15 RPM.

  • Spoed en rigting verander in reële tyd soos die potensiometer draai.

  • abs(speed) verseker 'n positiewe RPM-waarde; rigting word in step() hanteer.

🎬 Tydstempels uit Volledige Video

Hier is die sleutel video-tydstempels vir hierdie projek:

  • 1:39:24 – Projek 8: Inleiding

  • 1:40:58 – Projek 8: Bedrading

  • 1:44:04 – Projek 8: Kode

  • 1:53:19 – Projek 8: Demonstrasie


 

Beelde

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
395-Lesson 107-8: Controlling a 28BYJ-48 stepper motor using a potentiometer
Taal: C++
++
/*
* Lesson 107-8:  * This is Arduino code to control the speed of a 28BYJ-48 
* stepper motor with a potentiometer. 
See the video for details and a demonstration. 

In this lesson, we learn how to use a mini stepper motor, the 28BYJ-48, for our projects. I am presenting eight 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 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
  Project 6: Push button for 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 (this code)

  * Watch the 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 June 30, 2019 at 19:04 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/>.

 */

const int desiredValue = 20;//time in sec for a Revolution

const int dir = 2; // 1 for CW and 2 for CCW

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 potPin = A0;// center pin of pot is connected to this pin
int vcc2 = 2;// additional 5V for potentiometer

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 calcDelayfromTime(int t);
void driveStepper(int c);
int N = calcDelayfromTime(desiredValue);


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(vcc2, OUTPUT);//define pin as output for 5V for pot
 digitalWrite(vcc2, HIGH);//set vcc2 pin HIGH to have 5V for pot 
 Serial.begin(9600);
 Serial.println("Robojax Stepper Control");
 Serial.print("Max time per rev set: ");
 Serial.print(desiredValue);
 Serial.print(" loop delay: ");
 Serial.println(N);
  delay(4000);//give use time to read
}// setup

 void loop() 
{ 
  // Robojax Stepper code S8BYJ-48
 if(dir ==1){ 
   poleStep++; 
    driveStepper(poleStep);    
 }else if(dir ==2){ 
   poleStep--; 
    driveStepper(poleStep);    
 }else{
  driveStepper(8);   
 }
 if(poleStep>7){ 
   poleStep=0; 
 } 
 if(poleStep<0){ 
   poleStep=7; 
 } 
 int potValue =analogRead(potPin);// read potentiometer value
 int speed = map(potValue,0, 1023, 1,N);

 delay(speed); 


}// loop

int calcDelayfromTime(int t){
  return ((t-5)/4)+1;
}//



/*
 * @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

Lêers📁

Fritzing-lêer