Jiroskop X, Y ve Z düzlemlerinde rotasyon belirlemede kullanılan ve genellikle uçak, insansı robot uygulamalarında bulunan bir araçtır. Jiroskop, üzerine sabitlendiği cismin yerçekimine göre ve Z eksenindeki rotasına göre anlamlı ve stabil değer üretir. Bu değeri işlemden geçirerek objenin rotasyonu ile ilgili her türden işlem yapabilirsiniz.
Bu projede Arduino sistemi ile bir MPU6050 6 eksenli ivme ve gyro sensörü (gy521) kullanarak fiziksel ortamdaki rotasyonun bilgisayardaki bir objeye doğrudan yansıtılmasını sağlayacağız. Projenin videosunu yazının sonunda bulabilirsiniz.
Projeyi taklit etmek isterseniz tüm adımları ve kodarı aşağıda veriyor olacağım.
Proje iki kattan oluşuyor. Birinci kat donanım katı yani Arduino ile sensörün okuduğu verileri anlamlı hale getirmemiz gerekiyor. İkinci katta ise arduinonun anlamlandırılmış verilerini işlememiz gerekiyor. Birinci katta C# ikinci katta VB dillerini kullanacağız.
Yazılımla katkı sunmak ve geliştirmek istiyorsanız GitHub bağlantısı: https://github.com/auhub/WinJiroskop
Birinci Kat (Arduino)
Önelikle projeye başlamak için bir adet Arduino UNO (klon da alabilirsiniz) ve MPU6050 jiroskop satınalmanız gerekiyor. Bunların yanında biraz bağlantı kablosu ve USB kablosu da gerekli.
Donanım Hazırlama
Sensörün SDA pinini Arduino’nun A4 (Analog 4) pinine, SCL pinini Arduino’nun A5 (Analog 5) pinine bağlayın.
Sensörü VCC girişinden Aruino’nın 3.3V çıkışı ile besleyin. Sensörün GND pinini Aruino’nun GND pinine topraklayın. Son olarak sensörün INT pinini Arduino’nun 2 numaralı dijital pinine bağlayın. Sistem çaıştığı sürece USB ile bilgisayara bağlı olmalıdır. Hata vb. durumlarda USB’den ayırmanızda herhangi bir sorun olmaz.
Birinci Kat Yazılımı
Kütüphaneler ekleniyor.
#include <Wire.h> //Wire kütüphanesini ekledik (senkron seri haberleşme için)
#include <I2Cdev.h> //I2C kütüphanesini ekledik (senkron seri haberleşme için)
#include <MPU6050.h> //Mpu6050 kütüphanesi ekledik (sensörü kontrol edebilmek için)
Sensörün verilerini tanımlıyor ardından seri port haberleşmesi için gereken satırı giriyorum.
MPU6050 ivme_sensor; // sensörümüze ivme_sensor adını verdik
int16_t ax, ay, az; //ivme tanımlama (hepsini kullanmasanız da tanımlamanızda fayda var)
int16_t gx, gy, gz; //gyro tanımlama (hepsini kullanmasanız da tanımlamanızda fayda var)
byte serialA; //seri haberleşmeyi sağlamamız için gerekli
Kurulum satırlarını giriyorum.
void setup(){
Wire.begin();
Serial.begin(9600); // baud hızını 9600 olrak belirledim bu önemli bir bölüm.
ivme_sensor.initialize(); //ivme sensörünü başlatıyorum
}
İşlem satırlarını giriyorum.
void loop() {
ivme_sensor.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //ivme sensötlerinden hareket değerlerini çekiyorum
ay=map(ay,-13000,13000,1,180); //ivme sensöründen aldığım Y ekseni verilerini 1 ila 180 arasına kurulu map ile sınırlıyorum
delay(300); //arduino'nun yazılımı darboğaza sokmaması için hıza sınırlama ekliyorum
if(Serial.available()>0){ //seri port uygun olduğu anda seri port ekranından görülebilecek şekilde COM portlarından seçili olandan bilgisayara her 300 milisaniyede bir defa jiroskobun Y pozisyonu hakkında deklarasyon yapıyorum
Serial.println(ay); //println kullanarak her deklarasyonu yeni satıra yazıyorum
}
}
Birinci katla ilgili herhangi bir işlem kalmadı. Kodlar ve donanım hazırlama işlemleri çocuk seviyesinde.
İşlemleri biraz daha zorlaştıran kata geçiyoruz. İkinci kat yani donanımdan aldığımız verileri bilgisayara tekrar girmemiz gerekiyor.
İkinci Kat (Windows Aplikasyonu)
Bu katı yazabilmeniz için güçlü bir bilgisayara ihtiyacınız olacak. Kullanmanız gereken yazılım ücretsiz ancak eski bilgisayarlar için biraz ağır.
10. nesil i5 işlemci ve 8GB RAM işinizi görecektir.
Visual Studio kullanıyorum. Bu yazılım ücretsiz ve Microsoft’un resmi ve resmi olmayan tüm kütüphanelerine tam erişime sahip. Gereken kütüphaneleri bağımsız adreslerden indirebilir otomatik olarak güncelleyebilirsiniz.
Visual Basic’i çalıştırın ve Visual Basic seçeneğinden ilerleyip yeni bir Windows Form .NET 6.0 LTS seçin. Long term support işaretli altyapılar, yazılımınızı uzun süre kullanılabilir tutacaktır.

