Sangat sederhana, saya mengendalikan servos (9g Micro Servos) berdasarkan pada beberapa data yang dibaca dari tempat lain. Semuanya berfungsi dengan baik kecuali bahwa servos akan terus "gemetar." Artinya, mereka bergetar kembali dengan gerakan yang sangat halus (dengan gerakan terputus-putus 1/2 -> 1cm atau lebih).
Saya mencoba memperbaiki masalah ini dalam perangkat lunak dengan melakukan sesuatu seperti:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("X position: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Y position: ");
lcd.print(yRead);
}while( readChange() ); //while there has been change
Di mana do-while diperlukan menginisialisasi variabel yang menyimpan nilai servo yang dipetakan (menggunakan perpustakaan arduino servo).
Fungsi readChange () didefinisikan sebagai:
int readChange(){
int x_Temp, y_Temp;
x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);
if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change
else return 1; //change
}
Di mana xRead adalah nilai yang diinisialisasi (yang pertama, keluaran servo yang dipetakan).
Meskipun, ini sebenarnya bukan pendekatan yang baik. Ini mensyaratkan bahwa KEDUA nilai tidak boleh diubah oleh faktor DEG (~ 10 derajat, atau ~ 0.28V dalam kasus saya). Jika saya menulis fungsi sedemikian sehingga ATAU kurang dari DEG, lalu bagaimana jika saya hanya mengubah satu servo sekaligus? Jadi ada delimma ..
Apakah ini hanya properti servos (mungkin yang murah?) Atau apakah ada solusi?
Akan lebih mudah untuk menyertakan tautan pastie. Berikut adalah kode lengkapnya: http://pastie.org/8191459
Saya telah melampirkan dua servos bersama dengan laser pointer untuk memungkinkan dua derajat kebebasan (X, Y). Ada beberapa opsi, berdasarkan keadaan beberapa tombol, untuk mengontrol servos dengan berbagai cara. Yang pertama adalah "Gerak" di mana saya memiliki dua fotoresistor yang, berdasarkan jumlah paparan cahaya, mempengaruhi posisi servos. Saya belum menerapkan kode untuk mengontrol servos oleh pengontrol Xbox. Dan opsi ketiga hanyalah gerakan acak.
Jawaban:
Saat menggunakan pustaka Servo pada Arduino, sumber umum servo buzz adalah bahwa rutinitas servo yang digerakkan oleh interupsi tidak benar-benar memberikan pulsa keluaran yang sangat stabil. Karena AVR mengambil interupsi untuk melayani jam millis () dan hal-hal lain dalam runtime Arduino, jitter di perpustakaan Servo ada di urutan beberapa mikrodetik, yang diterjemahkan ke banyak gerakan di servo.
Cara mengatasinya adalah menulis pulsa Anda sendiri. Sesuatu seperti ini:
Ini akan mematikan interupsi lainnya, dan menghasilkan pulsa PWM yang jauh lebih bersih. Namun, itu akan membuat timer "millis () melewatkan beberapa tick ticks. (Fungsi" micros () "dapat disebut sesuatu yang lain - saya lupa persis apa.)
Secara umum, untuk menentukan waktu kode kritis, Anda ingin menyingkirkan runtime Arduino sepenuhnya, dan menulis sendiri menggunakan kompiler avr-gcc dan perpustakaan avr-libc yang mendukung lingkungan Arduino. Kemudian Anda dapat mengatur timer untuk mencentang 4 kali per mikrodetik, atau bahkan 16 kali per mikrodetik, dan mendapatkan resolusi yang jauh lebih baik di PWM Anda.
Penyebab lain buzz di servos adalah servos murah dengan sensor murah, di mana sensornya berisik, atau ketika posisi tepat yang diminta dengan pulsa tidak bisa dikodekan oleh sensor. Servo akan melihat "pindah ke posisi 1822" dan mencoba melakukannya, tetapi berakhir dengan pembacaan sensor 1823. Servo kemudian akan mengatakan "mundur sedikit" dan berakhir dengan pembacaan sensor 1821. Ulangi! Cara mengatasinya adalah dengan menggunakan servos berkualitas tinggi. Idealnya, bukan servos hobi sama sekali, tetapi servos asli dengan enkoder absolut optik atau magnetik.
Akhirnya, jika servos tidak mendapatkan daya yang cukup, atau jika Anda mencoba menggerakkan tenaganya dari rel 5V pada Arduino, ini akan menghasilkan buzz yang disebabkan oleh penurunan tegangan pada servos, seperti yang disarankan di atas. Anda mungkin dapat memperbaikinya dengan kapasitor elektrolitik besar (yang merupakan ide bagus untuk penyaringan umum) tetapi Anda lebih mungkin ingin memastikan sumber daya servo Anda benar-benar dapat memberikan beberapa amp arus pada tegangan servo.
sumber
Ini disebut "buzz".
Ada beberapa hal yang akan menyebabkannya. Ketidakstabilan dalam kekuatan ke servo adalah penyebab umum. R / C servos dapat menggambar beberapa paku BESAR ketika pertama kali menempatkan motor dalam gerakan.
Bertahun-tahun yang lalu, saya bermain dengan servo Tower Hobbies Royal Titan Standard, mengendalikannya dari 555 dan inverter satu-transistor. Sirkuit kontrol mati-sederhana. Saya belajar bahwa motor servo menarik 250 mA dari suplai 5V saat bergerak terus menerus. Berdengung, itu dengan mudah menarik paku setengah amp. (Mungkin lebih: saya hanya memantau meteran saat ini pada persediaan bangku saya, bukan membatasi shunt penginderaan saat ini.)
Butuh 220 uF langsung melintasi servo saya untuk menjinakkannya.
Coba letakkan kapasitor elektrolitik, setidaknya 100 uF, langsung di seberang catu daya ke servo, sedekat mungkin dengan servo, dan lihat apakah itu membantu.
Berdasarkan percobaan tersebut, saya tidak akan pernah mempertimbangkan menggunakan R / C servos untuk APA SAJA tanpa menambahkan kapasitor. Itu termasuk model yang dikendalikan radio.
Ini juga dapat disebabkan oleh kotoran di panci servo di dalam servo. Coba kapasitor terlebih dahulu.
sumber
Apakah dengungan / goncangan Anda terjadi hanya ketika berada pada atau dekat dengan batas servo (0 derajat atau 180 derajat)? Jika demikian, mungkin ada perbaikan sederhana untuk Anda. Saya telah menemukan bahwa servos murah tidak tahu bagaimana untuk tetap pada batas gerakan mereka dengan sangat baik, yang dapat menyebabkan dengungan / goncangan yang Anda sebutkan. Namun, jika Anda hanya membatasi jangkauannya hingga 10 ~ 170 derajat, masalah ini akan diperbaiki.
Jika itu tidak cukup baik untuk Anda, Anda dapat mengikuti perbaikan yang lebih kompleks yang disebutkan dalam jawaban lain, seperti daya yang lebih baik, sensor servo yang lebih baik, dll.
sumber
Saya telah memperbaiki masalah saya dengan "mematikan servo" setelah saya memindahkannya. Contoh:
PIN
adalah pin PWM yang terhubung ke servo Anda. dengan mengalihkannya ke mode Input saya dapat mematikan getaran. Ini bukan solusi optimal dan saya sarankan mencoba solusi lain terlebih dahulu.sumber
Saya memiliki masalah yang sama dengan MG90S servos (jittering), jalur sinyal saya relatif panjang (60 ~ 70cm), menempatkan kapasitor 103 (10nF) di atas sinyal dan jalur tanah memperbaiki masalah bagi saya (saya menempatkan kapasitor di suatu tempat di tengah, pada titik di mana kabel servo asli terhubung ke kabel internal saya).
Selain itu saya tidak bisa menggunakan pustaka Servo standar karena timer pertama yang diambil pada Arduino Mega adalah Timer-5 dan saya memerlukannya untuk pengukuran frekuensi. Karena saya hanya menggunakan 10 servos, saya mengekstrak kode kunci dari perpustakaan Servo dan mengubahnya menjadi menggunakan Timer-1 (setiap timer mendukung maksimum 12 servo pada Mega).
Kode yang berdiri sendiri di bawah ini untuk referensi, jika Anda ingin memasukkannya dalam proyek Anda sendiri maka Anda dapat menggunakan bagian atas saja, bagian bawah adalah untuk menguji bagian atas (itu mendengarkan pada port serial, Anda dapat memberikan sX dan perintah vX, di mana sX memilih servo, s0 akan memilih servo pertama, vX menetapkan posisi servo di kami, jadi v1500 akan mengatur servo0 ke posisi tengah, dengan asumsi Anda memberikan perintah s0 pertama).
sumber
Opsi terbaik saya dalam hal ini adalah melampirkan dan melepaskan Servo di setiap operasi.
PS. ini benar-benar tidak berkualitas sama sekali, hanya solusi.
sumber
Sementara yang lain telah menyarankan berbagai solusi untuk masalah buzz servo ini, di utas ini dan forum Arduino lainnya, yaitu:
Dalam kasus saya, saya menemukan bahwa dengungan berhenti ketika catu daya 9V / 2A dicolokkan ke papan Arduino. Tapi solusi pamungkas termudah adalah dengan menggerakkan servo perlahan:
YMMV.
sumber
sumber
Bagi saya, ini terlihat seperti kesalahan atau salah pengaturan dari loop umpan balik. Sistem kontrol servo kelas atas memiliki pengetahuan tentang karakteristik motor (induktansi, torsi, arus puncak, jumlah kutub), beban (momen inersia), dan kondisi seketika (posisi, rpm, back-emf, arus). Dengan informasi ini, program kontrol motor dapat membuat prediksi tentang apa yang akan dilakukan servo sebagai respons terhadap input yang diberikan dari pengontrol (yaitu input arus / tegangan) dan atas dasar itu menghasilkan input optimal untuk mencapai output yang diinginkan.
Seperti yang dapat Anda bayangkan, ini adalah hal yang agak rumit, tetapi pencarian internet tentang umpan balik servo akan membantu Anda memulai.
sumber