Belajar

Control a servo motor with an Arduino and a potentiometer

Pemula

Atau lihat semua pelajaran.

  • 503komponen di meja kerja
  • 44board sedang berjalan
  • 1.00xwaktu nyata, di semua board
Arduino Uno: servo dengan faderlive0.000 s 0.00x
Klik untuk membukanya di editor
Contoh servo: potensiometer geser di A0 mengatur sudut servo di pin 9. Buka di editor untuk menggeser slider-nya.

Motor servo adalah cara termudah untuk membuat Arduino menggerakkan sesuatu ke sudut yang tepat: tiga kabel, satu pin sinyal, dan angka dari 0 sampai 180. Rangkaian di atas adalah servo jenis SG90 di pin 9 Arduino Uno, dengan potensiometer geser di A0 yang mengatur arah lengan servo (horn). Rangkaian ini berjalan di browsermu pada ATmega328P simulasi.

Buka di editor dan geser slider-nya selagi berjalan: horn bergerak ke sudut baru dengan kecepatan SG90 sungguhan, dan Serial Monitor mencetak bacaan dan sudutnya setiap kali berubah.

What you need

  • Arduino Uno
  • Motor servo SG90 (atau sejenisnya)
  • Potensiometer 10 k (di sini jenis geser; yang putar disambung dengan cara yang sama)
  • Breadboard dan kabel jumper

Wiring

Komponen dan pinDisambung keCatatan
Kabel cokelat servo (GND)GND
Kabel merah servo (VCC)5 VDi bawah 4 V servo sama sekali tidak bergerak
Kabel oranye servo (sinyal)Pin 9Pin digital mana pun bisa
Ujung 1 potensiometer5 V
Ujung 3 potensiometerGND
Wiper potensiometerA0Terbaca 0 sampai 1023 sepanjang putarannya

Apa yang sebenarnya "didengar" servo

Kabel sinyal servo tidak menerima PWM dalam arti yang sama seperti LED. Duty cycle tidak ada artinya bagi servo. Yang diukurnya adalah lebar setiap pulsa: dengan angka dari library Servo, 544 mikrodetik menaruh horn di satu ujung, 2400 mikrodetik di ujung lainnya, dan 1472 mikrodetik di tengah, diulang sekitar lima puluh kali per detik. Servo menahan posisi terakhir yang diperintahkan dan bergerak ke sana dengan kecepatannya sendiri, kira-kira sepersepuluh detik untuk enam puluh derajat.

Itu juga sebabnya kamu tidak bisa menggerakkan servo dengan analogWrite() di Uno. PWM Uno berjalan di sekitar 490 atau 980 hertz, terlalu cepat untuk dibaca servo sebagai lebar pulsa. Library Servo membuat pulsanya sendiri.

Penjelasan kodenya

Sketch membaca potensiometer empat kali dan merata-ratakan bacaannya, supaya horn tidak berkedut karena bit terakhir converter yang berisik. map() mengubah 0 sampai 1023 menjadi 0 sampai 180 derajat, write() mengirim pulsa yang sesuai, dan loop menunggu 20 milidetik, yaitu periode frame servo itu sendiri. Sudut hanya dicetak saat berubah, jadi Serial Monitor terbaca seperti kalimat, bukan air terjun.

Loop-nya, dari contoh servo (dipersingkat)
void loop() {
  long sum = 0;
  for (int i = 0; i < 4; i++) {
    sum += analogRead(FADER);
  }
  int reading = (int)(sum / 4);
  int angle = (int)map(reading, 0, 1023, 0, 180);

  horn.write(angle);
  delay(20);
}

Hal yang sama dengan library Servo

Contoh bawaan memakai header servo milik Mokxi sendiri, tapi panggilan library Servo Arduino bisa dikompilasi apa adanya, di setiap board yang dikompilasi di browser. Sketch sweep klasik di bawah berjalan tanpa diubah, dengan lebar pulsa dari library aslinya: attach(pin) memakai 544 sampai 2400 mikrodetik, write(90) mengirim 1472, dan attach(pin, min, max) mengatur jendela lain. Ada satu perbedaan kecil yang perlu diketahui: setiap write() mengirim satu pulsa, bukan memulai timer, jadi sketch yang butuh servo tetap menahan posisi saat dibebani perlu memanggil refresh() dari loop().

