ይህ ትምህርት አካል ነው: ሰርቮ ሞተርስ
ከሰርቮ ሞተሮች ጋር የተያያዙ ሁሉም ቪዲዮዎች እዚህ ተዘርዝረዋል። ወደ ሌሎች ቪዲዮዎች የሚወስዱ አገናኞች ከዚህ ጽሑፍ በታች ይገኛሉ።
አርዱኖ ሰርቮ ቶግል ስዊች በፑሽ ቁልፍ ይገንቡ
የአርዱኖ ሰርቮ ቶግል ስዊች በፑሽ ቁልፍ ይገንቡ
ይህ የፕሮጀክት መመሪያ ቀላል ግን በጣም ጠቃሚ የሆነ ወረዳ እንዴት እንደሚፈጥሩ ያሳይዎታል፡ በእያንዳንዱ የአንድ ፑሽ ቁልፍ ጭመት በሁለት ቦታዎች መካከል የሚቀያየር ሰርቮ ሞተር። በመጀመሪያው ጭመት፣ ሰርቮው ከ0 እስከ 180 ዲግሪ በተቀላጠፈ ሁኔታ ይንቀሳቀሳል። በሁለተኛው ጭመት፣ ከ180 ወደ 0 ዲግሪ ይመለሳል። ይህ በሮቦቲክስ እና አውቶሜሽን ውስጥ መሠረታዊ ፅንሰ-ሀሳብ ነው፣ እንደ አውቶማቲክ በር መቆለፊያ፣ ቀላል ሮቦቲክ ክንድ፣ ባንዲራ ማወዛወዣ፣ ወይም ሁለት-ሁኔታ አካላዊ እንቅስቃሴ የሚፈልግ ማንኛውም ፕሮጀክት ለመፍጠር ፍጹም ነው።
አስፈላጊውን ሃርድዌር፣ ሽቦ አያያዥን፣ እና ሁሉንም ነገር የሚያንቀሳቅሰውን የአርዱኖ ኮድ ዝርዝር ማብራሪያ እንመለከታለን።
ሃርድዌር እና ሽቦ አያያዥ
ለዚህ ፕሮጀክት የሚያስፈልጉት ክፍሎች አነስተኛ እና በአብዛኛዎቹ የአርዱኖ መጀመሪያ ኪቶች ውስጥ የተለመዱ ናቸው። የአርዱኖ ቦርድ (እንደ ኡኖ)፣ መደበኛ የትርፍ ጊዜ ማሳለፊያ ሰርቮ ሞተር (ለምሳሌ SG90)፣ ፑሽ ቁልፍ፣ እና ጥቂት ጃምፐር ሽቦዎች ያስፈልግዎታል።
ሽቦ አያያዥው ቀላል ነው። የሰርቮው የኃይል እና የመሬት መስመሮች ከአርዱኖው 5V እና GND ፒኖች ጋር ይገናኛሉ፣ የሲግናል መስመሩ ደግሞ PWM አቅም ካለው ፒን (በኮዳችን ውስጥ ፒን 9) ጋር ይገናኛል። ፑሽ ቁልፉ በዲጂታል ፒን 2 እና GND መካከል ይገናኛል።
የአርዱኖ ኮድ ማብራሪያ
ስኬቹ ከአርዱኖ IDE ጋር የተካተተውን መደበኛ Servo.h ቤተ-መጻሕፍት ይጠቀማል። ኮዱ ንጹህ እና ለመረዳት ቀላል እንዲሆን የተነደፈ ነው፣ የሰርቮውን ሁኔታ ለመከታተል ባንዲራዎችን እና ለስላሳ የመንቀሳቀስ እንቅስቃሴ ለመፍጠር for loops ይጠቀማል።
ዓለም አቀፍ ተለዋዋጮች እና ውቅር
በኮዱ አናት ላይ፣ ፒኖቹን እና የሰርቮውን ባህሪ እንገልጻለን። እነዚህ ለፕሮጀክትዎ ማበጀት የሚፈልጉዋቸው ዋና ዋና እሴቶች ናቸው።
#include <Servo.h>
// ለሰርቮ እና ቁልፍ ፒኖች ተለዋዋጮችን ይግለጹ
const int servoPin = 9; // የሰርቮ ሲግናል ሽቦን ከዲጂታል ፒን 9 ጋር ያገናኙ
const int buttonPin = 2; // ፑሽ ቁልፍን ከዲጂታል ፒን 2 ጋር ያገናኙ
// የሰርቮ እንቅስቃሴ መለኪያዎችን ይግለጹ
const int initialAngle = 0; // የሰርቮው መነሻ አንግል
const int targetAngle1 = 180; // የመጀመሪያ ዒላማ አንግል
const int targetAngle2 = 0; // ሁለተኛ ዒላማ አንግል
const int movingStep = 1; // ለስላሳ እንቅስቃሴ የእርምጃ መጠን (በአንድ ጊዜ 1 ዲግሪ)
Servo myServo; // የሰርቮ ነገር ይፍጠሩ
// ሁኔታን የሚከታተሉ ተለዋዋጮች
int currentAngle = initialAngle;
bool buttonPressed = false;
bool servoAt180 = false;
servoPin፡ ከሰርቮው ሲግናል ሽቦ ጋር የተገናኘው ፒን። ይህ መሆን ያለበት PWM ፒን ነው (በአብዛኛዎቹ የአርዱኖ ቦርዶች ላይ በ`~` ምልክት የተደረገበት)።buttonPin፡ ፑሽ ቁልፉ የተገናኘበት ፒን።initialAngle፣targetAngle1፣targetAngle2፡ እነዚህ የሰርቮውን እንቅስቃሴ መነሻ እና መጨረሻ ነጥቦች ይገልጻሉ።movingStep፡ ይህ ሰርቮው በእያንዳንዱ የloop እርምጃ ስንት ዲግሪ እንደሚንቀሳቀስ ይቆጣጠራል። ትንሽ ቁጥር ለስላሳ እና ቀርፋፋ እንቅስቃሴ ይፈጥራል።
የ`setup()` ተግባር
የsetup() ተግባር አርዱኖ ሲበራ አንድ ጊዜ ይሰራል። ሰርቮውን ያስነሳል፣ የቁልፍ ፒንን ያዋቅራል፣ እና ሰርቮውን ወደ መነሻ ቦታው ያዘጋጃል።
void setup() {
myServo.attach(servoPin); // ሰርቮውን ከፒኑ ጋር ያያይዙ
pinMode(buttonPin, INPUT_PULLUP); // የቁልፍ ፒንን ከውስጥ pull-up ጋር እንደ ግብዓት ያዘጋጁ
myServo.write(initialAngle); // ሰርቮውን ወደ መነሻ ቦታው ያንቀሳቅሱ
Serial.begin(9600); // ለማረም ሴሪያልን ያስነሱ
}
ለቁልፍ ፒኑ INPUT_PULLUP እንጠቀማለን። ይህ በአርዱኖ ውስጥ ያለውን ውስጣዊ ተከላካይ ያነቃቃል፣ ይህም ቁልፉ በማይጫንበት ጊዜ የፒኑን ሁኔታ HIGH ያደርገዋል። ቁልፉ ሲጫን፣ ፒኑን ከመሬት ጋር ያገናኘዋል፣ ሁኔታውን LOW ያደርገዋል። ይህ ጠቃሚ ባህሪ ማለት በወረዳዎ ላይ ውጫዊ pull-up ተከላካይ መጨመር አያስፈልግዎትም ማለት ነው።
የ`loop()` - ዋናው አመክንዮ
ዋናው loop የቁልፍ ጭመትን ያለማቋረጥ ይፈትሻል። ጭመት ሲታወቅ፣ ሰርቮውን ወደ ቀጣዩ ዒላማ ቦታው ያንቀሳቅሰዋል።
void loop() {
// የቁልፉን ሁኔታ ያንብቡ
int buttonState = digitalRead(buttonPin);
// ቁልፉ መጫኑን (LOW) እና ቀድሞውኑ ተይዞ እንዳልነበረ ያረጋግጡ
if (buttonState == LOW && !buttonPressed) {
delay(50); // ብዙ ጊዜ መቀስቀስን ለመከላከል የDebounce መዘግየት
if (digitalRead(buttonPin) == LOW) { // የቁልፉን ሁኔታ እንደገና ያረጋግጡ
buttonPressed = true; // ቁልፉ እንደተጫነ ምልክት ያድርጉ
if (!servoAt180) {
// በ180 ላይ ካልሆነ፣ ወደ 180 ያንቀሳቅሱ
for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
myServo.write(angle);
delay(15); // ፍጥነትን ለመቆጣጠር በእርምጃዎች መካከል መዘግየት
}
currentAngle = targetAngle1;
servoAt180 = true; // ሁኔታን ያዘምኑ
} else {
// በ180 ላይ ከሆነ፣ ወደ 0 ይመለሱ
for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
myServo.write(angle);
delay(15);
}
currentAngle = targetAngle2;
servoAt180 = false; // ሁኔታን ያዘምኑ
}
}
}
// ቁልፉ ከተለቀቀ በኋላ የቁልፍ ጭመት ባንዲራውን ዳግም ያስጀምሩ
if (buttonState == HIGH) {
buttonPressed = false;
}
}
ኮዱ የቦሊያን ባንዲራ፣ servoAt180ን በመጠቀም የሰርቮውን የመጨረሻ ቦታ ያስታውሳል። አዝራሩ ሲጫን፣ ይህን ባንዲራ ይፈትሻል፡ ሰርቮው በ180 ዲግሪ ላይ ካልሆነ፣ ወደዚያ ያንቀሳቅሰዋል፤ አለበለዚያ ግን፣ ወደ 0 ይመልሰዋል። የfor loops ናቸው ለስላሳ የመጥረግ እንቅስቃሴን የሚፈጥሩት፣ ሰርቮውን በአንድ ዲግሪ በአንድ ጊዜ በማንቀሳቀስ በእያንዳንዱ እርምጃ መካከል ትንሽ መዘግየት በማድረግ።
እንዴት እንደሚሰራ
ኮዱን ሰቅለው አርዱኖዎን ካበሩ በኋላ፣ ሰርቮው ወደ መጀመሪያው የ0-ዲግሪ ቦታው ይንቀሳቀሳል።
- የመጀመሪያ ጨመቃ፡ አዝራሩን ሲጫኑ፣ ኮዱ ግብዓቱን ይለያል እና ሰርቮውን ከ0 ወደ 180 ዲግሪ፣ በአንድ ዲግሪ በአንድ ጊዜ ማንቀሳቀስ ይጀምራል።
- ሁለተኛ ጨመቃ፡ ሰርቮው 180 ዲግሪ ከደረሰ በኋላ፣ የሚቀጥለው የአዝራር ጨመቃ ከ180 ወደ 0 ዲግሪ እንዲመለስ ያደርገዋል።
ይህ ዑደት በእያንዳንዱ ተከታይ የአዝራር ጨመቃ ይደገማል፣ ለፕሮጀክትዎ አስተማማኝ እና ሊገመት የሚችል የመቀያየር ዘዴን ይፈጥራል።
ይህ ትምህርት አካል ነው: ሰርቮ ሞተርስ
- አርዱኖን በመጠቀም ሰርቮን በግፊት አዝራሮች መቆጣጠር
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- ፖቴንሺዮሜትር በመጠቀም ሰርቮን ከአርዱኖ ጋር መቆጣጠር
- ፖቴንሺዮሜትር እና LCD1602 በመጠቀም ሰርቮን ከአርዱኖ ጋር መቆጣጠር
- አርዱኖን በመጠቀም የኢንፍራሬድ ሪሞት ኮንትሮል በመጠቀም የሰርቮ ሞተሮችን መቆጣጠር
- የአርዱኖ ሰርቮ ሞተር ቁጥጥር በፖቴንሺዮሜትር በመጠቀም
- የሰርቮ አቀማመጥን በእጅ ምልክቶች መቆጣጠር ለአርዱኖ
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- የተከታታይ 360° ሰርቮን ከአርዱኖ ጋር እንዴት መጠቀም እንደሚቻል
- የ Arduino ኮድ እና ቪዲዮ ለ PCA9685 16-ቻናል 12-ቢት ሰርቮ መቆጣጠሪያ V1
/*
This code is provided by robojax.com
you can view the wiring diagram and details of this tutorial
here https://robojax.com/T661
*/
#include <Servo.h>
// Define variables for servo and button pins
const int servoPin = 9; // Connect servo signal wire to digital pin 9
const int buttonPin = 2; // Connect push button to digital pin 2
// Define servo movement parameters
const int initialAngle = 0; // Servo's starting angle
const int targetAngle1 = 180; // First target angle
const int targetAngle2 = 0; // Second target angle (same as initial in this case)
const int movingStep = 1; // Step size for smooth movement (e.g., 1 degree at a time)
Servo myServo; // Create a Servo object
int currentAngle = initialAngle; // Variable to keep track of the servo's current angle
bool buttonPressed = false; // Flag to track button state
bool servoAt180 = false; // Flag to track if the servo is at 180 degrees
void setup() {
myServo.attach(servoPin); // Attaches the servo on the servoPin to the servo object
pinMode(buttonPin, INPUT_PULLUP); // Set the button pin as input with internal pull-up resistor
myServo.write(initialAngle); // Set the servo to its initial angle
Serial.begin(9600); // Start serial communication for debugging
}
void loop() {
// Read the state of the button
int buttonState = digitalRead(buttonPin);
// Check if the button is pressed (LOW because of INPUT_PULLUP) and it was not pressed before
if (buttonState == LOW && !buttonPressed) {
delay(50); // Debounce delay
if (digitalRead(buttonPin) == LOW) { // Confirm button press after debounce
buttonPressed = true; // Set flag to indicate button is currently pressed
if (!servoAt180) {
// Move servo to 180 degrees
Serial.println("Moving to 180 degrees");
for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
myServo.write(angle);
delay(15); // Adjust this delay for desired speed
}
currentAngle = targetAngle1;
servoAt180 = true;
} else {
// Move servo to 0 degrees
Serial.println("Moving to 0 degrees");
for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
myServo.write(angle);
delay(15); // Adjust this delay for desired speed
}
currentAngle = targetAngle2;
servoAt180 = false;
}
}
}
// Reset buttonPressed flag when button is released
if (buttonState == HIGH) {
buttonPressed = false;
}
}
ምንጮች እና ምንጮች
አሁን ምንም ምንጮች የለም።
ፋይሎች📁
የዳታ ማዕከል (pdf)
-
sg90_serveo_motor_datasheet
sg90_serveo_motor_datasheet.pdf0.13 MB