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
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ü
Ş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
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
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
Ş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);
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++ ;
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
{
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);
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);
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];
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.
Ş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.
Ş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
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
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
Kaynaklar
http://arduino.cc
http://arduinoturkiye.com/
http://msdn.microsoft.com http://vbasicmaster.com