• Sonuç bulunamadı

DÜŞEY DÜZLEM YAZICISI ve ÇİZİM ORTAMI

N/A
N/A
Protected

Academic year: 2022

Share "DÜŞEY DÜZLEM YAZICISI ve ÇİZİM ORTAMI"

Copied!
18
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

DÜŞEY DÜZLEM YAZICISI ve

ÇİZİM ORTAMI

Hazırlayan : Necati ER

info@necatier.com

Facebook.com/ernecati

Twitter.com/ernecati

(2)

İçindekiler

İçindekiler ... 1

Giriş ... 2

Düşey Düzlem Yazıcısı... 2

Yazılım Aşaması ... 2

Çizim Ortamı ... 2

Arduino Yazılımı ... 5

Donanım Aşaması ... 12

Arduino Bağlantıları ... 12

Düşey Düzlem Yerleşimi ... 13

Çizim Ortamına Ait Tüm Kodlar... ...13

Kaynaklar ... 17

(3)

Giriş

Açık kaynak kodlu ortamların yaygınlaşması ile birlikte,daha önceleri özel ekipmanlar ve lisanslı yazlımlar gerektiren birçok uygulama çalışma odalarımıza girmiş ve geliştirilmeye açık hale gelmiştir. Bu açık kaynak kodlu ortamların en önemlilerinden olan Arduino elektronik alanındaki gelişmelere katkı sağlamakta , inovatif ürünlerinlerin ortaya çıkmasına ortam sağlamakta ayrıca bilgi teknolojilerinin her kesime yayılmasına yardımcı olmaktadır.

Bu dökümanda da Arduino UNO ve Visual Basic 6.0 kullanılarak düşey düzlem üzerine çizim yapabilen bir cihazın oluşturulması ve bu cihaz ile doğrudan bağlantılı olacak şekilde çizim yapabilme ortamının yazılması anlatılmaktadır.

Düşey Düzlem Yazıcısı

Cihazın inşaası temel iki kategoride incelenecektir. Bunlardan ilki işin zor kısmı olan yazılım , diğeri ise yazılım ile yönetilecek fiziksel elemanların bir araya

getirilmesidir.

Genel olarak amacımız bilgisayar ortamında çizilen doğruları matematiksel hesaplar yardımı ile koordinat verilerine dönüştürmek ardından koordinat verilerini referans alarak motorları döndürerek basitçe bir kalemi hareket ettirmektir.

Yazılım Aşaması

Bu aşama da iki bölümde incelenecektir. İlk olarak çizimlerin yapılacağı ortamın oluşturulmasını daha sonra yapılan çizimlerden elde edilen verilerin işleneceği ve motorlara iletileceği Arduino‟nun programlanmasını inceleyeceğiz.

Çizim Ortamı

Çizim ortamı Visual Basic 6.0 ile yazılmıştır. Program bir imagebox içerisine mouse ile çizimler yapılmasına imkan sağlamaktadır. Bu çizimler yapılırken tıklanan her nokta listbox‟a X ve Y koordinatı olarak kayıt edilmektedir. Çizim işlemi bittikten sonra MSComm öğesi ile comport üzerinden Arduino ile bağlantı sağlanmakta ve kaydedilmiş olan koordinatlar gönderilmektedir. Gönderme işlemi bir Timer öğesi yardımı ile yapılmaktadır. Gönderilen iki koordinat arasında çizimin yapılma süresinin hesaplanması yerine çizim bittikten sonra Arduino‟dan geri bersleme alınmakta ve bir sonraki koordinatın gönderilmesi işlemine başlanmaktadır.

Şekil 1 Tasarım Görünümü

(4)

Şekil 1 den görülebileceği gibi farklı butonlarla farklı işlevler yerine getirilmektedi. Butonların ve nesnelerin görevlerini detaylı incelemk gerekirse ; Bağlatı Kur :Port ayarları yapılmış olan MSComm1 öğesini aktive

etmektedir.Aktivasyon için

MSComm1.PortOpen = True

Komut satırı kullanılmaktadır.

Bağlantıyı Kes : MSComm1 öğresini deaktive etmektedir. Bu işlem ;

MSComm1.PortOpen = False

Komut satırı ile sağlanmaktadır.

