Search Code

85-сабақ: Сервоқозғалтқыштарға кіріспе | Arduino қадамдық курс

85-сабақ: Сервоқозғалтқыштарға кіріспе | Arduino қадамдық курс

Бұл жоба нұсқаулығы сізді үздіксіз айналу сервоқозғалтқыштары, басқаша айтқанда 360 градустық серволар әлемімен таныстырады. Белгілі бір бұрышқа (мысалы, 0-ден 180 градусқа дейін) қозғалатын стандартты серволардан айырмашылығы, бұл қозғалтқыштар екі бағытта да үздіксіз айналады. Бұл оларды кішкентай роботтар, танк шынжырлары немесе қарапайым, арзан жетек қозғалтқыштарын қажет ететін кез келген жоба үшін өте қолайлы етеді. Бұл нұсқаулық Arduino және бірнеше түймелерді пайдаланып оны қалай басқаруға болатынын көрсетеді, бұл сізге оның бағыты мен жылдамдығын қолмен басқару мүмкіндігін береді.

360 градустық серво үшін бірнеше практикалық қолдану мысалдары:

  • Кішкентай екі дөңгелекті робот көлігін жасау.
  • Шексіз айналатын пан-тилт камера тірегін жасау.
  • Кішкентай конвейер таспасын немесе лебедканы басқару.
  • Қарапайым радар немесе сенсор сканерлеу платформасын жасау.

Аппараттық құралдар мен компоненттер

Бұл жоба үшін келесі компоненттер қажет:

  • Arduino тақтасы (мысалы, Uno)
  • Үздіксіз айналу сервоқозғалтқышы (мысалы, FS90R немесе ұқсас)
  • Үш түйме
  • Жалғау сымдары
  • Макет тақтасы (міндетті емес, оңай жалғау үшін)

Жалғау нұсқаулығы

Бұл жобаның жалғауы қарапайым. Сервоқозғалтқыштың үш сымы бар: әдетте қоңыр (жер), қызыл (қуат) және қызғылт сары немесе сары (сигнал). Түймелер қарапайым конфигурацияда жалғанады.

Міне, қосылымдардың сипаттамасы:

  • Сервоқозғалтқыш:
    • Қоңыр сым (Жер) Arduino-ның GND түйреуішіне қосылады.
    • Қызыл сым (Қуат) Arduino-ның 5V түйреуішіне қосылады.
    • Қызғылт сары/сары сым (Сигнал) Arduino-ның 9 түйреуішіне қосылады.
  • Түймелер:
    • Әр түйменің бір жағы Arduino-ның GND түйреуішіне қосылады.
    • "Сағат тіліне қарсы" түймесінің екінші жағы 2 түйреуішке қосылады.
    • "Тоқтату" түймесінің екінші жағы 3 түйреуішке қосылады.
    • "Сағат тілімен" түймесінің екінші жағы 4 түйреуішке қосылады.

Бейнежазбада автор сервоның сигнал сымы Arduino-ның PWM қолдайтын түйреуішіне қосылуы керектігін атап өтеді, ол көбінесе тильда (~) белгісімен белгіленеді. 9 түйреуіш осы түйреуіштердің бірі болып табылады. Түймелер Arduino-ның ішкі тарту резисторларын пайдаланады, бұл сыртқы резисторларды қажет етпей, жалғауды жеңілдетеді (бейнежазбада 07:02).

Кодты түсіндіру

Код үш түйменің күйін оқуға және сервоқозғалтқышқа сәйкес команданы жіберуге арналған. Пайдаланушы реттей алатын бөліктерді қарастырайық.

Түйреуіштер мен командаларды конфигурациялау

Кодтың жоғарғы жағында түйреуіштер мен серво басқару мәндерінің анықтамаларын табасыз. Мұнда жобаңыздың әрекетін теңшей аласыз.


const int servoPin = 9;    // Серво сигналы үшін PWM түйреуіші
const int stopPin = 3;     // Тоқтату түймесі үшін түйреуіш
const int cwPin = 4;       // Сағат тілімен түймесі үшін түйреуіш
const int ccwPin = 2;      // Сағат тіліне қарсы түймесі үшін түйреуіш

Бұл тұрақтылар Arduino-ның қай түйреуіштері түймелер мен сервоға қосылғанын анықтайды. Егер түймелеріңіз үшін басқа түйреуіштерді қолдансаңыз, осындағы сандарды өзгертесіз. servoPin PWM қолдайтын түйреуіш болуы керек.


const int csServoCommand[3] = {106, 52, 0};  // {СҚ, ТОҚТАТУ, СТ}
const String csServoCommandText[3] = {"Сағат тіліне қарсы", "Тоқтатылды", "Сағат тілімен"};

Бұл түсіну және реттеу үшін ең маңызды бөлік. csServoCommand массиві сервоға жіберілетін мәндерді сақтайды. Үздіксіз серво үшін бұл мәндер бұрышты емес, жылдамдық пен бағытты білдіреді.

  • 106 — сағат тіліне қарсы толық жылдамдықпен айналу мәні.
  • 52 — толық тоқтау мәні.
  • 0 — сағат тілімен толық жылдамдықпен айналу мәні.

Бұл мәндер әмбебап емес. Өндірістік айырмашылықтарға байланысты "тоқтату" мәнін (52) реттеу қажет болуы мүмкін. Егер тоқтату түймесін басқанда серво баяу жылжыса, бұл мәнді дәл реттеу керек. Бейнежазбада бұл процесс көрсетілген, мәннің 54 немесе 51-ге өзгеруі қозғалтқыштың әрекетіне қалай әсер ететінін көрсетеді (бейнежазбада 13:45).

