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



Benzer belgeler
Uygulamalar 4 IsMissing Fonksiyonlar ve Alt Programlar Prosedür Parametreleri Public Function f(x,y,optional t, Optional k) End Function 1.

UYGULAMALAR. İkinci liste kutusu (List 2) Birinci liste Kutusu (List 1) Metin Kutusu

void setup() fonksiyonu: Bu fonksiyon program ilk açıldığında bir kere çalışır ve gerekli kalibrasyon, setup komutlarını buraya yazarız.

VTIY DERS-4 YARDIMCI NOTLARI -2018

INPUTBOX KULLANIMI. Komut Düğmesine uygulanan algoritma örneği

Uygulama 1) Aşağıdaki genel (global) değişken tanımlamalarını VB üzerinde yapınız. Süre 10 dak.

GÜZ YY. - MKT103 - GÖRSEL PROGRAMLAMA DERSİ - ARA SINAVI

İNTERNET TABANLI PROGRAMLAMA

OPTION BUTTON ve ELSEIF UYGULAMALARI

SAKARYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ GÖMÜLÜ SİSTEMLER DENEY FÖYÜ

Bu uygulama, MSGBOX fonksiyonun ve Form nesnesinin QueryUnload olayının kullanımı ile ilgili bir uygulamadır.

Yukardaki gibi sonsuz döngülü programlara Ctrl+Break tuş takımı ile müdahale edilmesi gerekir, aksi halde program sonsuz döngüye girer.

10 LU SAYISAL SİSTEMİ İLE 2 Lİ SAYISAL SİSTEMİ ARASINDA ÇEVİRİM UYGULAMASI

Erzurum Teknik Üniversitesi RobETÜ Kulübü Robot Eğitimleri. ARDUİNO EĞİTİMLERİ I Arş. Gör. Nurullah Gülmüş

Diziler İndisli Değişkenler


MT 373 Visual Basic Programlama Dersi

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

Genel Kullanılış 1: [değişken ismi] = [değişken ismi] [işlem] [sayı veya string ifade veya değişken]

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

DİZİLER. Bu ünitede yapılan örnekler Visual Studio 2010 programındaki Visual Basic programlama diliyle çözülmüştür.

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

OÖ lçu mu Uygulaması

Eastern Mediterranean University Faculty of Arts & Sciences -- Department Of Mathematics BİLG213 BİLGİSAYAR PROGRAMLAMAYA GİRİŞ

UYGULAMALAR -2 Select case Yapısı: Select Case case case case case case is case Else End Select Örnek:

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

Dr. Fatih AY Tel: fatihay@fatihay.net

KİRİŞLERDE PLASTİK MAFSALIN PLASTİKLEŞME BÖLGESİNİ VEREN BİLGİSAYAR YAZILIMI

T.C. ERCİYES ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ MEKATRONİK MÜHENDİSLİĞİ BÖLÜMÜ ELEKTRONİK SİSTEMLER LABORATUVARI 1

HESAP MAKİNASI YAPIMI

Arduino Uno ile Hc-Sr04 ve Lcd Ekran Kullanarak Mesafe Ölçmek

web-sitesi : satış : teknik destek : tel : IM-SMO20 Ultrasonik Mesafe Sensörü Özellikler

Mikroişlemciler ve Programlama Dersi- ARDUINO. Sensörler ve Analog-Digital Çeviriciler İle Çalışma

BİLG Dr. Mustafa T. Babagil 1

Windows Nasıl Çalışır? Pencereler (window), Hareketler (event) ve Mesajlar (message)

-A Grubu- MKT103 Görsel Programlama 2015/2016 Güz Dönemi Final Sınavı

KRİPTOANALİZ DERSİ FİNAL ÖDEVİ. PSO ile TRANSPOSITION CIPHER ÇÖZÜMÜ

Görsel Programlama (Visual Programming)

LPC2104 Mikro Denetleyicisini KEIL İle Programlamak

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

Elif İLİKSİZ. Keziban TURAN. Radio Frekanslarla Hareket Eden Araç

8. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

Her Select Case bloğu, mutlaka End Select ile bitmek zorundadır.

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

C# ile NJ Simulatöre Bağlanmak

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Timer İle arka plan renk değişimi

RS 232 HABERLEŞMELĐ DOKUNMATĐK ĐMZA PANELĐ

C Programlama Dilininin Basit Yapıları

Pointer Kavramı. Veri Yapıları

Yazılım Nedir? 2. Yazılımın Tarihçesi 3. Yazılım Grupları 4 Sistem Yazılımları 4 Kullanıcı Yazılımları 5. Yazılımın Önemi 6

DERS BİLGİ FORMU. Okul Eğitimi Süresi

NB Ekran Seri Port Üzerinden Veri Okuma/Yazma. Genel Bilgi Protokol Oluşturma Veri Okuma Veri Yazma