Kodları Gönder : Listbox1 içerisine kayıt edilmiş koordinatları , MSComm1 öğesi yardımı ile Arduino‟ya iletmek için Timer1 nesnesine start vermektedir. Timer1 nesnesini başlatmak için ; Timer1.Enabled = True

Komut satırı kullanılmaktadır.

Noktaya Git : Kalibrasyon amacı ile kullandığımız bu buton , hemen sol tarafındaki metin kutusuna girilen koordinatları Arduino‟ya göndermektedir. Koordinatların gönderilmesi için kullnaılan komut satırları Timer1 nesnesine ait koların altında detaylı olarak incelenecektir.

Kapat : Formu kapatmak için hazırlanmıştır. Unload Me komut satırını içermektedir.

Listeyi Temizle : Listbox1 içerisine kayıtlı koordinatların silinmesi işlemini gerçekleştirmektedir. Bu işlem için ;

List1.Clear

Komut satırını kullanmaktadır.

Çizimi Temizle : Listbox içerisinde kayıtlı koordinatları kaybetmeden çizim alanını temizlemektedir. Bu işlem için ;

Image1.Refresh

Komut satırı kullanılmaktadır.

Frame1 (Durum) : Arduino ile çizim ortamının bağlı olup olmadığını kontrol ederek içerdeiği label nesnesi üzerinden kullanıcıya bilgi vermektedir. Bu işlem için ;

If MSComm1.PortOpen = True Then Label1.Caption = "Bağlandı"

Else

Label1.Caption = "Bağlantı Yok"

End If

Komut satırları kullanılmaktadır.

Frame2 (Ayarlar) : Bu bölümde Arduino dan alınan geri beslemenin kontrol edildiği textbox ve ayrıntılı koordinat bilgilerinin görüntülenmesi işlemi gerçekleştirilmektedir.

Bu metin kutusuna Arduino‟dan gelen veriyi aktarmak için ;

Text2.Text = MSComm1.Input

Komut satırı kullanılmaktadır. Bu textbox her veri gönderildiğinde temizlenmekte ve tekrar dolup dolmadığı kontrol edilmektedir. Tekrar dolduğu takdirde gönderilmiş koordinatların yazım işlemi tamamlanmış , yeni koordinatların gönderilmesi işlemi başlamaya hazır işareti verilmiş anlamı taşımaktadır.

Frame3(Çizim Bilgileri):Bu bölümde mouse imlecinin çizim bölgesi üzerinde hangi koordinatlarda olduğu eş zamanlı olarak kullanıcıya bildirilmektedir. Bu işlem için image1 nesnesinin mouse_move özelliğine ;

Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Text5.Text = X

Text7.Text = 5000 - Y End Sub

Komutları yazılmıştır. Y koordinatının tespiti için 5000-Y yazılmasının sebebi VB‟nin koordinat başlangıç noktasını formun sol üst köşesi olarak kabul etmesidir. Bu kabul x ekseni için fark yaratmazken Y ekseni için ters orantı göstermektedir. Bu sebeple

(5)

tüm çizim alanının maksimum değerinden o anki Y değerini çıkartmakta ve başlangıç noktasını formun sol alt köşesi olarak kabul etmekteyiz.

Frame4 (Çizim Bilgisi) : Bu alanda Listbox içerisindeki koordinatların gönderiminin tamamlanıp tamamlanmadığını kontrol ederek kullanıcıya bilgi verilmektedir. Bu işlem

; gönderilen koordinatın listbox üzerinde hangi sırada olduğu ve listbox üzerinde kayıtlı tüm koordinatların sayısının karşılaştırılması ile sağlanmaktadır.

MSComm1 Nesnesi : Bu nesne comport üzerinden bilgisayarımız ve Arduino‟nun bağlantısını sağlamaktadır. Nesnenin properties bölmesinde ;

Setting : 9600,n,8,1

CommPort: 3(Arduino‟nun bağlı olduğu comport numarası)

Biçiminde ayarlanmalıdır.

Timer1 Nesnesi : Timer nesnesi başlangıçta deaktif konumda bulunmaktadır. Görevi aktive edildiği andan itibaren Arduino‟dan geri besleme alınıp alınmadığını kontrol etmek , geri besleme doğrultusunda listbox üzerinden sırası ile koordinatları Arduino‟ya göndermektir. Bu işlev için aşağıdaki komut satırları kullanılmaktadır.

