Search Code

Lekcja 85: Wprowadzenie do serwomechanizmów | Kurs Arduino Krok po Kroku

Lekcja 85: Wprowadzenie do serwomechanizmów | Kurs Arduino Krok po Kroku

Ten przewodnik projektowy wprowadza Cię w świat serwomotorów o ciągłym obrocie, znanych również jako serwa 360 stopni. W przeciwieństwie do standardowych serw, które przesuwają się pod określony kąt (np. od 0 do 180 stopni), te silniki obracają się w sposób ciągły w obu kierunkach. Dzięki temu idealnie nadają się do budowy małych robotów, gąsienic czołgów lub dowolnego projektu wymagającego prostych, niedrogich silników napędowych. Ten przewodnik pokaże Ci, jak sterować jednym z nich za pomocą Arduino i kilku przycisków, dając Ci praktyczną kontrolę nad jego kierunkiem i prędkością.

Oto kilka praktycznych zastosowań serwa 360 stopni:

  • Budowa małego dwukołowego robota.
  • Tworzenie uchwytu kamery z funkcją obrotu i pochylania, który obraca się w nieskończoność.
  • Napędzanie małego przenośnika taśmowego lub wciągarki.
  • Wykonanie prostej platformy skanującej do radaru lub czujników.

Sprzęt i komponenty

Do tego projektu będziesz potrzebować następujących komponentów:

  • Płytka Arduino (np. Uno)
  • Serwomotor o ciągłym obrocie (np. FS90R lub podobny)
  • Trzy przyciski
  • Przewody połączeniowe
  • Płytka stykowa (opcjonalnie, dla łatwiejszego okablowania)

Schemat połączeń

Okablowanie tego projektu jest proste. Serwomotor ma trzy przewody: zazwyczaj brązowy (masa), czerwony (zasilanie) oraz pomarańczowy lub żółty (sygnał). Przyciski są podłączone w prostej konfiguracji.

Oto zestawienie połączeń:

  • Serwomotor:
    • Brązowy przewód (masa) łączy się z pinem GND na Arduino.
    • Czerwony przewód (zasilanie) łączy się z pinem 5V na Arduino.
    • Pomarańczowy/żółty przewód (sygnał) łączy się z pinem 9 na Arduino.
  • Przyciski:
    • Jedna strona każdego przycisku jest podłączona do pinu GND na Arduino.
    • Druga strona przycisku „Przeciwnie do ruchu wskazówek zegara” łączy się z pinem 2.
    • Druga strona przycisku „Stop” łączy się z pinem 3.
    • Druga strona przycisku „Zgodnie z ruchem wskazówek zegara” łączy się z pinem 4.

W filmie autor podkreśla, że przewód sygnałowy serwa musi być podłączony do pinu z obsługą PWM na Arduino, który często jest oznaczony symbolem tyldy (~). Pin 9 jest jednym z takich pinów. Przyciski wykorzystują wewnętrzne rezystory podciągające Arduino, co upraszcza okablowanie, eliminując potrzebę stosowania zewnętrznych rezystorów (na filmie o 07:02).

Wyjaśnienie kodu

Kod został zaprojektowany tak, aby odczytywać stan trzech przycisków i wysyłać odpowiednie polecenie do serwomotoru. Rozłóżmy na czynniki pierwsze części konfigurowalne przez użytkownika.

Konfiguracja pinów i poleceń

Na górze kodu znajdziesz definicje pinów i wartości sterowania serwem. To tutaj możesz dostosować zachowanie swojego projektu.


const int servoPin = 9;    // Pin PWM dla sygnału serwa
const int stopPin = 3;     // Pin dla przycisku stop
const int cwPin = 4;       // Pin dla przycisku zgodnie z ruchem wskazówek zegara
const int ccwPin = 2;      // Pin dla przycisku przeciwnie do ruchu wskazówek zegara

Te stałe definiują, które piny Arduino są podłączone do przycisków i serwa. Jeśli użyjesz innych pinów dla swoich przycisków, zmienisz tutaj liczby. servoPin musi być pinem z obsługą PWM.


