NodeMCU V3 ESP8266 ESP-12E ile UART Seri Haberleşme Servo Motor Kontrolü Uygulaması
NodeMCU V3 kartı, Arduino UNO geliştirme kartı gibi bilgisayara USB portu üzerinden takıldığında COM portu olarak tanınır. COM portu, seri haberleşme adı verilen bir bağlantı türü için kullanılır. Bilgisayarla Arduino, NodeMCU vb. kartları haberleştirmek için Arduino IDE yazılımında bulunan “Seri Port Ekranı” kullanılır.
Seri haberleşme, iki cihaz arasında çift yönlü iletişim kurulmasıdır. Seri haberleşmede en çok kullanılan protokollerden biri UART/USART'dır. ESP8266 mikrodenetleyicisi de UART/USART seri haberleşmeyi destekler. UART/USART, iki cihaz arasında seri iletişim için kullanılan bir donanım cihazı veya devresidir. Bu donanım mikrodenetleyici içerisinde bulunur. UART, alınan paketlerden veri göndermek veya yeniden oluşturmak için verileri paketlere dönüştürerek çalışır. Aynı anda sadece iki UART cihazı birbirine bağlanabilir. UART ile verilerin taşınabilmesi için TX, RX ve GND olmak üzere 3 bağlantı yeterlidir.
UART: Evrensel Asenkron Alıcı/Verici (Universal Asynchronous Receiver/Transmitter).
Görsel 1.1: UART seri haberleşme
Kullanılan geliştirme kartı modeline göre bir veya daha fazla UART/USART donanımı bulunabilir. Örneğin NodeMCU V3, Arduino Uno ve Arduino Nano üzerinde 1 adet, Arduino Mega üzerinde 4 adet UART/USART seri haberleşme, donanımsal olarak mevcuttur. NodeMCU V3 kartında seri haberleşme için veri alıcı pin RX (receiver: alıcı), veri gönderici pin TX (transmitter: verici) olarak isimlendirilmiştir.
Serial.begin() fonksiyonu: Seri haberleşmeyi başlatmak için kullanılır. Yazım şekli, Serial.begin (baud rate); şeklindedir.
Baud rate (hızı): Bu terim seri haberleşme hızını belirtir. Bir UART cihazının iletebileceği/alabileceği saniyedeki bit (bps) sayısıdır. Doğru veri iletimi için her iki UART cihazı da aynı baud hızına ayarlanmalıdır. Her byte için 10 bit gönderildiğinden gönderilen byte miktarı bu değerlerin 10’a bölümüyle bulunur. Örneğin, 9600 bps hızında saniyede en fazla 9600 / 10 = 960 karakter gönderilebilir. Baud hızı olarak 300, 1.200, 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 74.880, 115.200, 230.400, 250.000, 500.000, 1.000.000 ve 2.000.000 baud kullanılabilir. Gönderici tarafta baud hızı neyse alıcı tarafta da aynı değer kullanılmalıdır. Aksi halde iletişim sağlanır ancak giden veriler alıcı tarafta yanlış okunur. Seri haberleşmede baud hızı standart olarak 9600 baud kullanılır.
Serial.available() fonksiyonu: Seri porttan mikrodenetleyiciye gönderilen ve okunmayı bekleyen veri olup olmadığını kontrol eden fonksiyondur. Bilgisayardan gelen byte (karakter) olup olmadığı kontrol edilir. Gönderilmiş olan veriyi byte şeklinde değerlendirir. Fonksiyonun döndürdüğü değer sıfırdan büyükse okunmayı bekleyen veri var demektir. Başka bir deyişle Serial.available() fonksiyonu tampon bellekte bulunan okunmamış verilerin sayısını döndürür. Bellekte veri yoksa 0 döndürür. Tampon bellek boyutu sınırlı olduğu için gelen veriler belirli bir zaman aralığında okunmalıdır. Aksi takdirde gelen veriler eskilerin üzerine yazılır. Veri geldiyse gelen verinin uzunluğu kadar tampon boyutu artar. Koşulda 0’dan büyük olduğu için gelen veri Serial.read() fonksiyonuyla okunup değişkene atanır.
Serial.read() fonksiyonu: Seri porttan gelen verileri okumak için kullanılır. Bilgisayar veya başka bir cihazdan seri port üzerinden seri haberleşmeyle gelen veriyi okumak için önce Serial.available() fonksiyonuyla verinin gelip gelmediği kontrol edilir. Veri gelmişse Serial.read() fonksiyonuyla gelen veri okunur. Okunan veri bir değişkene atanabilir. Serial.read() fonksiyonuyla seri porttan gelen veriler byte byte alındıktan sonra seri haberleşme için ayrılmış olan tampon bellek bölgesine yazılır. Programa gelen veriyi okumak içinde Serial.read() fonksiyonuyla tampon bellek okunur. Okunduğu anda tampon bellek silinir.
Seri haberleşmede veri gönderme fonksiyonları: Serial.print(), Serial.println() ve Serial.write() komutlarıdır.
Serial.print() ve Serial.println() fonksiyonları mikrodenetleyiciden ASCII karakter dizileri göndermek için kullanılır. Bu fonksiyonlar çift tırnak içinde yazan yazının seri port ekranında görünmesini sağlar. Serial.print (“veri”), gönderilen verileri sonuna karakter eklemeden (satır atlamadan) gönderilir. Karşı tarafta alınan veri yan yana gelmiş olur. Serial.println (“veri”), gönderilen verilerin sonuna “\n” yani Enter karakteri eklenir. Bu karakter karşı tarafta alınan verilerin alt alta gelmesini sağlar. Böylece satır atlanmış olur.
Serial.write(“veri”) ile veriler binary (ikili) formatta gönderilir. İkili formatta gönderim, ASCII formata göre biraz daha farklıdır.
Servo motor: Servo, mekanizmalardaki açısal-doğrusal pozisyon, hız ve ivme kontrolünü hatasız bir şekilde yapan tahrik sistemidir. Başka bir deyişle hareket kontrolü yapılan bir düzenektir. Servo motorlar, robot teknolojilerinde en çok kullanılan motor olmakla birlikte, RC (Radio Control) uygulamalarda da kullanılır. RC servo motorlar ilk olarak uzaktan kumandalı model araçlarda kullanılmıştır. Servolar, istenilen pozisyonu alması ve yeni bir komut gelmediği sürece bulunduğu pozisyonu değiştirmemesi amacıyla tasarlanmıştır.
Görsel 1.2: SG90 mikro servo motor
Servo motor içerisinde küçük bir DC motor, dişli yapısı, karşılaştırıcı devre ve potansiyometre bulunur. Dönüş açısı 0-180 derecedir. Servo motorların içerisinde motorun hareketini sağlayan bir DC motor bulunur. Bu motorun dışında bir dişli mekanizması, potansiyometre ve bir motor sürücü devresi bulunur. Potansiyometre, motor milinin dönüş miktarını ölçer. Servo içerisindeki DC motor hareket ettikçe potansiyometre döner. Kontrol devresi motorun bulunduğu pozisyon ile istenilen pozisyonu karşılaştırarak motor sürme işlemi yapar. Servolar diğer motorlar gibi harici bir motor sürücüye ihtiyaç duymadan çalışır. Genellikle çalışma açıları 180° ile sınırlıdır ancak 360° çalışma açısına sahip özel amaçlı servo motorlar da vardır. Servolar genellikle 4,8-6 V gerilimle çalışır. 7,4 V ve daha yüksek gerilimle çalışan servolar da vardır.
Çalışma Prensibi: Servo motorlar PWM (Darbe Genişlik Modülasyonu) sinyal ile çalışır. PWM sinyaller bir mikrodenetleyiciden veya uzaktan kumandadan sağlanabilir. Servo, her 20 msn içinde bir pals değeri okur. Pals uzunluğu motorun dönüşünü belirler. Örnek olarak 1,5 msn’lik bir pals, motorun 90 derece pozisyonunu almasını sağlar (nötr pozisyon). Servolar hareket etmeleri için bir komut aldıklarında önce istenilen pozisyona hareket eder. Sonra o pozisyonda kalırlar. Servolar bulundukları pozisyonu korurken kendilerine dışarıdan bir güç uygulandığında bu güce direnirler. Bulundukları konumu sonsuza kadar koruyamazlar. Pozisyonlarını koruyabilmeleri için palsin tekrar edilmesi gerekebilir. Hareket etmeleri için gereken pals genişliklerinin minimum ve maksimum değerleri vardır. Bu değerler değişkendir. Genellikle minimum pals genişliği 1 msn, maksimum pals genişliği 2 msn’dir.
Aşağıdaki şekilde sahip oldukları PWM değerleri vardır. 1 msn duty cycle değerinde 0°, 1,5 msn duty cycle değerinde 90°, 2 msn duty cycle değerinde 180° pozisyonunu almış olur. Servo motorun sinyal uçlarından gelen sinyalin HIGH (lojik 1) seviyede kalma süresine göre servo motorun açısı değişir.
Görsel 1.3: PWM sinyaline göre servo motor pozisyonları
Servo Model No: SG90 veya MG90
SG90 küçük mekanizmalar için ideal bir servo motordur. Her marka uzaktan kumanda alıcılarına tam uyumlu olup RC araçlarla da kullanılabilir. Bunun yanı sıra birçok mikrodenetleyiciden alınabilecek PWM sinyaliyle robot projelerinde kullanılabilir. Bu servo motor ile pan-tilt mekanizması ve robotik tutucu el ürünleri sorunsuzca kullanılabilir.
Dişli kutusu plastiktir. Servo başlıkları ve diğer parçalarıyla birlikte satılır. Diğer hobi servo motorlarda olduğu gibi motor milinin elle sağa sola çevrilmesiyle dişlileri kırılabilir. Motora bu şekilde elle müdahaleden kaçınılmalıdır.
Mini servo motorlar RC arabaların direksiyon sistemlerinde, model helikopterlerde, model uçakların iniş takımları ve kontrol yüzeylerinde, robotik projelerde tutucu (gripper) ve robot kollarında sıkça tercih edilir. SG90 gibi küçük boyutlu ve plastik dişli servo motorlar, ağırlıkları sebebiyle RC dünyasında “9g servo" olarak anılır.
SG90 plastik dişli, MG90 metal dişli motora sahiptir. 3 pine sahiptir. İkisi besleme, biri sinyal giriş kablosudur. Kırmızı renkli kablo +5V besleme, kahverengi renkli kablo GND (toprak, şase), turuncu renkli kablo sinyal kablosudur. Turuncu renkli kablo mikrodenetleyiciden gönderilen açı değerlerini ileten sinyal kablosudur.
Teknik Özellikler
- Boyutlar: 23.1 x 12.2 x 29 mm
- Ağırlık: 9 g
- Çalışma gerilimi: 4,8 – 6,0 V DC
- Hız @4,8 V: 0.1 sn/60°
- Zorlanma torku @6 V: 1,8 kg.cm
- Dişli kutusu: Plastik
- Dişli tipi: Plastik
- Dönüş açısı: 0-180°
- Çalışma PWM sinyali: 500-2400 μsn
- Kablo uzunluğu: 15 cm
Uygulama alanları aşağıda verilmiştir.
- Otomatik kapı
- Mini helikopter
- Mini uçak
- Mini araba
- Mini gemi
- Mini kapakçık kontrolü
- Robotik el
Servo motorlar, Servo.h kütüphanesiyle çalışır. Servo.h kütüphanesinde bulunan bazı fonksiyonlar aşağıda verilmiştir:
- attach(): Servo motorun bağlanacağı pini tanımlamak için kullanılır.
- write(): Servo motora açı bilgisi göndermek için kullanılır.
- read(): Servo motora gönderilen son açı bilgisini okumak için kullanılır.
- writeMicroseconds(): Servo motora belirtilen µsn süre boyunca HIGH seviyede sinyal göndermek için kullanılır.
- attached(): Servo motorun herhangi bir pine bağlı olup olmadığını sorgulamak için kullanılır.
- detach(): Servo motoru tanımlanmış olan pinden yazılımsal olarak ayırmak için kullanılır.
Uygulamaya Ait Şema, Bağlantı Şekli ve Görseller
Görsel 1.4: NodeMCU V3 ESP8266 ESP-12E ile UART seri haberleşme servo motor kontrolü uygulaması devre şeması
Görsel 1.5: NodeMCU V3 ESP8266 ESP-12E ile UART seri haberleşme servo motor kontrolü uygulaması devre şeması (KiCad 7.06 ile çizilmiştir)
Görsel 1.6: NodeMCU V3 ESP8266 ESP-12E ile UART seri haberleşme servo motor kontrolü uygulaması breadboard bağlantısı
Malzeme Listesi
Sıra No |
Adı |
Özelliği |
Miktarı |
1 |
NodeMCU V3 |
ESP8266 ESP-12E |
1 Adet |
2 |
Servo motor |
SG90 9 gr mikro servo |
1 Adet |
3 |
Breadboard |
830 pin |
1 Adet |
4 |
Jumper kablo |
Erkek-erkek |
- |
Uygulamaya Ait Kod
Bu internet sitesi içeriğinde yer alan tüm eserler (yazı, resim, görüntü, fotoğraf, video, müzik vb.) İlhan DEMİR'e ait olup, 5846 sayılı Fikir ve Sanat Eserleri Kanunu ve 5237 sayılı Türk Ceza Kanunu kapsamında korunmaktadır. Bu hakları ihlal eden kişiler, 5846 sayılı Fikir ve Sanat eserleri Kanunu ve 5237 sayılı Türk Ceza Kanununda yer alan hukuki ve cezai yaptırımlara tabi olurlar. İlhan DEMİR, yasal işlem başlatma hakkına sahiptir.
BİR CEVAP YAZ