İkinci Kat Yazılımı
Desinger sekmesine gidin ve bir adet Timer, bir adet ComboBox, bir adet Label, bir adet Buton ve Bir adet PictureBox ekleyin.
Kütüphane ekleyerek başlıyorum. Ekleyeceğim kütüphane COM portunu yani USB girişinizi tanımlayan veriler içeriyor. NuGet yöntemiyle aşağıdaki kütüphaneyi indirmenizi tavsiye ederim. Bunun dışında kütüphaneyi bulamayanlar “System.IO.Ports dll” anahtarını aratıp ilgili dll dosyasını indirdikten sonra başvurular bölümünden kütüphanesine ekleyebilir. Aksi halede çalışmaz.
Imports System.IO.Ports
Form1 açılışı yapıyoruz ve kod sonuna kadar içinde kalıyoruz. Buna ek olarak SerialPort sağlayıcısını “seriPort” olarak tanımlıyorum.
Public Class Form1
Dim seriPort As SerialPort
İlk sub ile seri port üzerinde çalışıyorum.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'giriş
'Desinger sekmesine gidin ve bir adet Timer, bir adet ComboBox, bir adet Label, bir adet Buton ve Bir adet PictureBox ekleyin. Adlarını değiştirmedim, siz değiştirebilirsiniz.
'Timer1'i 100 integer olarak aktif biçimde başlatmalısınız.
'COM portlarından hangilerinin kullanımda olduğunu saptıyorum ve ComboBox içine ekliyorum.
Dim acikPortlar As String() = SerialPort.GetPortNames()
comboBox1.Items.AddRange(acikPortlar)
'Açık portlar olması durumunda ilkini seçiyorum. Bazen boş görünebiliyor ve kullanıcı boş olduğunda seçim yapacak bir port olmadığını düşünebiliyor.
If comboBox1.Items.Count > 0 Then
comboBox1.SelectedIndex = 0
End If
'Seri port nesnesini oluşturuyoru.
seriPort = New SerialPort()
End Sub
Butonun basit bir fonksiyonu olacak. Butona basıldığında seçili porta bağlanılması gerekiyor.
Private Sub buttonConnect_Click(sender As Object, e As EventArgs) Handles buttonConnect.Click
'Seçili COM portu tanımlanıyor.
Dim seciliPort As String = comboBox1.SelectedItem.ToString()
'Seçilen COM portu kullanarak bağlantı kurma veya diğer işlemleri burada yapabilirsiniz
seriPort.PortName = seciliPort 'bu değer COM1, COM3, COM6 gibi görünecektir. Arduino hangisine bağlıysa o seçilir.
seriPort.BaudRate = 9600 'Serial.begin(9600); olarak girdiğim kodu burada aynı şekilde çağırmalıyım.
Try 'Try kullandım çünkü COM portuna bğalantı yapmak çok fazla hataya ve kitlenmeye neden olabiliyor. Bu yöntemle hataya rağmen devam edebilirsiniz.
seriPort.Open() 'Seri portu açıyorum.
'istağa bağlı işlem ekleyebilirsiniz.
Catch ex As Exception
'istağa bağlı işlem ekleyebilirsiniz. aksi yöndeki durumlar için.
End Try
End Sub
Son sub, zamanlayıcı bölümü aşağıdaki gibi. Sonuç olarak From1 sınıfını da kapatıyorum.
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Try 'Seri port ile çalışıyorum. Try daha iyi bir seçim. Saniyede 10 defa işlem yapılacak.
'Seri port verilerini naklen okuyorum.
Dim dataTopla As String = seriPort.ReadLine() 'ReadLine ile Arduino seri port ekranındaki satırları okuyorum ve dataTopla olarak isimlendiriyorum.
'Aldığım datayı Label1'e String olarak yazdırıyorum ve vbCrLf ile her yazışta temizliyorum. satir olarak tanımladım.
Dim satir As String = dataTopla & vbCrLf
Label1.Text = satir
Catch ex As Exception
'Hata durumunda işlem. (Bazı bilgisayarlarda gerekli olabilir)
End Try
'PictureBox oluşturmuştum. Bunun içine logo ekledim. Konumunu belirlerken x ve y birlikte olmak zorunda.
Dim yeniYer As New Point(400, 50)
'PictureBox1 yeni konumu.
PictureBox1.Location = yeniYer
'Yalnızca x konumunu değiştirmem yeterli.
Dim yX As Integer
If Integer.TryParse(Label1.Text, yX) Then
'PictureBox1 yeni konumunun sadece x konumu değişecek şekilde ayarlanması.
PictureBox1.Location = New Point(yX, PictureBox1.Location.Y)
End If
End Sub
End Class
Yazılımın Çalıştırılması
Sırayla yapılması gereken işlemler şu şekilde:
- Arduino UNO’yu bilgisayara bağlayın.
- Arduino’yu çalıştırın ve seri porttan veri akışının başladığından emin olun. Bazı sayılar siz jiroskop ile hareket ettikçe değişmelidir.
- Windows aplikasyonunu çalıştırın.
- Port seçimini yapın.
- Butona basın ve çalışmadığını gözlemleyin. (çünkü seri port ekranını çalışır durumda bıraktınız ve bu gerekli.)
- Arduino’ya dönün ve seri port ekranını kapatın.
- Aplikasyona geri dönün ve butona tekar basın.
- Logonun yer değiştirdiğini gözlemleyin.
Kaynakça
Kodlar ve görsellerin tamamı özgündür.
Bir yanıt yazın