Search Code

Lekcja 89: Użycie silnika serwo ciągłego lub 360°| Kurs Arduino Krok po Kroku

Lekcja 89: Użycie silnika serwo ciągłego lub 360°| Kurs Arduino Krok po Kroku

Czy kiedykolwiek chciałeś obracać silnikiem w dowolnym kierunku tak długo, jak chcesz, zamiast tylko wychylać go w przód i w tył jak w przypadku standardowego serwomechanizmu? To właśnie oferuje serwo o ciągłym obrocie lub 360 stopni. W przeciwieństwie do standardowego serwa, które ustawia się pod określonym kątem (zazwyczaj od 0 do 180 stopni), serwo o ciągłym obrocie obraca się bez końca w kierunku zgodnym lub przeciwnym do ruchu wskazówek zegara. Dzięki temu idealnie nadaje się do budowy małych robotów, platform kamerowych lub dowolnego projektu wymagającego ciągłej kontroli obrotu.

W tym projekcie zbudujemy system sterowania serwem 360 stopni za pomocą zaledwie trzech przycisków. Będziesz mógł wydać polecenie serwu, aby obracało się zgodnie z ruchem wskazówek zegara, przeciwnie do ruchu wskazówek zegara lub zatrzymało się w dowolnym momencie. Ten przewodnik przeprowadzi Cię przez podłączenie, wyjaśni konfigurowalne części kodu i pokaże praktyczną demonstrację działania systemu.

Oto kilka praktycznych pomysłów na wykorzystanie serwa o ciągłym obrocie we własnych projektach:

  • Zbuduj małego robota na dwóch kołach: Użyj dwóch serw o ciągłym obrocie do napędzania kół, co umożliwi jazdę do przodu, do tyłu i skręcanie.
  • Stwórz uchwyt kamery z funkcją obrotu i pochylania: Użyj jednego serwa o ciągłym obrocie do powolnego, niekończącego się obracania kamery ochrony lub kamery do obserwacji przyrody.
  • Zautomatyzuj taśmę przenośnika: Steruj małym systemem przenośnika do sortowania lub wydawania przedmiotów.
  • Zaprojektuj obrotową podstawę wystawową: Prezentuj model 3D lub produkt na platformie, która obraca się w sposób ciągły.

Wymagany sprzęt

  • Płytka Arduino (Uno, Nano itp.)
  • Serwomechanizm o ciągłym obrocie (360 stopni) (np. FS90R, DS04-NFC)
  • 3x przyciski
  • Przewody połączeniowe
  • Płytka stykowa

Schemat podłączenia

Podłączenie w tym projekcie jest proste. Serwomechanizm ma trzy przewody: zazwyczaj ciemny do masy (GND), środkowy (często czerwony) do zasilania (5V) oraz jaśniejszy (pomarańczowy, żółty lub biały) do sygnału. Jak pokazano na filmie, serwo jest podłączone do Arduino w następujący sposób:

  • Masa serwa (ciemny przewód): Podłącz do GND na Arduino.
  • Zasilanie serwa (środkowy/czerwony przewód): Podłącz do 5V na Arduino.
  • Sygnał serwa (jasny przewód): Podłącz do pinu 9 na Arduino.

Jeśli chodzi o trzy przyciski, każdy przycisk ma dwie strony. Jedna strona wszystkich przycisków jest połączona razem, a następnie do GND na Arduino. Druga strona każdego przycisku jest podłączona do osobnego pinu cyfrowego, jak opisano poniżej (na filmie o 03:40):

  • Przycisk zgodnie z ruchem wskazówek zegara (CW): Podłącz do pinu 2 na Arduino.
  • Przycisk Stop: Podłącz do pinu 3 na Arduino.
  • Przycisk przeciwnie do ruchu wskazówek zegara (CCW): Podłącz do pinu 4 na Arduino.
360_Serrvo_3_push_button_wiring

Wyjaśnienie kodu

Kod został zaprojektowany tak, aby był łatwy do skonfigurowania. Najważniejszą częścią, którą będziesz musiał dostosować, jest tablica sc[], która zawiera konkretne wartości PWM wysyłane do serwa w celu sterowania jego działaniami. Te wartości nie są uniwersalne i muszą być skalibrowane dla Twojego konkretnego serwomechanizmu (na filmie o 12:23).

int sc[]={106, 58, 0};// polecenia serwa są w kolejności
        //CCW, STOP, CW