If MSComm1.PortOpen = True Then Label5.Caption = "Çizim Yapılıyor!!"

a = Label4.Caption If Text2.Text <> "" Then Text2.Text = ""

MSComm1.Output = List1.List(a) List1.Selected(a) = True

If a = List1.ListCount Then

Label5.Caption = "Devam Eden Çizim Yok"

Timer1.Enabled = False End If

Label4.Caption = a + 1 End If

Else

MsgBox ("Bağlantı Kesildi!!") End If

Bilgisayarın Arduino ile bağlantısı hemen her görevden önce kontorl edilmekte ve gerekli yerlerde kullanıcıya iletilmektedir. (ör :çizim bilgisi , durum , msgbox ) Bu kontrol şu komut satırları ile yapılmaktadır.

If MSComm1.PortOpen = True Then Label1.Caption = "Bağlandı"

Else

Label1.Caption = "Bağlantı Yok"

End If

Image1 Nesnesi : Bu nesne üzerine çizim yapılabilen alanı oluşturmaktadır. Çizimler

“Line” komutu ile image1 nesenesinin Mouse_Down özelliğine yazılarak yapılmaktadır. Komut satırları ise şu şekildedir :

Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Me.Line (Label_x.Caption, Label_y.Caption)-(X, Y)

Label_x.Caption = X Label_y.Caption = Y Text3.Text = X Text4.Text = 5000 - Y If Len(Text3.Text) = 3 Then

Text3.Text = "0" & X End If

If Len(Text3.Text) = 2 Then Text3.Text = "00" & X End If

If Len(Text3.Text) = 1 Then Text3.Text = "0000" & X End If

(6)

If Len(Text4.Text) = 3 Then

Text4.Text = "0" & 5000 - Y End If

If Len(Text4.Text) = 2 Then

Text4.Text = "00" & 5000 - Y End If

If Len(Text4.Text) = 1 Then

Text4.Text = "000" & 5000 - Y End If

List1.AddItem (Text3.Text & Text4.Text) End Sub

Bu işlem sırasında çizim yapılan koordinatlar 1,2,3 veya 4 basamaklı

sayılardan oluşabilir ancak koordinatları belirli bir karakter uzunluğunda ve dizi olarak göndermemiz gerektiğinden 1,2 ve 3 basamaklı koordinatları başlarına yeterli sayıda 0 ekleyerek 4 basamaklı biçime dönüştürülmektedir. Bu sayede 4 basamaklı X ve 4 basamaklı Y koordinatını toplamda 8 basamaklı olacak şekilde elde etmekteyiz .(ör : 26004500)

Arduino Yazılımı

Arduino „dan yapmasını istediğimiz görevleri yerine getirmesi için Arduino IDE kullanarak yapacağımız yazılımın aktarılması gerekmektedir. Yazılımın kod kısmına geçmeden önce algoritmik ve matematiksel kısmının anlaşılması faydalı olacaktır.

Yapılmasını istediğimiz işlemler basitçe şu şekilde sıralanabilir:

1-Çizim ortamından verilerin alınması

2-Alınan verilerin 4 basamaklı X ve 4 basamaklı Y koordinatlarına dönüştürülmesi.

3-Kalemin ilk bulunduğu nokta ile çizim ortamıdan gelen nokta arasındaki uzaklığın hesaplanması.

4-Bu uzaklığın matematiksel bir fonksiyon olarak ifade edilmesi.

5-Elde edilen fonksiyona göre motorların hangi yönde kaçar kez adım atacağının hesaplanması ve uygulanması

6-Tamamlanan çizim işlemi sonrası çizim ortamına geri besleme gönderilmesi.

Bu noktada matematiksel işlemlerin açıklığa kavuşturulması faydalı olacaktır.

Şekil 2 Koordinat Düzlemi ve Konumlandırma

(7)

Şekil 2 „de gösterilen koordinat düzleminde 1. motor a noktasında , ikinci motor b noktasında gösterilmiştir. Kalemin ilk bulunduğu nokta C1 ve gitmesini istediğimiz nokta C2 olsun. C1 ve C2 noktaları arasındaki kırmızı doğru ile gösterilen uzaklığı elde etmek için ;

