Dc motorlar üzerlerine uygulanan gerilimin miktarına ve yönüne göre hareket ederler. Bir dc motoru döndürebilmek için dc artı ve eksi uygulanır bu uçların yönüne göre motor sağa yada sola döner. Bazı uygulamalarda çok anlık olarak motorun hızını yükseltip düşürmek gerekebilir bunun içn gerilimi azaltmak gerekir bu her nekadar kolay olsa da motorun yönünü sağa ve sola anlık olarak değiştirmek zor iştir. Bunun için bağlantıları ters çevirmek gerekir, buda anlık olarak yapılamadığı için bize ek yardımcı donanımlar gerekir.
Dc motorları sürmek için transistör gereklidir. Tek bir transistör motoru sadece bir yöne dönmesi için kafidir. diğer yön için başka bir tarnsistör gerekmektedir. Bu durumu çözmek için H Köprüsü adı verilen transistörlerden oluşan devre kurulabilir.
Bu devre sayesinde bir dc motorun hem hızı hem de yönü anlık olarak değiştirilebilir.
.L298n adı verilen hazır devre kartında üzerindeki entegre sayesinde içerisinde 2 tane H Köprüsü barındıran yapı bulunmaktadır. Bu modül ile arduino gibi bir işlemciden PWM sinyal göndererek motorların hızı ayarlanabilir ve dijital olarak motorların yönü anlık olarak değiştirilebilir. Bu modül aynı anda 2 adet dc motoru kontrol edebilmektedir.
Arduino ile dijital olarak motorların yönünü değiştirmek için aşağıdaki şemayı kurabilirsiniz.
//Görsel İşitsel Teknoloji Kanalı
//wwww.teknikerler.com
//Kerim Arı Youtube kanalı L2968N Kodları - kullanımı örnek Kodları
const int inputA1 = 2;
const int inputA2 = 3;
const int inputA3 = 4;
const int inputA4 = 5;
void setup()
{
Serial.begin(9600);
pinMode(inputA1, OUTPUT);
pinMode(inputA2, OUTPUT);
pinMode(inputA3, OUTPUT);
pinMode(inputA4, OUTPUT);
}
void loop()
{
//---- A Cikis olarak etkinlestir------//
digitalWrite(inputA1, HIGH);
digitalWrite(inputA2, LOW);
delay(3000);
digitalWrite(inputA1, LOW);
digitalWrite(inputA2, LOW);
delay(2000);
//---- A Cikis TERS olarak etkinlestir------//
digitalWrite(inputA1, LOW);
digitalWrite(inputA2, HIGH);
delay(3000);
digitalWrite(inputA1, LOW);
digitalWrite(inputA2, LOW);
delay(2000);
//---- B Cikis olarak etkinlestir------//
digitalWrite(inputA3, HIGH);
digitalWrite(inputA4, LOW);
delay(3000);
digitalWrite(inputA3, LOW);
digitalWrite(inputA4, LOW);
//---- B Cikis TERS olarak etkinlestir------//
digitalWrite(inputA3, LOW);
digitalWrite(inputA4, HIGH);
delay(3000);
digitalWrite(inputA3, LOW);
digitalWrite(inputA4, LOW);
delay(2000);
}
Arduino ile hem motorların yönünü, hem motorların hızını ayarlamak için aşağıdaki şemayı kurabiliriz.
//Görsel İşitsel Teknoloji Kanalı
//wwww.teknikerler.com
//Kerim Arı Youtube kanalı L2968N Analog Kodları - kullanımı örnek Kodları
const int IN1 = 2;
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 9;
const int ENB = 10;
int pot = A0;
int sag = 11;
int sol = 12;
void setup() {
Serial.begin(9600);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
pinMode(sag, INPUT);
pinMode(sol, INPUT);
}
void loop() {
int sag_durum = digitalRead(sag);
int sol_durum = digitalRead(sol);
int pot_deger = analogRead(pot);
{
if (sag_durum == 1)
{
Serial.print("SAĞA DÖNÜYOR");
Serial.print("\t");
Serial.print("Pot Değeri: ");
Serial.print(pot_deger);
Serial.print("\t");
analogWrite(ENA, pot_deger / 4); //256 e düşürdük
Serial.print("TAM Dönme Hızı: ");
Serial.print(pot_deger / 4);
Serial.print("\t");
analogWrite(ENB, pot_deger / 8); //128 e düşürdük
Serial.print("Yarım Dönme Hızı: ");
Serial.println(pot_deger / 8);
digitalWrite(IN1, HIGH);//Motor_1 sağ
digitalWrite(IN2, LOW);//Motor_1 sağ
digitalWrite(IN3, HIGH);//Motor_2 sağ
digitalWrite(IN4, LOW);//Motor_2 sağ
}
else if (sol_durum == 1)
{
Serial.print("SOLA DÖNÜYOR");
Serial.print("\t");
Serial.print("Pot Değeri: ");
Serial.print(pot_deger);
Serial.print("\t");
analogWrite(ENA, pot_deger / 4); //256 e düşürdük
Serial.print("TAM Dönme Hızı: ");
Serial.print(pot_deger / 4);
Serial.print("\t");
analogWrite(ENB, pot_deger / 8); //128 e düşürdük
Serial.print("Yarım Dönme Hızı: ");
Serial.println(pot_deger / 8);
digitalWrite(IN1, LOW);//Motor_1 sol
digitalWrite(IN2, HIGH);//Motor_1 sol
digitalWrite(IN3, LOW);//Motor_2 sol
digitalWrite(IN4, HIGH);//Motor_2 sol
}
else
while (1)
{
Serial.println("MOTORLAR DURUYOR");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
sag_durum = digitalRead(sag);
sol_durum = digitalRead(sol);
if (sag_durum || sol_durum == 1)
break;
}
}
}
/*
for (int k = 0; k <= 256; k++)
{
Serial.print("k ");
Serial.println(k);
analogWrite(ENA, k);
analogWrite(ENB, k);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(50);
}
delay(10);
for (int m = 250; m >= 0; m--)
{
Serial.print("m ");
Serial.println(m);
analogWrite(ENA, m);
analogWrite(ENB, m);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(100);
}
delay(4000);
}
*/