Код для поиска

Урок 85: Введение в сервоприводы | Курс Arduino Шаг за Шагом

Урок 85: Введение в сервоприводы | Курс Arduino Шаг за Шагом

Это руководство по проекту познакомит вас с миром сервоприводов непрерывного вращения, также известных как сервоприводы на 360 градусов. В отличие от стандартных сервоприводов, которые перемещаются на определенный угол (например, от 0 до 180 градусов), эти двигатели непрерывно вращаются в любом направлении. Это делает их идеальными для создания небольших роботов, гусеничных шасси или любых проектов, требующих простых и недорогих приводных двигателей. Это руководство покажет вам, как управлять таким двигателем с помощью Arduino и нескольких кнопок, что даст вам практический контроль над его направлением и скоростью.

Вот несколько практических применений сервопривода на 360 градусов:

  • Создание небольшого двухколесного робота-машинки.
  • Создание панорамной камеры с бесконечным вращением.
  • Привод небольшой конвейерной ленты или лебедки.
  • Создание простой платформы для сканирования радаром или датчиком.

Оборудование и компоненты

Для этого проекта вам понадобятся следующие компоненты:

  • Плата Arduino (например, Uno)
  • Сервопривод непрерывного вращения (например, FS90R или аналогичный)
  • Три кнопки
  • Соединительные провода
  • Макетная плата (необязательно, для удобства подключения)

Руководство по подключению

Подключение для этого проекта простое. У сервопривода три провода: обычно коричневый (земля), красный (питание) и оранжевый или желтый (сигнал). Кнопки подключаются по простой схеме.

Вот описание соединений:

  • Сервопривод:
    • Коричневый провод (земля) подключается к контакту GND на Arduino.
    • Красный провод (питание) подключается к контакту 5V на Arduino.
    • Оранжевый/желтый провод (сигнал) подключается к контакту 9 на Arduino.
  • Кнопки:
    • Одна сторона каждой кнопки подключается к контакту GND на Arduino.
    • Другая сторона кнопки «Против часовой стрелки» подключается к контакту 2.
    • Другая сторона кнопки «Стоп» подключается к контакту 3.
    • Другая сторона кнопки «По часовой стрелке» подключается к контакту 4.

В видео создатель подчеркивает, что сигнальный провод сервопривода должен быть подключен к контакту с поддержкой ШИМ на Arduino, который часто отмечен символом тильды (~). Контакт 9 — один из таких контактов. Кнопки используют внутренние подтягивающие резисторы Arduino, что упрощает подключение, устраняя необходимость во внешних резисторах (в видео на 07:02).

Объяснение кода

Код предназначен для считывания состояния трех кнопок и отправки соответствующей команды сервоприводу. Давайте разберем настраиваемые пользователем части.

Настройка контактов и команд

В начале кода вы найдете определения контактов и значений управления сервоприводом. Здесь вы можете настроить поведение вашего проекта.


const int servoPin = 9;    // ШИМ-контакт для сигнала сервопривода
const int stopPin = 3;     // Контакт для кнопки «Стоп»
const int cwPin = 4;       // Контакт для кнопки «По часовой стрелке»
const int ccwPin = 2;      // Контакт для кнопки «Против часовой стрелки»

Эти константы определяют, какие контакты Arduino подключены к кнопкам и сервоприводу. Если вы используете другие контакты для кнопок, вам нужно изменить числа здесь. servoPin должен быть контактом с поддержкой ШИМ.


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 содержит текстовые строки, которые выводятся в монитор последовательного порта для отображения текущего состояния команды.

Пользовательская функция: 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 

Вещи, которые могут вам понадобиться

Ресурсы и ссылки

Файлы📁

Другие файлы