1)s1-2 ile s1-1 arasındaki fark bulunmalı. (1. motorun alacağı yol) 2)s2-2 ile s2-1 arasındaki fark bulunmalı.(2. motorun alacağı yol) 3)Farkların oranı bulunmalı. (adım sırasını hesaplama)

O halde sayıları basitleştirerek bir örnek ile açıklanabilir:

Not : 5000x5000 olan çizim alanı 30x30 kabul edilecektir.

Kalemin başlangıçtaki konumu : C1(5,5) Kalemin gitmesini istediğimiz konum : C2(7,9) Bu veriler ile pisagor bağıntısı kullanılarak;

S1-1 = √(5000-C1y)²+C1x² S1-1 = 25,5

S1-2 = √(5000-C2y)²+C2x² S1-2= 24,5

S2-1 = √(5000-C1y)²+ (5000-C1x)² S2-1= 35,3

S2-2 = √(5000-C2y)²+ (5000-C2x)²

S3-3 = 31,1 uzunlukları hesaplanabilir.Elde edilen uzunluklar ile ipliklerde meydana gelen uzunluk farkı :

∆S1 = (S1-2) – (S1-1)

∆S1 = -1

∆S2 = (S2-2) – (S2-1)

∆S2 = -4,2 olarak bulunur. Buradan elde ettiğimiz sonuçlar ile 1. motora bağlı ipliğin boyunun ∆S1 kadar , 2. motora bağlı olan ipliğin boyunun ∆S2 kadar

değişmesi gerektiğini öğrenmiş olmaktayız. ∆S1 ve ∆S2 sayılarının aldığı – ve + değerler uzaman ve kısalma olarak değerlendirilmektedir. Bu durumda 1. motora bağlı iplik 1 birim kısalmalı , 2. motora bağlı iplik 4,2 birim kısalmalıdır.

M=∆S2/∆S1 işlemi hangi motorun , hangi sıra ile adım atması gerektiğini ifade edecek eğimi bize verecektir. 4,2 / 1 = M = 4,2

Doğruyu çizimi yapılırken y = x . m fonksiyonu dikkate alınacaktır. Bu aşamdan sonrası için kodların tamamı aşağıda verilecek gerekli açıklamalar kodların üzerinde yapılacaktır.

#include <stdlib.h> //Dizileri float değişkenlere dönüştürmek için gerekli olan atof fonksiyonunu barındıran kütüphane

char buffer[9]; //Bilgisayardan gelen tüm veriyi tutacak dizi char dizi2[3]; //Tüm verinin sonraki 4 değerini tutacak dizi int alinan; // Veri alım döngüsünde kullanilacak

char a0,a1,a2,a3,b0,b1,b2,b3; //Dizileri oluşturmak için değişkenler.

float sonKonum_x = 2500.00; //Kalemin ilk konumu kabul ettiğimiz koordinatlar.

float sonKonum_y = 2500.00;

float Hy=5000.00 ; // VB 6.0'da çizim alanının yüksekliği float Hx=5000.00 ; // VB 6.0'da çizim alanının genişliği

float olcek = 1.00; // pixel'in mm yada cm'ye donusumundeki oran int motor_hizi = 5 ; //motorlarin çalışma hizi (ms)

void setup() //Step motor bağlantıları {

pinMode(5, OUTPUT);

pinMode(6, OUTPUT);

(8)

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

pinMode(9, OUTPUT);

pinMode(10, OUTPUT);

pinMode(11, OUTPUT);

pinMode(12, OUTPUT);

Serial.begin(9600); // Serial iletişimin başlatılması alinan = 0;

buffer[alinan] = '\0'; //İlk değere atanan null //Serial.print("Hazir!!"); //Bağlantı sağlandı mesajı }

void dogruCiz(float x2 , float y2 , float x1 , float y1 ) // Doğru çizme işlemi için oluşturduğumuz fonksiyon

