Пребарување код

Лекција 85: Вовед во серво мотори | Arduino Чекор по чекор курс

Лекција 85: Вовед во серво мотори | Arduino Чекор по чекор курс

Овој проект водич ве запознава со светот на серво моторите со континуирана ротација, познати и како серво мотори од 360 степени. За разлика од стандардните серво мотори кои се движат до одреден агол (како 0 до 180 степени), овие мотори ротираат континуирано во двете насоки. Ова ги прави идеални за изградба на мали роботи, тенковски патеки или било кој проект кој бара едноставни, достапни погонски мотори. Овој водич ќе ви покаже како да контролирате еден користејќи Arduino и неколку копчиња, давајќи ви практична контрола врз неговата насока и брзина.

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

  • Изградба на мал роботски автомобил со две тркала.
  • Креирање на панорамирачка и навалувачка камера држач кој ротира бесконечно.
  • Погон на мала подвижна лента или винч.
  • Изработка на едноставна платформа за скенирање со радар или сензор.

Хардвер и компоненти

За овој проект, ќе ви бидат потребни следниве компоненти:

  • Arduino плоча (на пр., Uno)
  • Серво мотор со континуирана ротација (на пр., FS90R или сличен)
  • Три копчиња
  • Поврзувачки жици
  • Прототипна плоча (опционално, за полесно поврзување)

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

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

Еве преглед на врските:

  • Серво мотор:
    • Кафеавата жица (земја) се поврзува со GND пин на Arduino.
    • Црвената жица (напојување) се поврзува со 5V пин на Arduino.
    • Портокаловата/жолтата жица (сигнал) се поврзува со пин 9 на Arduino.
  • Копчиња:
    • Едната страна на секое копче е поврзана со GND пин на Arduino.
    • Другата страна на копчето „Спротивно од стрелката на часовникот“ се поврзува со пин 2.
    • Другата страна на копчето „Стоп“ се поврзува со пин 3.
    • Другата страна на копчето „Во насока на стрелката на часовникот“ се поврзува со пин 4.

Во видеото, креаторот нагласува дека сигналната жица на серво моторот мора да биде поврзана со PWM-способен пин на Arduino, кој често е означен со тилда (~) симбол. Пинот 9 е еден од овие пинови. Копчињата ги користат внатрешните pull-up отпорници на 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};  // {CCW, STOP, CW}
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, што треба да го запре моторот.

Серискиот монитор се користи за прикажување на моменталната состојба и точната вредност што се испраќа до сервото. Ова е непроценливо за дебагирање и за пронаоѓање на совршената вредност за „стоп“ за вашиот специфичен мотор. Како што е наведено во видеото, командата за стоп може да не биде совршена поради внатрешното коло на сервото, и може да забележите бавно поместување или вибрации. Ова е вообичаена карактеристика на поевтините континуирани серво мотори и може да се минимизира со подесување на вредноста за стоп во кодот (во видеото на 01:15).

Поглавја

  • [00:05] Вовед во серво моторот од 360 степени
  • [02:02] Преглед на компоненти и хардвер
  • [02:40] Детална шема за поврзување и конекции
  • [05:07] Објаснување на кодот: константи, низи и поставување
  • [09:56] Објаснување на кодот: функцијата servoCommand
  • [10:54] Демонстрација во живо и излез од Серискиот монитор
  • [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 

Работи што можеби ќе ви требаат

Ресурси и референци

Датотеки📁

Други датотеки