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
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 pin | Gittiği yer | Not |
|---|---|---|
| Servo kahverengi kablo (GND) | GND | |
| Servo kırmızı kablo (VCC) | 5 V | 4 V altında servo hiç hareket etmez |
| Servo turuncu kablo (sinyal) | Pin 9 | Herhangi bir dijital pin çalışır |
| Potansiyometre ucu 1 | 5 V | |
| Potansiyometre ucu 3 | GND | |
| Potansiyometre kayar ucu | A0 | Hareket 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.
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.
#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.
Devam et
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.