{

// Daha önce açıkladığımız matematiksel işlemler

float s11 = sqrt( pow(Hy-y1,2) + pow(x1,2)); // Şu bulunduğumuz noktanın 1. motora uzaklığı float s12 = sqrt( pow(Hy-y2,2) + pow(x2,2)); //Gideceğimiz noktanın 1.motora uzaklığı float s21 = sqrt( pow(Hy-y1,2) + pow(Hx-x1,2)); //Şu an bulunduğumuz noktanın 2.motora uzaklığı

float s22 = sqrt( pow(Hy-y2,2) + pow(Hx-x2,2)); // Gideceğimiz noktanın 2.motora uzaklığı float m1_yol = s12 - s11; //Birinci motorun alamsı gereken yol

float m2_yol = s22 - s21 ;//İkinci motorun alması gereken yol

float yol_1 = m1_yol / olcek; //pixelden cm yada mm donusumu icin olcekledik.

float yol_2 = m2_yol / olcek;

float oran = abs(yol_2/yol_1);

int dx = 0 ;// motor1'in ne kadar yol aldığını tutacak değişken int dy = 0 ;// motor2'nin ne kadar yol aldigini tutacak değişken

if (m1_yol > 0 && m2_yol > 0) //motor1 + yönde , motor2 + yönde hareket ediyorsa {

for (int t = 0 ; t<yol_1 ; t++) // alınan yol_1'e kadar motor1 bir adım atsın {

adimAt(1,1,motor_hizi); //Adim at dx = dx + 1 ; // Alınan yolu tut delay(10);

while( dy < (dx * oran) - 0.5) // Eğer dy < dx*m ise motor2 + adım atsın (y=m*x) {

dy++ ;//alınan yolu tut adimAt(2,1,motor_hizi);

delay(10);

} }

sonKonum_x = x2 ; //Kalemin son olarak geldiği nokta atanıyor.

sonKonum_y = y2 ; }

if (m1_yol > 0 && m2_yol < 0) //motor1 + , motor2 - yönde hareket ediyorsa {

for (int t = 0 ; t<yol_1 ; t++) {

adimAt(1,1,motor_hizi);

dx = dx + 1 ; delay(10);

while( dy < (dx * oran) - 0.5) // eğer dy < dx*m ise motor2 + adım atsın (y=m*x) {

dy++ ;

(9)

adimAt(2,-1,motor_hizi);

delay(10);

} }

sonKonum_x = x2 ; sonKonum_y = y2 ; }

else if (m1_yol < 0 && m2_yol <0) //motor1 - , motor2 - yönde hareket ediyorsa {

for (int t = 0 ; t<yol_1*(-1) ; t++) {

adimAt(1,-1,motor_hizi);

dx = dx + 1 ; delay(10);

while( dy < (dx * oran) - 0.5) // eğer dy < dx*m ise motor2 + adım atsın (y=m*x) {

dy++ ;

adimAt(2,-1,motor_hizi);

delay(10);

} }

sonKonum_x = x2 ; sonKonum_y = y2 ; }

else if (m1_yol < 0 && m2_yol >0) //motor1 - , motor2 + yönde hareket ediyorsa {

for (int t = 0 ; t<yol_1*(-1) ; t++) {

adimAt(1,-1,motor_hizi);

dx = dx + 1 ; delay(10);

while( dy < (dx * oran) - 0.5) // eğer dy < dx*m ise motor2 + adım atsın (y=m*x) {

dy++ ;

adimAt(2,1,motor_hizi);

delay(10);

} }

sonKonum_x = x2 ; sonKonum_y = y2 ;

}

else if (m1_yol == 0 && m2_yol >0) //motor1 hareket etmiyor , motor2 + yönde hareekt ediyorsa

{

for (int t = 0 ; t<yol_2 ; t++) {

adimAt(2,1,motor_hizi);

dy = dy + 1 ; delay(10);

}

sonKonum_x = x2 ; sonKonum_y = y2 ; }

else if (m1_yol = 0 && m2_yol <0) //motor1 hareket etmiyor , motor2 - yönde hareekt ediyorsa

(10)

{

for (int t = 0 ; t<yol_2*(-1) ; t++) {

adimAt(2,-1,motor_hizi);

dy = dy + 1 ; delay(10);

}

sonKonum_x = x2 ; sonKonum_y = y2 ; }

else if (m1_yol > 0 && m2_yol ==0) //motor1 + yönde hareket ediyor , motor2 hareket etmiyorsa

{

for (int t = 0 ; t<yol_1 ; t++) {

adimAt(1,1,motor_hizi);

dx = dx + 1 ; delay(10);

}

sonKonum_x = x2 ; sonKonum_y = y2 ; }

else if (m1_yol < 0 && m2_yol ==0) //motor1 - yönde hareket ediyor , motor2 hareket etmiyorsa