const int csServoCommand[3] = {106, 52, 0};  // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Przeciwnie do ruchu wskazówek zegara", "Zatrzymany", "Zgodnie z ruchem wskazówek zegara"};

To najważniejsza część do zrozumienia i dostrojenia. Tablica csServoCommand przechowuje wartości wysyłane do serwa. W przypadku serwa o ciągłym obrocie wartości te nie oznaczają kąta, ale prędkość i kierunek.

  • 106 to wartość dla pełnej prędkości obrotu przeciwnie do ruchu wskazówek zegara.
  • 52 to wartość dla całkowitego zatrzymania.
  • 0 to wartość dla pełnej prędkości obrotu zgodnie z ruchem wskazówek zegara.

Te wartości nie są uniwersalne. Ze względu na różnice produkcyjne wartość „stop” (52) może wymagać regulacji. Jeśli Twoje serwo powoli dryfuje po naciśnięciu przycisku stop, będziesz musiał precyzyjnie dostroić tę wartość. Film demonstruje ten proces, pokazując, jak zmiana wartości na 54 lub 51 może wpłynąć na zachowanie silnika (na filmie o 13:45).

Możesz również dostosować wartości obrotu, aby zmienić prędkość silnika. Na przykład ustawienie wartości dla obrotu przeciwnie do ruchu wskazówek zegara na 70 spowoduje, że będzie się obracał wolniej niż przy 106 (na filmie o 12:23).

Tablica csServoCommandText przechowuje ciągi tekstowe, które są drukowane w monitorze szeregowym, aby pokazać aktualny stan polecenia.

Funkcja niestandardowa: servoCommand()

Kod używa niestandardowej funkcji do obsługi logiki poleceń. Funkcja ta przyjmuje liczbę (0, 1 lub 2) jako argument, aktualizuje tekst statusu i wysyła odpowiednie polecenie do serwa.


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

Ta funkcja jest wywoływana z pętli głównej po naciśnięciu przycisku. Centralizuje logikę aktualizacji wyświetlacza i sterowania serwem, dzięki czemu kod jest czystszy i łatwiejszy do modyfikacji.

Projekt na żywo i demonstracja

W filmie autor demonstruje projekt w działaniu. Naciśnięcie przycisku „Zgodnie z ruchem wskazówek zegara” wysyła wartość 0 do serwa, powodując jego obrót w jednym kierunku. Naciśnięcie przycisku „Przeciwnie do ruchu wskazówek zegara” wysyła wartość 106, powodując obrót w drugą stronę. Przycisk „Stop” wysyła wartość 52, co powinno zatrzymać silnik.

Monitor szeregowy służy do wyświetlania bieżącego stanu oraz dokładnej wartości wysyłanej do serwomechanizmu. Jest to nieocenione podczas debugowania oraz znajdowania idealnej wartości „stop" dla Twojego konkretnego silnika. Jak zauważono w filmie, komenda stop może nie być idealna ze względu na wewnętrzne obwody serwomechanizmu i możesz zaobserwować powolny dryf lub wibracje. Jest to częsta cecha tańszych serwomechanizmów ciągłych, którą można zminimalizować, dostrajając wartość stop w kodzie (w filmie o 01:15).

Rozdziały

  • [00:05] Wprowadzenie do serwomechanizmu obrotowego 360 stopni
  • [02:02] Przegląd komponentów i sprzętu
  • [02:40] Szczegółowy schemat połączeń i podłączenia
  • [05:07] Wyjaśnienie kodu: stałe, tablice i konfiguracja
  • [09:56] Wyjaśnienie kodu: funkcja servoCommand
  • [10:54] Prezentacja na żywo i wyjście monitora szeregowego
  • [12:23] Regulacja prędkości serwomechanizmu i wartości stop

Obrazy

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
Język: 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)
Język: 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 

Rzeczy, których możesz potrzebować

Zasoby i odniesienia

Pliki📁

Inne pliki