Gelişen mikrokontrol teknolojileri ve artan bilgi birikimi sayesinde geliştirici düzeyinde daha yaygın kullanımına olanak tanımıştır. Burada elimden geldiği kadar bazı örnekler sunmaya çalışacağım... Görüleceği gibi ilk örneklerimizde çoğunlukla ASM üzerinde iken daha sonraları C üzerinde örnekler yer almaktadır. Hatta ilerleyen zamanlarda Arduino örneklerinin yer alması kaçınılmaz olacaktır.

7 Nisan 2018 Cumartesi

Arduino ile MAX7219 LED ekran kontroller sürme

Arduino ile MAX7219 LED ekran kontroller sürme


LED ekran kontrol açısından her bir parçayı ayrı ayrı bir akım sınırlama direnci üzerinden sürmektir. Ama bu yöntemin sıkıntısı çok fazla bacak ve bağlantı gerektirmesidir. Diğer yöntem çoğullama olarak bilinen  insan gözünün algılayamacağı bir hızda değişim ile ekranı tarama yaparak sürmektir. Bu yöntem bağlantı  sayısını azaltır, ama program karmaşıklığını artırır. İşte bunlara çözüm olarak piyasaya sürülmüş olan MAX7219 entegresi ile ki çoğullama tekniğini kullanır, LED ekran veya matris ekran sürülebilir. Ama işi kullanılabilir kılan sadece SPI bacak bağlantılarını kullanarak işlemci tarafından kontrol edilebilir ve LED ekran kolaylıkla sürülebilir. İşlemci sadece ilgili registerlere verileri yazar  ve ekran taraması ile diğer ekran kontrol işlerini karışmadan ekranda görüntü sağlanmış (veriler görüntülenmiş) olur.

Bu projemizde bir Arduino kullanarak MAX7219  içeren LED ekran ( 8 dijit  7 parçalı LED ekran)  sürülmesi ve bağlantıların oluşturulması üzerinde duracağız.

MAX7219

Maxim firması tarafından üretilen ürün, 7 parçalı  ortak katot LED ekranlar veya (matris ekranı) sürmek üzere tasarlanmış bir üründür. SPI üzerinden çalışabildiği için 10MHz 'e kadar yüksek hızlarda çalışabilmektedir. LED parlaklık kontrolunu analog (direnç üzerinden) veya dijital olarak gerçekleştirmek mümkündür. (0..15 adım içinde)
MAX7219 bacak bağlantıları.

Ekran veya LED taramasını otomatik olarak ekran gerçekleştirdiğinden, tarama işlemleri için işlemciyi meşgul etmez. Gelen ve kaydedilmiş veriler doğrultusunda veriler uygun RAM gözelerinde saklanır ve çağrılması MAX7219 üzerinde yerine getirilir.

MAX7219'un iki farklı kılıf şekli,

Max7219 ile her şey iletişim ile başlar. (başlama işlemleri hariç, bizi ilgilendiren bir durum değil ki her zaman için kendi oyun kurallarımızı koyarız.)

Temelde SPI formatındadır. Ama MAX7219'dan okuyacağımız bir veri olmadığı için kullanım MISO bacağı iletişimde kullanımda değildir. Hemen başka bir işte kullanayım demeyin, zira hala donanımsal iletişimin bin parçası olduğu için Atmel işlemci o bacağı tek başına bırakmayacaktır.

İletişim için gerekli bacaklar (arduino açısından)MOSI, CLK ve CS. CLK senkron saat darbeleridir, MOSI işlemcinin çıkış dolayısı ile MAX7219'un veri giriş bacağıdır, CS'de çip seçme ucudur. Arduino'nun  MAX7219'a ben veri gönderiyorum demek için kullandığı dürtme bacağıdır.

MAX7219 üzerinde Dout yer alsa da kullanımı biraz farklı. İki tane MAX7219 kullanılmak istendiği zaman ikincisine Din bacağı ilk MAX7219 Dout bacağına bağlanarak kaskad bağlama yöntemi uygulanabilmektedir.

Yine de ilk önce biz bir tanesini kontrol edelim, ikincisine belki sonra sıra gelir.
D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0
XXXXADRESMSB                             VERI                         LSB

 Görüldüğü gibi veri iletiminde bitlerin yerleşimi...