{

for (int t = 0 ; t<yol_1*(-1) ; t++) {

adimAt(1,-1,motor_hizi);

dx = dx + 1 ; delay(10);

}

sonKonum_x = x2 ; sonKonum_y = y2 ; }

}

void adimAt(int motor , int yon , int hiz) //Step motorların adım atması için hazırlanmış fonksiyon.

{

if( motor == 1) {

int m1_1 = 9; //1.motor 1.uç int m1_2 = 10;//1.motor 2.uç int m1_3 = 11;//1.motor 3.uç int m1_4 = 12;//1.motor 4.uç if (yon==1)

{

digitalWrite(m1_1, HIGH);

digitalWrite(m1_2, LOW);

digitalWrite(m1_3, LOW);

digitalWrite(m1_4, LOW);

delay(hiz);

digitalWrite(m1_1, LOW);

digitalWrite(m1_2, HIGH);

digitalWrite(m1_3, LOW);

digitalWrite(m1_4, LOW);

(11)

delay(hiz);

digitalWrite(m1_1, LOW);

digitalWrite(m1_2, LOW);

digitalWrite(m1_3, HIGH);

digitalWrite(m1_4, LOW);

delay(hiz);

digitalWrite(m1_1, LOW);

digitalWrite(m1_2, LOW);

digitalWrite(m1_3, LOW);

digitalWrite(m1_4, HIGH);

delay(hiz);

}

if (yon == -1) {

digitalWrite(m1_1, HIGH);

digitalWrite(m1_2, LOW);

digitalWrite(m1_3, LOW);

digitalWrite(m1_4, LOW);

delay(hiz);

digitalWrite(m1_1, LOW);

digitalWrite(m1_2, LOW);

digitalWrite(m1_3, LOW);

digitalWrite(m1_4, HIGH);

delay(hiz);

digitalWrite(m1_1, LOW);

digitalWrite(m1_2, LOW);

digitalWrite(m1_3, HIGH);

digitalWrite(m1_4, LOW);

delay(hiz);

digitalWrite(m1_1, LOW);

digitalWrite(m1_2, HIGH);

digitalWrite(m1_3, LOW);

digitalWrite(m1_4, LOW);

delay(hiz);

} }

if (motor==2) {

int m2_1 = 5; //2.motor 1.uç int m2_2 = 6;//2.motor 2.uç int m2_3 = 7;//2.motor 3.uç int m2_4 = 8;//2.motor 4.uç if (yon==1)

{

digitalWrite(m2_1, HIGH);

digitalWrite(m2_2, LOW);

digitalWrite(m2_3, LOW);

digitalWrite(m2_4, LOW);

delay(hiz);

digitalWrite(m2_1, LOW);

digitalWrite(m2_2, HIGH);

digitalWrite(m2_3, LOW);

digitalWrite(m2_4, LOW);

(12)

delay(hiz);

digitalWrite(m2_1, LOW);

digitalWrite(m2_2, LOW);

digitalWrite(m2_3, HIGH);

digitalWrite(m2_4, LOW);

delay(hiz);

digitalWrite(m2_1, LOW);

digitalWrite(m2_2, LOW);

digitalWrite(m2_3, LOW);

digitalWrite(m2_4, HIGH);

delay(hiz);

}

if (yon == -1) {

digitalWrite(m2_1, HIGH);

digitalWrite(m2_2, LOW);

digitalWrite(m2_3, LOW);

digitalWrite(m2_4, LOW);

delay(hiz);

digitalWrite(m2_1, LOW);

digitalWrite(m2_2, LOW);

digitalWrite(m2_3, LOW);

digitalWrite(m2_4, HIGH);

delay(hiz);

digitalWrite(m2_1, LOW);

digitalWrite(m2_2, LOW);

digitalWrite(m2_3, HIGH);

digitalWrite(m2_4, LOW);

delay(hiz);

digitalWrite(m2_1, LOW);

digitalWrite(m2_2, HIGH);

digitalWrite(m2_3, LOW);

digitalWrite(m2_4, LOW);

delay(hiz);

} } }

void loop() //Tekrar edilecek ana fonksiyonumuz {

