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.
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
X | X | X | X | ADRES | MSB 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 | Hex Kodu | |||||
D15-D12 | D11 | D10 | D9 | D8 | ||
işlem yok | X | 0 | 0 | 0 | 0 | 0xX0 |
Dijit 0 | X | 0 | 0 | 0 | 1 | 0xX1 |
Dijit 1 | X | 0 | 0 | 1 | 0 | 0xX2 |
Dijit 2 | X | 0 | 0 | 1 | 1 | 0xX3 |
Dijit 3 | X | 0 | 1 | 0 | 0 | 0xX4 |
Dijit 4 | X | 0 | 1 | 0 | 1 | 0xX5 |
Dijit 5 | X | 0 | 1 | 1 | 0 | 0xX6 |
Dijit 6 | X | 0 | 1 | 1 | 1 | 0xX7 |
Dijit 7 | X | 1 | 0 | 0 | 0 | 0xX8 |
Kodlama Modu | X | 1 | 0 | 0 | 1 | 0xX9 |
Parlaklık | X | 1 | 0 | 1 | 0 | 0xXA |
Tarama Sınırı | X | 1 | 0 | 1 | 1 | 0xXB |
Kapatma | X | 1 | 1 | 0 | 0 | 0xXC |
Ekran Test | X | 1 | 1 | 1 | 1 | 0xXF |
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ı karakter | Register Verisi | Yanık Parçalar=1 | ||||||||||||
D7* | D6-D4 | D3 | D2 | D1 | D0 | DP* | A | B | C | D | E | F | G | |
0 | X | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | ||
1 | X | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ||
2 | X | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | ||
3 | X | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | ||
4 | X | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | ||
5 | X | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | ||
6 | X | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | ||
7 | X | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | ||
8 | X | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
9 | X | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | ||
- | X | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ||
E | X | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | ||
H | X | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | ||
L | X | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | ||
P | X | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | ||
boş | X | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
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 | - |
MAX7219 | U1 |
oR 1206 | R2,R3,R4,R5,R6,R7 |
10k | R1 |
100nF 1206 | C1,C2,C3 |
10uF | C4 |
JYFD056ASR | dis1,dis2 |
2x5 sıra pin erkek | -- |
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.
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.
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:
/*
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:
#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ı
Hiç yorum yok:
Yorum Gönder