Herkese merhabalar geçen yazımızda Arduino’dan Unity’e veri göndermiştik o yazıya buradan ulaşabilirsiniz. Şimdi ise Unity’den Arduino’ya veri göndereceğiz hemen başlayalım.
Burada ki senaryo şu şekilde olacak Unity’de 3 adet UI elemanımız olacak buton,textBox ve checkBox. Arduino’da ise birer adet olacak şekilde buzzer,led ve servo(sg-90) motorumuz olacak. Yapacağımız iş ise Unity’deki giriş elemanlarını kullanarak Arduino’ya veri göndereceğiz. TextBoxtan gönderdiğimiz açı derecesi kadar servo motorumuz dönecek chekBox ile de led ve buzzerın çalışmasın veya çalışmamasını sağlayacağız.
Videosuna göz atabilirsiniz;
Şimdi ilk önce Arduino’aya bakalım;
#include <Servo.h>//servo içi gerekli kütüphaneyi ekledik Servo servo;//servo dan bir değişken ürettik void setup() { Serial.begin(9600);//seri portu başlattık pinMode(4,OUTPUT);//4. pini çıkış olarak ayarladık servo.attach(3);//servo nun çıkış pinini ayarlıyoruz burada pinimizin PWM işaretli pin olmasına dikkat etmeliyiz servo.write(0);//servonun ilk açı derecesini 0 derece yapıyoruz. } void loop() { if(Serial.parseInt()==201)//unityden gönderdiğimiz değer eğer 201 ise fonk1 içine giriyor burada servo hareketi sağlanacak { fonk1(); } if(Serial.parseInt()==202)//unityden gönderdiğimiz değer eğer 202 ise fonk2 içine giriyor burada led ve buzzer çalışması sağlanacak { fonk2(); } delay(100);//buraya bir yavaşlatma katmak istedim daha düzgün çalışması için } void fonk1() { int kontrol=Serial.parseInt();//burada seri porttan değeri integer olarak okuyor ve kontrol değişkenine atıyor if(kontrol!=0)// değer eğer 0 değilse servo motor döndürme işlemi başlayacak { servo.write(kontrol);//şimdi serialden okuduğumuz integer değer kadar servo motorumuzu dönderiyoruz } delay(100); digitalWrite(4,LOW);// eğer servo çalışıyorsa led ve buzzer devre dışı bırakıyorum aynı anda çalışmalarıda mümkün fakat ben bunu istemiyorum } void fonk2() { digitalWrite(4,HIGH);//burada ise eğer led ve buzzer çalışmaya başlıyor }
Servo motor çalıştırmak istediğimiz için ilk önce Servo.h kütüphanesini projemize dahil etmeliyiz. Daha sonra start fonksiyonu içerisinde hangi pinlerin ne iş yapacağını seri port başlatma işlerini yaptık. Loop fonksiyonu içinde ise serialden okuduğumuz değere göre servo döndürme veya led , buzzer çalıştırma işlemlerini gerçekleştireceğiz. Burada seri haberleşmede kendi gözlemlediğim bir şeyden bahsetmek istiyorum seri portta karakter ile iş yapmak bazen sıkıntı yapabiliyor arduino dili char türü veri ile işlem yaptığı için string kabul etmediği için işlemler karışabiliyor bende bundan dolayı seri port işlemlerinde integer veri tiplerini tercih ediyorum misal burada Unity’den string veriyi gönderiyorum ama Arduion’da parseInt fonksiyonu sayesinde bu değeri integer şeklinde okuyabiliyorum ve daha sağlıklı çalışıyor. Daha sonrasında okuduğum integer değerine göre fonk1 veya fonk2 fonksiyonlarından birisi çalışacaktır. Fonk1 içerisinde servo dönüş işlemi yapılıyor burada yine Unity’de string olarak gönderdiğimiz değer parseInt fonksiyonu vasıtasıyla integer’e dönüştürülüyor ve servonun dönüş değerini elde ediyoruz. Fonk2 de ise standart olarak 4. Pine HIGH değerini göndererek led ve buzzerın çalışmasını sağlıyoruz.
Unity içeriğine bakalım;
using UnityEngine; using System.Collections; using System.IO.Ports; using UnityEngine.UI; public class gonder : MonoBehaviour { SerialPort seri=new SerialPort("COM5",9600);//burada seri port ile haberleşmeyi , bağlantı kurmayı sağlıyoruz. public InputField text;//giriş elemanımızı tanımladık public Toggle che;//checkBox tanımladık void Start () { seri.ReadTimeout = 50; seri.Open ();//seri portu kullanacağımızı belirttik açtık yani seri portu } public void yak () { if (che.isOn.Equals(true)) //burada eğer checkBox işaretliyse servo motoru döndürme işlemini yapacağız { seri.WriteLine ("201");//ben burada servo motorun döneceğini belirtek için karşı tarafa 201 gönderdim //bu değer benim kendi belirlediğim bir değer zorunlu değil. } if (che.isOn.Equals(false)) //eğer checkBox işaretli değilse o zaman led ve buzzer için seri porttan 202 değerini gönderiyoruz { seri.WriteLine ("202");//202 değeri gönderildi seri porttan } seri.WriteLine (text.text);//burada ise inputField UI nesnesinden aldığımız değeri de seri porta gönderiyoruz servo dönüş açısı değeri. } }
Burada ilk öncelikle UI elemanları ile işlemler yapılacaksa gerekli kütüphane olan using.UnityEngine.UI eklenmelidir yine seri porttan haberleşmek için gerekli olan kütüphane using.System.IO.Ports eklenmelidir. Yine bir C# scripti oluşturup bu scripti sahnedeki herhangi bir objenin üzerine sürükleyip bırakıyoruz. Butona basma olayını da butona tıklayıp sağdaki inspector panelinden butonun On Click özelliğinden çalıştırılacak fonksiyonu seçiyoruz
Seri iletişim için SerialPort sınıfında bir nesne türetiyoruz girişi için gerekli elemanları tanımlıyoruz.
Start fonksiyonu içerisinde seri portu açıyoruz.
Benim tanımladığım yak fonksiyonu içerisinde ise chechkBox’ın seçili olmasına veya olmamasına göre işlemlerimiz gerçekleşiyor.Burada dikkat edilirse if şartlarında seçim belirlendikten sonra her seferinde eğer textBox’ın içinde bir değer varsa o da seri porttan gönderiliyor ki eğer gerekli şart sağlandı ve servo dönecekse servo dönüş değeride gitsin şeklinde bir algoritma düşündüm.
Servo bağlantısı için dataSheet(SG-90);