Search Code

Лекција 89: Користење на континуиран или 360 серво мотор | Arduino Чекор по чекор курс

Лекција 89: Користење на континуиран или 360 серво мотор | Arduino Чекор по чекор курс

Дали некогаш сте сакале да вртите мотор во било која насока колку сакате, наместо само да се движи напред-назад како стандарден серво? Токму тоа го нуди континуиран или 360-степенски серво мотор. За разлика од стандардниот серво кој се движи до одреден агол (обично 0 до 180 степени), континуираниот серво ротира бесконечно во насока на часовникот или спротивно од часовникот. Ова го прави совршен за изградба на мали роботи, платформи за камери или било кој проект кој бара континуирана контрола на ротацијата.

Во овој проект, ќе изградиме контролен систем за 360-степенски серво користејќи само три копчиња. Ќе можете да му наредите на сервото да ротира во насока на часовникот, спротивно од часовникот или да запре во секој момент. Овој водич ќе ве прошета низ поврзувањето, ќе ги објасни кориснички-конфигурабилните делови од кодот и ќе ви покаже жива демонстрација на системот во акција.

Еве неколку практични идеи за користење на континуиран серво во вашите сопствени проекти:

  • Изградете мал робот со две тркала: Користете два континуирани серво за да ги движите тркалата, овозможувајќи движење напред, назад и вртење.
  • Направете држач за камера со пан и тилт: Користете еден континуиран серво за бавно, бесконечно вртење на безбедносна или камера за диви животни.
  • Автоматизирајте подвижна лента: Контролирајте мал систем за транспорт за сортирање или издавање предмети.
  • Дизајнирајте ротирачки штанд за изложување: Прикажете 3D модел или производ на платформа која ротира континуирано.

Потребен хардвер

  • Arduino плоча (Uno, Nano, итн.)
  • Континуиран (360-степенски) серво мотор (на пр., FS90R, DS04-NFC)
  • 3x копчиња
  • Поврзувачки жици
  • Прототипна плоча (breadboard)

Водич за поврзување

Поврзувањето за овој проект е едноставно. Серво моторот има три жици: обично темна за земја (GND), средна (често црвена) за напојување (5V) и посветла (портокалова, жолта или бела) за сигнал. Како што е прикажано во видеото, сервото е поврзано со Arduino на следниов начин:

  • Серво земја (темна жица): Поврзете ја со Arduino GND.
  • Серво напојување (средна/црвена жица): Поврзете ја со Arduino 5V.
  • Серво сигнал (светла жица): Поврзете ја со пин 9 на Arduino.

За трите копчиња, секое копче има две страни. Едната страна од сите копчиња е поврзана заедно и потоа со Arduino GND. Другата страна од секое копче е поврзана со посебен дигитален пин, како што е опишано подолу (во видеото на 03:40):

  • Копче за насока на часовникот (CW): Поврзете го со пин 2 на Arduino.
  • Копче за стоп: Поврзете го со пин 3 на Arduino.
  • Копче за насока спротивно од часовникот (CCW): Поврзете го со пин 4 на Arduino.
360_Serrvo_3_push_button_wiring

Објаснување на кодот

Кодот е дизајниран да биде лесно конфигурабилен. Најважниот дел што ќе треба да го прилагодите е низата sc[], која ги содржи специфичните PWM вредности испратени до сервото за контрола на неговите дејства. Овие вредности не се универзални и мора да се калибрираат за вашиот специфичен серво мотор (во видеото на 12:23).

int sc[]={106, 58, 0};// серво командите се по редослед
        //CCW, STOP,CW

Оваа низа е срцето на калибрацијата. Вредностите се користат по овој редослед:

  • sc[0] = 106: Оваа вредност се испраќа за да се направи сервото да ротира спротивно од часовникот.
  • sc[1] = 58: Ова е вредноста за „стоп“. Поради внатрешното коло, точната вредност што го запира моторот варира. Може да откриете дека вашиот серво полека ротира дури и кога оваа команда е испратена, и ќе треба да ја прилагодите оваа бројка малку за да ја најдете вистинската вредност за „целосно запирање“ за вашиот мотор.
  • sc[2] = 0: Оваа вредност го прави сервото да ротира во насока на часовникот со максимална брзина.

Можете да ги прилагодите вредностите во низата sc[] за да ја промените брзината на ротација. На пример, поставувањето sc[0] на 70 ќе ја направи ротацијата спротивно од часовникот побавна. Колку е поблиску вредноста до вредноста за „стоп“ (58), толку побавно ќе се врти моторот во таа насока. Вредностите подалеку од 58 ќе ја зголемат брзината до максималната граница.

Исто така, постојат неколку други клучни променливи што можеби ќе треба да ги модифицирате. servoPin е поставен на 9, кој мора да биде пин со PWM можност на вашиот Arduino. Пиновите за копчињата се дефинирани на почетокот на кодот и може да се променат ако е потребно.

int servoPin = 9;// овој пин мора да биде еден од оние со PWM ~

