Pretraži kod

Lekcija 18/31: Korištenje servo motora s Arduinom SunFounderov Arduino komplet

Lekcija 18/31: Korištenje servo motora s Arduinom SunFounderov Arduino komplet

Servo motori su radni konji bezbrojnih robotičkih i daljinski upravljanih projekata, pružajući preciznu kutnu kontrolu za sve, od mehanizama za upravljanje do robotskih ruku. Ovaj vodič, zasnovan na Lekciji 18 kursa SunFounder Arduino Kit, provest će vas kroz osnove korištenja servo motora s Arduinom. Naučit ćete kako povezati hardver i kontrolirati položaj motora koristeći dvije različite metode: jednostavno zamahno kretanje i položaj kontroliran dugmetom. Znanje koje ovdje steknete vrlo je praktično i može se primijeniti na širok raspon projekata, uključujući:

  • Izgradnju robotske ruke koja može hvatati i pomicati objekte s preciznošću.
  • Kreiranje automobila ili čamca na daljinsko upravljanje sa servom za upravljanje.
  • Razvoj solarnog trackera koji prati sunce kako bi maksimizirao prikupljanje energije.
  • Konstrukciju pan-and-tilt nosača kamere za nadzor ili fotografiju.
  • Automatizaciju upravljačkih površina modela aviona, poput kormila ili krilaca.

Pregled hardvera

Prije nego što zaronite u kod, bitno je razumjeti sam servo motor. Kao što je prikazano u videu, servo motor se ne okreće kontinuirano poput standardnog DC motora. Umjesto toga, rotira se na specifičan kutni položaj, obično između 0 i 180 stepeni. To ga čini idealnim za aplikacije koje zahtijevaju precizno kretanje. Video ističe nekoliko primjera, od upravljanja RC automobilom do kontrole složenih zglobova robotske ruke (u videu na 00:06).

Servo motori dolaze u različitim veličinama, pri čemu fizička veličina i okretni moment određuju njihovu cijenu i primjenu. Mali mikro servo je savršen za lagane modele, dok je veći, snažniji servo potreban za teže zadatke poput upravljanja "vrlo snažnim ili debelim automobilom" (u videu na 01:59).

Većina hobby servo motora ima tri žice smještene u standardni konektor. Video objašnjava pametan dizajn: srednja žica je uvijek žica za napajanje (VCC), obično 5V. Ovo je sigurnosna karakteristika koja štiti uređaj od pogrešnog polariteta ako se konektor priključi unazad (u videu na 03:27). Ostale dvije žice su za uzemljenje (GND) i kontrolni signal.

Vodič za povezivanje

Servo-wiring_bb
Servo-pot_wiring

Povezivanje serva na vaš Arduino je jednostavno. Video pruža jasnu demonstraciju veza (u videu na 04:48). Tri pina na servo konektoru povezana su na Arduino na sljedeći način:

  • Signalna žica (često narandžasta ili žuta): Povežite je na digitalni PWM pin na Arduinu. Primjer koristi pin 9.
  • Žica za napajanje (često crvena): Povežite je na 5V pin na Arduinu.
  • Žica za uzemljenje (često smeđa ili crna): Povežite je na jedan od GND pinova na Arduinu.

U videu, voditelj koristi muško-muške DuPont jumper žice za povezivanje ženskog konektora na servu s pin headerima na Arduinu (u videu na 05:23).

Program 1: Kontrola servo motora (Sweep)

Ovaj prvi program je klasični "sweep" primjer. Dizajniran je da demonstrira puni raspon kretanja serva pomicanjem naprijed-nazad između 0 i 180 stepeni. Ovo je odličan način da provjerite je li vaše povezivanje ispravno i da vidite svoj servo u akciji. Video demonstrira upload ovog koda i gledanje serva kako se zamahuje naprijed-nazad (u videu na 09:21).

Za kontrolu serva, kod prvo uključuje ugrađenu Servo.h biblioteku, koja pojednostavljuje proces generiranja potrebnih kontrolnih signala. Zatim kreirate servo objekat i date mu ime, poput myservo. U setup() funkciji, povezujete ovaj objekat na specifičan pin koristeći myservo.attach(9), govoreći Arduinu da je signalna žica serva povezana na pin 9.

