Saya memiliki servo TowerPro MG90D ( Manufactuer Link ) ( ServoDatabase Link ).
Ini memiliki rentang 180deg (non-kontinu).
Ini merespons bagus untuk servo tester saya:
Amati 7% Duty Cycle berikut (sekitar 90 deg) pada tester:
Servo merespons dengan baik.
Namun, ketika saya gunakan servo.write()
dengan klon Arduino Mega 2560 saya, servo tidak menanggapi output sudut apa pun. Saya memiliki beberapa servos lain yang berfungsi dengan baik dengan kode yang sama pada pin yang sama.
Amati 7% Duty Cycle di Arduino dengan servo.write(90)
:
Tidak ada respon. Servo itu "lemas"; itu tidak memegang posisi apa pun.
Ketika saya menulis pertanyaan ini, saya berpikir untuk mencoba servo.writeMicroseconds()
.
Disini adalah servo.writeMicroseconds(1450)
:
Servo merespons!
Ini adalah servo.writeMicroseconds(1472)
(berfungsi), yang memiliki interval waktu yang sama dengan yang sebelumnya tidak bekerja servo.write(90)
!
servo.writeMicroseconds(1550)
(kerja):
Apa bedanya?
Penguji servo bekerja pada 49,5Hz, sementara servo.write()
gagal pada 49,9Hz. Saya bertanya-tanya apakah entah bagaimana 0.4Hz itu membuat perbedaan, tetapi kemudian saya melihat itu servo.writeMicroseconds()
bekerja pada 49.9Hz juga.
Dalam menangkap lingkup di atas, dapat dilihat bahwa keduanya servo.write(90)
danservo.writeMicroseconds(1472)
memiliki interval waktu yang sama:
1,474,560ns HIGH
18,544,640ns LOW
Sinyal sangat mirip ... Apa yang bisa menyebabkan servo.write()
tidak bekerja?
Kode saya sedasar mungkin:
#include <Servo.h>
Servo serv1;
void setup() {
serv1.attach(3); // Pin 3
}
void loop() {
serv1.write(90); // No response
delay(3000);
serv1.writeMicroseconds(1472); // Works
delay(3000);
serv1.write(0); // No response
delay(3000);
serv1.writeMicroseconds(1800); // Works
delay(3000);
}
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
write
? Tidak ada alasan bagi servo untuk tidak bekerja, jadi saya akan mempertanyakan sinyal Anda.Jawaban:
Pertama, cepat samping. Anda tampaknya memiliki sedikit kesalahpahaman tentang cara kerja servos. Servo tidak dikendalikan oleh PWM, dan mereka tidak tahu atau peduli bahwa Anda mengirim pulsa pada 49. apa pun Hz. Mereka tidak tahu denyut nadi adalah persentase dari beberapa periode yang sewenang-wenang. Servo tidak peduli berapa waktu antara pulsa. Saya mengatakan ini karena Anda tampaknya berfokus luar biasa pada hal-hal yang sebenarnya tidak penting.
Servo bahkan tidak benar-benar tahu atau peduli bahwa tegangannya tinggi atau rendah pada waktu tertentu. Mereka hanya peduli pada satu hal: waktu antara sisi naik dan turun.
Servo dikendalikan dengan mendeteksi tepi tegangan naik, dan mengukur waktu sampai ada tepi jatuh. Waktu yang valid biasanya antara 1,0 hingga 2,0 ms, tetapi dapat bervariasi dari satu servo ke servo.
Anda dapat mengontrolnya di 1Hz, 10Hz, 50Hz, 100Hz. Sebagian besar akan merespons tingkat denyut nadi yang lebih tinggi, tetapi sekali lagi ini adalah variabel. Apa yang saya coba katakan adalah bahwa frekuensi, siklus tugas, durasi antara pulsa, semua tidak bisa kurang relevan dengan masalah Anda, yaitu bahwa servo tidak merespons ketika Anda mengharapkannya.
Satu-satunya hal yang relevan adalah tepi denyut nadi Anda, yang belum Anda perhatikan. Jika Anda ingin mencari tahu hal ini, silakan mulai dengan melihat hal-hal yang penting, berikan tangkapan dekat dari tepi pulsa Anda, hal-hal semacam itu. Anda tidak menangkap apa pun yang berguna dalam tangkapan layar itu, yang mungkin mengapa tampaknya tidak ada masalah atau perbedaan. Ada banyak masalah atau perbedaan yang tidak akan pernah terlihat dengan apa yang Anda ukur.
Apa yang bisa saya lihat adalah bahwa penangkapan kereta nadi yang tidak bekerja terasa lebih kotor, baik nadi maupun tanah, daripada yang lainnya. Yang aneh, karena harus memanggil fungsi yang sama dengan yang lain. Mengapa begitu ribut sekali?
Lebih penting lagi, dalam penangkapan non-kerja, lihat 'musim gugur'. 809μs? Osiloskop Anda berpikir ia melihat waktu jatuh yang bertahan 0,8 ms. Itu buruk. Jelas itu tidak benar, tetapi kenyataannya tetap, itulah yang diukurnya.
Itu adalah tanda klasik dari tepi yang kotor. Pikirkan tentang itu. Jika pulsa ini membodohi peralatan uji kelas atas Anda yaitu osiloskop Anda untuk melihat waktu yang sangat panjang atau jatuh, atau mungkin sangat kotor sehingga tidak dapat mendeteksi tepi jatuh dengan benar setiap saat (atau siapa yang tahu), maka kesempatan apa yang dimiliki servo kecil $ 8 yang jelek itu untuk mendapatkan nilai yang baik?
Jika servo tidak mendapatkan pulsa yang valid (seperti jika ujung jatuh terlalu lama, terlalu kotor, atau terlewatkan) dalam rentang pulsa yang dapat diterima, dan oleh servos memperhitungkan tepi yang mungkin atau mungkin tidak memiliki apa pun untuk lakukan dengan apa yang Anda anggap sebagai tepi denyut nadi, lalu ia merespons seolah-olah mati.
Dengan kata lain, tidak hanya itu tidak bergerak, tetapi tidak akan menahan porosnya bergerak. Itu hanya akan menjadi lemas, persis seperti yang Anda lihat.
Sekarang, ini menimbulkan pertanyaan .... mengapa memanggil servo.write mempengaruhi kualitas tepi?
Anda mengatakan klon. Seperti yang ini?
Klon-klon ini khususnya cenderung berperilaku tidak menentu karena decoupling yang sangat buruk. Harus ada kapasitor decoupling pada setiap pin daya, dan sedekat mungkin dengan mega2560. Dan pada arduino yang sebenarnya, memang ada. Namun pada klon ini, mereka terlalu jauh, atau mungkin hilang, sulit untuk mengatakannya. Jelas dari melihat papan bahwa itu tidak akan berperilaku andal, itu yang penting.
Jadi apa bedanya?
Ketika Anda memanggil servo.write, ia mendorong stack lebih tinggi daripada jika Anda memanggil writeMicroseconds. Mengingat penunjuk stack 3 byte mega2560 (17 bit), itu harus membalik banyak bit kritis yang tidak harus ketika Anda memanggil writemicroseconds. Saya tahu ini sepertinya perbedaan yang tidak mungkin, tetapi saya telah mengalami bagian saya yang adil dari mikrokontroler yang dipisahkan secara buruk, dan atmegas pada khususnya tampaknya menunjukkan perilaku aneh khususnya ketika menggunakan timer dan / atau mendorong atau membuka tumpukan. Sesuatu yang serupa terjadi pada saya, hanya tumpukan yang rusak ketika saya mencoba untuk mengarahkan LED dengan PWM, tetapi jika saya meletakkan semuanya sejajar tanpa mendorong tumpukan, itu berhasil. Decoupling yang buruk akhirnya menjadi masalah.
Saya sepenuhnya berharap decoupling yang buruk dapat, untuk alasan yang diketahui bahwa ATmega2560 dan tidak ada orang lain, memiliki efek yang merugikan pada kualitas tepi pulsa itu, tetapi hanya ketika Anda mendorong tumpukan tepat sebelumnya. Servo ini hanya tidak cukup mampu menangani cara tepi-tepi itu dinodai, sehingga tidak ada pulsa yang valid dalam kasus itu. Servo lain jelas mengelolanya.
Hal decoupling selalu aneh dan hiper spesifik seperti ini. Itulah sebabnya decoupling sangat penting. Menjaga neraka mimpi buruk masalah kurangnya kapasitansi dapat menyebabkan Anda di teluk dengan tutup keramik yang bagus dan sedekat mungkin dengan chip.
sumber
Ini mungkin terkait dengan pengaturan pin output yang dilakukan oleh rutin .write (). Silakan coba gunakan resistor pull-down 1K, itu tidak bekerja kemudian lepaskan dan gunakan resistor pull-up. ini akan menyeimbangkan efek dari resistor pull-up / pull-down mingguan internal yang mungkin diatur oleh rutin. Ketika Anda mengukur sinyal dengan ruang lingkup Anda, resistansi internal probe bertindak sebagai pull-down.
Kebanyakan servos juga akan melepaskan daya ke motor internal jika sinyal dalam tidak diatur selama 10 pulsa berturut-turut. Ini digunakan untuk menghemat daya.
sumber