Arduino 301
Arduino 301
Hatırlatma: Kullandığınız kartın üzerindeki PWM çıkışları öğrenmek için Arduino'nun web sitesine
bakabilirsiniz.
PWM sinyali daha önce servo motor kontrolünde öğrenmiştik. Arduino üzerinden üretilin analog
sinyal aslında bir PWM sinyalidir. Analog çıkışın gerilimi, PWM sinyalinin görev zamanıyla (duty
cycle) doğru orantılı olarak değişmektedir. Örneğin %50 görev zamanına sahip bir PWM sinyali
üretildiğinde çıkış geriliminin 2,5 volt olduğu görülmektedir.
Aşağıdaki resimde PWM sinyalinin görev zamanıyla çıkış gerilimi arasındaki doğru orantı
gösterilmiştir:
Her ne kadar analog çıkış denilse bile aslında bu pinlerden PWM sinyali üretildiği için, bazı
uygulamalarda alçak geçiren filtre kullanılması gerekebilir. Alçak geçiren filtre, yüksek frekansa
sahip sinyalleri süzerek sadece düşük frekanstaki sinyallerin kullanılmasını sağlar, yani sinyali
yumuşatır. Bu filtre PWM sinyaline uygulandığında dalga tepeleri ve çukurlarını birleştirerek,
dalga tepesi ve çukurları oranında sabit bir çıkış gerilimi sağlamaktadır.
Alçak geçiren filtrenin devre şeması aşağıdaki resimde gösterilmiştir. Bu filtredeki direnç ve
kapasitenin değerine göre, filtrenin hassasiyeti değiştirilebilir.
Motorların hız kontrolü ve LED ışığın parlaklığının ayarlanması gibi projelerde alçak geçiren filtre
kullanılmasına gerek yoktur. Bu filtre sadece kesin olarak sabit analog değere ihtiyaç duyan
hassas uygulamalarda kullanılmaktadır.
Analog sinyalin üretilmesi için, daha önce temel Arduino fonksiyonlarında öğrendiğimiz
analogWrite fonksiyonu kullanılır. Bu fonksiyon iki giriş değişkenine ihtiyaç duymaktadır. Bu
değişkenlerden ilki analog çıkışın yapılacağı pini belirler. İkinci değişken ise çıkış geriliminin
belirleyecek PWM sinyalinin görev zamanıdır. Buraya 0 ile 255 arasındaki değerler yazılır.
Fonksiyona 0 değeri yollandığında bu pinden 0 volt, 255 değeri yollandığında 5 volt düzeyinde
çıkış gerilimi alınır.
Çıkış gerilimi 0 - 255 değerleriyle doğru orantılı olarak değişmektedir. Örneğin, 3,3 volt çıkış
gerilimine sahip olmak için fonksiyona 168 değeri yazılmalıdır. Bu sinyal Arduino'nun 10. pininden
alınmak istenseydi fonksiyon analogWrite(10,168); şeklinde yazılırdı.
Değişken Parlaklığa Sahip LED Işık
Bu uygulamada, Arduino'ya bağlanan 3 farklı LED'in parlaklıkları üretilen analog sinyallerle ayrı
ayrı kontrol edilmektedir. Arduino her 500 milisaniyede bir 1. LED'in parlaklığını azaltırken, 3.
LED'in parlaklığını artırmaktadır. 2. LED'in parlaklığı ise 'LEDParlaklıgi' dizisindeki rastgele
parlaklık değerlerine göre kontrol edilmektedir. Bu uygulamadaki amaç analogWrite fonksiyonuyla
analog sinyalin nasıl üretildiğini öğrenmek ve fonksiyona verilen değerlerle sinyalin değişimini
gözlemlemektir.
1 x Arduino
1 x breadboard
3 x LED
3 x 220 ohm direnç
/*
LED Parlaklıklarının tutulduğu değişkenler tanımlandı
LED1 tam yanık pozisyona, LED3 tam sönük pozisyonda başlatılacak
LED2 rastgeleParlakliklar dizisinden parlaklık değerlerini alacak
*/
int LED1Parlakligi = 255,LED2Parlakligi=0,LED3Parlakligi = 0;
void loop()
{
/* LED1 parlaklığı LED1Parlakligi değişkeninin değeri olarak
ayarlandı */
analogWrite(LED1,LED1Parlakligi);
/* LED1 parlaklığı bir azaltıldı */
LED1Parlakligi --;
/* Eğer LED1 parlaklığı 0'dan az olur ise tam yanık pozisyona
ayarlandı */
if(LED1Parlakligi < 0)
LED1Parlakligi = 255;
delay(25);
}
Yukarıda belirtildiği gibi devre kurulduktan sonra Arduino'ya kod yüklenmelidir. analogWrite
fonksiyonuyla LED parlaklıkları istenilen değere ayarlanmıştır. Bu bölümde analogWrite
fonksiyonu kullanılarak 0 ile 5 volt arasındaki gerilimlerin projelere uygun olarak nasıl üretildiğini
öğrenmiş olduk.
Arduino ile DC Motor Sürme
Arduino projeleri denildiğinde akla ilk gelen DC motorla kontrol edilen otonom araçlardır. Bu
bölümde DC motorun Arduino ile nasıl kontrol edileceğini öğreneceğiz. DC motorun ileri veya geri
dönmesinin yanında, dönme hızını da Arduino üzerinden kontrol edeceğiz. Arduino pinlerinden
verilebilen akım motorları çalıştırmak için yeterli olmamaktadır. Bu yüzden DC motorlar, motor
sürücülerle kullanılmalıdır. Motor sürücüsü kullanmadan doğrudan motoru Arduino'ya bağlamak,
Arduino'nun pinlerine zarar verebilir.
DC motorları kullanmak için motor sürücüsünü hazır devre kartı olarak alabileceğiniz gibi kendiniz
de devreyi kurabilirsiniz. Fakat devre üzerinde çok fazla bağlantı olduğu için, devreye yeni
fonksiyonlar da eklendiğinde devre karışıklığı artmaktadır.
Sistemin nasıl çalıştığını kavrayabilmek için bir kereye mahsus olsa da devrenin hazır kart
kullanılmadan kurulması yararlı olabilir. DC motorlar için Arduino pinlerinden çıkan akımı
kuvvetlendirmek ve motorların hızını kontrol etmek için L298 entegresini kullanacağız. Benzer
entegreler de aynı görevi yapmaktadır. L298 entegresinin en önemli özellikleri, 2 ampere kadar
dayanabilmesi ve iki adet H köprüsünün bulunmasıdır.
Not: H Köprüsü DC motorların ileri ve geri yönde hareket etmesini sağlayan devredir. Devrede 2
adet NPN ve 2 adet PNP transistör bulunur.
Hatırlatma: PWM sinyali daha önce öğrendiğimiz gibi bir kare sinyaldir. Bu sinyalin 5 volt ve 0
volt düzeylerinin oranına görev zamanı denir. Görev zamanı çıkış sinyalinin genliğini belirlediği
için motorların dönme hızını ayarlamada kullanılır. Motorlar için PWM sinyalini üretmek için
Arduino'nun analogWrite fonksiyonunu kullanacağız.
VSS (LOGIC SUPPLY voltAGE – 9. pin): Adından da anlaşıldığı gibi bu pinin 5 volta
bağlanması gerekmektedir. Devrenin kararsızlığını azaltmak için bu pinle toprak arasına
100nF'lık kondansatör bağlanabilir.
GND (8. pin): Besleme hattının devreyi tamamlayabilmesi için bu pin toprak hattına
bağlanması gerekir. Ayrıca entegrenin üzerindeki demir de GND pinine bağlıdır. Bu
metalin devre kurulumunda yanlış pinlere değip kısa devre yapmamasına özen
göstermek gerekir.
VS (4. pin): Entegrenin motorlara vereceği enerjiyi aldığı ana besleme hattıdır. Bu hatta
bağlanacak enerji kaynağı motorlara verileceği için, motorlarımızın özelliğine göre
besleme gerilimi kullanmalıyız. Genellikle bu hatta 7 ila 12 volt arasında besleme
kaynakları bağlanmaktadır.
Entegre üzerinde bulunan pinlerin görevlerini öğrendiğimize göre motor sürücü devresini
kurabiliriz. Devreyi test etmek için öncelikle breadboard üzerinde devre elemanını yerleştirip kablo
bağlantılarını yapalım. Devre için kullanılacak Arduino kodu, konunun ilerleyen kısmında
paylaşılacaktır. Devrenizin hatasız olarak çalıştığından emin olduktan sonra devrenizi delikli
pertinaks üzerine kurabilirsiniz.
Yukarıda anlatılan tüm işlemler ilk defa motor sürücüsüyle tanışanlar için anlatılmıştır. Her
projede tekrardan motor sürücüsünü kurmak hem zahmetli olmakta, hem de devrenin
fonksiyonları arttığında karmaşıklığı arttırmaktadır. Bu yüzden piyasada bulunan hazır motor
sürücüleri kullanmak daha mantıklıdır. Fakat hazır motor sürücüler kullanılsa bile sistemin nasıl
çalıştığının bilinmesinde fayda vardır.
Piyasada Arduino üzerine direkt olarak takılabilen shield sürücüler bulunduğu gibi, harici olarak
pinle Arduino'ya bağlanabilen motor sürücüler de bulunur. İki motor sürücü türü de aynı işlemi
yapmaktadır. Shield tarzı motor sürücülerin kullanımı daha kolaydır, fakat fiyatları diğer motor
sürücülere göre daha fazladır.
Harici Motor Sürücü Kullanımı
Shield motor sürücülere göre daha ucuz olduğu için harici motor sürücüler proje bütçesine göre
tercih edilebilmektedir. Harici motor sürücüler, bu bölümde gösterilen kendinizin kurabileceği
motor sürücülerin hazır kart şekline getirilmiş halidir. Bu sürücülerde INPUT, OUTPUT, ENABLE
ve besleme pinleri bulunur. INPUT pinleri daha önce öğrendiğimiz gibi yön kontrolünde, ENABLE
pinleri motorların dönme hızını kontrol etmede kullanılır.
Motor sürücüsünün nasıl çalıştığını bildiğimize göre kablo bağlantılarını yapmaya başlayabiliriz.
Motorlara enerji sağlayacak besleme 7-12 volt arasındaki besleme kaynaklarına bağlanmalıdır.
Mantıksal besleme 5 volt hattına ve GND ise toprak hattına bağlanmalıdır. INPUT pinleri
Arduino'nun çıkış pinlerine; ENABLE pinleri ise Arduino'nun PWM çıkış verebilen pinlerine
bağlanmalıdır. Motor pinleri sürücü yanlarında bulunan OUTPUT pinlerine bağlanmalıdır.
Not: Motorun ileri gitmesi beklenirken geri yönde dönmesi, OUTPUT pinlerinin ters bağlanmış
olduğundan kaynaklanmaktadır. Bu pinlerin yerleri değiştirilerek motorların doğru yönde dönmesi
sağlanabilir.
8 INPUT 1
9 INPUT 2
13 INPUT 3
12 INPUT 4
11 ENABLE A
10 ENABLE B
Motor1 + OUTPUT 1
Motor1 - OUTPUT 2
Motor2 + OUTPUT 3
Motor2 - OUTPUT 4
+5 volt VS
Devre kurulumunu yaptığımıza göre aşağıdaki kodu Arduino'ya yükleyerek devremizi test edelim.
Kendi motor sürücüsünü kurmuş olanlar da aşağıdaki Arduino kodunu kullanabilirler.
int DonmeHizi = 175;
/* bu değişken ile motorların dönme hızı kontrol edilebilir */
void dur()
{
/* Tüm motorlar kitlenerek durma sağlanıyor */
digitalWrite(sagileri, HIGH);
digitalWrite(saggeri, HIGH);
digitalWrite(solileri, HIGH);
digitalWrite(solgeri, HIGH);
}
void setup(){
/* motorları kontrol eden pinler çıkış olarak ayarlanıyor */
pinMode(sagileri,OUTPUT);
pinMode(saggeri,OUTPUT);
pinMode(solileri,OUTPUT);
pinMode(solgeri,OUTPUT);
pinMode(sagenable,OUTPUT);
pinMode(solenable,OUTPUT);
}
void loop(){
ileri(DonmeHizi);
delay(1000);
dur();
delay(1000);
solaDon(DonmeHizi);
delay(1000);
dur();
delay(1000);
sagaDon(DonmeHizi);
delay(1000);
dur();
delay(1000);
geri(DonmeHizi);
delay(1000);
dur();
delay(1000);
}
Yukarıdaki kodla motorlar dönmeye başlamalıdır. Eğer motorların dönmesinde bir sorun var ise,
öncelikle kablo bağlantılarınızı gözden geçiriniz. INPUT pinleri hatalı bağlanmış olabilir, birbiri
arasında yerlerini değiştirmeyi deneyebilirsiniz. Motorun ileri yönde dönmesi beklenirken geri
yönde dönüyorsa motor bağlantılarının yerini değiştirebilirsiniz.
Bu bölümde Arduino ile DC motor kontrolünün nasıl yapıldığını öğrenmiş olduk. Motor kontrolü
için gereken motor sürücülerin türlerini ve kendimiz nasıl motor sürücü yapacağımızı da öğrendik.
Artık hareket gerektiren projelerimizde motor sürücüler yardımıyla DC motorlarımızı kullanabiliriz.
Fark edildiği gibi normal motor sürücülerden farklı olarak tek pinle ileri ve geri yön kontrolü
yapılmaktadır. Yön pinlerinin 5 volt yada 0 volt olmasına göre motor ileri veya geri yönde
dönmektedir. Fren pini ise motorun durmasını sağlamaktadır.
Örneğin motorlardan birini harekete geçirmek için öncelikle motorun döneceği yönü belirlemek
için yön pinini 5 volt veya 0 volt düzeyine çekmeliyiz. İleri yönde dönmesi için bu pin 5 volt, geri
yönde dönmesi için 0 volt düzeyine getirilmelidir. Yön ayarlandıktan sonra motorun dönmesi için
fren pini 0 volt düzeyine getirilmelidir. Motorun hızının ayarlanması için hız pinine analogWrite
fonksiyonuyla 0-255 arasında hız bilgisi gönderilmelidir.
Shield doğrudan Arduino üzerine takıldığı için harici olarak devre kurulmasına gerek
kalmamaktadır. Motor ve besleme bağlantısını aşağıdaki resimde gösterildiği gibi shield üzerine
bağlanmalıdır.
Motor shield Arduino üzerine şekildeki gibi yerleştirildikten ve pin bağlantıları resimdeki gibi
yapıldıktan sonra Arduino programlanabilir. Aşağıdaki programla iki motor ayrı ayrı kontrol
edilmiştir. Program çalıştığında iki motor da 1 saniye boyunca ileri yönde dönmektedir. Daha
sonra motorlar 1 saniye boyunca fren yapmakta ve bir saniye sonunda iki motor farklı yönlerde
dönmeye başlamaktadır.
Dikkat! Aşağıdaki Arduino kodu sadece motor shield'larla çalışmaktadır. Diğer motor sürücüler
için Arduino kodu konunun ilerleyen bölümlerinde paylaşılacaktır.
void dur(){
digitalWrite(9, HIGH); /* fren yapıldı */
digitalWrite(8, HIGH); /* fren yapıldı */
}
void setup() {
/* A motorunun ayarları */
pinMode(12, OUTPUT); /* yön pini çıkış olarak ayarlandı */
pinMode(9, OUTPUT); /* Fren pini çıkış olarak ayarlandı */
/* B motorunun ayarları */
pinMode(13, OUTPUT); /* yön pini çıkış olarak ayarlandı */
pinMode(8, OUTPUT); /* Fren pini çıkış olarak ayarlandı */
}
void loop(){
ileri(DonmeHizi);
delay(1000);
dur();
delay(1000);
solaDon(DonmeHizi);
delay(1000);
dur();
delay(1000);
sagaDon(DonmeHizi);
delay(1000);
dur();
delay(1000);
geri(DonmeHizi);
delay(1000);
dur();
delay(1000);
}
Servo Motor
Servo motor 0 ila 180 derece arasında 1 derece hassasiyetle dönebilen motor çeşididir. Tam tur
atamaz. Genellikle robot kol gibi tam tur dönmesine gerek olmayan, hassas açılı yerlerde
kullanılır. Servo motor içerisinde bir adet DC motor bulunur. DC motorun ucuna bağlı dişli
sisteminin yardımıyla servo mili daha fazla yük kaldırabilmektedir. Bu işlem sırasında servonun
dönüş hızı da yavaşlamış olur. Kullanılan dişli sistemine göre servo motorların kaldırabileceği yük
değişir.
Servoların kaldırabileceği yük tork gücü üzerinden ifade edilir. Servo motorların torku, motor
miline bağlı 1 cm uzunluğundaki çubuğun kaldırabileceği maksimum yük olarak tarif edilir.
Piyasada bulunan servolar genellikle 1,4 [Link] torka sahiptir. Bu da demek oluyor ki, motor
milinize bağlı 1 cm uzunluğunda bir çubuk varsa ve bu çubuğun ucuna bağlı yük 1,4 kilogramdan
fazlaysa motorunuzun gücü mili döndürmeye yetmez. Eğer çubuğun uzunluğu 10 cm ise en fazla
140 gram kaldırabilirsiniz.
Kaliteli dişli sistemine sahip daha güçlü servo motorlar da vardır. Projede kullanılacak servo
motorun seçimi, taşıyacağı maksimum yüke göre yapılmalıdır.
Servo motorun üç adet bağlantı kablosu bulunmaktadır. Bu kablolar genellikle kırmızı, turuncu
(bazen sarı) ve siyah (bazen kahverengi) olmaktadır. Bu renkler kabloların görevini
göstermektedir. Kırmızı renk besleme (genellikle 5 volt) bağlantısını, siyah veya kahverengi renk
de toprak bağlantısını göstermektedir. Geriye kalan turuncu kablo ise motorun açısını
belirleyecek olan veri bağlantısıdır. Motorun dönüş açısının belirlenmesi için veri hattı üzerinden
PWM adı verilen özel kare dalga sinyalleri yollanmaktadır. PWM sinyali belirli bir süre 5 volt, belirli
bir süre 0 volt düzeyinde verilen gerilimdir. 5 volt düzeyinde geçen süreye "görev zamanı", toplam
süreye de "PWM periyodu" denir. Servo motorun kontrolü için ayarlanmış özel görev zamanları
ve PWM periyotları vardır. Bu ayarlar dışındaki PWM sinyalleri servo motoru düzgün çalıştıramaz.
Arduino’da servo motor kontrolü için özelleştirilmiş PWM pinleri bulunmaktadır. PWM pin sayısı
Arduino’nun türüne göre değişmektedir. Bu pinlerin yanında dalga (~) işareti bulunmaktadır.
Servo motor kontrolü için öncelikle Servo.h kütüphanesini projemize eklemeliyiz. Servo
kütüphanesi eklendikten sonra Servo nesnesi kullanılarak yeni servo motorlar tanımlanır.
Tanımlanan servo motorın bağlı olduğu pinler seçilir ve servo kullanıma hazır hale getirilir. Motor
milinin konumunu değiştirmek için Servo nesnesinin attach metodu kullanılır. Bu metodun
içerisine motor milinin gitmesi istenilen 0-180 derece arasında açı yazılır. Servonun yeni
konumunu alması biraz zaman alabilir. Bu yüzden bekleme (Delay) komutu kullanılmalıdır.
void setup()
{
[Link](9); /* Servo motor 9 numarali pine baglandi */
}
void loop()
{
[Link](100); /* Motorun mili 100. dereceye donuyor */
delay(1000);
[Link](20); /* Motor mili 20. dereceye donuyor */
delay(1000);
}
Servo gibi mekanik içyapıya sahip elektronik elemanların kullanımına dikkat edilmelidir. Bu
elemanlar zorlanmalara bağlı olarak fazla akım çekebilir. Besleme kaynağının fazla akımlar için
yeterli olmasına dikkat edilmelidir.
Servo motorun teknik bilgilerinde önerilen besleme geriliminden fazlası, motorun iç yapısına ve
dişli sistemine zarar verebilir. Bu yüzden servo motora önerilen besleme geriliminden (genellikle 5
volt) fazlası verilmemelidir. Servo motor ve benzeri mekanik elemanların fazla akım çekmesinden
dolayı, bu elemanların besleme ve toprak bağlantıları arasına kapasitör konmalıdır. Böylece
devremiz, bu elemanların yaratacağı gerilim dalgalanmalarından korunmuş olur.
Eğer projede motor gibi fazla akım çekebilecek elemanların kullanılması gerekiyorsa bu
elemanları Arduino üzerinden beslemek doğru değildir. Bu yüzden fazla akım çekebilecek
elemanlar genellikle Arduino üzerinden değil, harici bir kaynak üzerinden beslenir. Uygulamada
servo motor Arduino üzerinden değil, harici bir pil (yaklaşık 5 volt) üzerinden beslenecektir.
Arduino ve harici besleme kaynağının toprak hatları birbirine bağlanmalıdır. Aksi halde motor
düzgün çalışmayacaktır.
#include <Servo.h> /* Servo kutuphanesi projeye dahil edildi */
void setup()
{
[Link](9); /* Servo motor 9 numarali pine baglandi */
}
void loop()
{
PotDeger = analogRead(Potansiyometre); /* Potansiyometrenin cikis
gerilimi olculuyor */
PotDeger = map(PotDeger, 0, 1023, 0, 179);
/*
Potansiyometreden olculen 0 ve 1023 arasindaki deger map
fonksiyonu ile
Servo motorun calisma araligina yani 0 ve 180 dereceye cevriliyor.
Bu fonksiyon 0 ve 1023 arasindaki degerleri, lineer olarak 0 ve
180 arasina cevirir
*/
[Link](PotDeger); /* Hesaplanan deger servo motora
yollaniyor*/
delay(15); /* Motorun konumunu almasi icin bir sure bekleniyor */
}
Dâhili EEPROM Nedir ve Nasıl Kullanılır?
EEPROM, ihtiyacımız olan değişken verilerini tutabilen, elektriksel olarak bu verileri yazıp
silebilen küçük depolama birimidir. Arduino'nun mikroişlemcisinde dâhili olarak bulunan
EEPROM'a verilerimizi kaydedebilir, istediğimiz zaman bu verileri tekrar kullanabiliriz.
Arduino'nun enerjisi kesilse dahi EEPROM'daki veriler silinmez. Bu özellikten dolayı Arduino'nun
çalışmaya başladığında ilk olarak yapması gereken önemli işlerin verileri bu alanda depolanır.
EEPROM depo alanı, Arduino'nun üzerinde bulunan mikroişlemcinin türüne göre değişmektedir.
ATmega328'in 1024 byte, ATmega168 ve ATmega8'in 512 byte, ATmega1280 ve
ATmega2560'ın ise 4 kb depolama alanı vardır. Bu alanlar projelerimiz için yeterli olacak. Yeterli
olmadığı durumlarda hafıza alanının artırılması için harici EEPROM'lar da kullanılabilir.
void setup()
{
[Link](9600); /* Bilgisayara veri göndermek için */
}
void loop()
{
/* EEPROMa veri kaydediyoruz */
kayitAdresi = 10; /* Verinin yazılacağı EEPROM adresi */
kaydedilecekVeri = 50; /* EEPROMA kaydedilecek veri */
[Link](kayitAdresi, kaydedilecekVeri); /* EEPROMun 10 adresine 50
verisi yazdırıldı. */
delay(10);
EEPROM kullanmanın yaratacağı fark görülmesi için aşağıda verilen ilk kodda EEPROM
kullanılmamıştır. İkinci kodda son açı EEPROM'a kaydedilmiş ve servonun kaldığı yerden
çalışması sağlanmıştır.
1 x Arduino
1 x Servo motor
#include <Servo.h>
Servo servoMotor;
int servoAcisi = 1;
int donusYonu = 0; /* 0 ise servo ileri, 1 ise geri yönde dönmektedir.
*/
void setup()
{
[Link](9); /* Servo Arduinonun 9 numaralı pinine takıldı */
[Link](9600);
}
void loop()
{
[Link](servoAcisi); /* Servo motoru kontrol ediyoruz */
#include <Servo.h>
#include <EEPROM.h>
Servo servoMotor;
int servoAcisi;
int donusYonu = 0; /* 0 ise servo ileri, 1 ise geri yönde dönmektedir.
*/
void setup()
{
[Link](9); /* Servo Arduinonun 9 numaralı pinine takıldı */
Sensör üzerinde VCC, Trig, Echo, GND olmak üzere 4 adet pin bulunmaktadır. Bunlardan VCC
pini besleme (5 volt), GND pini toprak hattıdır. Trig pini çıkış yüzeyinden dalganın salınmasını
sağlayan pindir. Echo pini ise giriş yüzeyine yansıyan dalganın ulaştığını Arduino'ya haber veren
pindir. Açıklamalardan da anlaşıldığı gibi Arduino'da trig pini çıkış, echo pini ise giriş olarak
ayarlanmalıdır.
long sure;
long uzaklik;
void setup(){
pinMode(trigPin, OUTPUT); /* trig pini çıkış olarak ayarlandı */
pinMode(echoPin,INPUT); /* echo pini giriş olarak ayarlandı */
[Link](9600); /* Seri haberlesme baslatildi */
}
void loop()
{
digitalWrite(trigPin, LOW); /* sensör pasif hale getirildi */
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); /* Sensore ses dalgasının üretmesi için
emir verildi */
delayMicroseconds(10);
digitalWrite(trigPin, LOW);/* Yeni dalgaların üretilmemesi için trig
pini LOW konumuna getirildi */
sure = pulseIn(echoPin, HIGH); /* ses dalgasının geri dönmesi için geçen
sure ölçülüyor */
uzaklik= sure /29.1/2; /* ölçülen sure uzaklığa çevriliyor */
if(uzaklik > 200)
uzaklik = 200;
[Link]("Uzaklik ");
[Link](uzaklik); /* hesaplanan uzaklık bilgisayara aktarılıyor
*/
[Link](" CM olarak olculmustur.");
delay(500);
}
Uygulama: Kısa menzilli radar yapımı
Uygulamada yeni öğrendiğimiz uzaklık sensörünü servo motorun üzerine bağlayarak, 0-180
derece arasındaki cisimlerin uzaklığını bulan basit bir radar yapacağız. Bunun için servo motoru
10 derecelik açılarla döndürüp, o açıdaki maksimum uzaklığı ölçeceğiz. Uzaklığı daha kolay
ölçebilmek için bu uygulamamızda "mesafeOlcumu” fonksiyonunu tanımlayacağız. Servonun
10'ar derecelik açılarla dönmesini sağlayabilmek için 2 tane for döngüsü kullanılacaktır. Her 10
derecelik açılardaki maksimum uzaklıklar bilgisayardan görüntülenebilmesi için seri port
yardımıyla USB üzerinden bilgisayara yollanacaktır.
1 x Arduino
1 x Breadboard
1 x HC-SR04 (ultrasonik uzaklık sensörü)
1 x Servo motor
#include <Servo.h>
int aci = 0;
long mesafeOlcumu(){
long sure;
long uzaklik;
digitalWrite(trigPin, LOW); /* sensor pasif hale getirildi */
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); /* Sensöre ses dalgasının üretmesi için
emir verildi */
delayMicroseconds(10);
digitalWrite(trigPin, LOW);/* Yeni dalgaların üretilmemesi için trig
pini LOW konumuna getirildi */
sure = pulseIn(echoPin, HIGH, 11600); /* ses dalgasının geri dönmesi
icin gecen sure ölcülüyor */
uzaklik= sure /29.1/2; /* ölçülen sure uzaklığe çevriliyor */
if(uzaklik > 200 || uzaklik < 1 )
uzaklik = 200;
return uzaklik;
}
[Link]("uzaklik= ");
[Link](uzaklikDegeri);
}
void setup(){
pinMode(trigPin, OUTPUT); /* trig pini cikis olarak ayarlandi */
pinMode(echoPin,INPUT); /* echo pini giris olarak ayarlandi */
[Link](9);
void loop()
{
for(aci = 0; aci < 180; aci += 10) /* radarımız 0dan 180 kadar 10ar
10ar dönecektir */
{
[Link](aci); /* radari donduruyoruz */
delay(15); /* radarin donmesini bekliyoruz */
ekranaYazdir(aci, mesafeOlcumu());
}
for(aci = 180; aci>=1; aci-=10) /* radarımız 180dan 0 kadar 10ar 10ar
dönecektir */
{
[Link](aci); /* radarı donduruyoruz */
delay(15); /* radarın dönmesini bekliyoruz */
ekranaYazdir(aci, mesafeOlcumu());
}
}
Eğer sensörün ölçüm mesafesi içinde engel yoksa, sensörde bir miktar yavaşlama olmaktadır. Bu
durumdan kurtulmak için, eğer sensörün önünde engel yoksa zaman aşımına uğraması için
pulseIn fonksiyonunu güncelledik. Böylece belirli bir uzaklıkta engel yoksa sistem beklemeden
çalışmaya devam edecektir. PulseIn fonksiyonuna yazılan 2895 değeri sensöre ve ortama göre
değişiklik gösterebilir.
Genel Arduino Uygulamaları
Arduino ile en çok kullanılan fonksiyon ve özellikleri önceki yazılarımızda öğrendik. Artık
öğrendiklerimizle uygulamalar yapmaya başlayabiliriz. Bu bölümde yapacağımız uygulamalar
kolaydan zora doğru gitmektedir. Bölümde gösterilen uygulamaların, ilk etapta incelenmesi ve
denenmesi, daha sonra da üzerinde değişiklikler yapılarak yeni projelerin üretilmesi, Arduino
kullanımını pekiştirecektir.
Trafik Lambaları
Arduino pinlerinin kontrolünü pekiştirmek için her gün gördüğümüz trafik lambalarını Arduino ile
yapacağız. Arduino pinlerine bağlanan kırmızı, sarı ve yeşil LED'ler trafik lambalarının sırasına
göre kontrol edilecek. Buna göre program ilk başta kırmızı ışığı yakacak. Kırmızı ışık 5 saniye
yandıktan sonra sönecek ve 1 saniye boyunca sarı ışık yanacak. Sarı ışık söndükten sonra da 3
saniye boyunca yeşil ışık yanacak.
void setup()
{
/* LED pinleri çıkış olarak ayarlandı */
pinMode(kirmizi,OUTPUT);
pinMode(sari,OUTPUT);
pinMode(yesil,OUTPUT);
}
void loop()
{
kirmiziIsik();
delay(5000);
sariIsik();
delay(1000);
yesilIsik();
delay(3000);
}
Bu uygulamada tek bir trafik lambası için kodlama ve devre tasarımı yapıldı. Kendinizi geliştirmek
için, yukarıda paylaşılan koda eklemeler yaparak birden fazla trafik lambasını tek bir Arduino
üzerinden kontrol edebilirsiniz.
Çarpmayan Robot Yapımı
Bu uygulamada hemen hemen tüm robot yarışmalarındaki robotlarda kullanılan, engellerden
kaçma algoritması üzerine çalışacağız. Bunu yapabilmek için önceki konularda öğrendiğimiz DC
motor kontrolü ve ultrasonik uzaklık sensörü ile uzaklık ölçümünü kullanacağız. Bu uygulamada
öğrenilen bilgiler, robot yarışmalarında bulunan çöp toplama, labirent çözme, yangın söndürme
gibi kategorilerde kullanılabilir.
Bu projede yapılacak olan 4 tekerli robot hareket için 4x4 şeklinde, her bir tekere bağlanan DC
motorlardan oluşacak. Bu motorların kontrolü için DC motor sürücüsü kullanacağız. Uzaklık
ölçümü için HC-SR04 ultrasonik uzaklık sensörü kullanacağız.
Arduino sürekli olarak uzaklık sensöründen gelen uzaklık verisini kontrol edecek. Eğer ölçülen
uzaklık verisi 10 cm'den kısa ise robot durdurulacaktır. Robot engelden kaçmak için yaklaşık 90
derece sola dönecektir. Eğer sola döndükten sonra önünde herhangi bir engel yoksa ilerlemeye
devam edecektir. Önüne yeni bir engel geldiğinde robot, tekrar bu işlemleri yapacaktır. Böylece
robotumuz engellere çarpmadan ilerleyebilecek.
1 x Arduino
4 x Tekerlek
1 x Robot şasesi
4 x DC motor
1 x DC motor sürücüsü
1 x HC-SR04 uzaklık sensörü
Devre şemasında görüldüğü gibi aynı tarafta bulunan iki DC motor birbirine paralel olarak
bağlanmıştır. Böyle bağlanmasının nedeni bu motorun her zaman için aynı şekilde dönecek
olmasıdır. Eğer ayrı ayrı bağlanması istenseydi, o zaman iki adet DC motor sürücüye ihtiyaç
duyulurdu. Uzaklık sensörü robotun en önüne takılmıştır. Uzaklığın doğru olarak bulunması için
robotun hiçbir parçası sensörün görüş açısında bulunmamalıdır. Resimdeki devreyi robot
şasesine bağlayarak Arduino programlamaya başlayabiliriz.
8 INPUT 1
9 INPUT 2
13 INPUT 3
12 INPUT 4
11 ENABLE A
10 ENABLE B
Motor1 + OUTPUT 1
Motor1 - OUTPUT 2
Motor2 + OUTPUT 3
Motor2 - OUTPUT 4
+5 Volt VS
+5 Volt VCC
6 Trig
7 Echo
return uzaklik;
}
void ileri(int hiz){
/* ilk değişkenimiz sag motorun ikincisi sol motorun hızını
göstermektedir.
* motorlarımızın hızı 0-255 arasında olmalıdır.
* Fakat bazı motorların torkunun yetersizliğiniden 60-255
arasında çalışmaktadır.
* Eğer motorunuzdan tiz bir ses çıkıyorsa hızını arttırmanız
gerekmektedir.
*/
analogWrite(sagenable, hiz); /* sağ motorun hız verisi */
digitalWrite(sagileri,HIGH); /* ileri dönme sağlanıyor */
digitalWrite(saggeri,LOW); /* ileri dönme sağlanıyor */
void setup(){
/* Uzaklık sensörünün pinleri ayarlanıyor */
pinMode(trigPin, OUTPUT); /* trig pini cikis olarak ayarlandi */
pinMode(echoPin,INPUT); /* echo pini giris olarak ayarlandi */
void loop(){
Robotun harekete geçmesi için Bluetooth modülünden veri gelmesi gerekiyor. Bu veri akıllı
telefonlardan veya Bluetooth özelliği bulunan tablet ve bilgisayarlardan gelecek. Öncelikle
Bluetooth modülüyle cihazlarımızı eşleştirmemiz gerekiyor. Bu konuyu hatırlamıyorsanız,
tekrardan "Bluetooth ile Haberleşme" konusuna göz atmanızı öneririz.
Windows kullanıcıları Bluetooth ile haberleşmek için, ücretsiz olarak Tera
Term programını indirebilirler.
Android kullanıcıları ise haberleşme için Bluetooth Terminal isimli ücretsiz uygulamayı
kullanabilirler.
1 x Arduino
4 x Tekerlek
1 x Robot şasesi
4 x DC motor
1 x DC motor sürücüsü
1 x HC-05 veya HC-06 Bluetooth modülü
8 INPUT 1
9 INPUT 2
13 INPUT 3
12 INPUT 4
11 ENABLE A
10 ENABLE B
Motor1 + OUTPUT 1
Motor1 - OUTPUT 2
Motor2 + OUTPUT 3
Motor2 - OUTPUT 4
+5 Volt VS
Tx Rx
Rx Tx
Daha önceden de öğrendiğimiz gibi LDR ışığın şiddetiyle değişen bir dirençtir. LDR çıkışı
Arduino'nun analog girişine bağlanmıştır. Arduino analog girişini sürekli kontrol etmelidir. Eğer
analog girişin değeri belirli bir değerin altına düşer ise Arduino, lazer ışığı ile LDR arasından bir
şey geçtiğini anlayacaktır.
LDR ışığa duyarlı olduğu için çevre ışıklardan da etkilenmektedir. Bu yüzden LDR'a lazer ışığı
düşmediğinde tam karanlıkta olması gerekir. Bu yüzden LDR'ın opak bir boru içerisinde karanlıkta
kalması sağlanmalıdır.
1 x Arduino
1x 220 ohm direnç
1x 10 K ohm direnç
1 x LED
1 x LDR
1 x Lazer
1 x Breadboard
Yukarıdaki devreyi breadboard üzerine kurunuz ve aşağıdaki Arduino kodunu kartınıza yükleyiniz.
int LDRdegeri = 0;
void setup()
{
/* LED pini çıkış olarak ayarlandı */
pinMode(LED,OUTPUT);
/* LDR pini giriş olarak ayarlandı */
pinMode(LDR,INPUT);
}
void loop()
{
/* LDR'ın çıkışı analog olarak okunuyor */
LDRdegeri = analogRead(LDR);
/*
Eğer LDR'ın değeri 550'den küçük ise
Lazerin önünden bir şey geçmiştir
550 sayısını kendi devrenize göre güncellemelisiniz
*/
if(LDRdegeri < 550){
digitalWrite(LED,HIGH);
delay(250);
}else{
digitalWrite(LED,LOW);
delay(250);
}
}
Yukarıdaki kod ile basit bir güvenlik devresi kurmuş ve analog okuma ve LDR kullanımını tekrar
etmiş olduk. Yukarıdaki kodun çalışma mantığını anladıktan sonra, proje üzerinde değişiklikler
yaparak kendi projelerinizi oluşturabilirsiniz. Örneğin iki adet lazer devresi kurup tek bir
Arduino'dan lazer değerlerini okuyabilirsiniz. İki lazer sistemini aralarında yaklaşık 20 cm olacak
şekilde yerleştirerek, odaya birinin girdiğini veya odadan birinin çıktığını belirleyebilirsiniz.
Projenizin bir sonraki aşamasında da odada kaç kişinin olduğunu hesaplayabilirsiniz.
Odaya giriş mi çıkış mı yapıldığını anlamak için yerleştirilen iki sistemin çalışma mantığı çok
kolaydır. Örneğin ilk olarak çıkışa yakın olan lazerin, daha sonrada girişe yakın olan lazerin ışığı
kesiliyor ise odaya birinin girdiği anlaşılır. Eğer girişe yakın lazer ilk olarak kesiliyor ve daha sonra
da çıkıştaki lazer kesiliyorsa, odadan birinin çıktığı anlaşılır. Bu şekilde projeyi geliştirerek Arduino
kullanımınızı pekiştirebilirsiniz.