Veri iletimi 16 bitlik yapıdadır. İlk önce 8 biti adres , ikinci 8 bit veriyi oluşturacak şekilde yerleştirilmiştir. Her zaman için ilk önce en anlamlı bit (MSB) ve en son da en düşük anlamlı bit (LSB) gelir. Donanımsal olarak veri yönlendirildiği zaman SPI yazma registerine veriyi yazıp, sonra ikinci bayt (veri) yazılması yeterlidiri. Elbette ki veri gönderme esnasında CS bacağının lojik-0'da olmasına dikkate etmek gerekir.  Gönderme (veri yazma işleminden) önce CS lojik-0 yap, veri gönderme işleminden sonra CS lojik-1 yap.

LED'lerin parlaklığı iki yöntem ile kontrol edilebilmektedir. Birincisi  Iset ile +5V arasına bağlı bir direnç. Akım sınırlama işlemini görmektedir. İkincisi Intensity olarak bilinen 0xXA registeri üzerinden kontroldur. (Adres registeri ilk 4 biti kullanıldığı için X'in değerinin önemli olmadığı belirtilmektedir.). Tabii ki parlaklık arttıkça hali ile harcanan akım artacaktır.

Register
Adres
Hex Kodu
D15-D12D11D10D9D8
işlem yokX00000xX0
Dijit 0X00010xX1
Dijit 1X00100xX2
Dijit 2X00110xX3
Dijit 3X01000xX4
Dijit 4X01010xX5
Dijit 5X01100xX6
Dijit 6X01110xX7
Dijit 7X10000xX8
Kodlama ModuX10010xX9
ParlaklıkX10100xXA
Tarama SınırıX10110xXB
KapatmaX11000xXC
Ekran TestX11110xXF
Yukarıdaki tablo MAX7219 register adreslerirni ve yaptığı işlevleri tanımlamaktadır.

MAX7219 üzerinde kontrol için 16 adet register yer almaktadır. 0. adreste işlem yapılmamaktadır. 1..8 aralığı ekranda gösterilecek verilerin yazıldığı adrestir. 9. adres ekran tipini belirlemek içindir. Yani matris ekran veya 7 segmanlı LED ekran sürme arasında seçim yapılabilmesini sağlar. 10 adres parlaklık kontrolu içindir, 12. adres Tarama sınırını belirler , MAX7219 üzerine kaç dijit ekran bağlı  ise o kadar tarama yapma imkanı sağlar. 13. adres ekranın tümünü kapatma imkanı sağlar. 15. adres ekranı test içindir.

9. adresteki işlem bir yerde bize daha kolay kod yazma imkanı sağlar. 7 segman ekran kullanımında, normalde, her segman için ayrı ayrı kontrol yerine  sadece ekrana yazılacak rakamı ilgili registere yazarak ekranda gösterimini kontrol ederiz(0x0A adresine 0x0F verisi yüklenerek). Ama matris ekran veya ayrı ayrı LED yak söndür uygulamalarında herbirini kendimiz kontrol etmek isteriz. (0x0A adresine 0x00 verisi yüklenerek)

7 Parçalı karakterRegister VerisiYanık Parçalar=1
D7*D6-D4D3D2D1D0DP*ABCDEFG
0X00001111110
1X00010110000
2X00101101101
3X00111111001
4X01000110011
5X01011011011
6X01101011111
7X01111110000
8X10001111111
9X10011111011
-X10100000001
EX10111001111
HX11000110111
LX11010001110
PX11101100111
boşX11110000000
*ondalık nokta D7=1 yapılarak yakılmaktadır.
Sayı kodlanarak yakılmak istenen LEDler otomatik olarak seçilir.. Kodlama yerine bit olarak kontrol edilmek istenirse aynı şekilde adreslenerek de kontrol edilebilir.


  • D7 --Dp
  • D6--A
  • D5--B
  • D4--C
  • D3--D
  • D2--E
  • D1--F
  • D0--G

Şeklinde bit kontrolu ile de istenilen rakamın ekrana yazılması da mümkündür. (bit no --Segman) şeklinde gösterilmiştir.

11. adreste ise kaç tane ekranın gösterim için kullanılacağını belirlemekte kullanılır. 0x0B adresine 0x00 ile 0x07 aralığında bir değer girilerek, dijitlerin aktifliği kontrol edilir.

