Öğren

Control a servo motor with an Arduino and a potentiometer

Başlangıç

Ya da tüm dersleri gör.

  • 503parça tezgahta
  • 44kart şu an çalışıyor
  • 1.00xgerçek zamanlı, her kartta
Arduino Uno: servo kaydırıcılive0.000 s 0.00x
Düzenleyicide açmak için tıkla
Servo örneği: A0'daki bir sürgülü potansiyometre pin 9'daki bir servonun açısını ayarlar. Kaydırıcıyı oynatmak için düzenleyicide aç.

Bir hobi servosu, bir Arduino'ya bir şeyi tam bir açıya hareket ettirmenin en kolay yoludur: üç kablo, bir sinyal pini ve 0 ile 180 arasında bir sayı. Yukarıdaki devre, bir Arduino Uno'nun pin 9'unda SG90 tarzı bir servo ve A0'da kolun nereyi göstereceğini ayarlayan bir sürgülü potansiyometredir. Tarayıcında simüle edilmiş bir ATmega328P üzerinde çalışır.

Düzenleyicide aç ve çalışırken kaydırıcıyı sürükle: kol, gerçek bir SG90'ın hızıyla yeni açıya yürür ve seri monitör her değiştiğinde okumayı ve açıyı yazdırır.

What you need

  • Bir Arduino Uno
  • Bir SG90 (ya da benzeri) hobi servosu
  • 10 k'lık bir potansiyometre (burada sürgülü; döner olan aynı şekilde bağlanır)
  • Bir breadboard ve jumper kablolar

Wiring

Parça ve pinGittiği yerNot
Servo kahverengi kablo (GND)GND
Servo kırmızı kablo (VCC)5 V4 V altında servo hiç hareket etmez
Servo turuncu kablo (sinyal)Pin 9Herhangi bir dijital pin çalışır
Potansiyometre ucu 15 V
Potansiyometre ucu 3GND
Potansiyometre kayar ucuA0Hareket boyunca 0 ile 1023 okur

Servo gerçekte neyi dinler

Servonun sinyal kablosu, bir LED'in anladığı anlamda PWM almaz. Görev oranı ona hiçbir şey ifade etmez. Ölçtüğü şey her darbenin genişliğidir: Servo kütüphanesinin sayılarıyla 544 mikrosaniye kolu bir uca, 2400 mikrosaniye diğer uca ve 1472 mikrosaniye ortaya koyar; saniyede yaklaşık elli kez tekrarlanır. Servo kendisine en son söyleneni tutar ve oraya kendi hızıyla yürür, altmış derece için kabaca saniyenin onda biri.

Bu yüzden bir Uno'da servoyu analogWrite() ile süremezsin. Uno'nun PWM'i yaklaşık 490 ya da 980 hertzde çalışır; bir servonun bunu darbe genişliği olarak okuması için çok hızlıdır. Servo kütüphanesi darbeyi kendisi üretir.

Kod, açıklamalı

Kod potansiyometreyi dört kez okur ve okumaların ortalamasını alır, böylece kol çeviricinin son, gürültülü bitinde seğirmez. map() 0 ile 1023'ü 0 ile 180 dereceye çevirir, write() uygun darbeyi gönderir ve döngü 20 milisaniye bekler; bu servonun kendi çerçeve süresidir. Açı yalnızca değiştiğinde yazdırılır, böylece seri monitör bir şelale yerine bir cümle gibi okunur.

Servo örneğinden döngü (kısaltılmış)
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);
}

Aynı şey Servo kütüphanesiyle

Hazır örnek Mokxi'nin kendi servo başlığını kullanır, ama Arduino Servo kütüphanesinin çağrıları tarayıcıda derlenen her kartta olduğu gibi derlenir. Aşağıdaki klasik tarama kodu, özgün kütüphanenin genişlikleriyle değişmeden çalışır: attach(pin) 544 ile 2400 mikrosaniyeyi kullanır, write(90) 1472 gönderir ve attach(pin, min, max) başka bir pencere ayarlar. Bilmeye değer küçük bir fark: her write() bir zamanlayıcı başlatmak yerine tek bir darbe gönderir; bu yüzden servonun yük altında tutulması gereken bir kod loop() içinden refresh() çağırır.