Untuk tutorial ESP32, ESP32Servo.h adalah class yang sama dengan nama yang dipakai tutorial-tutorial itu.

Sweep dari library Servo, seperti yang dikompilasi di sini
#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  for (int pos = 0; pos <= 180; pos++) {
    myservo.write(pos);
    delay(15);
  }
}

Coba di editor

Buka rangkaiannya di editor dan ubah panggilan map() menjadi map(reading, 0, 1023, 45, 135). Sekarang slider hanya mencakup sembilan puluh derajat di tengah, cara untuk membuat kenop terasa lebih halus di rentang yang lebih sempit.

Lalu pilih servo-nya dan lihat propertinya: min_pulse, max_pulse, range, dan speed. Atur speed ke 60 derajat per detik lalu geser slider dengan cepat; sekarang horn merayap mengikutinya, seperti servo besar yang lambat. min_pulse dan max_pulse secara default bernilai 544 dan 2400, jendela milik library Servo; servo yang diatur dengan attach(pin, 1000, 2000) juga butuh 1000 dan 2000 di sana.

Untuk menggerakkan servo kedua, seret satu servo lagi ke kanvas, sambungkan sinyalnya ke pin 10, dan tambahkan objek Servo kedua di sketch.

Common mistakes

Memberi daya servo dari board dan mengira semuanya akan baik-baik saja. Di meja kerja sungguhan, SG90 bisa menarik seperempat ampere saat macet, cukup untuk membuat Uno yang dicatu dari USB kekurangan daya, dan itulah penyebab paling umum proyek servo me-reset dirinya sendiri. Simulator tidak memodelkan arus catu daya, jadi rangkaian yang tegangannya akan turun di mejamu berjalan mulus di sini. Kalau kamu merakitnya sungguhan, beri servo catu daya 5 volt sendiri dan satukan ground-nya.

Lupa menyatukan ground. Sinyalnya diukur terhadap ground milik servo itu sendiri, jadi kalau kedua catu daya tidak berbagi apa pun, pulsanya tidak berarti apa-apa.

Meminta sudut yang tidak bisa dicapai servo. Pulsa yang melewati salah satu ujung jendela servo membuat horn diam di ujung itu, sama seperti SG90 sungguhan yang tertahan di stopper-nya. Kalau horn berhenti sebelum 0 atau 180, cek apakah jendela di attach() sesuai dengan min_pulse dan max_pulse milik servo.

Memperbarui servo dalam loop rapat tanpa delay. Mengirim pulsa lebih cepat dari setiap 20 milidetik tidak ada gunanya, karena servo hanya memperbarui posisinya sesuai frame rate-nya sendiri.

Pertanyaan

Pin Arduino mana yang bisa menggerakkan servo?

Pin digital mana pun. Library membuat pulsanya di software, jadi servo tidak butuh pin PWM yang ditandai tilde.

Bisakah aku menggerakkan dua servo sekaligus?

Bisa. Buat dua objek Servo di dua pin lalu tulis ke masing-masing. Beri servo sungguhan catu daya sendiri kalau jumlahnya lebih dari satu, karena arusnya bertambah.

Kenapa servo-ku bergetar?

Biasanya karena bacaan yang diikutinya berisik. Merata-ratakan beberapa sampel analogRead(), seperti yang dilakukan sketch ini, atau mengabaikan perubahan satu dua derajat, akan membuatnya stabil. Di hardware sungguhan, catu daya yang tegangannya turun juga bisa menyebabkan getaran.

Apa bedanya servo dan motor stepper?

Servo bergerak ke sebuah sudut dan menahannya, dengan umpan balik di dalamnya, biasanya dalam rentang 180 derajat. Stepper berputar dengan langkah yang dihitung, sejauh apa pun yang kamu mau, dan tidak tahu posisinya kecuali kamu menghitungnya. Tutorial stepper membahas 28BYJ-48.

Rakit versi nyatanya

Buka editor, ubah sebuah nilai, dan lihat angkanya ikut berubah. Tidak ada yang perlu dipasang, dan tidak perlu akun.