#define STOPpin 3 // пин за копчето за СТОП
#define CWpin 2 //  пин за копчето за CW
#define CCWpin 4 // пин за копчето за CCW

Конечно, низата scText[] ги содржи низите што се печатат на Serial Monitor за дебагирање. Можете да ги промените ако сакате да прикажете различни пораки.

Како да го користите кодот

Поставете го дадениот код на вашата Arduino плоча. Отворете го Serial Monitor (поставете на 9600 бауди) за да ги видите пораките за статус. Сега можете да го контролирате сервото користејќи ги трите копчиња:

  • Притиснете и држете го копчето CW: Сервото ќе почне да ротира во насока на часовникот. Serial Monitor ќе прикаже „CW“ и вредноста што се испраќа.
  • Притиснете и држете го копчето CCW: Сервото ќе почне да ротира спротивно од часовникот. Serial Monitor ќе прикаже „CCW“ и вредноста што се испраќа.
  • Притиснете го копчето за стоп: Сервото ќе се обиде да запре. Serial Monitor ќе прикаже „Stop“.

Ако вашиот серво мотор не запре целосно кога ќе се притисне копчето Stop, ќе треба да ја калибрирате вредноста sc[1] во низата sc[]. Обидете се малку да ја промените вредноста (на пример, од 58 на 54 или 52) и повторно поставете го кодот додека моторот не остане совршено неподвижен.

Жива демонстрација

Во видеото, презентерот ја демонстрира целосната системска поставка. Можете да го видите серво моторот како ротира во двете насоки врз основа на притискањата на копчињата. Исто така е прикажан и излезот од Serial Monitor, кој ја прикажува моменталната состојба („CW“, „Stop“ или „CCW“) и специфичната вредност што се испраќа до серво моторот. Ова е одлична алатка за дебагирање и пронаоѓање на совршените калибрациски вредности за вашиот специфичен мотор. Демонстрацијата исто така покажува како прилагодувањето на вредностите во низата sc[] директно влијае на брзината на моторот, од бавно движење до неговата максимална ротациска брзина.

Заклучок

Овој проект обезбедува едноставен и ефикасен начин за контрола на континуиран серво мотор. Со разбирање на процесот на калибрација за вредноста „stop“, можете да обезбедите прецизна контрола во вашите сопствени роботски и автоматизациски проекти.

Видео поглавја

  • [00:05] Вовед во континуираниот серво мотор
  • [02:02] Преглед на хардверот на серво моторот
  • [02:40] Дијаграм на поврзување и конекции
  • [05:07] Објаснување на кодот: Променливи и поставување
  • [08:03] Објаснување на кодот: Главна логика на јамката
  • [09:56] Функцијата servoCommand()
  • [10:54] Жива демонстрација и излез од Serial Monitor
  • [12:23] Калибрација на брзината на серво моторот и вредностите за стоп

Images

360_Serrvo_3_push_button_wiring
360_Serrvo_3_push_button_wiring
209-How to control a 360 servo with push buttons
Language: C++
++
/*
 *  S05-13 Servo with 3 push buttons
 *  Demonstration of Controlling a Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo using push buttons
 *
 * Modified by Ahmad Shamshiri for Robojax Robojax.com
 * on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
 Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww

 Watch Introduction to  360 Servo video with code: https://youtu.be/b_xvu6wWafA
 You can get the wiring diagram from my Arduino Course at Udemy.com
 Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
 visit my course now http://robojax.com/L/?id=62

 If you found this tutorial helpful, please support me so I can continue creating
 content like this. 
 or make a donation using PayPal http://robojax.com/L/?id=64

 Original code by BARRAGAN <http://barraganstudio.com>
 *
 * Code is available at http://robojax.com/learn/arduino

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

*/

#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 one of those with PWM ~


#define STOPpin 3 // push button pin  for STOP
#define CWpin 2 //  push button for CW
#define CCWpin 4 // push button for CCW

int sc[]={106, 58, 0};// servo commands are in order
        //CCW, STOP,CW

String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
      //CW button status (CWBS)
      //CCW button status (CCWBS)
      //stop button status (SBS)

void setup() {
  Serial.begin(9600);
  pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
  pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
  pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW

  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  myservo.write(sc[1]);// send STOP command
  statusText=1;// initial value is STOP
}



void loop() {

    CCWBS = digitalRead(CCWpin);// read status of button CCW
    SBS = digitalRead(STOPpin);// read status of button STOP
    CWBS = digitalRead(CWpin);// read status of button CW

    if(CCWBS ==LOW)
    {
      servoCommand(0);
    }else if(SBS ==LOW)
    {
      servoCommand(1);
    }else if(CWBS ==LOW)
    {
      servoCommand(2);
    }

  Serial.println(scText[statusText]);
  delay(50);
}// loop



void servoCommand(int n)
{
   statusText = n;
   myservo.write(sc[n]);
   Serial.print("Going to  ");
   Serial.print(scText[n]);
   Serial.print( "(");
   Serial.print(sc[n]);
   Serial.println(")");
}

Things you might need

Resources & references

Files📁

Other files