Daha ayrıntılı bilgiyi  üreticinin internet sitesinde ve veri kağıtlarında bulabilirsiniz.

Şema

Aslında şema MAX7219  ile ekran arasındaki bağlantılar üzerine kuruludur.
Şemada kırmızı çerçeveli alan projenin asıl konusunu temsil eden MAX7219 devresidir. Arduino üzerinde bağlantıların yapıldığı konnektör (ISP)  aynı zamanda Arduino üzerindeki sıra pinlerde de  (SPI bacakların) yer alan bacak bağlantılarıdır. Ek olarak CS cip seçme bacağı için kullanılmaktadır.

PCB

PCB'nin alttan yolların görünümü
PCB'nin üstteki elemanların yerleşimi , 10 k direnç, 2 adet 4 dijit 7 segman ekran ve MAX7219 ile birlikte 2x5 sıra pin
Elemanların birazcığı altta. birkaç tane 100nf, bir tane 10uF ve  geri kalan da köprü ,yani 0 ohm...

PCB'nin  eleman yüzünden 3 boyutlu görünümü

Gerisi nerede derseniz, geriye sadece Arduino kalıyor. Birkaç tane de bağlantı kablo. Çok mu basit oldu. O da artık MAX7219'un sihri diyorum.

Daha önce uğraşma şansım olsa idi http://elektronikvelemciler.blogspot.com.tr/2015/04/atmega16-ve-74hc590-ile-led-ekranl.html projesindeki ekran için de bu projede anlatmış olduğumuz MAX7219 kullanırdım.  Büyük bir ihtimalle gelecek için bir güncelleme yapabilme ihtimalim her zaman için vardır.
Elemanların üst yüze monte edilmiş halı.
Ben kondansatör göremedim diyenler için alt yüz.. Köprülerin bir bölümü SMD direnç görümünde. PCB'yi kendin yapıyorsan, delik delmek biraz sıkıntı olabiliyor. Çözüm SMD  0ohm direnç
Arduino UNO-
USB kablosu-
MAX7219U1
oR 1206R2,R3,R4,R5,R6,R7
10kR1
100nF  1206C1,C2,C3
10uFC4
JYFD056ASRdis1,dis2
2x5 sıra pin erkek--
Listede arduino için gereken kablolar, PCB için gereken köprü kabloları belirtilmemiştir.

Kullanımı

Başlıkta paylaşılmakta olan bağlantı örneği. CS bacağı haricinde ISP portu üzerindeki (SPI) bacakları  aynen kullanılmaktadır. Eğer CS bacağın farklı bir pin seçerseniz , seçiminiz doğrultusunda kodda değişiklik yapmayı unutmayın.

Monte edilen PCB'nin Arduino'ya bağlantı şekli.  Aynı zamanda bağlantısı yapılan konnektörlerin bacak tanımları gösterilmektedir. Biraz uğraşılırsa PCB pek ala Arduino kartı üzerine monte edilip kullanılacak şekilde çizilebilir.

Arduino ile MA7219 kartı kablo bağlantılarını gerçekleştirdikten sonra, ilgili yazılımı Arduino üzerine yüklemek yeterlidir. Yüklediğiniz yazılım kendi yazdığınız bir kod olabildiği gibi burada örnekleri verilen kodlar da olabilir.

Donanım olarak iş, PCB montajından sonra, kabloları bağlamaktır. Geri kalanı tamamen yazılım ile ilgilidir. Yeterli eleman montajında veya kablo montajiında bir hata olmasın!