if (Serial.available()) {

buffer[alinan++] = Serial.read(); // Değeri okunup buffer dizisine yazılması buffer[alinan] = '\0';

if (alinan >= (sizeof(buffer)-1)) {

a0 = buffer[0]; // ilk okunan 4 değeri değişkenlere ata a1 = buffer[1];

a2 = buffer[2];

a3 = buffer[3];

b0 = buffer[4]; // sonra okunan 4 değeri değişkenlere ata b1 = buffer[5];

b2 = buffer[6];

b3 = buffer[7];

(13)

char dizi1[]={a0,a1,a2,a3}; //ilk diziyi burada tanımla ve değişkenleri yerleştir.

dizi2[0]=b0; //2.Diziyi en başta tanımladık! Değerlerini yaz.

dizi2[1]=b1;

dizi2[2]=b2;

dizi2[3]=b3;

float sayi1 = atof(dizi1);// Dizileri int'e çevir float sayi2 = atof(dizi2);

alinan = 0;

dogruCiz(sayi1,sayi2 , sonKonum_x , sonKonum_y );

Serial.println("Cizim OK"); //Geri bildirim mesajı }

} }

Donanım Aşaması

Bu aşamayı da iki kategoride incelemek uygun olacaktır. Öncelikle step motorlarımızın Arduino bağlantısı ve bilgisayar Arduino bağlantısı ardından step motorların düşey düzleme yerleşimi incelenecektir.

Arduino Bağlantıları

Step motor uçları ULN2003 sürücü entegresiArduino üzerindeki digital pinlerine bağlancaktır. Projede kullanılan 28YBJ-48 tipi iki adet step motorun uçları şekilde verilmiştir.

Şekil 3 Step Motor Bağlantı Kabloları

Kullanılan ULN2003 entegresi Arduino ve step motorların bağlantısı aşağıda verilmiştir.

(14)

Şekil 4 Step Motor , ULN2003 ve Arduino Bağlantıları

İki motor içinde bağlantılar aynı şekilde yapılmalı fakat diğer step motorun uçları diğer bir ULN2003 entegresi üzerinden Arduno‟nun digital 9 , 10 , 11 ve 12 pinlerine bağlanmalıdır.Bu sayede ilk yapılan bağlantı birinci motoru , ikinci yapılan bağlantı ise ikinci motoru kullanıma hazır hale getirmiş olacaktır. Bu aşamdan sonra motorların , kalemin ve ipliklerin düşey düzlem üzerine yerleştirilmeleri işlemi

yapılmalıdır.

Düşey Düzlem Yerleşimi

Bağlantıları yapılmış olan elemanların düşey düzlem üzerine yerleştirilmeleri sırasında dikkat edilmesi gereken nokta motorların birbirlerine olan uzaklıklarıdır. Bu uzaklık çizim genişliğini belirleyecek , belirlenen genişlikte Arduino‟ya yüklediğimiz kodlar içerisinde tanımlanmış “Ölçek” değişkeninin değiştirilmesini gerektirecektir.

Çizim ortamında pixel biriminde yapılan uzunluk ve koordinat hesapları , fiziksel ortama aktarılırken mm veya cm olarak değerlendirilmekte bu dönüşüm ölçek değişkeni ile sağlanmaktadır. Çizim alanının belirlenmesinde de bu konuya özen gösterilmelidir.

Mesafelerin yanı sıra , çizim için kullanılacak olan kalemin düşey düzleme dik konumda tutulması da mekaniksel anlamda zorluklar çıkarmaktadır. Bu zorlukları aşmak adına kalem çapı ebatında deliğe sahip dairesel ve nispeten ağır bir parçanın ipliklerle motora bağlanması ve kalemin bu parça üzerinde konumlandırılması

gerekmektedir.

(15)

Şekil 5 Düşey Düzlem Yazıcısı Şematik Görünümü

Çizim Ortamına Ait Tüm Visual Basic Kodları

Private Sub Command1_Click() Text2.Text = ""

If List1.ListCount = 0 Then MsgBox ("Çizim Yapılmamış!") Else

If MSComm1.PortOpen = True Then MSComm1.Output = Text1.Text Timer1.Enabled = True

Else

MsgBox ("Bağlantı Kurulmamış!") End If

End If End Sub

Private Sub Command2_Click()

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Else

MsgBox ("Bağlantı Zaten Kesik!") End If

If MSComm1.PortOpen = True Then Label1.Caption = "Bağlandı"

Else

