Showing posts with label servo tower pro. Show all posts
Showing posts with label servo tower pro. Show all posts

simple servo control

Bentuk motor servo:


servo standar



servo mini




 konfigurasi pin pada tiap merk servo




berikut merupakan gambar pemberian pulse pada data sheet servo Hitec-HS 311:

Arti dari gambar tersebut adalah jka servo di beri logic 1 (high) selama 600microsecon kemudian diberi logika 0 (low) selama beberapa miili secon maka servo akan bergerak ke posisi -90 derajat (berputar kekiri) , jika logik 1 nya diberikan selama 2400microsecon maka servo akan bergerak ke +90 derajat. untuk menggerakan servo ke tengah 0 derajat maka pulse yang diberikan adalah selama 1500micro secon,
pertanyaan yang muncul:
bagai mana menggerakan servo ke posisi 81 derajat?,33 derajat, 10 derajat?.

kita ganti saja logika berfikirnya, misal saya ubah menjadi :
  • -90 derajat (90 derajat kekiri) = 0 derajat
  • 0 derajat (tengah-tengah) = 90 derajat
  • +90 derajat (90 derajat kekanan) = 180 derajat
artinya :
  • lebar high pulse 600us  = 0 derajat
  • lebar high pulse 1500us= 90 derajat
  • lebar high pulse 2400us= 180 derajat
ini bukan merubah servo tetapi merubah pola berfikir untuk mempermudah pemrograman.
selisih lebar pulse high tiap derajat adalah (2400us - 600us) /180 = 10us.
maka untuk menggerakan servo sebesar 1 derajat maka lebar pulsa logic 1 adalah 600us + 1 x 10us. 


kesimpulan :
  • lebar pulse high (logic 1) = 600us + derajat yng diinginkan  x 10us 
  • lebar pulse low nya (logic 0) saya gunakan 10 milisecon

contoh program dalam bahasa C:
#include <mega16.h> // microcontroller ATmega 16
#include <delay.h>
#define servo PORTC.0 // servo connected with PORTC.0
typedef unsigned char unchar; // unsigned char = unchar
void set_servo(unchar derajat) // function to control servo 1
{
unchar n;
servo=1; // berikan output logic 1
delay_us(600); // selama 600us
 for(n=0; n < derajat; n++){ // ditambah 10us X derajat yg diinginkan
delay_us(10);
};
servo=0; // keluarkan output logic 0
delay_ms(10); // tunda selama 10 ms 
};
void main(void){
DDRC = 0x01;
PORTC= 0x00;
while(1){
set_servo(100); //menggerakan servo ke sudut 100 derajat
delay_ms(1000);
set_servo(30); // menggerakan servo ke sudut 30 derajat
delay_ms(1000); 
}
 }

Salah satu logika cara untuk mengatur speed servo:
jika servo kita perintahkan untuk bergerak menuju ke sudut tertentu maka servo akan bergerak ke sudut tersebut dengan kecepatan penuh , jika kita gerakan servo tiap step maka servo akan bergerak lambat.
misal :
dari posisi awal servo 0 derajat kemudian kita perintah untuk bergerak ke 30 derajat maka servo akan langsung bergerak dengan kecepatan penuh ke sudut 30 derajat. utuk memperlambat kita gerakan tiap 1 derajat.  maka servo akan bergerak dari 0 ke 1 derajat dulu, 2 derajat, 3 ,4.... dst sampai ke 30 derajat (tujuan), jika step kita perbesar maka gerakan akan semakin cepat , misal menggunakan 5 step, maka servo akan bergerak dari 0 derajat , 5 derajat , 10 derajat.. dst sampai 30 derajat (tujuan).
jangan lupa untuk menunda beberapa mili secon tiap step.


lihat video 24 serial servo controller buatan saya:



komunikasi menggunakan USART 
yang paling kiri adalah servo hitec HS-322
yang lainya servo towerpro MG945R 

source code dan simulasi proteus download disini !!  
setingan crystal yang saya gunakan external crystal 16MHZ (sesuaikan dengan milik anda), jika crystal tidak sama dengan program maka servo tidak akan bergerak sesuai keinginan,

password to open zip file : microku.blogspot.com