A- Gerekli Malzemeler:

1 – 1 adet 16F877A mikrodenetleyici
2 – 1 adet kırmızı LED
3 – 1 adet 220 ohm direnç
4 – 1 adet 4k7 direnç
5 – 2 adet 22pF kapasitör
6 – 1 adet 20Mhz kristal
7 – 1 adet LM7805 regülatör
8 – 1 adet servo motor
9 – 2 adet düğme
10- 2 adet 10k direnç

B- Açıklamalar:

Bu uygulamada PIC 16F877A mikrodenetleyicisini kullanarak bir servo motoru kontrol edeceğiz. Kontrol ederken iki düğme kullanacağız. Düğmelerin birine basıldığında servo bir yöne, diğerine basıldığında servo başka bir yöne ve düğmelere basılmadığında bir yöne dönecektir.
Kullanacağımız servo motorun 3 adet iğnesi bulunmaktadır. İlk iğne (sarı kablo) veri iğnesidir. İkinci iğne (kırmızı kablo) gerilim (5V) ve üçüncü iğne (siyah kablo) topraktır. Servo motor veri iğnesinden gelen 20ms lik veriyi alır ve bu verideki 1 (yani +5V) miktarına göre yönünü ayarlar. Mesela:

  1. bit_set(b_kapisi,7);
  2. delay_us(2400);
  3. bit_clear(b_kapisi,7);
  4. delay_ms(17);
  5. delay_us(600);

Kodu ile B kapısının yedinci iğnesine bağlı bir servo motoru 2,4ms 1 ve 17,6ms 0 vererek saat yönünde döndürebiliyoruz. Motoru ortalamak için ise aşağıdaki kodu kullanıyoruz:

  1. bit_set(b_kapisi,7);
  2. delay_us(1500);
  3. bit_clear(b_kapisi,7);
  4. delay_ms(17);
  5. delay_us(1500);

Görüldüğü gibi 1,5ms 1 ve 18,5ms 0 verilmesi motoru ortalıyor. Benzer şekilde 0,6ms 1 ve 19,4ms 0 vererek motoru saat yönünün tersinde bir konuma getirebiliriz. Burada dikkat edilmesi gereken şey gönderilen sinyaldeki 1 (yani +5V) süresinin 0,6ms ile 2,4ms arasında değişmesidir. Daha büyük veya daha küçük (servo motorun özelliklerine göre bu 0,6ms ve 2,4ms değerleri oynama gösterecektir) değerler istenmeyen sonuçlar doğuracaktır.
Unutulmaması gereken bir detay servo motorun düz DC motorun aksine belirli bir konuma (bizim yukarıdaki verilerle belirttiğimiz) gelindiğinde durmasıdır. Yani açılı döndürme gibi işlemler yapılabilir.
Düğmeler bağlanırken de pull-down dirençlerin bağlanmasına özen gösterilmelidir (aksi takdirde A kapısından veri okunurken istenmeyen sonuçlar elde edilecektir).

C- Devre Şeması (ISIS):

devre_sema.JPG

pic_2dsn.txt (uzantısını .DSN olarak değiştiriniz)

D- Kod (CCS C):

pic_2.hex : pic_2.txt (uzantısını .hex olarak değiştiriniz)

pic_2.c :

  1. #include “D:\scozturk\pic_2.h”
  2. #BYTE a_kapisi = 0x05               // A kapısını tanımla
  3. #BYTE b_kapisi = 0x06               // B kapısını tanımla
  4. void ayarla()
  5. {
  6. setup_adc_ports(NO_ANALOGS);
  7. setup_adc(ADC_OFF);
  8. setup_psp(PSP_DISABLED);
  9. setup_spi(FALSE);
  10. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  11. setup_timer_1(T1_DISABLED);
  12. setup_timer_2(T2_DISABLED,0,1);
  13. setup_comparator(NC_NC_NC_NC);
  14. setup_vref(FALSE);
  15. }
  16. void main()
  17. {
  18. int i;                              // Döngülerde kullanılan sayaç
  19. ayarla();                           // PIC’i ayarla
  20. delay_ms(2000);                     // 2 saniye bekle
  21. set_tris_a(0xFF);                   // A kapısını giriş olarak kullanacağımızdan giriş olarak ayarlayalım
  22. set_tris_b(0x00);                   // B kapısını çıkış olarak ayarlayalım
  23. bit_set(b_kapisi,0);                // RB0 daki LED’i yak
  24. for( ; ; )                          // Sonsuz döngü
  25. {
  26. if(bit_test(a_kapisi,0))         // RA0 daki düğmeye mi basılmış?
  27. {
  28. for(i = 0 ; i < 5 ;++i)       // Servo motoru sağa döndür
  29. {
  30. bit_set(b_kapisi,7);
  31. delay_us(2400);
  32. bit_clear(b_kapisi,7);
  33. delay_ms(17);
  34. delay_us(600);
  35. }
  36. }
  37. else if(bit_test(a_kapisi,1))    // RA1 deki düğmeye mi basılmış?
  38. {
  39. for(i = 0 ; i < 5 ;++i)       // Servoyu sola döndür
  40. {
  41. bit_set(b_kapisi,7);
  42. delay_us(600);
  43. bit_clear(b_kapisi,7);
  44. delay_ms(17);
  45. delay_us(2400);
  46. }
  47. }
  48. else
  49. {
  50. for(i = 0 ; i < 5 ;++i)       // Servoyu ortala
  51. {
  52. bit_set(b_kapisi,7);
  53. delay_us(1500);
  54. bit_clear(b_kapisi,7);
  55. delay_ms(17);
  56. delay_us(1500);
  57. }
  58. }
  59. }
  60. }

pic_2.h :

  1. #include <16F877A.h>
  2. #device *=16
  3. #device adc=8
  4. #FUSES NOWDT                     //No Watch Dog Timer
  5. #FUSES HS                        //High speed Osc (> 4mhz)
  6. #FUSES NOPUT                     //No Power Up Timer
  7. #FUSES NOPROTECT                 //Code not protected from reading
  8. #FUSES NODEBUG                   //No Debug mode for ICD
  9. #FUSES NOBROWNOUT                //No brownout reset
  10. #FUSES NOLVP                     //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  11. #FUSES NOCPD                     //No EE protection
  12. #FUSES NOWRT                     //Program memory not write protected
  13. #use delay(clock=20000000)

E- Devrenin Resmi:

devre_resim.JPG

F- Vidyo:

Vidyo 1

Vidyo 2