Label1.Caption = "Bağlantı Yok"

End If End Sub

(16)

Private Sub Command3_Click() If MSComm1.PortOpen = True Then MsgBox ("Bağlantı Zaten Kurulu!") Else

MSComm1.PortOpen = True End If

If MSComm1.PortOpen = True Then Label1.Caption = "Bağlandı"

Else

Label1.Caption = "Bağlantı Yok"

End If End Sub

Private Sub Command4_Click() If MSComm1.PortOpen = True Then MSComm1.Output = Text6.Text Else

MsgBox ("Bağlantı Kurulmamış!!") End If

End Sub

Private Sub Command5_Click() List1.Clear

End Sub

Private Sub Command6_Click() Image1.Refresh

Label_x.Caption = 2500 Label_y.Caption = 2500 End Sub

Private Sub Command7_Click() Unload Me

End Sub

Private Sub Form_Load()

If MSComm1.PortOpen = True Then Label1.Caption = "Bağlandı"

Else

Label1.Caption = "Bağlantı Yok"

End If End Sub

Private Sub Form_Unload(Cancel As Integer) If MSComm1.PortOpen = True Then

MSComm1.PortOpen = False End If

End Sub

Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Me.Line (Label_x.Caption, Label_y.Caption)-(X, Y)

Label_x.Caption = X Label_y.Caption = Y Text3.Text = X

(17)

Text4.Text = 5000 - Y If Len(Text3.Text) = 3 Then

Text3.Text = "0" & X End If

If Len(Text3.Text) = 2 Then Text3.Text = "00" & X End If

If Len(Text3.Text) = 1 Then Text3.Text = "0000" & X End If

If Len(Text4.Text) = 3 Then

Text4.Text = "0" & 5000 - Y End If

If Len(Text4.Text) = 2 Then

Text4.Text = "00" & 5000 - Y End If

If Len(Text4.Text) = 1 Then

Text4.Text = "000" & 5000 - Y End If

List1.AddItem (Text3.Text & Text4.Text) End Sub

Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Text5.Text = X

Text7.Text = 5000 - Y End Sub

Private Sub MSComm1_OnComm()

If MSComm1.CommEvent = comEvReceive Then Text2.Text = MSComm1.Input

End If End Sub

Private Sub Timer1_Timer()

If MSComm1.PortOpen = True Then Label5.Caption = "Çizim Yapılıyor!!"

a = Label4.Caption If Text2.Text <> "" Then Text2.Text = ""

MSComm1.Output = List1.List(a) List1.Selected(a) = True

If a = List1.ListCount Then

Label5.Caption = "Devam Eden Çizim Yok"

Timer1.Enabled = False End If

Label4.Caption = a + 1 End If

Else

MsgBox ("Bağlantı Kesildi!!") End If

End Sub

(18)

Kaynaklar

http://arduino.cc

http://arduinoturkiye.com/

http://msdn.microsoft.com http://vbasicmaster.com

Referanslar

Benzer Belgeler

• Bu komut &#34;veriler.txt&#34; adlı dosyanın içindeki iki sütunun ilkini x değerleri ikincisini de y değerleri olarak dikkate alır ve çizim yapar.. Dosyadan

Tesisat projeleri, yapı veya tesisin kesin projesi ortaya çıktıktan sonra kullanılan tesisatlara ilişkin projeler ayrı ayrı çizilir.. Bu amaçla sıhhi tesisat,

Basia Szkutnica, Moda Tasarımda Teknik Çizim, Karakalem Kitapevi, İzmir, 2011 Tizianna Paci,Figure Drawing for Fashion Design,

Basia Szkutnica, Moda Tasarımda Teknik Çizim, Karakalem Kitapevi, İzmir, 2011 Tizianna Paci,Figure Drawing for Fashion Design,

Basia Szkutnica, Moda Tasarımda Teknik Çizim, Karakalem Kitapevi, İzmir, 2011 Tizianna Paci,Figure Drawing for Fashion Design,

Kalıp üzerinde belirli nokta ve açıların işaretlenerek ölçü alınması.. ÖN

Programı çalıştırmak için program menüsünden seçmek veya masaüstünden AutoCAD simgesini tıklatmak gerekir. 2009

Halfwidth : Polyline komutu aktif iken çizginin yarı genişliği yazılıp çizim aktif hale getirilebilir...