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.

7segment
Resmi büyültmek için görsele tıkla.

 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..

7seg_bb

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…

9 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir