T.C. MEKATRONİK MÜHENDİSLİĞİ MİKROİŞLEMCİLER YAZI YAZAN ROBOT RAPORU Ekip Üyesi : Okul No : OĞUZ TAHMAZ 140224018 KAAN SALI 140224036 HAKAN KOCAKOYUN 140224072
T.C.
MEKATRONİK MÜHENDİSLİĞİ
MİKROİŞLEMCİLER
YAZI YAZAN ROBOT RAPORU
Ekip Üyesi : Okul No : OĞUZ TAHMAZ 140224018 KAAN SALI 140224036 HAKAN KOCAKOYUN 140224072
İçindekiler :
1. GİRİŞ VE TANITIM............................................................Sayfa 1
2. ELEKTRONİK
2.1 Simulasyon ve Şematik...........................................Sayfa 2
2.2 PCB ve 3D PCB Görünümü......................................Sayfa 3
3. MEKANİK
3.1 Çizilen Mekanizmanın Açıklanması ........................Sayfa 9
3.2 Mekanizma Render ve Montaj Görüntüleri............Sayfa 10
3.3 Teknik Resimler......................................................Sayfa 14
4. YAZILIM
4.1 Kodların Açıklanması..............................................Sayfa 22
4.2 C# Kullanıcı Arayüzü Görselleri...............................Sayfa 22
4.3 C# Kullanıcı Arayüzü Kodları...................................Sayfa 25
4.4 CCS C Kodları..........................................................Sayfa 31
5.SONUÇ
5.1 Yazı Yazan Robot Görselleri....................................Sayfa 53
5.2 Yazı Yazan Robot İle Alınan Baskı...........................Sayfa 53
1
GİRİŞ
Bu proje ile Mikroişlemciler dersinde görülen teorik bilgilerin, uygulamalı
proje ile pratiğe dönüştürülmesi amaçlanmıştır. Bu çalışma esnasında bizi
yönlendiren Sn. Yrd. Doç. Dr. Selçuk KİZİR’ e teşekkür ederiz.
TANITIM
Mekanizma tasarımı, devre tasarımı ve yazılımı bu rapor kapağında isimleri
geçen Kocaeli Üniversitesi, Mekatronik Mühendisliği öğrencileri tarafından
yapılmıştır.
Bu proje ile hedeflenen, iki eksende hareket eden mekanizmanın, bilgisayar
arayüzünden girilen harf, rakam, kelime ve cümlelerin kağıda yazdırmasıdır.
Proje; CNC, 3D Printer ve diğer eksenel cihazların çalışma mantığından
yararlanılarak ortaya konulmuştur.
Ürettiğimiz ve Mikroişlemciler dersi kapsamında sunacağımız proje
geliştirilmeye oldukça açıktır. Geliştirilmesiyle birlikte ticarileştirilebilmeye
oldukça uygundur. Z ekseninin mekanizmaya eklenmesi ve geliştirilmesi ile
birlikte çok çeşitli görevi yerine getirme imkanına sahip olabilecek bir
makinedir.
Kullanılabileceği Alanlar :
Afişler ve Duyurular
Davetiyeler
Fazla Sayıda İmza Atılması / Doldurulması Gereken Evraklar
2
ELEKTRONİK RAPORU
2.1 Simulasyon ve Şematik
Devre Proteus Circuit Designer ile tasarlandı. İlk olarak Şekil 2.1’de devre şeması aynı zamanda
simulasyon ekranının bir ekran alıntısı verilmiştir. PIC 16F877A Mikrodenetleyicisi kullanılmıştır.
Devrede 1 adet Servo Motor, 2 adet Step Motor çıkışı (X ve Y ekseni), 2 adet besleme girişi (5V,12V),
4 adet buton girişi (Başlat, Sonraki, Önceki Butonları, MCLR ile Sıfırlama Butonu), 1 adet 16*2
Karakter LCD çıkışı ve 1 adet seri iletişim çıkışı bulunmaktadır. Seri iletişim çıkışı, C# arayüzü ile PIC
mikrodenetleyicisini haberleştirmek amacıyla devreye eklenmiştir. Seri iletişim için CP2102 USB to
UART dönüştürücü kullanılmıştır.İletişim bilgisayar vasıtasıyla sağlanacağından butonlar
kullanılmamaktadır ancak ihtiyaç durumunda butonlar aktif edilebilmektedir.
Mikroişlemci : PIC 16F877A
Motor Sürücü : Pololu DRV8825
Step Motorlar : Nema 17
Servo Motor : Art-Tech 9g
Şekil 2.1 Devre Şeması
3
2.2 PCB ve 3D PCB Görünümü
Devre’nin PCB’si Proteus Circuit Designer’da tasarlandı. Boyutları 87 mm * 100 mm’ dir.
Şekil 2.2, Şekil 2.2.1 ve Şekil 2.2.2 ‘de görülmektedir. Baskı devrede besleme girişlerinde,
motor sürücülerin Vmotor besleme girişlerinde, mikroişlemci besleme girişlerinde, LCD
besleme girişlerinde gerilim dalgalanmasını önlemek amacıyla kondansatörler kullanıldı.
Besleme girişlerinde ve motor sürülere bağlı olan kapasitörler 15V 100uF’ dır. 4 Mhz’ lik
kristale 22pF kondansatör bağlanmıştır. Bu değer Kristal frekansları için verilmiş olan kapasite
değerlerinden alınmıştır.
Şekil 2.2 PCB 3D Üstten Görünüşü
4
Şekil 2.2.1 PCB 3D Önden Görünüşü
Şekil 2.2.2 Üretilmiş PCB
5
Şekil 2.2.3 DRV8825 Step Motor Sürücü Bağlantı Şeması
Şekil 2.2.4 DRV8825 Step Motor Sürücü CAD Çizimi
6
Şekil 2.2.5 Karakter LCD (16*2)
Şekil 2.2.6 PIC 16F877A
Şekil 2.2.7 PIC 16F877A Pin Çıkışları Şekil 2.2.8 PIC 16F877A Zorunlu
Bağlantıları
C# arayüzü ile mikrodenetleyici iletişimini sağlamak amacıyla CP2102 USB To TTL Dönüştürücü
kullanılmıştır.
Şekil 2.2.9 CP2102 USB To TTL Dönüştürücü
7
Devrenin PCB görünüşü Şekil 2.2.10’ de verilmiştir. Devrede 8 adet 2.Katman atlatması vardır.
Gerekli Pin çıkışları’nın isimleri Şekil 2.2.10’ da verilmiştir.
Şekil 2.2.10 PCB
8
Şekil 2.2.11 Baskı Devre (87mm * 100mm)
9
MEKANİK RAPORU
3.1 Çizilen Mekanizmanın Açıklanması
2D düzleme yazı yazma mekanizması Siemens NX programı ile tasarlandı.Makine ana iki eksen ve
servo ekseni olmak üzere 3 eksenden oluşmaktadır. Tüm plastik parçalar 3D Yazıcıdan basılmıştır.
Baskıda kullanılan malzeme PLA+’ dır.
X ekseni:
İki adet 8mm*427mm krom kaplı indüksiyonlu mil ile sabitlenmiş, GT2 kayış kasnak sistemi ile y
ekseni tahrik edilmektedir. Miller üzerine konumlanmış 4 adet LM8UU lineer rulman ile y ekseni
düşük tolerans payı ile hareket ettirilmektedir.
Şekil 3.1 X Ekseni
Y ekseni:
Z eksenini oluşturan kalem başlığını taşıyan eksendir, x eksenine 4 adet lineer rulman ile
yataklanmıştır. Kayış, kasnak üzerine gerdirilerek y eksenini tahrik eden motor sabit konumlanmıştır.
Şekil 3.1.1 Y Ekseni
10
Z ekseni:
Kalemin kağıt üzerinden kalkmasını sağlayan sistemdir, servo motor ile tahrik edilmektedir.
Minimum tolerans payı için 2 adet 3mm lik krom kaplı indüksiyonlu miller kullanılmıştır.
Şekil 3.1.2 Z Ekseni
3.2 Mekanizma Render ve Montaj Görüntüleri
Şekil 3.2 Montajlanmış Mekanizma
11
Şekil 3.2.1 Montajlanmış Mekanizma
Şekil 3.2.2 Üretilmiş Mekanizma
12
Şekil 3.2.3 Elektronik Kutusu
Şekil 3.2.4 Üretilmiş Elektronik Kutusu
13
Şekil 3.2.5 3D Baskı Aşaması
Şekil 3.2.6 PCB + Güç Kaynağı (12V) + Elektronik Kutusu
Montajlanmış Görüntüsü
14
3.3 Mekanizma Teknik Resimleri
15
16
17
18
19
20
21
22
YAZILIM RAPORU
4.1 Kodların Açıklanması
Yazı Yazan Robot’un amacı bilgisayar arayüzünden girilen harflerin, kelimelerin, cümlelerin,
rakamların mekanizma yardımı ve bir kalem ile kağıda yazılmasıdır. Bu amaçla PIC 16F877A
Mikrodenetleyicisi CCS C Derleyicisinde programlanmıştır. Arayüz C#’ta hazırlanmıştır.
CCS C’de C# Arayüzünden gelen verilerin beklenmesi esastır. Arayüzden herhangi bir veri
geldiğinde bu CCS C Derleyicisindeki harf ve rakam fonksiyonlarını çağırır.Bir harfin yazım işlemi
bittiğinde diğer harfin fonksiyonu çağırılır ve bu döngü bu şekilde devam eder. Tüm bu döngü
tamamlandığında mikrodenetleyiciye LCD’ye işlem durumunu yazdırması amacıyla başka bir karakter
gönderilir ve bu karakter fonksiyonunun altında LCD’ye ‘’İŞLEM BİTTİ” yazdırılır veya USB girişi
bilgisayara bağlandığında mikrodenetleyiciye yeni bir karakter yollanır ve LCD’ye “CIHAZ BAGLANDI”
yazdırılır. Örneğin kullanıcı cihazın bilgisayar ile olan bağlantısını kestiğinde LCD’ye ‘’BAGLANTI
KOPTU” yazdırılır. LCD ve C# Arayüzü ile daha kullanıcı dostu ve kullanımı kolay bir makine üretmek
amaçlandı. Ana mantık karakterlerin bilgisayardan mikrodenetleyiciye aktarılması ve buna göre
gerekli fonksiyonların icra edilmesidir.
4.2 C# Kullanıcı Arayüzü Görselleri
Şekil 4.2 Kontrol Paneli Açılış Ekranı
23
Şekil 4.2.1 Kontrol Paneli Başarılı Bağlantı Durumu
Şekil 4.2.2 Kontrol Paneli Kesilen Bağlantı Durumu
24
Şekil 4.2.3 Kontrol Paneli İşlem Durumu
Şekil 4.2.4 Kontrol Paneli İşlem Bitti Durumu
25
4.3 C# Kullanıcı Arayüzü Kodları
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.IO.Ports; //Giris Cikis Portlari Tanimlaniyor.
namespace WindowsFormsApplication8
{
public partial class Form1 : Form
{
//Değişkenler Tanimlaniyor.
string veri;
int harf_say;
int i = 0;
int j = 0;
string[] ports = SerialPort.GetPortNames(); //Seriportların İsimleri Ports Dizisine Ataniyor.
public Form1()
{
//İlk Olarak Program Arayüzünde Aktif ve Aktif Olmayacak Kısımlar Belirleniyor.
InitializeComponent();
portbox.Enabled = true;
baudbox.Enabled = true;
baglanbtn.Enabled = true;
kesbtn.Enabled = false;
26
metinbox.Enabled = false;
puntobox.Enabled = false;
gonderbtn.Enabled = false;
refreshbtn.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
//Combobox'lara Gerekli İtemler Ekleniyor.
baudbox.Items.Add("300");
baudbox.Items.Add("1200");
baudbox.Items.Add("2400");
baudbox.Items.Add("4800");
baudbox.Items.Add("9600");
baudbox.Items.Add("19200");
baudbox.Items.Add("38400");
baudbox.Items.Add("57600");
baudbox.Items.Add("74880");
baudbox.Items.Add("115200");
baudbox.Items.Add("230400");
baudbox.Items.Add("250000");
puntobox.Items.Add("10");
puntobox.Items.Add("12");
puntobox.Items.Add("14");
puntobox.Items.Add("16");
puntobox.Items.Add("18");
puntobox.Items.Add("20");
puntobox.Items.Add("22");
puntobox.Items.Add("24");
puntobox.Items.Add("26");
puntobox.Items.Add("28");
puntobox.Items.Add("30");
metinbox.Text = "";
baudbox.Text = "9600"; //Mikrodenetleyicimizin Baudrate'i 9600'e Ayarlandığından Kullanıcıya İlk Olarak
//9600 Baudrate Gösteriliyor.
foreach (string port in ports)
{
//İsimleri Alinan Portlar Portbox Combobox'ına Ekleniyor.
27
portbox.Items.Add(port);
portbox.SelectedIndex = 0;
}
}
private void baglanbtn_Click(object sender, EventArgs e) //Yazıcıya Bağlan Butonuna Basılınca
//Gerçekleşecek Olaylar Fonksiyonu.
{
//Verileri Gönder Butonuna Basınca Gerçekleşecek Olaylar
try // COM Portta İletişim Kurulacak Cihaz Takılıysa Gerçekleşecek Olaylar.
{
serialPort1.PortName = portbox.SelectedItem.ToString(); //Hangi Seri Port'un Kullanılacağı
//Belirleniyor.
serialPort1.BaudRate = Int32.Parse(baudbox.SelectedItem.ToString()); //Baudrate'in Ne Olacağı
//Belirleniyor.
baudbox.Enabled = false; //Baudrate Combobox'ı Aktif Değil.
portbox.Enabled = false; //Portbox Combobox'ı Aktif Değil.
serialPort1.Open(); //Seri Port İletişime Açılıyor.
metinbox.Enabled = true; //Metinbox Combobox'ı Aktif Değil.
gonderbtn.Enabled = true; //Verileri Gönder Butonu Aktif.
puntobox.Enabled = true; //Puntobox Combobox'ı Aktif Değil.
kesbtn.Enabled = true; //Bağlantıyı Kes Butonu Aktif.
baglanbtn.Enabled = false; //Yazıcıya Bağlan Butonu Aktif.
bilgi.Text = "BAĞLANTI BAŞARILI"; //Bağlantı Durumu Arayüze Yazdırılıyor.
bilgi.ForeColor = System.Drawing.Color.Green; //Bağlantı Durumu'nun Rengi Yeşil Olarak Değiştiriliyor.
serialPort1.Write("+"); //Mikrodenetleyici LCD Ekranına "Bilgisayara Bağlandı" Yazması Sağlanıyor
refreshbtn.Enabled = true; //Baglan Butonuna Basıldığında Yenile Butonunun Aktif Olması Sağlanıyor.
}
catch //COM Portta Hiçbir Cihaz Takılı Değilse Kullanıcıya Uyarı Göster.
{
MessageBox.Show("COM PORTU AÇILAMADI"); //Kullanıcıya Uyarı Veriliyor.
}
}
private void kesbtn_Click(object sender, EventArgs e) //Bağlantıyı Kes Butonuna Basılınca Gerçekleşecek Olaylar Fonksiyonu.
{
28
try
{
serialPort1.Write("&"); //Mikrodenetleyici LCD Ekranına "Bağlantı Kesildi" Yazması Sağlanıyor.
serialPort1.Close(); // Seri Port İletişimi Kapatılıyor.
portbox.Enabled = true; //Portbox Combobox'ı Aktif.
baudbox.Enabled = true; //Baudrate Combobox'ı Aktif.
baglanbtn.Enabled = true; //Yazıcıya Bağlan Butonu Aktif.
kesbtn.Enabled = false; //Bağlantıyı Kes Butonu Aktif Değil.
metinbox.Enabled = false; //Metinbox Combobox'ı Aktif Değil.
puntobox.Enabled = false; //Puntobox Combobox'ı Aktif Değil.
gonderbtn.Enabled = false; //Verileri Gönder Butonu Aktif.
bilgi.Text = "BAĞLANTI KESİLDİ "; //Bağlantı Durumu Arayüze Yazdırılıyor.
bilgi.ForeColor = System.Drawing.Color.Red; //Bağlantı Durumu'nun Rengi Kırmızı Olarak Değiştiriliyor.
}
catch
{
serialPort1.Close(); // Seri Port İletişimi Kapatılıyor.
portbox.Enabled = true; //Portbox Combobox'ı Aktif.
baudbox.Enabled = true; //Baudrate Combobox'ı Aktif.
baglanbtn.Enabled = true; //Yazıcıya Bağlan Butonu Aktif.
kesbtn.Enabled = false; //Bağlantıyı Kes Butonu Aktif Değil.
metinbox.Enabled = false; //Metinbox Combobox'ı Aktif Değil.
puntobox.Enabled = false; //Puntobox Combobox'ı Aktif Değil.
gonderbtn.Enabled = false; //Verileri Gönder Butonu Aktif.
bilgi.Text = "BAĞLANTI KESİLDİ "; //Bağlantı Durumu Arayüze Yazdırılıyor.
bilgi.ForeColor = System.Drawing.Color.Red; //Bağlantı Durumu'nun Rengi Kırmızı Olarak Değiştiriliyor.
}
}
private void gonderbtn_Click(object sender, EventArgs e) //Verileri Gönder Butonuna Basılınca
//Gerçekleşecek Olaylar Fonksiyonu.
{
harf_say = metinbox.TextLength; //Arayüzden Yazılan Metnin Uzunluğu Alınıyor.
islem.Text = "İŞLEM SÜRÜYOR..."; //İşlem Yapılırken Kullanıcıya Arayüz Vasıtasıyla İşlem Durumu İle İlgili
//Bilgi Veriliyor.
islem.ForeColor = System.Drawing.Color.DarkOrange; //İşlem Durumunu Gösteren Yazının Rengi
//Turuncu Olarak Değiştiriliyor.
try
29
{
harf_say = metinbox.TextLength; //Arayüzden Yazılan Metnin Uzunluğu Alınıyor.
islem.Text = "İŞLEM SÜRÜYOR..."; //İşlem Yapılırken Kullanıcıya Arayüz Vasıtasıyla İşlem Durumu İle
//İlgili Bilgi Veriliyor.
islem.ForeColor = System.Drawing.Color.DarkOrange; //İşlem Durumunu Gösteren Yazının Rengi
//Turuncu Olarak Değiştiriliyor.
serialPort1.Write("-"); //Mikrodenetleyici LCD Ekranının Temizlenmesi Sağlanıyor
Thread.Sleep(3000);
for (i = 0; i < harf_say; i++) //Kullanıcının Arayüz Vasıtasıyla Mikrodenetleyiciye Yolladığı Verileri
//Sırasıyla İşleme Sokuyoruz.
{
veri = metinbox.Text.Substring(j, 1); // Metinbox'a Girilen Metnin İçerisindeki Karakterleri Tek Tek
//Veri Değişkenine Atıyoruz.
j++; //Her Döngüde Bir Sonraki Karaktere Geçmek Amacıyla J'yi Bir Artırıyoruz.
serialPort1.Write(veri); //Metinden Çekilen Her Bir Karakter Her Bir Döngüde Seriporta Yazdırılıyor.
Thread.Sleep(20000); //Verilerin İletişim Sırasında Kaybolmaması ve Atlanmaması İçin İşlem
//Sırasında Arayüzü Bekletiyoruz.Kullanılmaması Durumunda İşlem Sırasında
//Bazı Karakterlerin Aktarılmadığı Gözlemlendi.
}
islem.Text = "İŞLEM BİTTİ..."; //Tüm Veriler Mikrodenetleyiciye Aktarıldıktan Sonra Kullanıcıya Arayüz
//Vasıtasıyla İşlem Durumu İle İlgili Bilgi Veriliyor.
islem.ForeColor = System.Drawing.Color.Green; //İşlem Durumunu Gösteren Yazının Rengi Yeşil Olarak
//Değiştiriliyor.
//i ve j Değişkenleri Sıfırlanıyor.
serialPort1.Write("*"); //Mikrodenetleyici LCD Ekranında "Yazdırma İşlemi Bitti" Yazması Sağlanıyor
i = 0;
j = 0;
}
catch
{
harf_say = metinbox.TextLength; //Arayüzden Yazılan Metnin Uzunluğu Alınıyor.
islem.Text = "İŞLEM DURUMU"; //İşlem Yapılırken Kullanıcıya Arayüz Vasıtasıyla İşlem Durumu İle İlgili
//Bilgi Veriliyor.
islem.ForeColor = System.Drawing.Color.Black; //İşlem Durumunu Gösteren Yazının Rengi Turuncu
//Olarak Değiştiriliyor.
bilgi.Text = "BAĞLANTI KESİLDİ "; //Bağlantı Durumu Arayüze Yazdırılıyor.
30
bilgi.ForeColor = System.Drawing.Color.Red; //Bağlantı Durumu'nun Rengi Kırmızı Olarak Değiştiriliyor.
MessageBox.Show("Yazıcı Bağlı Değil");
i = 0;
j = 0;
}
}
private void baudbox_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void refreshbtn_Click(object sender, EventArgs e) //Kullanıcı Mikrodenetleyiciyi Çıkarıp Taktığı
//Zaman Programı Kapatıp Açmak Yerine Yenileme Butonu Sayesinde
// COM Port Durumunu Güncellemesi Sağlanıyor.
{
portbox.Enabled = true;
baudbox.Enabled = true;
baglanbtn.Enabled = true;
puntobox.Enabled = false;
gonderbtn.Enabled = false;
kesbtn.Enabled = false;
serialPort1.Close();
bilgi.Text = "BAĞLANTI KESİLDİ "; //Bağlantı Durumu Arayüze Yazdırılıyor.
bilgi.ForeColor = System.Drawing.Color.Red; //Bağlantı Durumu'nun Rengi Kırmızı Olarak Değiştiriliyor.
portbox.Items.Clear(); //Portbox İtemleri Siliniyor.
portbox.Text = " "; //Portbox'ın Üzerinde Yazan Port'un İsmi Siliniyor.
string[] ports = SerialPort.GetPortNames(); //Seri Port'a Takılı Olan Port İsimleri Alınıp Diziye Atanıyor.
//İsimleri Alinan Portlar Portbox Combobox'ına Ekleniyor.
foreach (string port in ports)
{
portbox.Items.Add(port);
portbox.SelectedIndex = 0;
}
}
}
}
31
4.4 CCS C Kodları
//*YAZI YAZAN ROBOT * CCS C KODLARI*
//---------------------------------------------------
#include <16F877A.h> //Kullandıgimiz Microcontroller'in Kutuphanesi Eklendi.
#fuses XT,NOWDT,NOLVP,NOBROWNOUT,NOPROTECT // Harici Kristal Belirtildi.
#use delay(clock=4M)//4 Mhz Kristal Belirtildi.
#define MOTOR_X_STEP PIN_B1 //X Ekseninde Hareket Edecek Olan Step Motor'un Step Sinyalini Alacagi Cikis Belirtildi.
#define MOTOR_Y_STEP PIN_B2//Y Ekseninde Hareket Edecek Olan Step Motor'un Step Sinyalini Alacagi Cikis Belirtildi.
#define MOTOR_X_DIR PIN_B0//X Ekseninde Hareket Edecek Olan Step Motor'un Direction Sinyalini Alacagi Cikis Belirtildi.
#define MOTOR_Y_DIR PIN_B4//Y Ekseninde Hareket Edecek Olan Step Motor'un Direction Sinyalini Alacagi Cikis Belirtildi.
#define SONRAKI PIN_B5//Sonraki Harfe Gecmemizi Saglayan Buton Cikisi Belirtildi.
#define ONCEKI PIN_B6//Önceki Harfe Gecmemizi Saglayan Buton Cikisi Belirtildi.
#define BASLAT PIN_B7//Harf Yazdirmaya Baslamamızı Saglayan Buton Cikisi Belirtildi.
#define SERVO PIN_C3//Servo Motorun Sinyali Alacagi Cikis Belirtildi.
#include <lcd.c> //16*2 LCD Tanımlaniyor.
#use rs232 (baud=9600, xmit=PIN_C6 , rcv=PIN_C7,restart_wdt) //C# Arayüzü ile Haberleşme için İletişim Port ve Baudrate Tanimlamalari
int16 xpos=0 , ypos=0 , son_ypos=0 ,son_xpos=0 ; //Pozisyon Degiskenleri
int16 i=0, j=0 ,k=0 ,s=0, a=0; //Döngülerde ve Fonksiyonlarda Kullanılmak Uzere Tanimlanmis Harf Degiskenleri
//------------------------TANIMLANAN KONUM FONKSIYONLARI---------------------------//
/*Burada Tanimlanan Fonksiyonlarin Amaci Kodu Kisaltmaktir.Her Harfi ve Rakami Tek Tek Kendi Fonksiyonu
Icinde Tanimlamak Yerine Buradaki Konum Fonksiyonlarini Cagirarak Motorlarimiza Gerekli Hareketi Verebiliyoruz.*/
void motor_asagi(int pos) //Step Motoru Asagi Yonde Hareket Ettirme Fonksiyonu
{
son_ypos = ypos + pos; // Pozisyondan Baska Bir Pozisyona Gecildiginde Degisken Son Pozisyon Bilgisini Yeni Bir Degiskene Atiyoruz.
output_high(MOTOR_Y_DIR); //y Eksenindeki Motorun Yonu Ayarlaniyor.
for(i = ypos ; i<son_ypos ; i++) //for Dongusu Ile Step Motor Suruluyor.
{
output_high(MOTOR_Y_STEP);
output_low(MOTOR_Y_STEP);
delay_ms(10);
}
write_eeprom(1,son_ypos/10); //y'nin EEPROM'da Kaydedilmesi Saglaniyor.
ypos = son_ypos; //son_ypos Tekrar ypos Degiskenine Ataniyor.
return;
}
32
void motor_sol(int pos)//Step Motoru Sol Yonde Hareket Ettirme Fonksiyonu
{
son_xpos = xpos - pos; // Pozisyondan Baska Bir Pozisyona Gecildiginde Degisken Son Pozisyon Bilgisini Yeni Bir Degiskene Atiyoruz.
output_high(MOTOR_X_DIR); //x Eksenindeki Motorun Yonu Ayarlaniyor.
for(i = xpos ; i>son_xpos ; i--) //for Dongusu Ile Step Motor Suruluyor.
{
output_high(MOTOR_X_STEP);
output_low(MOTOR_X_STEP);
delay_ms(10);
}
write_eeprom(0,son_xpos/10); //x'in EEPROM'da Kaydedilmesi Saglaniyor.
xpos = son_xpos; //son_xpos Tekrar xpos Degiskenine Ataniyor.
return;
}
void motor_yukari(int pos) //Step Motoru Yukari Yonde Hareket Ettirme Fonksiyonu
{
son_ypos = ypos - pos; // Pozisyondan Baska Bir Pozisyona Gecildiginde Degisken Son Pozisyon Bilgisini Yeni Bir Degiskene Atiyoruz.
output_low(MOTOR_Y_DIR); //y Eksenindeki Motorun Yonu Ayarlaniyor.
for(i = ypos ; i>son_ypos ; i--) //for Dongusu Ile Step Motor Suruluyor.
{
output_high(MOTOR_Y_STEP);
output_low(MOTOR_Y_STEP);
delay_ms(10);
}
write_eeprom(1,son_ypos/10); //y'in EEPROM'da Kaydedilmesi Saglaniyor.
ypos = son_ypos; //son_ypos Tekrar ypos Degiskenine Ataniyor.
return;
}
void motor_sag(int pos) //Step Motoru Sag Yonde Hareket Ettirme Fonksiyonu
{
son_xpos = xpos+pos; // Pozisyondan Baska Bir Pozisyona Gecildiginde Degisken Son Pozisyon Bilgisini Yeni Bir Degiskene Atiyoruz.
output_low(MOTOR_X_DIR); //x Eksenindeki Motorun Yonu Ayarlaniyor.
for(i = xpos ; i<son_xpos ; i++) //for Dongusu Ile Step Motor Suruluyor.
{
33
output_high(MOTOR_X_STEP);
output_low(MOTOR_X_STEP);
delay_ms(10);
}
write_eeprom(0,son_xpos/10); //x'in EEPROM'da Kaydedilmesi Saglaniyor.
xpos = son_xpos; //son_xpos Tekrar xpos Degiskenine Ataniyor.
return;
}
void motor_sag_yukari(int adim,int x,int y) //Step Motoru Sag Yukarı Capraz Yonde Hareket Ettirme Fonksiyonu
{
for(k=0;k<adim;k++) //For Dongusu Ile Mekanizmaya Capraz Hareketi Vermek Icın x ve y Eksenindeki Motorlar Tek Tek Hareket Ettiriliyor.
{ //Gerekli Fonksiyonlar Teker Teker Cagiriliyor.
motor_yukari(y);
motor_sag(x);
}
k=0; //k Degiskeni Baska Fonksiyonda Kullanilacaginden Sifirlaniyor.
}
void motor_sol_yukari(int adim,int x,int y) //Step Motoru Sol Yukarı Capraz Yonde Hareket Ettirme Fonksiyonu
{
for(k=0;k<adim;k++) //For Dongusu Ile Mekanizmaya Capraz Hareketi Vermek Icın x ve y Eksenindeki Motorlar Tek Tek Hareket Ettiriliyor.
{ //Gerekli Fonksiyonlar Teker Teker Cagiriliyor.
motor_yukari(y);
motor_sol(x);
}
k=0; //k Degiskeni Baska Fonksiyonda Kullanilacaginden Sifirlaniyor.
}
void motor_sag_asagi(int adim,int x,int y) //Step Motoru Sag Asagi Capraz Yonde Hareket Ettirme Fonksiyonu
{
for(k=0;k<adim;k++) //For Dongusu Ile Mekanizmaya Capraz Hareketi Vermek Icın x ve y Eksenindeki Motorlar Tek Tek Hareket Ettiriliyor.
{ //Gerekli Fonksiyonlar Teker Teker Cagiriliyor.
motor_asagi(y);
motor_sag(x);
}
34
k=0; //k Degiskeni Baska Fonksiyonda Kullanilacaginden Sifirlaniyor.
}
void motor_sol_asagi(int adim,int x,int y) //Step Motoru Sol Asagi Capraz Yonde Hareket Ettirme Fonksiyonu
{
for(k=0;k<adim;k++) //For Dongusu Ile Mekanizmaya Capraz Hareketi Vermek Icın x ve y Eksenindeki Motorlar Tek Tek Hareket Ettiriliyor.
{ //Gerekli Fonksiyonlar Teker Teker Cagiriliyor.
motor_asagi(y);
motor_sol(x);
}
k=0; //k Degiskeni Baska Fonksiyonda Kullanilacaginden Sifirlaniyor.
}
void servo_onoff (int state) //Servo Motoru Asagi veya Yukari Ayarlamak Icin Tanimlanan Fonksiyon
{
switch (state)
{
case 0: //90 derece aci verecek
{
for(j=10;j>0;j--) //PWM Sayısı
{
output_high(SERVO);//Duty cycle
delay_us(500);
output_low(SERVO);
delay_ms(19);
delay_us(500);
}
break;
}
case 1: //180 derece aci verecek
{
for(j=10;j>0;j--)
{
output_high(SERVO);
delay_us(1500);
output_low(SERVO);
delay_ms(18);
delay_us(500);
35
}
break;
}
return;
}
}
//-------------------TANIMLANAN HARF VE RAKAM FONKSIYONLARI-----------------------//
/*Basla Fonksiyonunun Amaci; Yukarida Yazili Olan Yon ve Adim Fonksiyonlari
Vasitasiyla Step Motorlari Cesitli Harfleri ve Rakamlari Cizecek Sekilde Surmesidir.
Her Harf Icin Switch Case'lerden Yararlanilmistir.
Seri Porttan Gelen Her Bir Veri Ile Buradaki Harf,Rakam Durum Fonksiyonlari Cagirilir.
ORNEK 1: motor_asagi(200); Motor Asagi 200 Adimlik Bir Inis Yapacagini Belirtir.
ORNEK 2: servo_onoff(1); Servo Motorun Kalemi Asagi Indirecegini Belirtir.
ORNEK 3: motor_sag_yukari(25,1,2); Motorun Sag Yukari Capraz Olarak 25 Adimlik
For Dongusunde X Motorunu 1'er Y Motorunu 2'ser Adimlarla Hareket
Ettirecegini Belirtir*/
void basla(char c)
{
switch (c)
{
case 'A':
{
motor_asagi(200);
servo_onoff(1);
motor_yukari(150);
motor_sag_yukari(25,1,2);
motor_sag(50);
motor_sag_asagi(25,1,2);
motor_asagi(150);
motor_yukari(100);
motor_sol(100);
servo_onoff(0);
motor_yukari(100);
motor_sag(150);
break;
}
36
case 'B':
{
servo_onoff(1);
motor_asagi(200);
motor_sag(80);
motor_sag_yukari(20,1,1);
motor_yukari(60);
motor_sol_yukari(20,1,1);
motor_sol(80);
motor_sag(80);
motor_sag_yukari(20,1,1);
motor_yukari(60);
motor_sol_yukari(20,1,1);
motor_sol(80);
servo_onoff(0);
motor_sag(150);
break;
}
case 'C':
{
servo_onoff(1);
motor_sag(100);
motor_sol(100);
motor_asagi(200);
motor_sag(100);
servo_onoff(0);
motor_sag(50);
motor_yukari(200);
break;
}
case 'D':
{
servo_onoff(1);
motor_asagi(200);
motor_sag(80);
37
motor_sag_yukari(20,1,1);
motor_yukari(160);
motor_sol_yukari(20,1,1);
motor_sol(80);
servo_onoff(0);
motor_sag(150);
break;
}
case 'E':
{
motor_sag(100);
servo_onoff(1);
motor_sol(100);
motor_asagi(100);
motor_sag(100);
motor_sol(100);
motor_asagi(100);
motor_sag(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case 'F':
{
motor_sag(100);
servo_onoff(1);
motor_sol(100);
motor_asagi(100);
motor_sag(100);
motor_sol(100);
motor_asagi(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(150);
break;
38
}
case 'G':
{
motor_sag(100);
servo_onoff(1);
motor_sol(80);
motor_sol_asagi(20,1,1);
motor_asagi(160);
motor_sag_asagi(20,1,1);
motor_sag(80);
motor_sag_yukari(20,1,1);
motor_yukari(80);
motor_sol(70);
servo_onoff(0);
motor_yukari(100);
motor_sag(120);
break;
}
case 'H':
{
servo_onoff(1);
motor_asagi(200);
motor_yukari(100);
motor_sag(100);
motor_yukari(100);
motor_asagi(200);
servo_onoff(0);
motor_sag(50);
motor_yukari(200);
break;
}
case 'I':
{
servo_onoff(1);
motor_sag(100);
39
motor_sol(50);
motor_asagi(200);
motor_sol(50);
motor_sag(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case 'J':
{
servo_onoff(1);
motor_sag(100);
motor_asagi(160);
motor_sol_asagi(20,1,2);
motor_sol(60);
motor_sol_yukari(20,1,2);
servo_onoff(0);
motor_sag(120);
motor_yukari(190);
break;
}
case 'K':
{
servo_onoff(1);
motor_asagi(200);
motor_yukari(100);
motor_sag_asagi(100,1,1);
servo_onoff(0);
motor_yukari(200);
servo_onoff(1);
motor_sol_asagi(100,1,1);
servo_onoff(0);
motor_sag(150);
motor_yukari(100);
break;
40
}
case 'L':
{
servo_onoff(1);
motor_asagi(200);
motor_sag(100);
servo_onoff(0);
motor_sag(50);
motor_yukari(200);
break;
}
case 'M':
{
motor_asagi(200);
servo_onoff(1);
motor_yukari(200);
motor_sag_asagi(50,1,2);
motor_sag_yukari(50,1,2);
motor_asagi(200);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case 'N':
{
motor_asagi(200);
servo_onoff(1);
motor_yukari(200);
motor_sag_asagi(100,1,2);
motor_yukari(200);
servo_onoff(0);
motor_sag(50);
break;
}
41
case 'O':
{
motor_sag(20);
servo_onoff(1);
motor_sol_asagi(20,1,1);
motor_asagi(160);
motor_sag_asagi(20,1,1);
motor_sag(60);
motor_sag_yukari(20,1,1);
motor_yukari(160);
motor_sol_yukari(20,1,1);
motor_sol(60);
servo_onoff(0);
motor_sag(150);
break;
}
case 'P':
{
motor_asagi(200);
servo_onoff(1);
motor_yukari(200);
motor_sag(80);
motor_sag_asagi(20,1,1);
motor_asagi(80);
motor_sol_asagi(20,1,1);
motor_sol(80);
servo_onoff(0);
motor_yukari(100);
motor_sag(150);
break;
}
case 'R':
{
motor_asagi(200);
servo_onoff(1);
42
motor_yukari(200);
motor_sag(80);
motor_sag_asagi(20,1,1);
motor_asagi(60);
motor_sol_asagi(20,1,1);
motor_sol(80);
motor_sag_asagi(100,1,1);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case 'S':
{
motor_sag(100);
servo_onoff(1);
motor_sol(80);
motor_sol_asagi(20,1,1);
motor_asagi(60);
motor_sag_asagi(20,1,1);
motor_sag(60);
motor_sag_asagi(20,1,1);
motor_asagi(60);
motor_sol_asagi(20,1,1);
motor_sol(80);
servo_onoff(0);
motor_yukari(200);
motor_sag(150);
break;
}
case 'T':
{
servo_onoff(1);
motor_sag(100);
motor_sol(50);
motor_asagi(200);
43
servo_onoff(0);
motor_yukari(200);
motor_sag(100);
break;
}
case 'U':
{
servo_onoff(1);
motor_asagi(200);
motor_sag(100);
motor_yukari(200);
servo_onoff(0);
motor_sag(50);
break;
}
case 'V':
{
servo_onoff(1);
motor_sag_asagi(50,1,4);
motor_sag_yukari(50,1,4);
servo_onoff(0);
motor_sag(50);
break;
}
case 'Y':
{
servo_onoff(1);
motor_sag_asagi(50,1,2);
motor_sag_yukari(50,1,2);
motor_sol_asagi(50,1,2);
motor_asagi(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(100);
break;
44
}
case 'Z':
{
servo_onoff(1);
motor_sag(100);
motor_sol_asagi(100,1,2);
motor_sag(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case '1':
{
motor_asagi(20);
servo_onoff(1);
motor_sag_yukari(20,1,1);
motor_asagi(200);
motor_sol(50);
motor_sag(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case '2':
{
servo_onoff(1);
motor_sag(100);
motor_asagi(100);
motor_sol(100);
motor_asagi(100);
motor_sag(100);
servo_onoff(0);
motor_yukari(200);
45
motor_sag(50);
break;
}
case '3':
{
servo_onoff(1);
motor_sag(100);
motor_asagi(100);
motor_sol(100);
motor_sag(100);
motor_asagi(100);
motor_sol(100);
servo_onoff(0);
motor_yukari(200);
motor_sag(150);
break;
}
case '4':
{
servo_onoff(1);
motor_asagi(100);
motor_sag(100);
motor_yukari(100);
motor_asagi(200);
servo_onoff(0);
motor_yukari(200);
motor_sag(50);
break;
}
case '5':
{
motor_sag(100);
servo_onoff(1);
motor_sol(100);
motor_asagi(100);
46
motor_sag(100);
motor_asagi(100);
motor_sol(100);
servo_onoff(0);
motor_sag(150);
motor_yukari(200);
break;
}
case '6':
{
motor_sag(100);
servo_onoff(1);
motor_sol(100);
motor_asagi(200);
motor_sag(100);
motor_yukari(100);
motor_sol(100);
servo_onoff(0);
motor_sag(150);
motor_yukari(100);
break;
}
case '7':
{
servo_onoff(1);
motor_sag(100);
motor_asagi(200);
servo_onoff(0);
motor_sag(50);
motor_yukari(200);
break;
}
case '8':
{
servo_onoff(1);
47
motor_asagi(200);
motor_sag(100);
motor_yukari(200);
motor_sol(100);
motor_asagi(100);
motor_sag(100);
servo_onoff(0);
motor_sag(150);
motor_yukari(100);
break;
}
case '9':
{
motor_asagi(200);
servo_onoff(1);
motor_sag(100);
motor_yukari(200);
motor_sol(100);
motor_asagi(100);
motor_sag(100);
servo_onoff(0);
motor_sag(50);
motor_yukari(100);
break;
}
case '0':
{
servo_onoff(1);
motor_asagi(200);
motor_sag(100);
motor_yukari(200);
motor_sol(100);
servo_onoff(0);
motor_sag(150);
break;
}
48
case ' ':
{
if(s!=0) //s = 0 Degilse Yazicinin Imleci En basta Degildir.O Zaman Imlec
//Bir Yana Kayarak Bosluk Karakterini Olusturabilir.
{
motor_sag(150); //Bosluk Olusturmak Icin Kullanilan Fonksiyon
}
if(s==0) //s = 0 ise Imlec Ilk Bastadir ve Ilk Basta Gereksiz Bosluk Karakteri
//Olusturulmasi Istenmez Bunun Icın Burada Seri Iletisimde Gelen Veriyi
//Saymak Icın Kullandigimiz ve Her Gelen Veride 1 Artirdigimiz s Degiskenini
//Gereksiz Yere Yazdirilmayan Bir Harf Icin Artirmak Istemeyiz.
//Artirilan S Degiskenini Burada s = 0 Sarti Icin -1 Azaltiyoruz.
{
s--;
}
break;
}
case '-': //LCD'ye Islem Durumunu Yazdiran ve Seri Iletisimle Arayuzden Gelen '-' Karakteri
{
s--; //Harf veya Rakam Yazdirilmadigindan Gereksiz Artirilan s Degiskenini -1 Azaltiyoruz.
printf(lcd_putc,"\f"); //LCD Temizlendi.
lcd_gotoxy(1,1); //LCD Imleci 1,1 Konumuna Gidiyor.
printf(lcd_putc,"ISLEM SURUYOR..."); //LCD'ye Yazdiriliyor.
lcd_gotoxy(1,2); //LCD Imleci 1,2 Konumuna Gidiyor.
printf(lcd_putc,"BEKLEYINIZ..."); //LCD'ye Yazdiriliyor.
break;
}
case '+': //LCD'ye Islem Durumunu Yazdiran ve Seri Iletisimle Arayuzden Gelen '+' Karakteri
{
s--; //Harf veya Rakam Yazdirilmadigindan Gereksiz Artirilan s Degiskenini -1 Azaltiyoruz.
printf(lcd_putc,"\f"); //LCD Temizlendi.
lcd_gotoxy(1,1); //LCD Imleci 1,1 Konumuna Gidiyor.
printf(lcd_putc,"CIHAZ BAGLI!.."); //LCD'ye Yazdiriliyor.
break;
}
49
case '&': //LCD'ye Islem Durumunu Yazdiran ve Seri Iletisimle Arayuzden Gelen '&' Karakteri
{
s--; //Harf veya Rakam Yazdirilmadigindan Gereksiz Artirilan s Degiskenini -1 Azaltiyoruz.
printf(lcd_putc,"\f"); //LCD Temizlendi.
lcd_gotoxy(1,1); //LCD Imleci 1,1 Konumuna Gidiyor.
printf(lcd_putc,"BAGLANTI KOPTU!"); //LCD'ye Yazdiriliyor.
break;
}
case '*': //LCD'ye Islem Durumunu Yazdiran ve Seri Iletisimle Arayuzden Gelen '*' Karakteri
{
s--; //Harf veya Rakam Yazdirilmadigindan Gereksiz Artirilan s Degiskenini -1 Azaltiyoruz.
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"YAZDIRMA ISLEMI");
lcd_gotoxy(1,2);
printf(lcd_putc,"BITTI!..");
break;
}
}
return;
}
//----------------------SERI PORT HABERLESME KESMESI--------------------------//
#int_rda //Haberlesme Seri Iletisim Kesmesi
void seri_kesme()
{
disable_interrupts(int_rda);
basla(getc()); // Seri Porttan Her Bir Gelen Verinin Yazdirilmasi
//Icin Basla Fonksiyonu Calistiriliyor.
s++; //Her Gelen Veri Satir Sinir Islemlerini Yapmak Icin Sayiliyor
delay_ms(5);
if(s==10) //Mekanizma Satirda 10'dan Fazla Karakter Yazamadigindan 10 Karakterden
//Sonra Imlec Bir Asagi Sutuna Inmeli
{
50
if(read_eeprom(0)!=0) //Eepromda x Konumu Sifir Olarak Kayitli Degilse
{
output_high(MOTOR_X_DIR); //-X Yonu Tanimlandi
for(i = xpos ; i>0 ; i--) //Xpos Sifirlaniyor X Ana Konumunda Donuyor.
{//Step Motor Suruluyor.
output_high(MOTOR_X_STEP);
output_low(MOTOR_X_STEP);
delay_ms(10);
}
write_eeprom(0,1); //Eeprom'daki X Konumu 0 Yapildi.
xpos = 1; //Konum Degerlerini Eeprom Almadigindan 10'a Bolerek Eeprom'da
//Sakliyoruz.10'a Bolmek xpos = 0 Oldugunda 0 /10 Durumundan
//Oturu Beklenmeyen Sonuclar Veriyor.Bundan Dolayi Xpos = 1 Yapiyoruz.
}
s=0; //Bir Sonraki Satira Indigimizde Imlecimiz Ilk Konumda Oldugundan s = 0 Yapiyoruz.
servo_onoff(0); //Kalemi Yukari Kaldiriyoruz.
motor_asagi(250); //Motoru Asagi Indiriyoruz.
}
}
//-------------------ANA (MAIN) FONKSIYONU-----------------------//
void main()
{
setup_adc(ADC_OFF); //Analog Dijital Cevirici Kapali Olarak Ayarlandi.
setup_adc_ports(NO_ANALOGS); //Analog Cikislar Kullanilmayacak.
enable_interrupts(GLOBAL); //Kesmeler Acildi.
set_tris_d(0x00); //D Portu Cikis Olarak Kullanilacak.
output_d(0x00); //D Portu Cikislari 0'dir.
lcd_init(); //LCD’yi Kullanima Hazirla.
lcd_gotoxy(1,1); //LCD Imlecini 1,1 Konumuna Al.
printf(lcd_putc,"YAZI YAZAN ROBOT"); //LCD'ye Yazdirildi.
for(a=1;a<17;a++) //For Dongusu Vasitasiyla LCD'nin 2. Satirina Yildizlar
//Sirasiyla Cizdiriliyor
{
lcd_gotoxy(a,2);
printf(lcd_putc,"*");
delay_ms(200);
51
}
delay_ms(1000);
printf(lcd_putc,"\f"); //LCD Temizlendi.
lcd_gotoxy(1,1); //LCD Imleci 1,1 Konumuna Gitti.
/*
lcd_gotoxy(1,1);
printf(lcd_putc,"----KONUMLAR----");
lcd_gotoxy(1,2);
printf(lcd_putc,"--SIFIRLANIYOR--");
xpos=read_eeprom(0);
ypos=read_eeprom(1);
if(xpos==0){
xpos=1;}
if(ypos==0){
ypos=1;}
xpos=xpos*10;
ypos=ypos*10;
if(read_eeprom(0)!=0)
{
output_high(MOTOR_X_DIR);
for(i=xpos;i>0;i--){
output_high(MOTOR_X_STEP);
output_low(MOTOR_X_STEP);
delay_ms(10);
}
write_eeprom(0,1);
xpos=1;
}
if(read_eeprom(1)!=0)
{
output_low(MOTOR_Y_DIR);
for(i=ypos;i>0;i--){
output_high(MOTOR_Y_STEP);
output_low(MOTOR_Y_STEP);
delay_ms(10);
}
52
write_eeprom(1,1);
ypos=1;
}
*/
printf(lcd_putc,"VERI BEKLENIYOR."); //LCD'ye Yazdiriliyor ve PC'den Veri Bekleniyor.
while(TRUE) //Sonsuz Dongude PC'den Veri Bekleniyor ve Beklenen Veriler Isleniyor.
{
enable_interrupts(int_rda); //Iletisim Kesmesi.
}
}
53
SONUÇ
5.1 YAZI YAZAN ROBOT
Şekil 5.1’de Yazı Yazan Robot’un üretilmiş hali görülmektedir.
Şekil 5.1 Yazı Yazan Robot
5.2 YAZI YAZAN ROBOT İLE ALINAN BASKI
Aşağıda, Şekil 5.2’ de Yazı Yazan Robot’un başarılı bir şekilde yazı yazdığı ilk örneklerden biri
görülmektedir.
Şekil 5.2 Yazı Yazan Robot ile Alınan Baskı