Айналу мәндерін қозғалтқыштың жылдамдығын өзгерту үшін де реттеуге болады. Мысалы, сағат тіліне қарсы мәнді 70-ке қою оны 106-дан баяу айналдырады (бейнежазбада 12:23).

csServoCommandText массиві ағымдағы команда күйін көрсету үшін Serial Monitor-ге басып шығарылатын мәтіндік жолдарды сақтайды.

Арнайы функция: servoCommand()

Код команда логикасын өңдеу үшін арнайы функцияны пайдаланады. Бұл функция аргумент ретінде санды (0, 1 немесе 2) қабылдайды, күй мәтінін жаңартады және сервоға сәйкес команданы жібереді.


void servoCommand(int n) {
  statusText = csServoCommandText[n];
  myservo.write(csServoCommand[n]);
  Serial.println(csServoCommandText[n]);
  Serial.println(csServoCommand[n]);
}

Бұл функция негізгі циклде түйме басылғанда шақырылады. Ол дисплейді жаңарту және сервоны басқару логикасын бір орталыққа жинақтайды, бұл кодты таза және өзгертуге оңай етеді.

Тірі жоба және демонстрация

Бейнежазбада автор жобаның жұмысын көрсетеді. "Сағат тілімен" түймесін басу сервоға 0 мәнін жібереді, бұл оның бір бағытта айналуына себеп болады. "Сағат тіліне қарсы" түймесін басу 106 мәнін жібереді, бұл оны басқа бағытта айналдырады. "Тоқтату" түймесі 52 мәнін жібереді, бұл қозғалтқышты тоқтатуы керек.

Serial Monitor ағымдағы күйді және сервоға жіберілетін нақты мәнді көрсету үшін қолданылады. Бұл жөндеу жұмыстары мен сіздің нақты моторыңыз үшін тамаша "тоқтату" мәнін табуда баға жетпес құрал болып табылады. Бейнежазбада атап өтілгендей, тоқтату командасы сервоның ішкі тізбегіне байланысты мінсіз болмауы мүмкін, сондықтан баяу дрейф немесе діріл байқалуы ықтимал. Бұл арзан үздіксіз серволардың жалпы сипаттамасы болып табылады және кодтағы тоқтату мәнін реттеу арқылы азайтылуы мүмкін (бейнежазбада 01:15).

Тараулар

  • [00:05] 360 градустық серво моторына кіріспе
  • [02:02] Компоненттер мен аппараттық құралдарға шолу
  • [02:40] Егжей-тегжейлі қосылу схемасы мен қосылымдар
  • [05:07] Кодты түсіндіру: тұрақтылар, массивтер және баптау
  • [09:56] Кодты түсіндіру: servoCommand функциясы
  • [10:54] Тікелей демонстрация және Serial Monitor шығысы
  • [12:23] Серво жылдамдығы мен тоқтату мәндерін реттеу

Суреттер

SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
115-Arduino code to control continuous 360° servo from serial monitor command
Тіл: C++
/* 
 *  
 *  Demonstration of Controlling Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor. 
📚⬇️ Download and resource page https://robojax.com/RJT762
 *  
 * Modified by Ahmad Shamshiri for Robojax.com
 * on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
 * Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
 * Get this code from Robojax.com
 * 
 Original code by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.
 Modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position
int incomingByte = 0;   // for incoming serial data

void setup() {
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}



void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("received: ");
                Serial.print (incomingByte);
                if(incomingByte == 108){
                 Serial.println(" sent 0 Rotating CW "); 
                 myservo.write(0); 
                }else if(incomingByte == 114){
                  Serial.println(" sent 180 Rotating CCW "); 
                  myservo.write(180); 
                }else if(incomingByte == 60){
                  Serial.println(" sent Stopped "); 
                  myservo.write(60); 
                }else{
                  Serial.println(" moving Randomly"); 
                  myservo.write(incomingByte); 
                }
                  
                 
        }

  
}
893-Arduino code to control continuous 360° servo from serial monitor command (Code 2)
Тіл: C++
/* 
 *  
 *  Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
 *  This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor. 
📚⬇️ Download and resource page https://robojax.com/RJT762
 *  
 * Modified by Ahmad Shamshiri for Robojax.com
 * on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
 * Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
 * Get this code from Robojax.com
 * 
 Original code by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.
 Modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0;    // variable to store the servo position
int incomingByte = 0;   // for incoming serial data
int CWBS, CCWBS, SBS;

void setup() {
  Serial.begin(9600);
 pinMode(2,INPUT_PULLUP);// set pin for push button STOP
  pinMode(3,INPUT_PULLUP);// set pin for push button CCW  
  pinMode(4,INPUT_PULLUP);// set pin for push button CW
   
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
}



void loop() {
    CCWBS = digitalRead(2);// read status of button CCW
    SBS = digitalRead(3);// read status of button STOP
    CWBS = digitalRead(4);// read status of button CW
                 if(CCWBS == LOW){
                 Serial.println(" sent 0 Rotaing CW "); 
                 myservo.write(0); 
                }else if(CWBS == LOW){
                  Serial.println(" sent 180 Rotaing CCW "); 
                  myservo.write(180); 
                }else if(SBS == LOW){
                  Serial.println(" sent Stopped "); 
                  myservo.write(60); 
                }else{
                  Serial.println(" moving Random"); 
                  myservo.write(48); 
                }
                  


  
}// loop 

Сізге қажет болуы мүмкін нәрселер

Ресурстар мен сілтемелер

Файлдар📁

Басқа файлдар