Arduino ile 28BYJ-48 Step Motor Kullanımı, Potansiyometre ile Hız ve Yön Kontrolü
Merhabalar,
Bu çalışmada sizlere step motorların çalışma mantığını ve arduino ile kullanımını açıklamak amacıyla, piyasada kolayca bulunan ve oldukça düşük maliyetli 28BYJ-48 5vDC Step Motor ve kendi sürücü kartı olan ULN2003APG'yi nasıl kullanacağımızı, potansiyometre veya joystick kullanarak nasıl hız ve yön kontrolü yapabileceğimizi anlatmaya çalıştım.
Umarım faydalı olmuştur. Videoyu beğendiyseniz beğene tıklamayı ve yeni içerikler için lütfen YouTube kanalıma abone olmayı unutmayın.
İzlediğiniz için teşekkürler...
Gerekli Malzemeler
1 adet 28BYJ-48 step motor ve motor sürücü kartı
1 adet 10kohm potansiyometre (1kohm ve üzeri yeterli)
1 adet arduino Uno veya Nano
1 ader breadboard, jumper kablo
5v harici kaynak
Devre Şeması:
Arduino Kodu:
//28BYJ-48 STEP MOTOR VE ULN2003APG SÜRÜCÜ //POT VEYA JOYSTICK İLE YÖN VE HIZ KONTROLÜ //Mucit Pilot 2020 //YOUTUBE: Mucit Pilot ////////////////////////////////////////////////// // step motor kontrol pinleri #define Pin1 3 #define Pin2 4 #define Pin3 5 #define Pin4 6 // joystick veya pot Arduino A0 a bağlı #define joystick A0 int whichStep = 0; //step motor adımları için kullanacağız boolean dir = true;// false=saat yönü, true=saat yönü tersi void setup() { pinMode(Pin1, OUTPUT); pinMode(Pin2, OUTPUT); pinMode(Pin3, OUTPUT); pinMode(Pin4, OUTPUT); } void loop() { // analog veriyi pottan veya joystickten okuyoruz int val = analogRead(joystick); // tam ortadayken ===> motoru durdur if( (val > 470) && (val < 550) ) { digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); } else { // motoru bir yönde çevireceğiz while (val >= 550) { dir=false; //yön kontrolü için // map fonksiyonu ile 550-1023 arası gelen analog veriyi 1-250 arasına çekiyoruz int hiz = map(val, 550, 1023, 250, 1); motor(hiz, dir); val = analogRead(joystick); //while'da sonsuza kadar dönmemesi için tekrar okuyoruz } // motoru diğer yönde çevireceğiz while (val <= 470) { dir=true; // map fonksiyonu ile 0-470 arası gelen analog veriyi 1-250 arasına çekiyoruz int hiz = map(val, 470, 0, 250, 1); motor(hiz, dir); val = analogRead(joystick); } } } void motor(int hiz, int dir) //motoru süren fonksiyonumuz { switch(whichStep){ //motorun hangi adımda olduğunda pinleri nasıl ayarlayacağını switch case yapısı ile hızlıca tanımlıyoruz case 0: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, HIGH); break; case 1: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, HIGH); digitalWrite(Pin4, HIGH); break; case 2: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, HIGH); digitalWrite(Pin4, LOW); break; case 3: digitalWrite(Pin1, LOW); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, HIGH); digitalWrite(Pin4, LOW); break; case 4: digitalWrite(Pin1, LOW); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; case 5: digitalWrite(Pin1, HIGH); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; case 6: digitalWrite(Pin1, HIGH); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; case 7: digitalWrite(Pin1, HIGH); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, HIGH); break; default: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; } if(dir){ whichStep++; }else{ whichStep--; } if(whichStep>7){ whichStep=0; } if(whichStep<0){ whichStep=7; } delay(hiz); }
Gerekli Malzemeler
1 adet 28BYJ-48 step motor ve motor sürücü kartı
1 adet 10kohm potansiyometre (1kohm ve üzeri yeterli)
1 adet arduino Uno veya Nano
1 ader breadboard, jumper kablo
5v harici kaynak
Devre Şeması:
Arduino Kodu:
//28BYJ-48 STEP MOTOR VE ULN2003APG SÜRÜCÜ //POT VEYA JOYSTICK İLE YÖN VE HIZ KONTROLÜ //Mucit Pilot 2020 //YOUTUBE: Mucit Pilot ////////////////////////////////////////////////// // step motor kontrol pinleri #define Pin1 3 #define Pin2 4 #define Pin3 5 #define Pin4 6 // joystick veya pot Arduino A0 a bağlı #define joystick A0 int whichStep = 0; //step motor adımları için kullanacağız boolean dir = true;// false=saat yönü, true=saat yönü tersi void setup() { pinMode(Pin1, OUTPUT); pinMode(Pin2, OUTPUT); pinMode(Pin3, OUTPUT); pinMode(Pin4, OUTPUT); } void loop() { // analog veriyi pottan veya joystickten okuyoruz int val = analogRead(joystick); // tam ortadayken ===> motoru durdur if( (val > 470) && (val < 550) ) { digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); } else { // motoru bir yönde çevireceğiz while (val >= 550) { dir=false; //yön kontrolü için // map fonksiyonu ile 550-1023 arası gelen analog veriyi 1-250 arasına çekiyoruz int hiz = map(val, 550, 1023, 250, 1); motor(hiz, dir); val = analogRead(joystick); //while'da sonsuza kadar dönmemesi için tekrar okuyoruz } // motoru diğer yönde çevireceğiz while (val <= 470) { dir=true; // map fonksiyonu ile 0-470 arası gelen analog veriyi 1-250 arasına çekiyoruz int hiz = map(val, 470, 0, 250, 1); motor(hiz, dir); val = analogRead(joystick); } } } void motor(int hiz, int dir) //motoru süren fonksiyonumuz { switch(whichStep){ //motorun hangi adımda olduğunda pinleri nasıl ayarlayacağını switch case yapısı ile hızlıca tanımlıyoruz case 0: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, HIGH); break; case 1: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, HIGH); digitalWrite(Pin4, HIGH); break; case 2: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, HIGH); digitalWrite(Pin4, LOW); break; case 3: digitalWrite(Pin1, LOW); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, HIGH); digitalWrite(Pin4, LOW); break; case 4: digitalWrite(Pin1, LOW); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; case 5: digitalWrite(Pin1, HIGH); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; case 6: digitalWrite(Pin1, HIGH); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; case 7: digitalWrite(Pin1, HIGH); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, HIGH); break; default: digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); digitalWrite(Pin4, LOW); break; } if(dir){ whichStep++; }else{ whichStep--; } if(whichStep>7){ whichStep=0; } if(whichStep<0){ whichStep=7; } delay(hiz); }
Yorumlar
Yorum Gönder