Ta tablica jest sercem kalibracji. Wartości są używane w tej kolejności:

  • sc[0] = 106: Ta wartość jest wysyłana, aby serwo obracało się przeciwnie do ruchu wskazówek zegara.
  • sc[1] = 58: To jest wartość „stop". Ze względu na wewnętrzne obwody dokładna wartość, która zatrzymuje silnik, jest różna. Możesz zauważyć, że Twoje serwo powoli się obraca nawet po wysłaniu tego polecenia, i będziesz musiał nieznacznie dostosować tę liczbę, aby znaleźć prawdziwą wartość „całkowitego zatrzymania" dla swojego silnika.
  • sc[2] = 0: Ta wartość powoduje obrót serwa zgodnie z ruchem wskazówek zegara z maksymalną prędkością.

Możesz dostosować wartości w tablicy sc[], aby zmienić prędkość obrotu. Na przykład ustawienie sc[0] na 70 spowoduje wolniejszy obrót przeciwnie do ruchu wskazówek zegara. Im bliżej wartości „stop" (58), tym wolniej silnik będzie się obracał w danym kierunku. Wartości dalsze od 58 zwiększą prędkość aż do maksymalnego limitu.

Istnieje również kilka innych kluczowych zmiennych, które możesz musieć zmodyfikować. servoPin jest ustawione na 9, co musi być pinem z obsługą PWM na Twoim Arduino. Piny przycisków są zdefiniowane na początku kodu i można je zmienić w razie potrzeby.

int servoPin = 9;// ten pin musi być jednym z tych z PWM ~

#define STOPpin 3 // pin przycisku dla STOP
#define CWpin 2 //  pin przycisku dla CW
#define CCWpin 4 // pin przycisku dla CCW

Na koniec tablica scText[] zawiera ciągi znaków, które są wyświetlane w monitorze szeregowym do debugowania. Możesz je zmienić, jeśli chcesz wyświetlać inne komunikaty.

Jak używać kodu

Wgraj dostarczony kod na swoją płytkę Arduino. Otwórz monitor szeregowy (ustawiony na 9600 bodów), aby zobaczyć komunikaty statusu. Możesz teraz sterować serwem za pomocą trzech przycisków:

  • Naciśnij i przytrzymaj przycisk CW: Serwo zacznie obracać się zgodnie z ruchem wskazówek zegara. Monitor szeregowy wyświetli „CW" oraz wysyłaną wartość.
  • Naciśnij i przytrzymaj przycisk CCW: Serwo zacznie obracać się przeciwnie do ruchu wskazówek zegara. Monitor szeregowy wyświetli „CCW" oraz wysyłaną wartość.
  • Naciśnij przycisk Stop: Serwo spróbuje się zatrzymać. Monitor szeregowy wyświetli „Stop".

Jeśli Twój serwo nie zatrzymuje się całkowicie po naciśnięciu przycisku Stop, konieczna będzie kalibracja wartości sc[1] w tablicy sc[]. Spróbuj nieznacznie zmienić wartość (np. z 58 na 54 lub 52) i ponownie wgraj kod, aż silnik pozostanie idealnie nieruchomy.

Prezentacja na żywo

Na filmie prowadzący demonstruje kompletny system. Możesz zobaczyć, jak serwo obraca się w obu kierunkach w zależności od naciśnięć przycisków. Wyświetlane jest również okno Serial Monitor, pokazujące bieżący stan („CW", „Stop" lub „CCW") oraz konkretną wartość wysyłaną do serwa. To doskonałe narzędzie do debugowania i znajdowania idealnych wartości kalibracji dla Twojego konkretnego silnika. Demonstracja pokazuje również, jak zmiana wartości w tablicy sc[] bezpośrednio wpływa na prędkość silnika — od powolnego pełzania do maksymalnej prędkości obrotowej.

Podsumowanie

Ten projekt zapewnia prosty i skuteczny sposób sterowania serwem o ciągłym obrocie. Dzięki zrozumieniu procesu kalibracji wartości „stop" możesz zapewnić precyzyjne sterowanie w swoich własnych projektach robotyki i automatyki.

Rozdziały filmu

  • [00:05] Wprowadzenie do serwa o ciągłym obrocie
  • [02:02] Przegląd sprzętu serwa
  • [02:40] Schemat połączeń i podłączenia
  • [05:07] Wyjaśnienie kodu: zmienne i konfiguracja
  • [08:03] Wyjaśnienie kodu: logika pętli głównej
  • [09:56] Funkcja servoCommand()
  • [10:54] Prezentacja na żywo i wyjście Serial Monitor
  • [12:23] Kalibracja prędkości serwa i wartości stop

Obrazy

360_Serrvo_3_push_button_wiring
360_Serrvo_3_push_button_wiring
209-How to control a 360 servo with push buttons
Język: 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(")");
}

Rzeczy, których możesz potrzebować

Zasoby i odniesienia

Pliki📁

Inne pliki