Çoğunlukla ekran ile ilgili ilk kod grupları sadece ayarlardır. Kaç hane olsun, ekran parlaklığını ne olsun (bu değer aynı zamanda MAX7219'un VCC ile ISET arasına takılan direnç ile de ilgili olduğunu göz önüne almak gerekiyor) ve ekran matris mi olsun, 7 segman mı olsun seçeneklerinin belirlenmesi üzerine kuruludur.

Her ne kadar biz 7 segman için  kod çözücü olduğunu belirtsek de, isterseniz, pek ala matris kodlarını da kullanabilirsiniz. Hane ve segmanların hangi dijitleri sürdüğünü bilmeniz ve ona göre kodlama oluşturmanız yeterlidir.

Veri gönderirken, SPI kodlamalarını kullanabildiğiniz gibi, sizin oluşturacağınız  yazılımsal kodlama ile de veri gönderilmesi ve  MAX7219 kontrol edilmesi mümkündür. Bu durumda SPI bacaklarının dışındaki bacakları da kullanmanız mümkün olabilir. Yada SPI bacaklarını aynen kullanıp SPI-MISO bacağını CS olarak kullanmanız da mümkündür. (Kablo bağlantımlarını ISP konnektöründe toplayabilirsiniz. Yazılımsa olarak işlemciye biraz daha fazla iş düşer,

Buradaki tek özel durum LED üzerinde dp olarak bilinen ondalıklı noktadır. Ondalıklı nokta dekoder değerinden ziyade, data registerindeki D7 üzerinden  (1 yanık, 0 sönük olacak şekilde) kontrol edilmektedir. Özellikle ondalıklı değerleri gönderirken bu konuya dikkate almakta fayda var.


ÖRNEKLER

Örnek1:


Her hane sağdan sola doğru 1'den 9'a kadar sayar ve sonra tümü 0'a döner.
/*
  Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf
  Author:  Nicholas Dobie 
  Date:    30 December 2013
  License: WTFPL (http://www.wtfpl.net/)
  Temel olarak yukarıdaki üreticinin kodunu esas aldım
  tabii ki kendi devremize göre kodlamada 
  değişiklikler yaptık.
*/
#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/
void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  // Enable mode B
  maxTransfer(0x09, 0xFF);

  // Use lowest intensity
  maxTransfer(0x0A, 3);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
  // Turn on chip
  maxTransfer(0x0C, 0x01);

}

void loop() {

  // Loop through each code
  for (uint8_t k = 8; k >1; --k) {
    for (uint8_t i = 0; i < 10; ++i)
    {
      maxTransfer(k, i);
      delay(300);
    }
  }
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
}

Örnek2:


Buradaki olay ekranda "00000000" yazar,animasyolu olarak nokta soldan sağa doğru doldulur ve sonra"00000000" yazarak başa alır. Kod ile ilgili başlık örnek1'de verilmiştir.

#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/
void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  // Enable mode B
  maxTransfer(0x09, 0xFF);

  // Use lowest intensity
  maxTransfer(0x0A, 4);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
  // Turn on chip
  maxTransfer(0x0C, 0x01);

}

void loop() {

  maxTransfer(0x01, 0b10000000);
  delay(300);
  maxTransfer(0x02, 0b10000000);
  delay(300);
  maxTransfer(0x03, 0b10000000);
  delay(300);
  maxTransfer(0x04, 0b10000000);
  delay(300);
  maxTransfer(0x05, 0b10000000);
  delay(300);
  maxTransfer(0x06, 0b10000000);
  delay(300);
  maxTransfer(0x07, 0b10000000);
  delay(300);
  maxTransfer(0x08, 0b10000000);
  delay(300);
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
}

Örnek3:


Örneğimizde ilk etapta ekranda "00000000" yazar ve zamanla soldan sağa doğru sıfırlar söner. ve ekrana tekrar"00000000" yazar ve işlem tekrarlanır. Kod ile ilgili başlık örnek1'de verilmiştir.

#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/
void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  // Enable mode B
  maxTransfer(0x09, 0xFF);

  // Use lowest intensity
  maxTransfer(0x0A, 4);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
  // Turn on chip
  maxTransfer(0x0C, 0x01);

}

void loop() {

  maxTransfer(0x01, 0x7f);
  delay(300);
  maxTransfer(0x02,  0x7f);
  delay(300);
  maxTransfer(0x03,  0x7f);
  delay(300);
  maxTransfer(0x04,  0x7f);
  delay(300);
  maxTransfer(0x05,  0x7f);
  delay(300);
  maxTransfer(0x06,  0x7f);
  delay(300);
  maxTransfer(0x07,  0x7f);
  delay(300);
  maxTransfer(0x08,  0x7f);
  delay(300);
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
    delay(500);
}


Örnek4:


örnekte,ekran üzerine soldan sağa doğru "12345678" yazılmaktadır. Ve ekranda kalmaktadır.