Magija se događa u loop() funkciji, koja koristi dvije for petlje za pomicanje serva. Prva petlja povećava varijablu položaja pos od 0 do 180, pomičući servo jedan stepen po jedan. Druga petlja radi suprotno, smanjujući pos od 180 nazad na 0. Ključni dio je delay(15) na kraju svake iteracije petlje. Ova pauza daje servu dovoljno vremena da se fizički pomakne na novi položaj prije nego što se pošalje sljedeća komanda. Bez ovog kašnjenja, servo ne bi mogao pratiti i zastao bi ili podrhtavao (u videu na 12:31).

Ovaj primjer je savršen za učenje, ali u stvarnoj aplikaciji vjerovatno ćete željeti postaviti servo na specifičan ugao. Kao što je prikazano u videu, možete modificirati kod zamjenom for petlji s jednom komandom poput myservo.write(90) za pomicanje serva na 90 stepeni i držanje tamo (u videu na 10:09).

Program 2: Kontrola servo motora (Knob)

Ovaj drugi program vodi kontrolu serva korak dalje uvodeći potenciometar (dugme) za pružanje kontrole u stvarnom vremenu, ručne kontrole nad položajem serva. Ovo je fantastičan način da razumijete kako se analogni ulaz može prevesti u precizno fizičko kretanje.

Ovaj program nadograđuje prethodni dodavanjem potenciometra. Potenciometar je promjenjivi otpornik koji djeluje kao analogni razdjelnik napona. Kada okrećete dugme, on mijenja napon na svom izlaznom pinu. Arduino očitava ovaj napon koristeći analogno-digitalni pretvarač (ADC) na jednom od svojih analognih pinova, pretvarajući ga u vrijednost između 0 i 1023.

Ključ ovog programa je funkcija map(). Ova funkcija skalira broj iz jednog raspona u drugi. U ovom slučaju, koristi se za prevođenje sirove vrijednosti potenciometra (0 do 1023) u vrijednost prikladnu za servo (0 do 180 stepeni). Kod očitava vrijednost potenciometra pomoću analogRead(potpin), skalira je koristeći map(val, 0, 1023, 0, 180), a zatim šalje tu skaliranu vrijednost servou pomoću myservo.write(val). Ovo stvara direktnu vezu gdje okretanje dugmeta do njegove sredine pozicionira servo na 90 stepeni, i tako dalje.

Ova metoda upravljanja je vrlo intuitivna i predstavlja temelj za mnoga sučelja između čovjeka i mašine, od jednostavnih daljinskih upravljača do složenih robotskih kontrolera.

Demonstracija projekta uživo

Video pruža demonstraciju uživo oba programa u akciji. Za program sweep (pomicanje), možete vidjeti kako se ruka servoa glatko kreće od 0 do 180 stepeni i nazad. Prezenter također pokazuje kako podešavanje veličine koraka u for petlji (npr. od 1 stepena do 20 stepeni) i vrijeme kašnjenja mijenjaju ponašanje servoa, čineći pokret bržim ali manje glatkim (u videu na 11:19).

Za program s dugmetom, demonstracija pokazuje kako okretanje potenciometra direktno kontroliše poziciju servoa u realnom vremenu. Ova vizuelna povratna informacija je odlična za razumijevanje odnosa između analognog ulaza i fizičkog izlaza.

Poglavlja

  • [00:00] Uvod u servo motore
  • [01:07] Primjene servo motora
  • [02:57] Anatomija servo motora
  • [04:48] Povezivanje servoa na Arduino
  • [06:06] Istraživanje primjera koda sweep
  • [09:21] Demonstracija programa sweep
  • [10:04] Postavljanje prilagođenog ugla servoa
  • [11:19] Modifikacija brzine sweep-a i veličine koraka
  • [13:15] Primjer drugog servo motora

Slike

SG90_servo_motor-1
SG90_servo_motor-1
SG90 servo
SG90 servo
Servo-pot_wiring
Servo-pot_wiring
Servo-wiring_bb
Servo-wiring_bb
914-Lesson 18/31: Controlling servo motor (sweep)
Jezik: C++
/*
Lesson 18/31: Controlling servo motor (sweep)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
 
  
 * 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 download 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 pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the Servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15 ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15 ms for the servo to reach the position
  }
}
915-Lesson 18/31: Controlling servo motor (knob)
Jezik: C++
/*
Lesson 18/31: Controlling servo motor (knob)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
 
  
 * 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 download 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

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

Resursi i reference

Datoteke📁

Arduino biblioteke (zip)