28BYJ-48 Step Motor Uygulaması
Merhaba arkadaşlar, bu yazımızda Trudyo Geliştirme Kartı‘nı kullanarak 28BYJ-48 Step Motor kontrol uygulaması yapacağız. İlk olarak step motorun belirlediğimiz miktarda adım atmasını sağlayacak bir uygulama yapacağız. Daha sonra Trudyo Başlangıç Kiti kullanarak trimpot belirlenen konuma yine trimpot belirlenen hızla hareket edecek bir uygulama yapacağız.
Eğer step motorlar hakkında ayrıntılı bilgi almak isterseniz aşağıdaki yazımızı incelemenizi öneririz. Ek olarak, Trudyo Geliştirme Kartı‘nın konfigürasyon ayarlarını yapmak için yine aşağıdaki yazımızı inceleyebilirsiniz.
Step motorlar, uygulanan elektriksel sinyaller ile adım adım (step step) hareket edebilen motorlardır. Step motorları...
https://youtu.be/Cox4RN5P_pQ Merhaba arkadaşlar, Trudyo Geliştirme Kartı’nızı ile ilk uygulamalarınızı gerçekleştirmek mi istiyorsunuz? Başlamadan önce konfigürasyon...
28BYJ-48 Step Motor ve Trudyo Geliştirme Kartı Bağlantı Şeması
28BYJ-48 Step Motorlar genellikle ULN2003 motor sürücü ile birlikte gelirler. Sıklıkla kullanılan iki farklı ULN2003 motor sürücü devresi için de ayrı ayrı bağlantı şeması yukarıda belirtilmiştir. Ayrıca kablo bağlantı şeması aşağıdaki tabloda belirtilmiştir.
Trudyo Geliştirme Kartı | ULN2003 Sürücü Kartı |
---|
5V | VDD | |
D7 | IN1 | |
D6 | IN2 | |
D5 | IN3 | |
D4 | IN4 | |
GND | GND |
Bu Uygulamada Kullanılan Malzemeler
Yukarıda paylaşılan uygulama bağlantı şeması referans alındığında ihtiyaç duyabileceğiniz malzemeler aşağıda listelenmektedir.
Trudyo Geliştirme Kartı
28BYJ-48 Step Motor Uygulama Kodları
// Step Motor Baglantilari
#define STEP_IN1 LATD7_bit
#define STEP_IN2 LATD6_bit
#define STEP_IN3 LATD5_bit
#define STEP_IN4 LATD4_bit
#include "Library/STEP.c"
void main() {
// Port Giris-Çikis Seçimi (0:Çikis, 1:Giris)
TRISA=0b00000000; // [][][][LED][][][][]
TRISB=0b00000000; // [][][][][][][][]
TRISC=0b00000000; // [][][][][][][][]
TRISD=0b00000000; // [STEP_IN1][STEP_IN2][STEP_IN3][STEP_IN4][][][][]
TRISE=0b00000000; // [][][][][][][][]
// Port Analog-Dijital Giris Seçimi (0:Dijital, 1:Analog)
ANSELA=0b00000000; // [][][][][][][][]
ANSELB=0b00000000; // [][][][][][][][]
ANSELC=0b00000000; // [][][][][][][][]
ANSELD=0b00000000; // [][][][][][][][]
ANSELE=0b00000000; // [][][][][][][][]
// Port Temizleme
LATA=0x00;
LATB=0x00;
LATC=0x00;
LATD=0x00;
LATE=0x00;
SetStepMotor(2048, HALF_STEP_MODE, 3000); // Yarim adim modunda 3000us bekleme ile 2048 adim ileri dön (fonksiyon icerisinde her bir adim için iki adimlik hareket yapiliyor)
SetStepMotor(-2048, FULL_STEP_MODE, 3000); // Tam adim modunda 3000us bekleme ile 2048 adim geri dön
SetStepMotor(512, HALF_STEP_MODE, 3000); // Yarim adim modunda 3000us bekleme ile 512 adim ileri dön
SetStepMotor(-512, HALF_STEP_MODE, 3000); // Tam adim modunda 3000us bekleme ile 512 adim geri dön
// Sonsuz Dongu
while(1){
SetStepMotor(20, HALF_STEP_MODE, 1000000); // Yarim adim modunda 1s bekleme ile 20 adim ileri dön
SetStepMotor(20, FULL_STEP_MODE, 1000000); // Tam adim modunda 1s bekleme ile 20 adim geri dön
}
}
Uygulama Kodları Açıklaması
1.Step Motor Bağlantı Tanımlamaları
// Step Motor Baglantilari
#define STEP_IN1 LATD7_bit
#define STEP_IN2 LATD6_bit
#define STEP_IN3 LATD5_bit
#define STEP_IN4 LATD4_bit
#include "Library/STEP.c"
#define
tanımlaması ile bir pin veya porta farklı bir isim ataması yapılabilir. Bu sayede, kütüphane dosyalarında güncelleme yapmaksızın step motorun bağlantı noktalarını dilediğiniz bir başka pine aktarabilirsiniz. Ek olarak, çok daha anlaşılabilir programlama avantajı da sunar.
#define STEP_IN1 LATD7_bit // D7 pini yerine STEP_IN1 tanımlandı
Yukarıdaki komut satırında LATD7_bit tanımlaması yerine STEP_IN1 tanımlamasının kullanılacağı belirtilmiştir.
#include "Library/STEP.c" // Step motor kütüphanesini dahil et
#include
tanımlaması ile harici bir dosyayı projenize dahil edebilirsiniz. Dahil etmek istediğiniz dosyanın proje klasörü içerisinde olması gerekmektedir. Örnekteki komut satırında proje klasörü içerisinde Library alt klasöründe bulunan STEP.c
kütüphane dosyası programa dahil edilmiştir.
2.Giriş/Çıkış Seçimleri
// Port Giris-Çikis Seçimi (0:Çikis, 1:Giris)
TRISA=0b00000000; // [][][][LED][][][][]
TRISB=0b00000000; // [][][][][][][][]
TRISC=0b00000000; // [][][][][][][][]
TRISD=0b00000000; // [STEP_IN1][STEP_IN2][STEP_IN3][STEP_IN4][][][][]
TRISE=0b00000000; // [][][][][][][][]
TRIS
kaydedicisi bir portun pinlerinin giriş olarak mı, yoksa çıkış olarak mı kullanılacağını belirleyen kaydedicidir. 0 değeri bir pinin çıkış olarak kullanıldığını belirtirken, 1 değeri ise ilgili pinin giriş olarak kullanılacağını belirtir. Burada TRISD kaydedicisinin 7, 6, 5 ve 4 nolu bitleri step motor kontrol çıkışları olduğu için 0 değerini almıştır.
3.Analog/Dijital Giriş Seçimleri
// Port Analog-Dijital Giris Seçimi (0:Dijital, 1:Analog)
ANSELA=0b00000000; // [][][][][][][][]
ANSELB=0b00000000; // [][][][][][][][]
ANSELC=0b00000000; // [][][][][][][][]
ANSELD=0b00000000; // [][][][][][][][]
ANSELE=0b00000000; // [][][][][][][][]
ANSEL
kaydedicisi bir portun pinlerinin dijital giriş olarak mı, yoksa analog giriş olarak mı kullanılacağını belirleyen kaydedicidir. 0 değeri bir pinin dijital giriş olarak kullanıldığını belirtirken, 1 değeri ise ilgili pinin analog giriş olarak kullanılacağını belirtir.
4.Portları Temizleme
// Port Temizleme
LATA=0x00;
LATB=0x00;
LATC=0x00;
LATD=0x00;
LATE=0x00;
LAT
kaydedicisi çıkış olarak ayarlanan bir portun pinlerini lojik-1 veya lojik-0 olarak ayarlamak için kullanılan kaydedicidir. Program başlangıcında portların varsayılan değerleri eğer gerekiyorsa güncellenmeli, gerekmiyor ise temizlenmelidir.
5.Step Motor Kontrol Komutları
SetStepMotor(2048, HALF_STEP_MODE, 3000); // Yarim adim modunda 3000us bekleme ile 2048 adim ileri dön (fonksiyon icerisinde her bir adim için iki adimlik hareket yapiliyor)
SetStepMotor(-2048, FULL_STEP_MODE, 3000); // Tam adim modunda 3000us bekleme ile 2048 adim geri dön
SetStepMotor(512, HALF_STEP_MODE, 3000); // Yarim adim modunda 3000us bekleme ile 512 adim ileri dön
SetStepMotor(-512, HALF_STEP_MODE, 3000); // Tam adim modunda 3000us bekleme ile 512 adim geri dön
SetStepMotor
fonksiyonu step motora belirlenen yönde, belirlenen şekilde , belirlenen miktarda ve yine belirlenen hız ile hareket etme komutunu işleten fonksiyondur.
SetStepMotor(2048, HALF_STEP_MODE, 3000); // Yarim adim modunda 3000us bekleme ile 2048 adim ileri dön (fonksiyon icerisinde her bir adim için iki adimlik hareket yapiliyor)
Yukarıdaki komut satırında belirtilen SetStepMotor(2048, HALF_STEP_MODE, 3000);
komutununda;
-
2048
değeri step motorun saat yönünde 2048 adım (bir tam tur) hareket edeceğini belirtir. Negatif değerler için step motor saat yönünün tersine hareket etmektedir. -
HALF_STEP_MODE
değeri hareket sekansının yarım adımlar halinde yapılacağını belirtir. 28BYJ-48 yarım adım modunda toplamda 4096 adımda bir turunu tamamlamaktadır. Ancak kütüphane fonksiyonu içerisinde her seferde 2 adım işletildiği için yine bir tam turunu 2048 adımda tamamlamaktadır. -
3000
değeri step motorun adımlar arasında bekleyeceği zamanı mikrosaniye olarak belirtmektedir.
6.ULN2003 Motor Sürücü ile 28BYJ-48 Kontrolüne Daha Ayrıntılı Bakalım
// Sonsuz Dongu
while(1){
SetStepMotor(20, HALF_STEP_MODE, 1000000); // Yarim adim modunda 1s bekleme ile 20 adim ileri dön
SetStepMotor(20, FULL_STEP_MODE, 1000000); // Tam adim modunda 1s bekleme ile 20 adim geri dön
}
Sonsuz döngü içerisinde 20 adımlık yarım ve tam adımlar ile hareket etme komutları tanımlanmıştır. Zaman olarak ise daha iyi gözlemlenmesi için 1 saniyelik bir değişim hızı ayarlanmıştır. Aşağıda ULN2003 motor sürücüsü LED’lerinin sonsuz döngü durumumu için animasyonu görünmektedir.
ULN2003 DIP Motor Sürücü - Tam Adım Modu
ULN2003 DIP Motor Sürücü - Yarım Adım Modu
28BYJ-48 Step Motor ve Trudyo Başlangıç Kiti Bağlantı Şeması
Trudyo Başlangıç Kiti üzerinde 28BYJ-48 Step Motor bağlantısı için bir bağlantı noktası bulunmaktadır. J3 header‘ine dişi-dişi jumper kablo ile doğrudan bağlantı yapılarak kullanılabilir. Ayrıca kablo bağlantı şeması aşağıdaki tabloda belirtilmiştir.
Trudyo Başlangıç Kiti (J3) | ULN2003 Sürücü Kartı |
---|
5V | VDD | |
IN1 | IN1 | |
IN2 | IN2 | |
IN3 | IN3 | |
IN4 | IN4 | |
GND | GND |
Bu Uygulamada Kullanılan Malzemeler
Yukarıda paylaşılan uygulama bağlantı şeması referans alındığında ihtiyaç duyabileceğiniz malzemeler aşağıda listelenmektedir.
Trudyo Başlangıç Kiti
Trudyo Başlangıç Kiti Kutusu – Siyah
28BYJ-48 Step Motor Uygulama Kodları
#include "register.c"
#include "connection.c"
#include "function.c"
#include "display.c"
#include "initialize.c"
#include "Library/DS18B20.c"
#include "Library/RGB.c"
#define STEP_IN1 IN1
#define STEP_IN2 IN2
#define STEP_IN3 IN3
#define STEP_IN4 IN4
#include "Library/STEP.c"
#include "interrupt.c"
void main() {
InitMCU();
InitStep(); // Step Motoru Hazirla
LCD_Out(1,1," TRUDYO "); // 1.satir 1.sütuna " TRUDYO " yaz
LCD_Out(2,1," BASLANGIC KITI "); // 2.satir 1.sütuna " BASLANGIC KITI " yaz
wait(1000); // 1 saniye bekle
LCD_Out(1,1," 28BYJ-48 "); // 1.satir 1.sütuna " 28BYJ-48 " yaz
LCD_Out(2,1," STEP MOTOR UYG "); // 2.satir 1.sütuna " STEP MOTOR UYG " yaz
wait(1000); // 1 saniye bekle
LCD_Out(1,1,"HIZ: "); // 1.satir 1.sütuna "HIZ: " yaz
LCD_Out(2,1,"KONUM: "); // 2.satir 1.sütuna "KONUM: " yaz
// Sonsuz Döngü
while(1){
// Hiz degerini Trimpot1'den oku ve ekrana yazdir
speed=3000+ADC_Read(1)*7; // Hiz 3000~10000us arasinda
LCD_PrintInt(1,12,speed,5); // 5 basamakli speed degerini 1.satir 12.sütuna yaz
// Konum degerini Trimpot2'den oku ve ekrana yazdir
location=ADC_Read(3)*2; // Konum 0-2048 arasinda olacak sekilde ayarlandi
LCD_PrintInt(2,8,currentLocation,4); // 4 basamakli currentLocation degerini 2.satir 8.sütuna yaz
Lcd_Chr(2,12,'/'); // 2.satir 12.sütuna / karakterini yazdir
LCD_PrintInt(2,13,location,4); // 4 basamakli location degerini 2.satir 13.sütuna yaz
}
// Sonsuz Döngü
while(1){
LCD_Out(1,1," TRUDYO "); // 1.satir 1.sütuna " TRUDYO " yaz
LCD_Out(2,1," BASLANGIC KITI "); // 2.satir 1.sütuna " BASLANGIC KITI " yaz
}
}
Uygulama Kodları Açıklaması
1.Step Motor Bağlantı Tanımlamaları
#define STEP_IN1 IN1
#define STEP_IN2 IN2
#define STEP_IN3 IN3
#define STEP_IN4 IN4
#include "Library/STEP.c"
#define STEP_IN1 IN1 // D7 pini yerine STEP_IN1 tanımlandı
#define
tanımlaması ile bir pin veya porta farklı bir isim ataması yapılabileceği ve bu sayede kütüphane dosyalarında güncelleme yapmaksızın step motorun bağlantı noktalarını dilediğiniz bir başka pine aktarabileceğimizden bahsetmiştik. Yukarıdaki komut satırında IN1 tanımlaması yerine STEP_IN1 tanımlamasının kullanılacağı belirtilmiştir. Kütüphane fonksiyonları içerisinde connection.c
dosyasını inceleyecek olursanız;
LATD1_bit yerine IN1 ,
LATD0_bit yerine IN2 ,
LATC2_bit yerine IN3 ,
LATB4_bit yerine IN4 tanımlamasının yapıldığını görebilirsiniz. Yani daha önce yapılmış bir tanımlamyı kullanarak başka bir tanımlama yapılabilir.
#include "Library/STEP.c" // Step motor kütüphanesini dahil et
#include
tanımlaması ile harici bir dosyayı projenize dahil ediyoruz.
2.Ana Fonksiyon
mikroC programlama dilinde de diğer mikrodenetleyici programlama dillerinde olduğu gibi tüm program kodlarının işletimi main()
fonksiyonu içerisinden başlar.
InitMCU();
InitMCU()
fonksiyonu başlangıç kitinin çalışması için gerekli olan tüm temel işlemlerin yapıldığı fonksiyondur. initialize.c dosyası içerisinde bulunan fonksiyonda bir önceki uygulamada açıklanan giriş-çıkış tanımlamaları, anolog-dijital seçimleri, port temizleme ve başlangıç kiti için gerekli bazı temel tanımlamalar bulunmaktadır.
InitStep(); // Step Motoru Hazirla
void main() {
InitMCU();
InitStep(); // Step Motoru Hazirla
LCD_Out(1,1," TRUDYO "); // 1.satir 1.sütuna " TRUDYO " yaz
LCD_Out(2,1," BASLANGIC KITI "); // 2.satir 1.sütuna " BASLANGIC KITI " yaz
wait(1000); // 1 saniye bekle
LCD_Out(1,1," 28BYJ-48 "); // 1.satir 1.sütuna " 28BYJ-48 " yaz
LCD_Out(2,1," STEP MOTOR UYG "); // 2.satir 1.sütuna " STEP MOTOR UYG " yaz
wait(1000); // 1 saniye bekle
LCD_Out(1,1,"HIZ: "); // 1.satir 1.sütuna "HIZ: " yaz
LCD_Out(2,1,"KONUM: "); // 2.satir 1.sütuna "KONUM: " yaz
// Sonsuz Döngü
while(1){
// Hiz degerini Trimpot1'den oku ve ekrana yazdir
speed=3000+ADC_Read(1)*7; // Hiz 3000~10000us arasinda
LCD_PrintInt(1,12,speed,5); // 5 basamakli speed degerini 1.satir 12.sütuna yaz
// Konum degerini Trimpot2'den oku ve ekrana yazdir
location=ADC_Read(3)*2; // Konum 0-2048 arasinda olacak sekilde ayarlandi
LCD_PrintInt(2,8,currentLocation,4); // 4 basamakli currentLocation degerini 2.satir 8.sütuna yaz
Lcd_Chr(2,12,'/'); // 2.satir 12.sütuna / karakterini yazdir
LCD_PrintInt(2,13,location,4); // 4 basamakli location degerini 2.satir 13.sütuna yaz
}
// Sonsuz Döngü
while(1){
LCD_Out(1,1," TRUDYO "); // 1.satir 1.sütuna " TRUDYO " yaz
LCD_Out(2,1," BASLANGIC KITI "); // 2.satir 1.sütuna " BASLANGIC KITI " yaz
}
}
InitStep()
fonksiyonu StepMotorListener()
fonksiyonu kullanılacak ise tanımlanması gereken bir fonksiyondur. Bu fonksiyon tanımlandığında sadece speed
ve location
değişkenlerinin değerlerini değiştirerek step motorumuzu kontrol edebiliriz. StepMotorListener()
fonksiyonu interrupt.c
dosyası içerisinde bulunur ve her 50 mikrosaniyede bir kez tetiklenir.
LCD_Out(1,1," TRUDYO "); // 1.satir 1.sütuna " TRUDYO " yaz
LCD_Out(2,1," BASLANGIC KITI "); // 2.satir 1.sütuna " BASLANGIC KITI " yaz
wait(1000); // 1 saniye bekle
LCD_Out(1,1," 28BYJ-48 "); // 1.satir 1.sütuna " 28BYJ-48 " yaz
LCD_Out(2,1," STEP MOTOR UYG "); // 2.satir 1.sütuna " STEP MOTOR UYG " yaz
wait(1000); // 1 saniye bekle
LCD_Out(1,1,"HIZ: "); // 1.satir 1.sütuna "HIZ: " yaz
LCD_Out(2,1,"KONUM: "); // 2.satir 1.sütuna "KONUM: " yaz
LCD_Out()
fonksiyonu ile ekrana istediğimiz metinsel ifadeleri yazdırabiliriz. Fonksiyonun ilk parametresi satır, ikinci parametresi sütun ve son parametresi ise ekrana yazdırılacak veriyi içermelidir. mikroC ile 2×16 LCD Ekran kullanımı hakkında daha ayrıntılı bilgi almak ve kütüphane fonksiyonlarının kullanımı öğrenmek için aşağıdaki yazılarımızı incelemenizi öneriririz.
Merhaba arkadaşlar, bu yazımızda Trudyo Geliştirme Kartı ile 2×16 Karakter LCD ekranların kullanımından bahsedeceğiz. LCD...
Merhaba arkadaşlar, bu yazımızda Trudyo Geliştirme Kartı ile 2×16 Karakter LCD Ekran ve LCD I2C...
3.Sonsuz Döngü
// Sonsuz Döngü
while(1){
// Hiz degerini Trimpot1'den oku ve ekrana yazdir
speed=3000+ADC_Read(1)*7; // Hiz 3000~10000us arasinda
LCD_PrintInt(1,12,speed,5); // 5 basamakli speed degerini 1.satir 12.sütuna yaz
// Konum degerini Trimpot2'den oku ve ekrana yazdir
location=ADC_Read(3)*2; // Konum 0-2048 arasinda olacak sekilde ayarlandi
LCD_PrintInt(2,8,currentLocation,4); // 4 basamakli currentLocation degerini 2.satir 8.sütuna yaz
Lcd_Chr(2,12,'/'); // 2.satir 12.sütuna / karakterini yazdir
LCD_PrintInt(2,13,location,4); // 4 basamakli location degerini 2.satir 13.sütuna yaz
wait(100); // 100ms bekleme
}
while()
döngüsü parantezler içerisindeki şartın sonucu 1 ve 1’den büyük olması durumunda tekrarlanmaya devam eden bir döngüdür. while(1)
döngüsü parantez içerisinde 1 değeri olması nedeniyle sonsuza kadar aynı şartı sağlayacağı için program kodlarımız sürekli bu döngü içerisinde sırayla tekrarlanacaktır.
// Hiz degerini Trimpot1'den oku ve ekrana yazdir
speed=3000+ADC_Read(1)*7; // Hiz 3000~10000us arasinda
LCD_PrintInt(1,12,speed,5); // 5 basamakli speed degerini 1.satir 12.sütuna yaz
ADC_Read()
fonksiyonu seçilen kanaldan analog veriyi okur ve dijitale çevirerek geri döndürür. Trudyo Geliştirme Kartı ve PIC18F45K50 için 0-5V arası okunan analaog ver 0-1024 arası bir dijital veriye çevrilir. speed
değeri hesaplanırken belirlediğimiz minimum 3.000us ve yaklaşık 10.000us aralığında kalması için ADC’den okunan değeri 7 ile çarparak (7168) toplamı (10.168) tekrar speed
değerine yazıyoruz.
// Hiz degerini Trimpot1'den oku ve ekrana yazdir
speed=3000+ADC_Read(1)*7; // Hiz 3000~10000us arasinda
LCD_PrintInt(1,12,speed,5); // 5 basamakli speed degerini 1.satir 12.sütuna yaz
LCD_PrintInt()
fonksiyonu function.c
içerisinte tanımlanmış bir fonksiyondur. IntToStr()
fonksiyonu ile de bir tamsayıyı metin formatına çevirebiliriz. Ancak her seferinde bu işlemi yapmamak için doğrudan LCD_PrintInt()
fonksiyonunu kullanmak daha kolay ve kullanışlı bir yol olacaktır.
LCD_PrintInt()
fonksiyonu parametreleri sırasıyla; satır, sütun, ekrana yazdırılmak istenen tamsayı değeri ve bu sayının en fazla kaç basamak olacağı bilgisini içerir. Yukarıda seçili satıra belirtilen komut satırı için 1. satır 12. sütuna speed
değerini yazıyoruz. Maksimum speed
değerimiz 10.168 olacağı için ise son parametre için 5 değeri girilmiştir.
// Konum degerini Trimpot2'den oku ve ekrana yazdir
location=ADC_Read(3)*2; // Konum 0-2048 arasinda olacak sekilde ayarlandi
LCD_PrintInt(2,8,currentLocation,4); // 4 basamakli currentLocation degerini 2.satir 8.sütuna yaz
Lcd_Chr(2,12,'/'); // 2.satir 12.sütuna / karakterini yazdir
LCD_PrintInt(2,13,location,4); // 4 basamakli location degerini 2.satir 13.sütuna yaz
location
değeri ADC 3. kanaldan okunan verinin (Maksimum 1024) iki katı (2048) olacak şekilde belirlenmiştir. ADC 3. kanal Trudyo Başlangıç Kiti’nin 2. Trimpot’undan okunan değerdir.
location
değeri ile step motorun hangi konuma gitmesi gerektiği bilgisini belirlemiş oluyoruz. Bu hareket anlık olarak tamamlanamayacağı için currentLocation
değeri ile step motorun anlık olarak hangi konumda olduğunu takip edebiliriz.
Bir uygulamanın daha sonuna gelmiş bulunmaktayız. Uygulamaya ait dosyaları program kodları bölümünden indirebilirsiniz. Merak ettiğiniz ve aklınıza takılan soruları aşağıda 👇 yorum olarak bize iletebilirsiniz. İyi çalışmalar. 🙂 #geliştirmeyebaşla
Yorum yapmak için giriş yapmalısınız.