7 Segment ve 7447 Arduino Kullanımı
|Merhabalar..
Bu konuda Arduino ile 7 segment kullanımına değineceğiz. Başlangıç olarak 7 Segment’ den bahsedelim:
7 segment içerisinde 7 tane led (nokta ile 8), 10 tane pin bulunan devre elemanıdır. Elinizdeki 7 segmen sayısına göre 0- 9 a yada 3 tane segment iniz var ise 0 -999′ a kadar saydırmak için kullanılabilir. Genel olarak 2 çeşiti bulunmakta ortak anot ve ortak katot. Ortak katotlarda adında anlaşılacağı gibi tek bir katot(-) pin bulunmakta ve biz led leri yakmak için 5V göndermemiz gerekmektedir. Ancak ortak anotta durum bunun tam tersidir. Bir tane anot(+) vardır ve led leri yakmak için bağlantı pin 0V ‘a çekilmelidir.
Buna örnek olarak:
Kullanacağınız segment çeşidine dikkat etmeniz gereklidir. Biz örneğimizde ortak anot kullanacağız. Eğer sizde ortak katot var ise yazılımın çalışmıyacağı gibi segment’ e de zarar verebilirsiniz. Herhangi bir zarar verme ihtimaline karşı direnç kullanımınızı tavsiye ederim. Bunu anlamanın en kolay yolu datasheet i ne bakmaktır.
Öncelikle 7 segment için entegre kullanmaksızın bir yazılım yazalım. Burada algoritmayı kafamızda canlandırmak kolay olsun diye Arduino’ nun 1. pini ile 7 segment’ in 1 . pinine 2. pini 7 segment’ in 2. si şeklinde bağaldım. Siz farklı algoritmalar geliştirebilirsiniz elbette.
Şekilde de göreceiğiniz gibi altta en soldaki pin 1 numaralı üstte soldaki pin ise 10 numaralı pin. Bunları sırası ile Arduino’ nun digital pinlerine bağlıyacağız. Bu segment lerde 2 adet anot pin bulunmakta(kullanıma göre ortak katot ise 2 katot). Bunlardan sadece birinin kullanmanız yeterlidir.
Soldaki şekilde 7 segmentin pin bağlantılarını görebilirsiniz. Sağda ise fritzing üzerinde devremizin breadboard üstündeki görüntüsünü gösterdik.
Şimdi de yazılımından bahsedelim.
Benim yazdığım kodlar ortak anot içindir. Ortak katottan fark sadece rakamların tanımlandığı kısımdır. Eğerordaki 1′ leri 0, 0′ larıda 1 yaparsanız bu yazılımı aynı bağlantı şekli ile ortak katot 7 segment’ de de kullanabilirsiniz.
Yorum satırları kodlarda bulunmmaktda. Basitce bir değinirsek 7 segment üzerindeki ledlerin sıralanışına göre iki boyutlu 1 ve 0 lardan oluşan bir dizi oluşturduk. Sıralama 7 segment’ in A,B,C,DP,B,A,F ve G şeklindedir. Hangisinin yanmasını istiyorsak o pinden 0V göderdik. Böylece o led yanmış oldu.
//ortak anot için yazılmıştır //5V pinler 0, 0V pinler 1 ile temsil edildir //7 segment üzerinde led lerin sırasına göre bir dizi oluşturduk int rakamlar[10][8] = {{0,0,0,1,0,0,0,1},//0 {1,1,0,1,0,1,1,1},//1 {0,0,1,1,0,0,1,0},//2 {1,0,0,1,0,0,1,0},//3 {1,1,0,1,0,1,0,0},//4 {1,0,0,1,1,0,0,0},//5 {0,0,0,1,1,0,0,0},//6 {1,1,0,1,0,0,1,1},//7 {0,0,0,1,0,0,0,0},//8 {1,0,0,1,0,0,0,0}//9 }; //Bağlantı pinlerimşz int pinler[8] = {1,2,4,5,6,7,9,10}; void setup(){ for(int i = 0; i < 8; i++){ pinMode(pinler[i] , OUTPUT); } } void loop(){ for(int j = 0; j < 10; j++){ //bütün rakamları içeren dizinin ilk boyutu for(int i = 0; i < 8; i++){ //pinlere tek tek işleme aldığımız yer if(rakamlar[j][i] == 1){ //Burada bitleri okuyoruz eğer 1 ise ilgili ledi ledi yakıyor, 0 ise söndürüyoruz digitalWrite(pinler[i], HIGH); }else{ digitalWrite(pinler[i], LOW); } } delay(1000); } } //Prepared by Oğuzhan Başer
7447 Entegresi ile 7 segment Kullanmak
Şimdide 2 adet ortak anot 7 segment’ i SN74LS74N(7447) entegresi yardımı ile çalıştırmayı deneyelim. Enterenin datasheetine buradan ulaşabilirsiniz. Farklı işlemler için D Bu entegreyi kullanmak Arduino üzerindeki pinlerden tasarruf sağlar. Normalde bir 7 segment için 8 adet pin kullanmamız gerekirken bu entegre yardımı ile sadece 4 tane pin yeterlidir. Ayrıca bir kolaylığıda rakamlırı da tek tek tanımlamanız gerekmez. Rakamların Hexadecimal karşılıklarını Arduino’ daki bitRead fonksiyonu ile pinlere okutarak işleminizi kolaylıkla halledebilirsiniz. Yazılıma geçmeden önce breadboard görünümü görelim..
Karışık göründüğünü düşünen varsa birde gerçekledikten sonra baksın .. ;) Devrede kullanılan transistörler PNP transistör olup resimdeki pin sıraları soldan sağa doğru collector, base ve emitter’ dir. Elinizdeki transistörün bu pinlerinin sırasına dikkat ederek bağlantıyı yapmalısınız. Bu transistörler segmentleri yazılım ile anahtarlanabilmesini sağlamak için anot girişlerine bağlanmıştır.
7447 kullanmak karışıkmış gibi görünsede yazılımda çok daha kolaylık sağlıyor. Yapacağımız işlem 0′ dan 99 ‘ a kadar 7 segmentler yardımı ile bir sayaç yapmak. Normalde bu işlem için 18 tane pin kullanmak gerekirken. Biz işimizi sadece 8 pin ile halledeceğiz. İşte yazılımımız:
//7 segment (ortak anot)7447 ile kullanmak için hazırlanmıştır int pinler[4] = {2,3,4,5}; //7447 A,B,C,D pinlerine int onlar = 8; //onlar VCC pini int birler = 9; //Birler VCC pini int sayi = 0; //birler basamğına yazdıracağımız sayı int sayi2 = 0; //onlar basamığına yazdıracağımız sayı void setup(){ for(int i = 0; i < 4; i++){ pinMode(pinler[i], OUTPUT); } pinMode(onlar, OUTPUT); pinMode(birler, OUTPUT); } void loop(){ digitalWrite(birler, HIGH); //birler basamığını gösteren segment i aktif ettek digitalWrite(onlar, LOW); //onlar basamığını gösteren segment i pasif ettik segment(sayi++); //segment sayıyı yazacak fonksiyona sayi değerimizi argüman olarak yolladık if(sayi == 10) sayi2++; //sayı değerimiz 10 ise onlar basamığını bir arttırdık delay(500); digitalWrite(birler, LOW); //birler pinini pasif ettik digitalWrite(onlar, HIGH); //onlar pinini aktif ettik segment(sayi2); delay(500); if(sayi == 10) sayi = 0; //birler basamağındaki değerimizi 10 ise sıfırladık if(sayi2 == 10) sayi2 = 0; //onlar basamığında değerimiz 10 ise sıfırladık } void segment(byte sayi){ for(int i = 0; i < 4 ;i++){ if(bitRead(sayi, i) == 1){ //gelen sayıyı hexadecimal formatta okuyup eğer 1 ise ledi yaktık. digitalWrite(pinler[i], HIGH); }else{ digitalWrite(pinler[i], LOW); } } } //Prepared by Oğuzhan Başer
Yakında 4’lü 7 segmenti de ekleyeceğim.
Teşekkürler…
hocam iyi çalışmalar sizde ve diğer sayfalarda sürekli arduino ile 2 display kulanarak sayaç var fakat ben 4 display li geri sayım yapmak istiyorum onu nasıl yapabilirim. Teşekkürler.
Merhaba…
Bu konu ile ilgili sitemizde yazı zaten bulunmaktadır. Bu yazıya buradan ulaşabilirsiniz
https://www.elektrobot.net/arduino-ile-saat-uygulamasi/
İyi çalışmalar…
hocam yukarıda 7447 ENTEGRESİ İLE 7 SEGMENT projesinde 2 display de aynı sıralamada sayıyor. 00, 11, 22, 33, 44, 55, 66, 77, 88, 99 gibi. yazılımı kontrol ederseniz sevinirim. teşekkürler…
Uyarınız için teşekkürler.
Lakin yazılımı deneme ve değiştirme şansım bu ara bayağı zor ancak denenip çalışır vaziyette oraya yazmışdım onları. Ama elbet hata yapmış olabilirim, tekrar bu sorun için özür dilerim.
Sorun değil hocam bu kadar uğraşıp yazmanız yeterli ben biraz uğraşıp arızayı bulursam sizlere iletirim, teşekkürler.
Bu bağlantı şeması tamamen yanlış.
2 segment direkt paralel bağlandığı için rakamlar her zaman 11 – 22 -33 gibi gözükecektir.
kodlamayla çözülemez.
elinizde 2 li şema var mı ? muhtemelen çift entegreli bişidir.
Merhaba, Bağlantı şeması tamamen yanlış değil, sadece transistör eksikti. Onları da yerleştirdim ve tekrar test ettim. Sorunsuz olarak çalışıyor. Aradaki gecikme süresini kısaltırsanız sanki ikisi de aynı anda yanıyormuş gibi gözükecektir. İyi çalışmalar dilerim…
Merhaba Oğuzhan Bey;
Bir sorum olacak.
Yine 74LS47 entegresi ile rakam değilde farklı bir şekil oluşturmak istersem.
mesela arduino ile segmentte yalnızca a-d yada a-g-d ledlerini yakmak istersem nasıl bir kod göndermem gerekir ?
Merhaba, bahsettiğiniz işlemi bu entegre ile yapabilmenizin çok mümkün olduğunu düşünmüyorum. Çünkü o entegre 4 bit binary girişi segment üzerinde hexal olarak göstermesi için ayarlanmış. Ama bu sadece tahmin. Belki farklı yöntemleri vardır çok yardımcı olamayacağım. İyi çalışmalar dilerim…