mİkrodenetleyİ İ ii la. deney fÖyÜ deneyin adı ......u projenin yazılımında bir dijital...
TRANSCRIPT
1
MİKRODENETLEYİCİ II LAB. DENEY FÖYÜ
Deneyin Adı: Buton Kontrol
Deneyde Gerekli olan Malzemeler: Arduino Uno, 8.2 k direnç, buton, bağlantı kabloları
Deneyin Yapılışı:
Dijital pinler giriş olarak ayarlandığında pullup yada pulldown direnç kullanılarak normal şartlardaki
lojik durumu belirlenir. Giriş olarak ayarlanan pine bağlı bir buton ve direnç vardır. Butona
basıldığında, giriş pinine HIGH değer gelecektir. Giriş pini direnç ile Gnd’ye bağlanmamış olsaydı ne
olurdu. Fiziksel olarak 0 Volt yada 5 Volta bağlı olmadığı için elektriksel gürültülerden ve yandaki
pinlerin lojik durumlarından etkileneceği için giriş pininin lojik durumunda kararsızlık olacaktır. Bu
olumsuzluğu ortadan kaldırmak için pullup veya pulldown dirençleri ile pinin lojik durumu normal
şartlarda HIGH yada LOW bir değere sabitlenir. Pulldown direnci olarak 8.2 k lık direnç seçilmiştir.
10k’dan büyük direnç değerlerinde pinin toprak seviyesine çekilmesi zorlaşacaktır.
const int Led=13; //Led in bağlı olduğu pin numarası
const int Buton=4;//butonun bağlı olduğu pin numarası
void setup()
{
pinMode(Led,OUTPUT);
pinMode(Buton,INPUT);
}
void loop()
{
if (digitalRead(Buton)==HIGH)
{
digitalWrite(Led,HIGH);
}
else
{
digitalWrite(Led,LOW);
}
}
Butonlar, herhangi bir cihazı kontrol etmek istediğimizde kullandığımız en basit elektrik devre
elemanlarından birisidir. Butonun yapı olarak basitliği, maliyeti azaltıp, güvenliği ve kullanımı
kolaylaştırsa da mekanik olarak çalışan parçaları olduğu için butona basılma ve bırakma anlarında
elektriksel salınım meydana gelir. Bu salınımlar her uygulamada karşımıza problem olarak
çıkmayabilir. Yüksek hızda çalışan uygulamalarda butona basma süresinin milisaniyelerle ölçüldüğü
noktalarda butonun 5 ms lik süre boyunca lojik durumunun 0 ve 1 arasında gidip gelmesi, tasarımcı
için başlı başına bir sorun olur. Butona basıldığı an bu salınımlar başlar ve 5 ms lik bir süre boyunca
devam eder. Bu süre zarfında kontrolü kaybetmemek için yazılımsal olarak 5 ms lik sürenin gözönüne
alınması gerekir. Bunu için programı şu şekilde düzenleyebiliriz.
1. Butonun şimdiki ve sonraki durumlarını kaydet.
2
2. Butonda değişim olup olmadığını kontrol et.
3. Butonda değişim varsa 5 ms bekle tekrar kontrol et.
4. Sonraki durum aynı ise çıkışa ver, değilse 2. maddeye git.
const int Led=13;
const int Buton=4;
boolean oncekiDurum=LOW;
boolean sonrakiDurum=LOW;
void setup()
{
pinMode(Led,OUTPUT);
pinMode(Buton,INPUT);
}
void loop()
{
sonrakiDurum=digitalRead(Buton);
if(sonrakiDurum=!oncekiDurum)
delay(5);
sonrakiDurum=digitalRead(Buton);
if(sonrakiDurum=!oncekiDurum)
{
if (digitalRead(Buton)==HIGH)
{
digitalWrite(Led,HIGH);
}
else
{
digitalWrite(Led,LOW);
}
}
}
programı bir fonksiyon ile yazmak istersek;
*******programın diğer bir versiyonu
const int Led=13;
const int Buton=4;
boolean oncekiDurum=LOW;
boolean sonrakiDurum=LOW;
void setup()
{
pinMode(Led,OUTPUT);
pinMode(Buton,INPUT);
}
boolean butonKontrol(boolean oncekiDurum)
3
{
boolean sonrakiDurum=digitalRead(Buton);
if(sonrakiDurum!=oncekiDurum)
{
delay(5);
boolean sonrakiDurum=digitalRead(Buton);
if(sonrakiDurum!=oncekiDurum)
{
return sonrakiDurum;
}
else
{
return oncekiDurum;
}
}
else
{
return oncekiDurum;
}
}
void loop()
{
if (butonKontrol(oncekiDurum)==HIGH)
{
digitalWrite(Led,HIGH);
}
else
{
digitalWrite(Led,LOW);
}
}
Deney Adı: Bir anahtar yardımıyla dc motoru çalıştırmak
Gerekli olan malzemeler: (Şekil 1.1 de gösterilmiştir.)
- Arduino uno
- motor shield
- on/off switch
4
- dc motor
- breadbord
- dc güç kaynağı
- bağlantı kabloları
Şekil 1.1
Donanımın Hazırlanması:
İlk önce motor shield ile arduino uno arasındaki bağlantılar yapılır. Daha sonra motor shielddeki A
terminaline dc motorun uçları bağlanır. Sonra on/off switch arduino nun ground ve 10 nolu dijital
ucuna bağlanır. Son olarak dc güç kaynağı bağlantıları da motor shield üzerindeki yerlerine bağlanır.
(Şekil 1.2, 1.3 ve 1.4 bu bağlantıları göstermektedir.)
Şekil 1.2 Şekil 1.3
5
Şekil 1.4
Programın Yazılması:
Bu projenin yazılımında bir dijital giriş, bir dijital çıkış ve çıkışı kontrol etmek için if şartlı yapısı
kullanılmıştır. Yazılımın kodları aşağıda verilmiştir.
6
Bu programda buttonPin isimli değişkene sabit olarak 10 nolu pin değeri, motorPin’e 3 nolu pin değeri
ve buttonVal isimli değişkene sayısal olarak 0 değeri atanmıştır. Daha sonra setup yapısında
buttonPin giriş olarak, motorPin ise çıkış olarak ayarlanmıştır. Önemli bir ayarlama işlemi de 10 nolu
pin’in pull-up direncinin aktif hale gelmesidir. Bu da devre içerisindeki direncin digitalWrite()
fonksiyonu ile aktif hale getirilmesiyle olur. Mesela 10 nolu pin’i giriş olarak belirlediğimiz halde
digitalWrite(10,HIGH) fonksiyonu 10 nolu pin’e bağlı pull-up direncini aktif hale getirir. (Eğer bunu
yapmasaydık 10 nolu uca harici bir direnç bağlamamız gerekecekti tâki switch doğru çalışsın.) Loop
döngü yapısı içinde buttonPin nolu pinden okuduğumuz dijital değeri buttonVal isimli değişkene
atarız. Daha sonra if şartlı yapısıyla buttonVal değişkeninin değerini kontrol ettiririz. Eğer buttonVal
değeri lojik 1 ise motorPin numaralı çıkışa HIGH (yani lojik 1), değilse LOW (yani lojik 0) gönderilir.
Böylece motor çalıştırılmış veya durdurulmuş olur.
7
Deney Adı: Potansiyometre ile bir dc motorun hızının kontrol edilmesi
Dc motor hız kontrolünde potansiyometrenin kullanımı temel becerilerden biridir. Bu deneyde daha
önce görmediğimiz map() fonksiyonunun kullanımını da öğreneceğiz. Arduino’daki analog girişi
kullanarak dc motorun hızını kontrol edeceğiz. Potansiyometreden gelen analog voltajı (bu voltaj 0 ile
5 volt arasındadır.) dijitale çevirip, bu voltaj ile doğru orantılı 0-1023 arasında bir sayı elde edeceğiz.
Bu sayıyı ölçeklendirerek, motor shield üzerindeki pwm girişinin (ki bu aynı zamanda dc motorun
hızını kontrol eder.) duty cycle’nı kontrol edecek 0-255 arasında sayılar üreteceğiz.
Gerekli olan malzemeler: (Şekil 2.1 de gösterilmiştir.)
-Arduino Uno
-motor shield
-dc motor
-10 kohm potansiyometre
-ayarlı güç kaynağı
-bread bord
-bağlantı kabloları
Şekil 2.1
Öncelikle motor shield’ı arduino’ya bağlamalıyız. Daha sonra potansiyometreyi arduinoya
bağlamamız gerekir. Potansiyometrenin orta ucunu arduinonun analog pin 0’a, diğer uçlarının birini
+5V pin ucuna diğerini ground ucuna bağlarız. Daha sonra motoru, motor shieldın A portuna bağlar
8
ve gerekli motor besleme bağlantısını yaparız. Daha sonra arduinoyu USB kablosuyla bilgisayara
bağlayarak yazılımı yükleriz.
Şekil 2.2
Şekil 2.3
Programın yazılması:
9
Bu deneyde analog pin ve dijital pwm pinini kullanacağız. Bu sebeple pot ile motor arasındaki iletişimi
sağlamak için analogRead() ve analogWrite() fonksiyonlarını kullanacağız. Program kodları aşağıda
verilmiştir.
Program potPin=A0, motorPin=3, potVal=0 ve mappedPotVal=0 değerleri atanarak başlar. Daha sonra
setup yapısında potPin, giriş olarak, motorPin ise çıkış olarak atanır. Sonra loop yapısında potPin
numaralı girişden okunan analog voltaj değeri ile orantılı bir sayı değeri (0-1023) potVal değişkenine
atanır. Bu değer map() fonksiyonu kullanılarak ölçeklendirilir ve (0-255) arasında bir değer pwm
sinyalinin duty cycle’nı belirler, bu da motorun hızını tayin eder. map(potVal,0,1023,0,255);
fonksiyonu pot’un ürettiği 0-1023 arasındaki değeri 0-255 arasında ölçekler. Bu fonksiyonun genel
kullanımı şu şekildedir:
programı çalıştırdığımızda potansiyometreden okunan değerlerle orantılı bir pwm değeri 3 nolu
uçdan motor shielda uygulanır. Bu da motorun hızını belirler. Potaniyometrenin değerini değiştirdikçe
motorun hızının değiştiğini görürüz.
10
Deney Adı: İki adet dc motorun arduino ile kontrolü
Gerekli olan malzemeler:(Şekil 3.1’de gösterilmiştir.)
- arduino uno
- motor shield
- iki adet dc motor
- iki adet anahtar
- bread bord
- ayarlı güç kaynağı
- bağlantı kabloları
Şekil 3.1
Donanımın Hazırlanması:
Bu deneyde iki adet push buton bulunmaktadır. Butonlardan birincisinin bir ucu arduinonun 9 nolu
dijital pinine diğer ucu grounda bağlanır. İkinci butonun bir ucu 10 nolu dijital pine diğer ucu da
grounda bağlanır. Motorlar motor shieldın A ve B portlarına bağlanır. Motorların beslemesi bağlanır.
Bu deneyde motor hızı kontrol edilmeyeceğinden pwm sinyali kullanılmayacaktır. Şekil 3.2, 3.3 ve 3.4
yapılan bağlantıları göstermektedir.
11
Şekil 3.2 Şekil 3.3
Şekil 3.4
12
Programın Yazılması:
Bu deneyde arduino ile haberleşmek için digitalRead() ve digital Write() fonksiyonlarını kullanacağız.
Butonlardan biri A portundaki motoru çalıştırmak için diğeri ise B portundaki motoru çalıştırmak için
kullanılmaktadır. Yazılımın kodları aşağıda verilmiştir.
Kodun başlangıcında pin değerleri ayarlanmış buttonVal1 ve buttonVal2 değişkenlerine 0 değeri
atanmıştır. Setup yapısında ise butona bağlı pinler giriş olarak, motora bağlı pinler çıkış olarak
belirlenmiştir. Bu ayarlamalardan sonra giriş butonlarına bağlı pinlerdeki pull-up dirençleri aşağıdaki
iki komutla aktif edilmiştir.
13
digitalWrite(buttonPin1,HIGH);
digitalWrite(buttonPin2,HIGH);
Daha sonra loop yapısı içerisinde buttonPin1’in aldığı değere göre buttonVal1, buttonPin2’nin aldığı
değere göre buttonVal2 ayarlanmıştır. Bunun için şartlı durumlarda kullandığımız if yapısı
kullanılmıştır.
14
Deney Adı: Arduino ile dc motorun hız ve yön kontrolü
Gerekli olan malzemeler:(Şekil 4.1’de gösterilmiştir.)
- arduino uno
- motor shield
- 10 kohm potansiyometre
- anahtar (switch)
- dc motor
- ayarlı güç kaynağı
- breadbord
- bağlantı kabloları
Şekil 4.1
Donanımın Hazırlanması:
Bu deneyde yapılacak ilk iş motor shield’ı arduino’ya bağlamaktır. İkinci olarak potansiyometrenin
orta ucu analog pin 0’a diğer iki ucu +5V ve Ground’a bağlanır. Daha sonra on/off anahtarı (switch)
dijital pin 10 ile toprak (ground) arasına bağlayın. En son USB den Arduino’yu bilgisayara bağlayın. (
Şekil 4.2, Şekil 4.3 ve Şekil 4.4’de gösterilmiştir.)
15
Şekil 4.2
Şekil 4.3
16
Şekil 4.4
Programın Yazılması:
Bu deneyde hem dijital hem analog pinleri kullanacağız. Analog pin motorun hızını kontrol etmek
için, dijital pin motorun yönünü kontrol etmek için kullanılacak. Yazılımın kodları aşağıda verilmiştir.
17
Bu kodlarda ilk önce switchPin, potPin, motorPin, SwitchVal, potVal ve mappedPotVal’in başlangıç
değerleri belirlenir. Daha sonra setup yapısında switchPin ve potPin giriş olarak, motorPin çıkış olarak
belirlenir. Sonra digitalWrite() fonksiyonu ile pull-up direnci aktif hale getirilir. Daha sonra döngü
yapısı içerisinde switchPin’den okuduğumuz değeri switchVal’e, potPin’den okuduğumuz değeri
potVal’e aktarırız. Potansiyometreden gelen analog voltaj değerine göre map() fonksiyonu
kullanılarak 0 ile 255 arasındaki değerler mappedPotVal’e aktarılır. Bu da motorun hızını kontrol
etmek için motorPin’e gönderilir. Son olarak if yapısıyla da motorun yönü kontrol edilir. Eğer
switchVal değeri lojik 1 olursa motor saat yönünde, lojik 0 olursa saat yönünün tersinde döner.
18
Deney Adı: Potansiyometre ile servo motor kontrolü
Gerekli olan malzemeler
1 adet Arduino
1 adet potansiyometre(5-10 Kohm yeterli olacaktır.)
1 adet servo motor
Erkek jumper kablo
1 adet breadboard
(Şekil 1.1 de gösterilmiştir)
(şekil 1.1)
Donanımın Hazırlanması
Servo motorun kahverengi bacağı (Toprak) ve potansiyometrenin en sağdaki bacağı Arduinonun gnd
bacağına bağlanır. Servo motorun kırmızı bacağı (Artı) ve potansiyometrenin en sol bacağı Arduino
mikrokontrolörün 5V bacağına bağlanır.
Servo motorun turuncu ucu (bilgi ucu) Arduinonun D9 bacağına bağlanır. Servo motorumumuzu bu
pinden kontrol edeceğiz. Potansiyometrenin orta bacağı (bilgi ucu) Arduinonun A0 bacağına bağlanır.
Mikrodenetleyici A0 pininden analog değer okuyacaktır(Şekil 2.2 de gösterilmiştir.)
19
Programın Yazılması:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
İlk önce servo kütüphanesi çağırılıyor. Servo Motor’un kontrolü için servom adında bir nesne
oluşturuluyor. Potansiyometre analog sıfır pinine bağlanıyor. Potansiyometreden gelen analog değeri
taşıması için oluşturulan val değişkeni tanımlanıyor.Servo Motor 9. pine bağlanıyor.
Potansiyometreden aldığımız değeri val değişkenine yüklüyoruz(yüklenen değer 0 ile 1023
arasında).Değişkenin sayısal değerini servo motora göre oranla (0 ile 1023 arasında olan değer 0 ile
20
180 arasına çekildi).Servo Motor’u val değişkeninde bulunan açı değerine karşılık gelecek şekilde
konumlandır.15 milisaniye beklenilir.
21
Deney Adı: Arduino ile PIR sensor
Gerekli olan malzemeler
1 adet Arduino
PIR sensor
Erkek jumper kablo
1 adet breadboard
1 adet led
(Şekil 1.1 de gösterilmiştir)
(şekil 1.1)
Donanımın Hazırlanması
İlk olarak PIR sensorumuzun kenar bacaklarını gnd ve 5v’a bağlıyoruz. Orta bacağını
digital pin 3 ‘ e bağlıyoruz. Led’in + bacağını digital pin 4 e - bacağını da gnd ’ ye bağlıyoruz.
Donanım şekil 1.1 de gösterilmiştir.
.
Sensörün 3 pini bulunmaktadır.
22
1-Pozitif
2-Data
3- Negatif
Programın Yazılması:
int pirPin = 3; // PIR pin
int ledPin = 4; // LED pin
int deger = 0;
void setup() {
pinMode(pirPin, INPUT); // PIR Pin'i giriş yapılıyor
pinMode(ledPin, OUTPUT); // LED Pin'i çıkış yapılıyor
Serial.begin(9600); //Serial Porttan veri göndermek için
baundrate ayarlanıyor.
}
void loop(){
deger = digitalRead(pirPin); // Dijital pin okunuyor
Serial.println(deger); // Okunan değer seri porttan okunuyor.
if (deger == HIGH) {
digitalWrite(ledPin, HIGH); // Eğer okunan değer 1 ise LED yakılıyor.
}
else{
digitalWrite(ledPin,LOW); // Eğer okunan değer 0 ise LED
söndürülüyor.
}
}
Deney Adı: Arduino ile HC-SR04 Ultrasonic Ping Sensor
Gerekli olan malzemeler
1 adet Arduino
Ultrasonic sensor
Erkek jumper kablo
1 adet breadboard
2 adet led
(Şekil 1.1 de gösterilmiştir)
23
(şekil 1.1)
Donanımın Hazırlanması
.
Breadboard için HC-SR04 sensoru ve LED'leri board’a yerleştirin.Yeşil ledi
Arduino Pin 3 e, Kırmızı ledi Pin 2 ye takın sensör üzerinde ki 5v u VCC pimini takın
sensör üzerinde trigonometri pimini Pin 13 e takın . Sensör üzerinde echo pimini Pin
12 ye takın.Aşağıdaki kodu yazıp , bilgisayarınıza Arduino bağlayın, ve upload ediniz.
Programın Yazılması:
const int pingPin = 13;
int inPin = 12;
int safeZone = 5;
int greenLed = 3, redLed = 2;
void setup() {
Serial.begin(9600);
}
void loop()
{
long duration, cm;
pinMode(pingPin, OUTPUT);
24
pinMode(greenLed, OUTPUT);
pinMode(redLed, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH);
cm = microsecondsToCentimeters(duration);
Serial.print(cm);
Serial.print("cm");
Serial.println();
if (cm > safeZone)
{
digitalWrite(greenLed, HIGH);
digitalWrite(redLed, LOW);
}
else
{
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, LOW);
}
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}
Deney Adı: Arduino ile LCD keypad’e yazı yazma
Gerekli olan malzemeler
1 adet Arduino
LCD Keypad Shield
Erkek jumper kablo
1 adet breadboard
25
(Şekil 1.1 de gösterilmiştir)
(şekil 1.1)
Donanımın Hazırlanması
. .
Programın Yazılması:
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 );
void setup()
{
lcd.begin(16, 2);
lcd.print("karatekin");
}
26
void loop()
{
//Ana Döngü kodu yazımı…
}
Deneyin Adı: Kesme(Interrupt) Kontrol
27
Deneyde Gerekli olan Malzemeler: Arduino Uno, 8.2 k direnç, pır dedektörü, bağlantı kabloları
Deneyin Yapılışı:
Yazdığımız uygulamaların kesintiye uğramadan çalışması istenilen bir durumdur.
Interrupt yani kesme ise en temel anlamda işlemcinin hali hazırdaki aktivitesini kesip başka
bir iş yapabilmemize imkan sağlar. Mikrodenetleyici hassas bir kontrol işlemi gerçekleştirirken
o süre içinde pinlere gelen herhangi bir istek yada veri değişimi söz konusu olabilir. Bu
değişimlere cevap verebilmek için Interrupt kullanabiliriz.
Program normal akışı içerisinde devam ederken, zamanlama yada donanım
kesmelerinden birisi aktif olduğunda program akışı o kesme ile ilgili alt programa yönlendirilir.
Altprogramdaki komutlar çalıştırıldıktan sonra ana program kaldığı yerden çalışmasına devam
eder. Interrupt fonksiyonları oldukça basit ve belirli bir işi yerine getirecek şekilde yazılır. Bu
fonksiyonların mümkün olduğunca çabuk çalıştırılıp bitirilmesi beklenir.
Arduino uno iki adet donanım interruptına sahiptir. Gerekli ayarlamalar yapıldıktan
sonra 2 ve 3 nolu dijital pinlerin lojik seviyesi değiştiğinde kesme(interrupt) tetiklenir ve ilgili
kesme fonksiyonu çalıştırılır.
Donanım kesmesinin tetiklenmesinde 4 mod vardır.
LOW: kesme pini LOW seviyesinde olursa.
CHANGE: kesme pinine uygulanan gerilim değiştiğinde, LOW iken HIGH, HIGH iken
LOW olduğunda.
RISING: yükselen kenar. kesme pini LOW konumundan HIGH konumuna çekildiğinde.
FALLING: düşen kenar. kesme pini HIGH konumundan LOW konumuna geçtiğinde.
Bu modlardan herhangi birisi seçilerek istenen donanım kesmesinin tetiklenmesi
sağlanır. program yazarken dikkat etmemiz gereken noktalardan birisi de kesme fonksiyonu
içerisinde delay() ve Serial.available() metodlarını kullanamayız.
Kesmeleri kullanabilmek için öncelikle ayarlarını yapmalıyız.
attachInterrupt(0,fonksiyon,mod) metodu ile kesme aktifleştirilir. Burada 0 ile belirtilen ilk
parametre INT0 olarak 2 nolu dijital pinin parametresidir. Daha sonra ikinci parametre olarak
kesme sinyali geldiğinde çalışmasını istediğimiz fonksiyonun ismini yazıyoruz. Bu fonksiyonun
diğer fonksiyonlardan farkı geri dönüş değerinin olmaması ve parametre almamasıdır. Mod
parametresi ise kesmenin nasıl tetikleneceğini belirtir.
Kesmeleri pasifleştirmek için noInterrupts() metodu, pasif olan kesmeleri tekrar
aktifleştirmek için interrupts() metodu kullanılır. Kesmenin kapatılması için
detachInterrupt(interrupt) metodu kullanılır.
28
Devremizde arduino uno nun 2 nolu dijital bacağını kesme giriş sinyali için kullandık.
Kesme sinyalini pır dedektörünün tetikleme ucundan aldık. Kesme oluştuğu zaman da seri
monitörden kesme oluştu yazısını yazdırdık.
Programın kodları;
const int Led=13;
void setup()
{
pinMode(Led,OUTPUT);
Serial.begin(9600);
attachInterrupt(0,kesme,RISING);
}
kesme()
{
Serial.println(“kesme calisti”);
}
void loop()
{
digitalWrite(Led,HIGH);
delay(1000);
digitalWrite(Led,LOW);
delay(1000);
}