10/21/2020

Arduino İle Çift Yönlü ESC Çalıştırma (İleri & Geri)

Arduino ile çift yönlü ESC kullanımı. Bu kod ve bağlantılar ile Fırçalı ve Fırçasız ESC ve motorları kullanabilirsiniz.

 

Arduino ile çift yönlü ESC kullanım Kodu:

 #include <Servo.h> //Arduino Servo Library 

Servo ESC;  // ESC için bir obje tanımlanıyor. 

float value;    // Analog pin A1 den veri okuma için değişken tanımlaması. 
void setup()
{
  Serial.begin(9600);
  ESC.attach(3);  // Pin 3 den PWM sinyal çıkışı.
}

void loop() { 
  
   for(int i = 0; i < 50; i++)
     {
      value=value+analogRead(A1); // Potansiyometreden gelen değeri daha kararlı veriye çevirmek için 50 kez toplanıp ortalamasının alınması.
      delay(1);
     }  
     
  value=value/50; // Ortalama değer
  value=map(value, 0, 1023, 0, 180); // Analog girişten okunan değerin ESC nin anlayacağı değerlere çevrilmesi. 
  ESC.write(value);                    // Potansiyometreden gelen değere göre ESC / servo konumunu ayarlar. 
  Serial.print("Değer= ");
  Serial.println(value);
  }

ESC çalıştırabilmek için arduinonun servo.h kütüphanesi kullanılır. ESC ve servoların çalışma prensipleri aynıdır. Her ikisi de PWM sinyal ile kontrol edilirler.
Anolog girişten potansiyometre ile sağlanan değer 0 ile 1023 arasındadır. Bu değerleri direk olarak kullanırsak tutarsız sonuçlar alırız. Bu yüzden “map” komutu ile bu değeri ESC nin anlayacağı minumum 0 ile maksimum 180 değerlerine çeviriyoruz. Bu durum servo motorlar için de aynıdır.

Çift yönlü ESC ler tek yönlülerden farklı değer aralığı ile çalışır. Motorun çalışmadığı nokta orta noktadır. Yani 180/2 = 90 değeri teorik olarak merkez noktasıdır. 90 ile 180 arasında bir yöne, 90 ile 0 arasında diğer yöne çalışma sağlanır. Merkez noktası teoride 90 olsada pratikte biraz aşağı veya yukarı da olabilir. Örneğin yukarda ki resimde görülen ESC ve Motor kombinasyonu için orta nokta 72 ile 82 arasında dır ve bu değerler arasında motor çalışmayacaktır. Potans sağa ve sola çevrildiğinde mevcut değeri Serial Monitör de görebildiğimiz için bu nokta kolayca tespit edilebilir.

Kod içerisinde bir for döngüsü mevcuttur. Bu döngü olmadan da çalışma sağlanır. Ama bu döngü ile Analog girişten gelen değer 50 kez toplanarak ortalaması alınır ve daha kararlı bir çalışma elde edilir. Özellikle orta noktada yani motorun çalışmaması gereken konumda bekleme yapılırken ara sıra küçük veri sıçramaları nedeniyle motor kendi kendine minik hareketler yapabilir. For döngüsü ile elde edilen ortalama değer motora gönderildiğinden bu minik sıçramalardan kurtulmuş oluruz. Döngünün 50 kez yapılmasının sebepi yaptığım testler sonucunda en makul değer olarak tespit etmiş olmamdır. Daha fazla olursa motora giden komutta gecikmeler ve kesiklikler gözlemledim.

Arduino ile çift yönlü ESC ve Motor Çalıştırma OLED Ekranlı Kod: ( Arduino Bidirectional DC Motor Speed Control With Oled Screen)

#include <Servo.h>                       // Arduino Servo Library (Servo motor kütüphanesi ESC için de kullanılır)
#include <Wire.h>                        // Include Wire library (I2C device için gerekli)
#include <Adafruit_GFX.h>                // Include Adafruit graphics library
#include <Adafruit_SH1106.h>             // SH1106 library (SH1106 Çipli Oled ekran için kütüphane)
#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);
#if (SH1106_LCDHEIGHT != 64)
#error(“Height incorrect, please fix Adafruit_SH1106.h!”);
#endif

int y;
String Durum;
Servo ESC;         // ESC için bir obje tanımlanıyor. (Object identification for esc)

int long value;    // Analog pin A1 den veri okuma için değişken tanımlaması. (Variable for A1 pin data)
void setup()
{
  display.begin(SH1106_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.display();
  ESC.attach(3);  // Pin 3 den PWM sinyal çıkışı. (Sending PWM signals from pin 3)
}

void loop() { 
  
   for(int i = 0; i < 50; i++)
     {
      value=value+analogRead(A1); // Potansiyometreden gelen değeri daha kararlı veriye çevirmek için 50 kez toplanıp ortalamasının alınması (To obtain a more stable result from the potentiometer data, collect 50 times and get the average)
      delay(1);
     }  
     
  value=value/50; // Ortalama değer
  value=map(value, 0, 1023, 0, 180); // Analog girişten okunan değerin ESC nin anlayacağı değerlere çevrilmesi. (Converting the value read from the analog input to the values that the ESC will understand)
  ESC.write(value); // Potansiyometreden gelen değere göre ESC / servo konumunu ayarlar. (Sets the ESC / servo position according to the value from the potentiometer.)

if(value<92) Durum = "< REVERSE";
if(value>102) Durum = "FORWARD >";
if(value>92 && value<104) Durum = "  CENTER";

if (value<100) y=55; else y=49;
 
  //display.setTextSize(1);
  display.setCursor(14,9);
  display.print(Durum);
  display.setCursor(y,39);
  display.print(value);
  display.display();
  display.clearDisplay();
  }