Bir ESP32 öğreticisi için ESP32Servo.h, o öğreticilerin kullandığı adla aynı sınıftır.

Servo kütüphanesi taraması, burada derlendiği gibi
#include <Servo.h>

Servo myservo;

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

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

Düzenleyicide dene

Devreyi düzenleyicide aç ve map() çağrısını map(reading, 0, 1023, 45, 135) yap. Kaydırıcı artık yalnızca ortadaki doksan dereceyi kapsar; bir düğmeye daha küçük bir aralıkta daha ince bir his vermenin yolu budur.

Sonra servoyu seç ve özelliklerine bak: min_pulse, max_pulse, range ve speed. Hızı saniyede 60 dereceye ayarla ve kaydırıcıyı hızla oynat; kol artık büyük, yavaş bir servonun yapacağı gibi ardından sürünür. min_pulse ve max_pulse varsayılan olarak 544 ve 2400'dür, Servo kütüphanesinin penceresi; attach(pin, 1000, 2000) ile kurulan bir servo orada da 1000 ve 2000 ister.

İkinci bir servo sürmek için tuvale bir tane daha sürükle, sinyalini pin 10'a bağla ve koda ikinci bir Servo nesnesi ekle.

Common mistakes

Servoyu karttan beslemek ve sorun olmayacağını sanmak. Gerçek bir tezgahta bir SG90 takıldığında çeyrek amper çekebilir; bu, USB'den çalışan bir Uno'yu çökertmeye yeter ve bir servo projesinin kendini sıfırlamasının en yaygın nedenidir. Simülatör besleme akımını modellemez, bu yüzden masanda çökecek bir devre burada temiz çalışır. Gerçekten kuruyorsan servoya kendi 5 voltluk beslemesini ver ve topraklarını birleştir.

Ortak toprağı unutmak. Sinyal servonun kendi toprağına göre ölçülür; iki besleme hiçbir şey paylaşmıyorsa darbe hiçbir şey ifade etmez.

Servonun ulaşamayacağı açıları istemek. Servo penceresinin iki ucundan birini aşan bir darbe, gerçek bir SG90'ın uç durdurucuya karşı zorlanması gibi, kolu o uçta bırakır. Kol 0 ya da 180'e varmadan duruyorsa attach() içindeki pencerenin servonun min_pulse ve max_pulse'una uyduğunu kontrol et.

Servoyu delay olmadan sıkı bir döngüde güncellemek. Her 20 milisaniyeden hızlı darbe göndermek bir şey kazandırmaz, çünkü servo yalnızca kendi çerçeve hızında güncellenir.

Sorular

Hangi Arduino pinleri bir servoyu sürebilir?

Herhangi bir dijital pin. Kütüphane darbeyi yazılımla üretir, bu yüzden servonun tilde ile işaretli PWM pinlerinden birine ihtiyacı yoktur.

İki servoyu aynı anda sürebilir miyim?

Evet. İki pinde iki Servo nesnesi oluştur ve her birine yaz. Birden fazla olduğunda gerçek servolara kendi beslemelerini ver, çünkü akımlar toplanır.

Servom neden titriyor?

Genellikle izlediği okuma gürültülü olduğu için. Birkaç analogRead() örneğinin ortalamasını almak, bu kodun yaptığı gibi, ya da bir iki derecelik değişimleri yok saymak onu sabitler. Gerçek donanımda çöken bir besleme de titreme yapar.

Servo ile step motor arasındaki fark nedir?

Bir servo bir açıya gider ve orada durur; içinde kendi geri beslemesi vardır, genellikle 180 derece üzerinden. Bir step motor sayılmış adımlarla, istediğin kadar döner ve saymazsan nerede olduğunu bilmez. Step motor öğreticisi 28BYJ-48'i kapsar.

Bunu gerçekten kur

Düzenleyiciyi aç, bir değeri değiştir ve sayının onunla birlikte oynadığını izle. Kurulacak bir şey yok ve hesap gerekmez.