#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/
void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  // Enable mode B
  maxTransfer(0x09, 0xFF);

  // Use lowest intensity
  maxTransfer(0x0A, 3);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
  // Turn on chip
  maxTransfer(0x0C, 0x01);
  maxTransfer(0x01, 1);
  maxTransfer(0x02, 2);
  maxTransfer(0x03, 3);
  maxTransfer(0x04, 4);
  maxTransfer(0x05, 5);
  maxTransfer(0x06, 6);
  maxTransfer(0x07, 7);
  maxTransfer(0x08, 8);
}

void loop() {

  
  delay(300);
 
}

Örnek5:

Örneğimizde bilgisayara bağlı bir seri terminal penceresinden(örneğin Arduino IDE programından seri port Ekranı) ekran üzerine istenilen haneye istenilen sayıyı yazdırma için kodlamadır.
Seri port 9600 baud kullanmaktadır.


yazdırılmak istenen sayı H1:2 veya H3:8 gibi  H (hane):değer şeklinde tanımlanmıştır. değer rakam olmalıdır. Hatta istenirse H1:xH2:x....H8:x  (x istenen herhangi bir rakam) olarak tüm ekranı kapsayacak şekilde de seri port üzerinden gönderim yapılabilir.


#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/

//seri port için tampon
unsigned char data_usart[41];
int uart_say = 0; //data_usart() için indis sayacaı
uint8_t rakam = 0;

void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  // Enable mode B
  maxTransfer(0x09, 0xFF);

  // Use lowest intensity
  maxTransfer(0x0A, 3);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
  // Turn on chip
  maxTransfer(0x0C, 0x01);

  //ilk değerleri ekrana yaz
  //soldan sağa hanler
  maxTransfer(0x01, 1);
  maxTransfer(0x02, 2);
  maxTransfer(0x03, 3);
  maxTransfer(0x04, 4);
  maxTransfer(0x05, 5);
  maxTransfer(0x06, 6);
  maxTransfer(0x07, 7);
  maxTransfer(0x08, 8);
  Serial.begin(9600); //seri port 9600 baud ata
  Serial.println("Max7219 aktif");
}

void loop() {

  //seri port üzerinde veri varsa, bunu oku
  //data_usart() üzeri yaz. Enter değeri gelmiş mi bak;
  //enter gelmiş iskomut incelemeye gönder,
 // değilse uart_say sayacını sıfırla
  if (Serial.available())
  {
    data_usart[uart_say] = Serial.read();
    if (data_usart[uart_say] == 13)
      komut_incele();
    else {
      if (uart_say < 40)
        uart_say++;
    }
  }

}


//komut incele 40 ayrılmış bellek olsa da 36'ya kadar bakılmakta
//tüm komutların ortam özelliği "H" ile başlamaları sonra "1"(ve diğer haneleri) ve ":"
//değerlerine bakılmakta, sonraki hane hane verisi, bu değer rakam mı bakılıyor,
//ascII karakterinden düz veri halene getiriliyor, ve ilgili haneye gönderiliyor.
void komut_incele()
{
  for (int i = 0; i < 36; i++)
  {
    if ( data_usart[i] == 'H')
    {
      if ((data_usart[i + 1] == '1') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x01, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '2') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x02, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '3') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x03, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '4') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x04, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '5') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x05, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '6') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x06, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '7') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x07, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == '8') && (data_usart[i + 2] == ':'))
      {
        if (isAlphaNumeric(data_usart[i + 3]))
        {
          rakam = data_usart[i + 3] - 0x30;
          maxTransfer(0x08, rakam);
          if (i < 36)
            i += 4;
        }
      }

    }
  }

// sonra dat_usart ve indisi sıfırlanıyor,..
  for (int i = 0; i < 40; i++)
  {
    //elbette önve değerler terminale gönderiliyor...
    Serial.write (data_usart[i]);
  }
  uart_say = 0;
  for (int i = 0; i < 40; i++)
  {
    data_usart[i] = 0;
  }
}


Örnek6:

Örneğimizde kodlama biraz farklı bir yöne kaymıştır. Görüntüdeki her bir hane  bit olarak kontrol edilmiştir. Yani ekran üzerindeki her bir LED segman bit ile kontrol edilmiştir. Segmanlar rakam[] değişkeninde tanımlanmıştır. gerektiğinde çağrılarak rakam_1 değişkeninde kullanılmaktadır.

#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

const uint8_t rakam[] = {0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011,
                         0b01011011, 0b01011111, 0b01110000, 0b01111111, 0b01111011
                        };
uint8_t rakam_1 = 0;
/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/
void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  //bit sürme
  maxTransfer(0x09, 0x00);

  // Use lowest intensity
  maxTransfer(0x0A, 3);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  rakam_1 = rakam[0x00];
  maxTransfer(0x01, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x02, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x03, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x04, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x05, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x06, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x07, rakam_1);
  rakam_1 = rakam[0x00];
  maxTransfer(0x08, rakam_1);
  // Turn on chip
  maxTransfer(0x0C, 0x01);
  rakam_1 = rakam[1];
  maxTransfer(0x01, rakam_1);
  rakam_1 = rakam[2];
  maxTransfer(0x02, rakam_1);
  rakam_1 = rakam[3];
  maxTransfer(0x03, rakam_1);
  rakam_1 = rakam[4];
  maxTransfer(0x04, rakam_1);
  rakam_1 = rakam[5];
  maxTransfer(0x05, rakam_1);
  rakam_1 = rakam[6];
  maxTransfer(0x06, rakam_1);
  rakam_1 = rakam[7];
  maxTransfer(0x07, rakam_1);
  rakam_1 = rakam[8];
  maxTransfer(0x08, rakam_1);
}

void loop() {


  delay(1000);

}

Örnek7:

Yukarıda verilen örnekler tamamı neredeyse Arduino ve MAX7219 arasında geçen olaylar ve tamamı sadece Arduino tarafından kontrol ediliyor ve veri sağlanıyordu.

Tabii her zaman için bu böyle olmayabilir. Bilgisayardan gönderiler veya uzak bir noktadan erişimi sağlanan sıcaklık, basınç... veya benzeri bir değerin MAX7219 üzerinde görüntülenmesi istenebilir. Bu örneğimizde bilgisayardan girilen bir değerin Arduino ve dolayısı ile MAX7219 üzerinden görüntülenmesi örneği üzerinde durulmaktadır.
C# üzerinde yazılan ve haberleşmesi seri port (USB emülasyon) üzerinden yürütülen  MAX 7219 üzerinde girilen değeri görüntüleyen bir yapıdadır.  Bilgisayar arayüzü yukarıda görüldüğü gibidir.
Kullanımı:
Önceki örneklerde olduğu gibi MAX7219 üzeride bağlı olan Arduino bilgisayar bağla. Burada bakılması gereken Ardiuno'nun bağlandığı seri portun öğrenilmesidir ki bu işin kolayıdır.. Bu port öğrenilmesi önemlidir. Bilgisayarınız üzerinde  donanım olarak seri port yoksa zaten göreceğiniz tek seri port Arduino'ya atanmış seri porttur.
Öğrenmiş olduğunu seri portu kırmızı daire ile işaretli alana COMXX (XX atanmış seri port numarası) olarak giriyorsunuz. Her şey tamam ise iletişim için hazırdır, tek yapılması gereken "Gönder" butonuna basmaktır.
Bu resimde butonlar renklendirilmiş olarak gösterilmektedir. Kırmızı ile gösterilen butonlar ilgili hane değerini 1 artırır 9'dan sonra 0'a döner. Mavi ile gösterilen butonlar ilgili hanenin değerini 1 azaltır. 0'dan sonra 9'a döner.
Yeşil buton "Gönder" butonudur. Hanelere atanan değeri MAX7219'da gösterilmek üzere Arduino 'ya gönderilir. Elbette bunu  otomatik, yani değerlerde herhangi bir değişiklik yapıldığında verinin gönderilmesi şeklinde yapabilmesi mümkündür.
//07-05-2018 tarini ile çalışır durumda...
#include <SPI.h>

// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
#define LOAD_PIN 9

/**
   Transfers data to a MAX7219/MAX7221 register.

   @param address The register to load data into
   @param value   Value to store in the register
*/

//seri port için tampon
unsigned char data_usart[41];
int uart_say = 0; //data_usart() için indis sayacaı
uint8_t rakam = 0;