idea rsbasic KOMUTLARI

DENEY 1 - SABİT HIZLA DÜZGÜN DOĞRUSAL HAREKET

AOSB 2017 EĞİTİM PROGRAMI

Paralel ve Seri İletişim. Asenkron/Senkron İletişim. Şekil 2: İletişim Modları

Arduino nedir? Arduino donanım ve yazılımın kolayca kullanılmasına dayalı bir açık kaynak elektronik platformdur.

Response : Sunucunun istemciye veri yollamasını

SPSS E GİRİŞ SPSS TE TEMEL İŞLEMLER. Abdullah Can

Kod Kavramı Sub End Sub Olay (Event) Kavramı

Fonksiyonlar (Altprogram)

PROGRAMLAMAYA GİRİŞ DERS 2

1- KULLANILACAK DEVRE ELEMANLARININ TANITILMASI

VISUAL BASIC TE VERĠ TABANI ĠġLEMLERĠ

Göstericiler (Pointers)

Visual Studio 2010 veya 2013, Sharp Develop 3.2 programlarını kurabilirsiniz.

İNTERNET TABANLI PROGRAMLAMA

Matematiksel Operatörler

OTOBÜS İŞLETMESİ OTOMASYONU. Otobüs işletmesi Otomasyonu hazırlanırken takip edilen Yazılım Geliştirme Süreçleri yukarıda gösterilmiştir.

LED YAKMAK. Circuit 2. Kablo LED. Direnç. Arduino LED. Direnç (330ohm)

Uygulama1) Şart yapısının kullanımı CheckBox1 bileşeninin işaretlendiğinde ekranda Kutu işaretlendi mesajı veren kodları yazınız.

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

OMÜ HAVACILIK VE UZAY BİLİMLERİ FAKÜLTESİ METEOROLOJİ MÜHENDİSLİĞİ BÖLÜMÜ MET103 BİLGİSAYAR PROGRAMLAMA I BÜTÜNLEME SINAVI

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

MATLAB/Programı Dallandıran İfadeler

BİLGİSAYAR PROGRAMLAMA. Algoritma ve Akış Şemaları

Uygulama 1) Tur sayısını 1 den klavyeden girilen n e kadar ekrana yazarak birikimli (kümülatif) toplam alan kaynak kodları yazınız.

2 VISUAL STUDIO 2012 GELİŞTİRME ORTAMI

Leica DISTO D3a / BT Çok fonksiyonel, hassas ölçüm imkanı

1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.Net Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5

BİL1001 Bilgisayar Bilimlerine Giriş 1

TUŞ TAKIMI (KEYPAD) UYGULAMALARI

Kısa Program yazma-mdi

BİL-142 Bilgisayar Programlama II

YILDIZ TEKNİK ÜNİVERSİTESİ ELEKTRİK-ELEKTRONİK FAKÜLTESİ ELEKTRİK MÜHENDİSLİĞİ BÖLÜMÜ

DIV KAVRAMI <style> position: absolute

Sınav Dağılım & IMKB Endeks

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

ÜNİT E ÜNİTE KONTROL DEYİMLERİ KARAR YAPILARI. IF Deyimi GİRİŞ

VERİ GÖNDERME PROGRAMI KULLANMA KILAVUZU (Tesisler tarafından kullanılacak)

DENEY-1. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

TEMEL BİLGİSAYAR BİLİMLERİ. Programcılık, problem çözme ve algoritma oluşturma

Dik İzdüşüm Teorisi. Prof. Dr. Muammer Nalbant. Muammer Nalbant

Transkript:

DÜŞEY DÜZLEM YAZICISI ve ÇİZİM ORTAMI Hazırlayan : Necati ER info@necatier.com Facebook.com/ernecati Twitter.com/ernecati

İç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 1

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ü 2

Ş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 ; Label1.Caption = "Bağlandı" Label1.Caption = "Bağlantı 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 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 Yok" 3

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. 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 Label4.Caption = a + 1 MsgBox ("Bağlantı Kesildi!!") 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. Label1.Caption = "Bağlandı" Label1.Caption = "Bağlantı Yok" 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 If Len(Text3.Text) = 2 Then Text3.Text = "00" & X If Len(Text3.Text) = 1 Then Text3.Text = "0000" & X 4

If Len(Text4.Text) = 3 Then Text4.Text = "0" & 5000 - Y If Len(Text4.Text) = 2 Then Text4.Text = "00" & 5000 - Y If Len(Text4.Text) = 1 Then Text4.Text = "000" & 5000 - Y List1.AddItem (Text3.Text & Text4.Text) 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 5

Ş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); 6

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 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); 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 ; while( dy < (dx * oran) - 0.5) // eğer dy < dx*m ise motor2 + adım atsın (y=m*x) dy++ ; 7

adimat(2,-1,motor_hizi); 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 ; 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); 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 ; 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); 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 ; sonkonum_x = x2 ; sonkonum_y = y2 ; else if (m1_yol = 0 && m2_yol <0) //motor1 hareket etmiyor, motor2 - yönde hareekt ediyorsa 8

for (int t = 0 ; t<yol_2*(-1) ; t++) adimat(2,-1,motor_hizi); dy = dy + 1 ; 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 ; 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 ; 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); digitalwrite(m1_1, LOW); digitalwrite(m1_2, HIGH); digitalwrite(m1_3, LOW); digitalwrite(m1_4, LOW); 9

digitalwrite(m1_1, LOW); digitalwrite(m1_2, LOW); digitalwrite(m1_3, HIGH); digitalwrite(m1_4, LOW); digitalwrite(m1_1, LOW); digitalwrite(m1_2, LOW); digitalwrite(m1_3, LOW); digitalwrite(m1_4, HIGH); if (yon == -1) digitalwrite(m1_1, HIGH); digitalwrite(m1_2, LOW); digitalwrite(m1_3, LOW); digitalwrite(m1_4, LOW); digitalwrite(m1_1, LOW); digitalwrite(m1_2, LOW); digitalwrite(m1_3, LOW); digitalwrite(m1_4, HIGH); digitalwrite(m1_1, LOW); digitalwrite(m1_2, LOW); digitalwrite(m1_3, HIGH); digitalwrite(m1_4, LOW); digitalwrite(m1_1, LOW); digitalwrite(m1_2, HIGH); digitalwrite(m1_3, LOW); digitalwrite(m1_4, LOW); 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); digitalwrite(m2_1, LOW); digitalwrite(m2_2, HIGH); digitalwrite(m2_3, LOW); digitalwrite(m2_4, LOW); 10

digitalwrite(m2_1, LOW); digitalwrite(m2_2, LOW); digitalwrite(m2_3, HIGH); digitalwrite(m2_4, LOW); digitalwrite(m2_1, LOW); digitalwrite(m2_2, LOW); digitalwrite(m2_3, LOW); digitalwrite(m2_4, HIGH); if (yon == -1) digitalwrite(m2_1, HIGH); digitalwrite(m2_2, LOW); digitalwrite(m2_3, LOW); digitalwrite(m2_4, LOW); digitalwrite(m2_1, LOW); digitalwrite(m2_2, LOW); digitalwrite(m2_3, LOW); digitalwrite(m2_4, HIGH); digitalwrite(m2_1, LOW); digitalwrite(m2_2, LOW); digitalwrite(m2_3, HIGH); digitalwrite(m2_4, LOW); digitalwrite(m2_1, LOW); digitalwrite(m2_2, HIGH); digitalwrite(m2_3, LOW); digitalwrite(m2_4, LOW); 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]; 11

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. 12

Ş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. 13

Ş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ış!") MSComm1.Output = Text1.Text Timer1.Enabled = True MsgBox ("Bağlantı Kurulmamış!") Private Sub Command2_Click() MSComm1.PortOpen = False MsgBox ("Bağlantı Zaten Kesik!") Label1.Caption = "Bağlandı" Label1.Caption = "Bağlantı Yok" 14

Private Sub Command3_Click() MsgBox ("Bağlantı Zaten Kurulu!") MSComm1.PortOpen = True Label1.Caption = "Bağlandı" Label1.Caption = "Bağlantı Yok" Private Sub Command4_Click() MSComm1.Output = Text6.Text MsgBox ("Bağlantı Kurulmamış!!") Private Sub Command5_Click() List1.Clear Private Sub Command6_Click() Image1.Refresh Label_x.Caption = 2500 Label_y.Caption = 2500 Private Sub Command7_Click() Unload Me Private Sub Form_Load() Label1.Caption = "Bağlandı" Label1.Caption = "Bağlantı Yok" Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False 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 15

Text4.Text = 5000 - Y If Len(Text3.Text) = 3 Then Text3.Text = "0" & X If Len(Text3.Text) = 2 Then Text3.Text = "00" & X If Len(Text3.Text) = 1 Then Text3.Text = "0000" & X If Len(Text4.Text) = 3 Then Text4.Text = "0" & 5000 - Y If Len(Text4.Text) = 2 Then Text4.Text = "00" & 5000 - Y If Len(Text4.Text) = 1 Then Text4.Text = "000" & 5000 - Y List1.AddItem (Text3.Text & Text4.Text) Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Text5.Text = X Text7.Text = 5000 - Y Private Sub MSComm1_OnComm() If MSComm1.CommEvent = comevreceive Then Text2.Text = MSComm1.Input Private Sub Timer1_Timer() 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 Label4.Caption = a + 1 MsgBox ("Bağlantı Kesildi!!") 16

Kaynaklar http://arduino.cc http://arduinoturkiye.com/ http://msdn.microsoft.com http://vbasicmaster.com 17