Hobi projelerinden endüstriyel otomasyona uzanan yolda en büyük zorluklardan biri; kullanıcı arayüzü (GUI) ile zaman açısından kritik donanım kontrolünü aynı mikrokontrolcü üzerinde çakışmadan çalıştırabilmektir.
Bu projede harici bir bilgisayar veya pahalı bir dokunmatik ekran donanımı kullanmadan; yalnızca bir ESP32, FabGL kütüphanesi ve yardımcı bir motor sürücü kartı (Arduino) ile 3 eksenli endüstriyel adım motor sistemini canlı VGA ekranda nasıl yönetebileceğinizi anlatıyorum.
Projenin Kalbi: FabGL Kütüphanesi Ne Anlama Geliyor?
Kütüphaneye buradan ulaşabilirsiniz.
Ayrıca buradan da FABGL kütüphane sayfasına ulaşabilirsiniz.
Bu sistemin mimarı hiç şüphesiz FabGL kütüphanesidir. FabGL; ESP32’nin dâhili donanım imkânlarını (özellikle DMA ve I2S birimlerini) kullanarak, ekstra hiçbir grafik işlemciye ihtiyaç duymadan VGA ekran çıkışı (400×300) veren, aynı zamanda PS/2 Mouse ve PS/2 Klavye protokollerini doğrudan mikrodenetleyici seviyesinde çözen muazzam bir kütüphanedir.
Bizim projemizde bunun anlamı şudur:
-
Sıfır Ekran Kartı Maliyeti: ESP32, eski bir CRT veya LCD monitörü doğrudan bir grafik arayüze dönüştürür. (Not: Bazı modern LCD monitörler 400×300 çözünürlüğü eski bulduğu için desteklemeyebilir.)
-
Tam Kontrol: PS/2 fare ve klavye takarak, tıpkı bir PC işletim sisteminde gezinir gibi canlı X, Y, Z koordinat takibi, program başlatma/durdurma ve JOG hareketleri yapabiliyoruz.
-
İş Yükü Dağılımı (Dual-Core): ESP32’nin Core 0 çekirdeğini seri haberleşme ve FabGL arayüz yenilemelerine (
repaint), Core 1 çekirdeğini ise hassas motor zamanlamalarına ayırarak ekran çizimlerinin motor adımlarında oluşturabileceği titreşimi en aza indirdik.
Geliştirme Sürecinde Yaşanan Deneyimler ve Dikkat Edilecek Noktalar
Sistemi sıfırdan kurarken karşılaştığım sorunlar ve elde ettiğim tecrübeler, bu projeyi yapacak amatör arkadaşlar için yol haritası olacaktır:
1. PS/2 Mouse Yokluğu ve Bluetooth / BLE Tecrübesi
Geliştirme aşamasında elimde fiziksel bir PS/2 fare yoktu. Bunun yerine MIT App Inventor ile 2 butonlu bir Touchpad uygulaması yapıp Bluetooth üzerinden ESP32’ye bağlanmayı denedim. Ancak ESP32’nin dâhili BLE (Bluetooth Low Energy) modülünü çalıştırdığımda hafıza yapısında ciddi sorunlar oluştu.
ESP32 bir yandan VGA ekranı yenileyip komutları işlerken, BLE modülünün gerektirdiği yüksek RAM kullanımı ve işlemci zamanı sistemin kilitlenmesine yol açtı. Ben de çözümü ESP32’nin dâhili BLE modülünü kapatıp, donanımsal seri portlarından birine HC-05 Bluetooth modülü bağlamakta buldum. Böylece işlemci yükünü sıfırlayarak sorunu çözdüm.
(Yazılımın eski versiyonlarında HC-05 kullanan bu Bluetooth mouse uygulamasını bulabilirsiniz. Ayrıca TXD2 ve RXD2 kullanıldı. 16. ve 17. pin. Program ismi:vgadene4_mouse_10_butoons_ok_son.ino )
2. PS/2 Seviye Dönüştürücü (Level Shifter) Problemi
PS/2 klavye ve fareler 5V ile, ESP32 ise 3.3V lojik seviyesiyle çalışır. Bu tür durumlarda genelde transistörlü seviye dönüştürücüler kullanılır. Ancak I2C hatlarında sorunsuz çalışan transistörlü devreler burada çalışmadı.
Çünkü PS/2 hattı Open-Collector (Açık Kollektör) yapıda çalışır. Aradaki transistörler sinyalin kare dalga formunu bozarak iletişim hatasına sebep oldu. Çözüm olarak aktif transistörler yerine pasif dirençli koruma/pull-up devresini kullandık.
3. Güç Dağıtımı ve Ortak GND ZORUNLULUĞU
Sistemde hem 5V hem 3.3V hem de çok sayıda GND hattı olduğu için özel bir Güç Dağıtıcı PCB tasarladım. Bu kart üzerinde giriş ve çıkışları hem erkek hem dişi pinlerle oluşturdum; böylece jumper kablo karmaşası bitti.
Ayrıca kart üzerine AMS1117 3.3V (0.7A) regülatör modülü yerleştirdim. Amatör arkadaşlara tavsiyem: Çok mecbur kalmadıkça Arduino veya ESP32 modüllerinin dâhili 3.3V çıkışından yüksek akım çekmeyin. Harici bir regülatör kullanmak modülünüzü korur.
Amatör Geliştiricilere ve Yapımcılara (Maker) Tavsiyeler
-
Seri Port Haberleşme Protokolünüzü Basit Tutun: Karmaşık JSON yapıları yerine
STAT,BUSY,x,y,z,lineveyaINF,PARKED,x,y,zgibi virgülle ayrılmış (CSV) kısa paketler tercih edin. C++ içerisindekisscanffonksiyonu bu paketleri bellek harcamadan çok hızlı işler. Hatta komut formatının aynı şekilde olması, bu komutları ve geri bildirimleri parçalarken farklı parçalama satırlarından kurtarır. ( İsterseniz kendi geliştirmenizi yaparken GCODE kodlamasını kullanabilirsiniz. Bunu Çözüp eksen bilgilerini almak için Arduino Gcode kütüphanesini kullanabiliesiniz. ) -
Mikrodenetleyici Çekirdeklerini Bölün: RTOS kullanıyorsanız ekran ve arayüz (UI) işlemlerini bir çekirdeğe, adım motor adım sinyallerini ise gecikmesiz çalışması için diğer çekirdeğe atayın.
-
Güvenlik Sensörlerini Şarta Bağlayın: LM35 ile sıcaklık kontrolü veya switch’ler üzerinden limit kontrolü yapılmadan (
isControlOK) motorların hareket etmesine yazılımsal olarak izin vermeyin.
İlk Defa ESP32 Kullanacaklar İçin Kurulum Adımları
Daha önce sadece Arduino kullandıysanız, bilgisayarınızda CH340 sürücüsü yüklüdür. Fakat ESP32 geliştirme kartlarında genellikle CP2102 sürücüsü bulunur.
-
Sürücü Kurulumu: Silicon Labs sitesinden CP210x Windows Drivers paketini indirip kurun.
-
Arduino IDE Kart Ekleme: IDE üzerinde Dosya > Tercihler menüsünü açın. “Ek Devre Kartları Yöneticisi URL’leri” kısmına şu güncel adresi ekleyin:
[https://dl.espressif.com/dl/package_esp32_index.json](https://dl.espressif.com/dl/package_esp32_index.json)(Alternatif adres:
[https://espressif.github.io/arduino-esp32/package_esp32_index.json](https://espressif.github.io/arduino-esp32/package_esp32_index.json)) -
Kart ve Hafıza Ayarı: Araçlar > Kart > ESP32 Arduino altından kartınızı seçin. Çok ÖNEMLİ: FabGL kütüphanesinin sığabilmesi için Partition Scheme seçeneğini mutlaka HUGE APP (3MB No OTA/1MB SPIFFS) olarak ayarlayın.
İpucu (COM Port Değiştirme): ESP32’yi USB ile bağladığınızda Aygıt Yöneticisi’nde yüksek bir COM port numarası (örneğin COM13) atanabilir. Proteus gibi simülasyon programları genelde COM1-COM4 arasını destekler. Aygıt Yöneticisi’nden Bağlantı Noktası Ayarları > Gelişmiş adımlarını izleyerek port numarasını COM1-COM4 arasına çekebilir ve bilgisayarı yeniden başlatabilirsiniz. ( Ekran görüntüleri için tüm programları aldığınız yerdeki resimlere bakın )
Donanım ve Ekran Arayüzünün Çalışma Mantığı
Projede kullandığım modül ESP32-WROOM-32U (4MB) versiyonudur.
-
Arayüz Kontrolü: VGA ekran açıldığında PS2 Mouse bağlıysa ekranda beyaz imleç görünür. Eğer imleç siyah ise FabGL fareyi algılamamış demektir. Klavyenin çalışıp çalışmadığını ise ESP32’ye reset attığınızda klavye LED’lerinin (NumLock/CapsLock) anlık yanıp sönmesinden ve
CapsLocktuşuna bastığınızda LED’in durum değiştirmesinden anlayabilirsiniz. -
Ekran Kontrolü: Ekranda X, Y, Z koordinat kutuları ve JOG (artı/eksi) butonları yer alır. Kutular arasında gezmek için
TABveSHIFT + TABtuşlarını ve PS2 mouse kullanabilirsiniz. Seçili kutu sarı renge döner.
-
Arduino ile Haberleşme: ESP32 arayüzden aldığı komutları Seri Port üzerinden motorları süren Arduino UNO‘ya gönderir. Arduino işlemi tamamlayınca durum bilgisini (
STATUS) ESP32’ye geri bildirir ve ekrandaki kutular güncellenir.
Sistemin Çalışma Adımları ve İş Akışı
-
Kontrol (Güvenlik): Kullanıcı ekrandaki KONTROL butonuna basar. Arduino tüm limit switch’leri ve sıcaklık sensörünü kontrol eder. Şartlar uygunsa ekrana
CHECK OKbilgisi döner. -
HOME (Sıfırlama): İlk açılışta motorların konumu bilinmediği için HOME butonuna basılır. Eksenler sıfır noktasına çekilir ve bu andan itibaren yapılan tüm adımlar sayılır.
-
SD Karttan Program Okuma: SDKART OKU butonuna basıldığında, Arduino SD kart içindeki
.PRGuzantılı (8.3 dosya formatındaki) program isimlerini liste olarak ESP32 ekranına gönderir. -
Program Çalıştırma ve PARK Pozisyonu: Kullanıcı bir program seçip START der. İşlem bittiğinde programın son satırında buluna P harfini gördüğünde, sistem PARK (P) pozisyonuna geçer. Motorları her seferinde en başa (HOME noktasına) göndermek mekanik aşınmaya sebep olacağı için, programın ilk satırındaki koordinat PARK pozisyonu olarak tutulur. 2. kez START butonuna basıldığında PARK pozisyonu ilk satır koordinatı olduğundan 1. satırda motorlar hareket etmeden işi yapar.
(Not: Bu projede simülasyon ve anlatım basit tutulmuştur. Gerçek endüstriyel sistemlerde motorun adımı kaçırmadığından emin olmak için optik enkoderler veya zaman aşımı [timeout] kontrolleri eklenmelidir.)
Sistemin tüm işleyişine bir de bu şekilde bakın.
Sistemin ÇAlışması:
Öncelikle kullanıcı tüm switch ve sıcaklık sensörünü kontrol etmek için ekrandaki KONTROL butonuna basar. Bu istek Arduinoya gittiğinde tüm switchler doğru konumdaysa ve Sıcaklık göstergesi doğru aralıktaysa INF,CHECK_OK,0,0,0 bilgisi döner.
Sonrasında ise Motorların nerede olduğunu bizde bilmiyoruz Arduinoda bilmiyor.
Bundan dolayı HOME butonuna basarak sıfır noktasına çekilir ve bundan sonraki hareketler kayıt altına alınır. Bu şekilde motorların nerede olduğunu arduino bilir. Ekrana da yazar. HOME işlemi bittiğinde INF,HOMED,0,0,0 bilgisi ekrana gelir.
Sıfırlama işleminden sonra ESP32 SDCARD bağlantısı yoktur. Bu işi de Arduino üstlenmiştir. Ekrandan SDKART OKU butonuna basaılır. Bu bu buton arduinoya GETFILES komutunu verir. Arduino sdcard okur ve hata yoksa ekranın sol tarafındaki kutu içine arduinonun sdcard içinden okuduğu program isimleri gelir. Bu program isimleri 8 karakter isim, 3 karakter uzantı olacak şekilde verilir. Ayrıca mutlaka uzantı kısmı PRG olması gerekir. Bu şekilde tüm prgler listelenir.
Ekrandan kullanıcı programlardan birini seçip START butonuna bastığında program çalışmaya başlar. Start butonuna bastığında CMD,START,prog1.prg,0,0 komutu gider. Arduino program satırlarını işlemeye başlar. Her program satırı işlendikten sonra Arduino STAT komutu yollarken toplam adımları gösterir. STAT,BUSY,10,10,0,2 gibi 2. satırdan sonra son durum demektir.
1. satırda 10 adım gittiyse stat, busy 10 görünürken 2. satırda 5 adım gittiyse stat,busy,15 olarak görünür. Bunu da arduino ESP32 ye gönderir bu da ekranda X,Y,Z kutularının içine yazılır.
Buraya kadar program yürütülür. Sonrasında programın sonunda olan P harfi Park pozisyonu demektir. İlk defa programı çalıştırıp HOME yaptıysanız, motorlar sıfır noktasındadır. Fakat program 1 kere çalıştıktan sonra programın ilk satır koordinatı PARK pozisyonu olarak belirlenir.
Sebebi ise Program bittiğinde motorları sıfıra göndermek ve tekrar başladığında sıfırdan geri getirmek mekanik olarak her programda fazladan aşınma demektir. Bundan dolayı programın ilk satırını PARK pozisyonuna verirsek program tekrar başladığında ilk satır için hareket etmesine gerek kalmadan işlem yapılır.
Önemli:
Bu program ve preoteus simülatör basit tutuldu. Motora git komutunu verdiğinizde, motor gerilimi belki de kesik olacak. Bundan dolayı gidemeyecek. Gerçek devrede bunu kontrol edilerek timeout mesajı verdirebilirsiniz. Ya da motor doğru yere gittimi diye bir enkoder ile kontrol edebilirsiniz. Bu enkoder piyasada satılan enkodere bir dişli bağlayıp kontrol edilebileceği gibi dişli kayışının optik olarak okunmasıyla ya da delikli bir enkoder ile kaç dönüş yaptığını kontrolm edebilirsiniz.
Benim programım bir zaman gecikmesi verip, adım bilgilerini arka arkaya gönderiyor. Gerçek sistemde bu kontrollü yollanır ve motor doğru yere gittikten sonra arkasından diğer program satırı işlenir. Ayrıca Tüm eksenlerde HOME switch ve Her iki yönde de LİMİT switchler koyabilirsiniz. Ben bunları basit tuttum. Sizler geliştirebilirsiniz.
Ben sadece size VGA ekran ile endüstriyel bir eksen sistemini nasıl kolaylıkla yapabileceğinizi gösterdim. Fakat sizler bunu daha da geliştirebilirsiniz.
Yukarıdaki bilgilerde sizler için önemli notlar var. bunları dikkate alın aynı hataları yapmayın. Ben programlama esnasında deneme ile öğrendim. Sizler ise bu hataları yapmazsanız zaman kaybetmezsiniz.
Donanım Bağlantıları ve VGA Devresi
Devreyi kurarken dikkat edilecek bağlantı şemaları şunlardır:
-
PS/2 Bağlantısı: FabGL şeması ile benim uyguladığım şema arasında 120R dirençlerin konumu açısından ufak bir fark vardır. Her iki şema da sorunsuz çalışmaktadır.
-
VGA Soket Bağlantısı: ESP32’nin 3.3V olan renk çıkışları, VGA standardı olan 0-1V seviyesine düşürülmek için gerilim bölücü dirençlerle VGA soketine bağlanır. HSYNC ve VSYNC hatlarında ise kısa devre koruması için seri 100R direnç kullanılmıştır.
Ek Teknik Bilgi: ESP32’de SPI Pinleri ve HSPI / VSPI Mantığı,
Bu programlamada SPI kullanılmasa da, Ben de yeni öğrendim size bilgi vermek istedim.
ESP32 şemalarına baktığınızda doğrudan “MOSI” veya “MISO” etiketlerini görmeyebilirsiniz. Benim de bu projede öğrendiğim bu yapıyı şöyle özetleyebiliriz:
ESP32 çipinde toplam 4 adet donanımsal SPI birimi bulunur:
-
SPI0 ve SPI1: Çipin kendi dâhili Flash belleği ve PSRAM için ayrılmıştır, kullanılmaz.
-
SPI2 (HSPI) ve SPI3 (VSPI): Biz geliştiricilerin kullanımına açık donanımsal SPI portlarıdır.
Neden Pin Haritasında MOSI/MISO Yazmıyor?
-
GPIO Matrix Özelliği: ESP32’de SPI pinleri sabit değildir. Yazılımsal olarak hemen hemen istenen her GPIO pinine yönlendirilebilir.
-
İsimlendirme Farkı: Espressif dokümanlarında MOSI yerine
D/SDO, MISO yerine iseQ/SDIifadeleri kullanılabilir.
HSPI Varsayılan Donanım Pin Haritası:
| Sinyal Adı | İşlevi | Standart İsim | Varsayılan ESP32 Pini |
| HSPI_MOSI | Veri Çıkışı | MOSI | GPIO 13 |
| HSPI_MISO | Veri Girişi | MISO | GPIO 12 |
| HSPI_CLK | Saat Sinyali | SCK / SCLK | GPIO 14 |
| HSPI_CS | Chip Select | SS / CS | GPIO 15 |
(Kod tarafında SPI.begin(14, 12, 13, 15); komutu ile bu pinleri istediğiniz gibi değiştirebilirsiniz.)
Proteus çiziminde Arduino pinlerinden de tasarruf etmek için L297 ve L293 entegrelerini birlikte kullandım. Sadece L293 kullansaydım daha fazla Arduino pimine ihtiyaç duyulacaktı. Fakat L297 kullandığımda her eksen için ikişer tane pim kullanarak 3 ekseni kontrol ettim. Ayrıca SDCARD arduinoda kaldı hem programları daha çabuk okuyor ve gereğini yapıyor diye. Hem de bir zorunluluktu. Çünkü ESP32 çalışma yoğunluğundan dolayı içindeki programı okuyup arduinoya iletmek için zaman kaybedecekti. Bu da VGA ekranın yenilenmesinde sorun oluşturacağı için ekranda titremeler olacaktı.
Bununla birlikte bir de simülatör kullanırken proteusun gecikmesini göreceksiniz. Prog1.prg gibi kısa adımlı programlarda step motorlar hata yapmıyor. Fakat adım sayısı çoğaldıkça simülatör gerçek zaman içinde step motorları döndüremediğinden motorların altındaki referanslar kaymaktadır. Bunun sebebi sadece proteusun bu yükü kaldıramamasıdır. Gerçek devrede zaten gerekli önlemler alınacaktır. enkoder ya da optik ölçüm sensörleriyle. Bu hata gerçek devrede olmaması için step motorlara komut zaman paylaşımlı değil motor gideceği yere vardığında sensör bilgisiyle motora bir sonraki adım sayısı verilirse bu gecikme ya da referans kayması yaşanmaz.
Aşağıda, KULLANILAN KOMUT SİSTEMİ bulunmaktadır. Bu komutları Seri port üzerinden verdiğinizde proteus gerekli çalışmaları yapacaktır.
NOT: Proteus programını test etmek istediğinizde illaki ESP32 modülünü bağlamanıza gerek yok. Bunun yerine VSPE programını kullanarak (Virtual serial port emulator) Sanal bir com port üretip Proteus ile bir terminal programı ki ben REALTERM programını kullanıyorum Proteus ve realterm programını aynı sanal port olarak ayarladığınızda burada bulunankomutları seri porttan ESP32 göndermiş gibi gönderdiğinizde Proyeus ve Arduino UNO programını test edebilirsiniz. VSPE programını buradan alabilirsiniz deneme sürümü olsa da yine de sanal com port oluşturacaktır. https://eterlogic.com/Downloads.html
Proteus içinde SDCARD kullanımı var. Bunun için IMA(image) dosyası hazırlamanız gerekir. Bunu ise WINIMAGE programı le yapabilirsiniz. Benim verdiğim örnek dosyayı bu program ile açıp kendi yapacağınız deneme programını sürükle bırak olarak bu image dosyasına yazabilirsiniz. Bu şekilde Proteus SDCARD image içerisindeki dosyaları gerçek sdcard gibi kullanabilecektir.Fakat PROGRAM uzantıları mutlaka PRG olmak zorundadır.
Nasıl yapıldığını öğrenmek istiyorsanız videonun 00:33:26. saniyesine giderseniz görebilirsiniz.
Tüm Programlara buradan erişebilirsiniz.
Program isimleri ve açıklamaları.
vgadene4_mouse_10_butoons_ok_son.ino : Bu program PS2 mouse olmadan önce MIT APP INVENTOR ile yaptığım Bluetooth Touchpad kullanır. Bunun için ESP32 ye HC-05 bluetooth modülünü 16.ve 17. pinlerine bağladım. Bu seri port girişinden aldığı bilgiyi direkt olarak ekranda mouse hareketine dönüştüren esp32 dir.
vgadene4_mouse_17_ps2_keyb_mouse_OK.ino : Bu program esp32 programının son versiyonudur. Burada PS2 mouse ve PS2 klavye kullanıldı. ( videoda göreceğiniz gibi klavye USB ama ps2 adaptörle kullanıldı) Tüm son değişiklikler de bu programda yapıldı.
xyz_motor_11.ino : Bu program Arduino UNO programıdır Proteus üzerinde simüle ederken kullanılmıştır.
progs.rar : Bu tüm programların bulunduğu progs.IMA dosyasının sıkıştırılmış halidir. Açıldıktan sonra proteusun bulunduğu dizine konulur.
motorkontrol_3.pdsprj : Proteus 8.6 versiyonla hazırlanmış proteus dosyasıdır. Proteus 8.6 veya yukarı versiyonla çalıştırılabilir.
Not: PROGS.IMA dosyası büyük olduğu için programlar içinde ZİP olarak sıkıştırılan progs.zip dosyasını açarsanız progs.IMA dosyasına ulaşırsınız.
NOT: Yazıda anlatılan bazı ayarlarla ilgili resim ekran görüntüleri tüm programların arasındadır. takıldığınız yerde bu resimlere bakarak yazılan ayarları yapabilirsiniz. Her ayar için ekrana resim koymak istemedim yazıyla alakası yok diye.
Bu çalışmayla,
ESP32 ve VGA entegrasyonunun endüstriyel sistemlerde ne kadar pratik bir şekilde kullanılabileceğini göstermiş oldum. Sizler daha da geliştirebilirsiniz.
Takıldığınız noktaları yorumlarda sorabilirsiniz. Hepinize kolay gelsin!
Video