void maxTransfer(uint8_t address, uint8_t value) {

  // Ensure LOAD/CS is LOW
  digitalWrite(LOAD_PIN, LOW);

  // Send the register address
  SPI.transfer(address);

  // Send the value
  SPI.transfer(value);

  // Tell chip to load in data
  digitalWrite(LOAD_PIN, HIGH);
}


void setup() {
  // Set load pin to output
  pinMode(LOAD_PIN, OUTPUT);
  // Reverse the SPI transfer to send the MSB first
  SPI.setBitOrder(MSBFIRST);

  // Start SPI
  SPI.begin();

  // Run test
  // All LED segments should light up
  maxTransfer(0x0F, 0x01);
  delay(500);
  maxTransfer(0x0F, 0x00);

  // Enable mode B
  maxTransfer(0x09, 0xFF);

  // Use lowest intensity
  maxTransfer(0x0A, 3);//parlaklık ayarı


  // Only scan one digit
  maxTransfer(0x0B, 0x07); //8 dijit

  //dijiitlere ilk değer verme
  maxTransfer(0x01, 0x00);
  maxTransfer(0x02, 0x00);
  maxTransfer(0x03, 0x00);
  maxTransfer(0x04, 0x00);
  maxTransfer(0x05, 0x00);
  maxTransfer(0x06, 0x00);
  maxTransfer(0x07, 0x00);
  maxTransfer(0x08, 0x00);
  // Turn on chip
  maxTransfer(0x0C, 0x01);

  //ilk değerleri ekrana yaz
  //soldan sağa hanler
  maxTransfer(0x01, 1);
  maxTransfer(0x02, 2);
  maxTransfer(0x03, 3);
  maxTransfer(0x04, 4);
  maxTransfer(0x05, 5);
  maxTransfer(0x06, 6);
  maxTransfer(0x07, 7);
  maxTransfer(0x08, 8);
  Serial.begin(9600); //seri port 9600 baud ata
  Serial.println("Max7219 aktif");
}

void loop() {

  //seri port üzerinde veri varsa, bunu oku
  //data_usart() üzeri yaz. Enter değeri gelmiş mi bak;
  //enter gelmiş iskomut incelemeye gönder,
 // değilse uart_say sayacını sıfırla
  if (Serial.available())
  {
    data_usart[uart_say] = Serial.read();
    if (data_usart[uart_say] == 13)
      komut_incele();
    else {
      if (uart_say < 40)
        uart_say++;
    }
  }

}


//komut incele 40 ayrılmış bellek olsa da 36'ya kadar bakılmakta
//tüm komutların ortam özelliği "H" ile başlamaları sonra "1"(ve diğer haneleri) ve ":"
//değerlerine bakılmakta, sonraki hane hane verisi, bu değer rakam mı bakılıyor,
//ascII karakterinden düz veri halene getiriliyor, ve ilgili haneye gönderiliyor.
void komut_incele()
{
  for (int i = 0; i < 36; i++)
  {
    if ( data_usart[i] == 'H')
    {
      if ((data_usart[i + 1] == 'a'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x08, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'b'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x07, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'c'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x06, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'd'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x05, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'e'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x04, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'f') )
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x03, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'g'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x02, rakam);
          if (i < 36)
            i += 4;
        }
      }
      if ((data_usart[i + 1] == 'h'))
      {
        if (isAlphaNumeric(data_usart[i + 2]))
        {
          rakam = data_usart[i + 2] - 0x30;
          maxTransfer(0x01, rakam);
          if (i < 36)
            i += 4;
        }
      }

    }
  }

// sonra dat_usart ve indisi sıfırlanıyor,..
  for (int i = 0; i < 40; i++)
  {
    //elbette önve değerler terminale gönderiliyor...
    Serial.write (data_usart[i]);
  }
  uart_say = 0;
  for (int i = 0; i < 40; i++)
  {
    data_usart[i] = 0;
  }
}


Burada C# programının yazılımı vermeyeceğiz. Onun yerine açık kodları veriyoruz. Derlenmiş programda yer almakta.
C# program ve kodları

Sonuç

Burada doğrudan bir proje yerine kendi projenizde kullanabileceğiniz bir ön çalışma şeklinde vermeye çalıştık. Başka şekilde  anlatmak istersek, size burada bir kapı açtık, ne kadar ilerleyeceğiniz size kalmıştır.

Hiç yorum yok:

Translate

Sayfalar

Etiketler

İzleyiciler