Her hayırlı işe Besmele ile başlamak gerek malum. Biz de hayr murad ederek geç te olsa başladık bu blog işine. Ne diyelim; bana da, takip edenlere de hayırlı olsun o halde. Yıllardır aklımın bir köşesinde sürekli uğraştığım konularla ilgili böyle bir çalışma yapmak vardı. Artık üşengeçlik mi, tembellik mi dersiniz adına bilmem, fakat baktım da bu blogu bile 9 sene önce, 2009 da register etmişim. Yani niyetim halis, tembelliğim gerçek. :)
8 Nisan 2018 (ürün fiyatları, güncel kalması için bu tarihteki TL fiyatlarından USD'ye çevrilerek yazılmıştır)
Sözü fazla uzatmadan ilk yazımız olan, bugünlerde ilgilendiğim LED tabelalara getireyim konuyu. Son yıllarda oldukça yaygınlaşan led tabelaların yaygınlaşmasında ilerleyen teknoloji, gömülü yazılımlardaki gelişmeler epey etkili olmuş durumda. LEGO tarzı yapılan, istenildiği şekilde genişletilebilen blok panel tabela sistemi ile de sanırım zirveye ulaşmış oldu.
Nedir bu LEGO tarzı blok panel led tabelalar? 16x32, 32x32, 64x64 vb. gibi farklı matris boyutlarında üretilen hazır led panellerdir. En çok kullanılan 16x32 lik paneli örnek olarak ele alacak olursak; bu sayılar şunu ifade etmektedir: 16cm yüksekliğinde, 32cm genişliğinde fiziksel ölçülere sahip bir led paneldir. Led panellerin isimlendirmeleri ise her 1 santimetrekare içine düşen led sayısına orantılanarak verilmiştir. Örneğimizdeki 16x32 led panelin tip ismi P10 olarak geçiyorsa her 10mm de 1 adet led gelecek şekilde yerleşimi olan bir led matris paneldir. Yani 16x32x(10/10)=512 adet led vardır örneğimizdeki P10 panelde. Eğer aynı panelin tip ismi P5 olursa bu da her 5mm de 1 adet led gelecek şekilde yerleşimi olan bir led matris paneldir. Yani 16x32x(10/5)=1024 adet led vardır örneğimizdeki P5 panelde. LED panellerin kırmızı, yeşil, mavi, beyaz, sarı gibi tek renkli modelleri olduğu gibi, RGB led paneller de mevcuttur. Bu tip rgb panelleri şehir meydanlarındaki dev ekranlarda görebilirsiniz. Her bir led bir piksele karşılık gelmektedir. Bu mantıkla oluşturulan görüntü bu panellerin yönetimi için oluşturulmuş özel kontrol kartları veya kendi yapacağımız bir ARM, PIC, Arduino veya benzer bir mikroişlemci devresi ve yazılımı ile de mümkündür.
Pratiğe gelecek olursak... :)
Ankara Konya sokaktan 30 TL'ye, internetten 20-30 TL (4.94$) arasına bulabileceğiniz bir P10 LED Panel başlangıç için doğru bir tercih olacaktır.
Örnek bir çalışma için gerekli temel malzemeler:
- bir adet P10 kırmızı renk led panel (kırmızı en uygun fiyatlısıdır) [4.94$]
- bir adet Arduino UNO + USB Kablosu [4.45$]
- bir adet 5 volt, 5 amper (veya üzeri) DC güç kaynağı [5v 10a için 5.44$]
Practical Arduino kitabının yazarı Jonathan Oxer ve Marc Alexander tarafından oluşturulan ve açık kaynak kod ilkesiyle yayın yapan Freetronics sitesinde bulunan Arduino DMD kütüphanesini kullanacağız:
http://www.freetronics.com/dmd-library
https://github.com/freetronics/dmd
linklerindeki "Clone or download zip" adlı yeşil renkli buton ile DMD-master.zip dosyasi indirilir.
Aynı kütüphanenin 3.parti ek geliştirmeler görmüş hali: https://github.com/cjd/DMD
Arduino IDE'deki Taslak > library ekle > .ZIP Kitaplığı Ekle
menülerinden indirilen zip dosya arduino ide'ye eklenir.
Freetronics'in DMD kütüphanesi içinde kullanılan TimerOne kütüphanesini de indirmek gerekiyor:
https://code.google.com/archive/p/arduino-timerone/downloads
linklerinden TimerOne-r11.zip kutuphanesi indirilir.
Eklediğiniz library dosyalarını Arduino IDE'deki Taslak > library ekle
menusunden kontrol edin. DMD-master ve TimerOne-r11 i görmelisiniz.
https://www.freetronics.com.au/products/dot-matrix-display-32x16-red
https://www.freetronics.com.au/pages/using-your-freetronics-dmd
Linklerinde de ufak örnek uygulamalar mevcut.
P10 panel ile Arduino UNO arasında pratik bağlantı için Freetronics'in geliştirdiği ufak bir PCB var:
https://github.com/freetronics/DMDCon
Aşağıda Freetronics tarafından verilen bağlantı şemasını görebilirsiniz:
Bu şemayı PCB'siz olarak jumper kablolar ile aşağıdaki gibi bağlayarak gerçekleştirebiliriz:
Flat kablolarda pin numaraları 1 ile kırmızı çizgili tel (ve bir ok işareti ile de) gösterilir. 1 numaralı pin ile aynı hizada flat kablonun diğer kenarına doğrıı giden sütun tek sayılı (1-3-5-7-...) pinlerdir. 1 numaralı pine komşu olan diğer pin de 2 numaralı pindir. Çift pinler de aynı şekilde flat kablonun diğer kenarına kadar çift sayılı (2-4-6-...) olarak gider:
Uygulanmış hali aşağıdaki fotoğraflarda görüntüğü gibi olmalıdır:
flat kabloya bağlanan jumper kabloları |
arduino pin bağlantıları-1 |
arduino pin bağlantıları-2 |
demo uygulaması çalışırken panel arkası, bağlantılar vs. |
demo uygulaması çalışırken panel önü-arkası, bağlantılar vs. |
demo uygulaması çalışırken panel arkası, bağlantılar vs. |
Arduino Nano kullanarak (aynı bacak bağlantılarıyla) yapılmış hali:
Freetronics DMD kütüphanesinden örnek DMD_Demo kodu:
#include <DMD.h> #include <TimerOne.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); void ScanDMD() { dmd.scanDisplayBySPI(); } void setup(void) { Timer1.initialize( 5000 ); Timer1.attachInterrupt( ScanDMD ); dmd.clearScreen( true ); } void loop(void) { byte b; // yanıp sönen pixel kolonlarının yerleştirilebilmesi için OR ve NOR modlarının demolarını içeren 10 x 14 yazı tipli saat dmd.clearScreen( true ); dmd.selectFont(Arial_Black_16); dmd.drawChar( 0, 3, '2', GRAPHICS_NORMAL ); dmd.drawChar( 7, 3, '3', GRAPHICS_NORMAL ); dmd.drawChar( 17, 3, '4', GRAPHICS_NORMAL ); dmd.drawChar( 25, 3, '5', GRAPHICS_NORMAL ); dmd.drawChar( 15, 3, ':', GRAPHICS_OR ); delay( 1000 ); dmd.drawChar( 15, 3, ':', GRAPHICS_NOR ); delay( 1000 ); dmd.drawChar( 15, 3, ':', GRAPHICS_OR ); delay( 1000 ); dmd.drawChar( 15, 3, ':', GRAPHICS_NOR ); delay( 1000 ); dmd.drawChar( 15, 3, ':', GRAPHICS_OR ); delay( 1000 ); dmd.drawMarquee(" https://ersinkecis.blogspot.com.tr ",39,(32*DISPLAYS_ACROSS)-1,0); long start=millis(); long timer=start; boolean ret=false; while(!ret){ if ((timer+30) < millis()) { ret=dmd.stepMarquee(-1,0); timer=millis(); } } // piksellerin yarısı dmd.drawTestPattern( PATTERN_ALT_0 ); delay( 1000 ); // diğer yarısı dmd.drawTestPattern( PATTERN_ALT_1 ); delay( 1000 ); // bir yazıyı tek ekranda 2 satır olarak görüntüle dmd.clearScreen( true ); dmd.selectFont(System5x7); for (byte x=0;x<DISPLAYS_ACROSS;x++) { for (byte y=0;y<DISPLAYS_DOWN;y++) { dmd.drawString( 2+(32*x), 1+(16*y), "ERSiN", 5, GRAPHICS_NORMAL ); dmd.drawString( 2+(32*x), 9+(16*y), "KECiS", 5, GRAPHICS_NORMAL ); } } delay( 2000 ); // ekranın dışına bir çerçeve çiz dmd.clearScreen( true ); dmd.drawBox( 0, 0, (32*DISPLAYS_ACROSS)-1, (16*DISPLAYS_DOWN)-1, GRAPHICS_NORMAL ); delay( 1000 ); for (byte y=0;y<DISPLAYS_DOWN;y++) { for (byte x=0;x<DISPLAYS_ACROSS;x++) { // bir X çiz int ix=32*x; int iy=16*y; dmd.drawLine( 0+ix, 0+iy, 11+ix, 15+iy, GRAPHICS_NORMAL ); dmd.drawLine( 0+ix, 15+iy, 11+ix, 0+iy, GRAPHICS_NORMAL ); delay( 1000 ); // bir daire çiz dmd.drawCircle( 16+ix, 8+iy, 5, GRAPHICS_NORMAL ); delay( 1000 ); // içi dolu bir kutu çiz dmd.drawFilledBox( 24+ix, 3+iy, 29+ix, 13+iy, GRAPHICS_NORMAL ); delay( 1000 ); } } // şerit kovalayan testi for( b = 0 ; b < 20 ; b++ ) { dmd.drawTestPattern( (b&1)+PATTERN_STRIPE_0 ); delay( 200 ); } delay( 200 ); }
Merhaba Ersin güzel bir paylaşım olmuş
YanıtlaSilmerhaba hocam ledler yanmadı nedeni nedir acaba yardım eder misiniz?
YanıtlaSilçok genel bir soru olmuş. :) yukardaki safhaları en ince detaya kadar ve elimden geldiğince net bir şekilde fotoğraflamaya çalıştım. tekrar gözden geçirmenizi öneririm. olmazsa sıkıntıyı daha detaylandırabilirseniz yardımcı olmaya çalışırım. şu an itibarı ile güç kaynağı 220v fişine bakın diyebilirim ilk kontrol etmeniz gereken nokta odur. oradan başlayıp P10 panele doğru bağlantıları inceleyin isterseniz. Selamlar.
YanıtlaSilMerhaba Ersin Hocam;
YanıtlaSilArduino ve dmd ile ilgili bir proje üzerinde çalışıyorum. Henüz projenin başındayım. Projede yapılmak istenen hadise 3 adet dmd nin 1 tanesinde zaman işleyecek. Diğer 2 adet dmd de ise basılan butonlara göre her bir dmd deki sayısal değerler artış yapacak. Örneğin birinci dmd ye ait butonlardan birine basılınca başlangıç değeri "0"(sıfır) olan sayısal değerimiz "1" artacak, ikinci butona basılınca o anki değerimiz kaç ise üzerine 2 puan daha eklenecek. diğer dmd de de aynı durum söz konusu. Zamanı işleyen ve sayısal değerleri butonlarla arttıran kodlarım hazır.
Sizin bu konudaki çalışmalarınızı görünce bana, olurmu olmazmı noktasında fikir verebileceğinizi düşündüm. Öğrenmek istediğim hususa geçmeden önce arduinonun pinlerinin projeme yetebilmesi için en asgari kullanabilmek adına 2 adet dmd nin arduinodan gelen bağlantılarını (araştırmalarıma göre)aynı bağlayabiliyormuşuz. Sadece 2 pin bağlantısı değişiyormuş. Yanlış hatırlamıyorsam sclk ve clk pinleri olsa gerek. Sizcede durum böyle midir? Ayrıca 3 adet dmd yi bu yöntemle bağlamak mümkün olur mu? Mümkün olsa bile arduino bu işin altından kalkabilir mi? Eğer araştırmalarım beni yanıltıyorsa o halde 2 dmd yi birbirine bağlamak için dmd nin diğer kenarındaki geçiş pinlerini kullanarak mı yapılacak (yani bildiğimiz tabelacıların yaptığı standart bağlantı). Böyle olduğu takdirde yazılımda da değişiklikler olacaktır. Aynı zamanda yazılımların kaplayacağı kapasiteyide düşünmek zorundayım. Fikir olarak yardımcı olursanız minnettar olurum. İyi çalışmalar...
mrb. 1 adetten fazla panelde sorunlar yaşadım ben. ya her birine ayrı mcu ve mcu lar arasında haberleşme veya mcu tipini arm olarak güncellemek çözüm olabilir gibi.
SilElinize aklınıza sağlık Ersin Bey.Çok faydalı bir yazı oldu benim için.
YanıtlaSilexit status 1
YanıtlaSil'dmd' was not declared in this scope
hatası alıyorum.. yardım eder misiniz
çözebildin mi proble mi
SilErsin bey teşekkürler paylaşımınız için. Ekranı 32x32 olarak nasıl tanitiriz arduinoya? Ya da 48x64 gibi...
YanıtlaSilmrb. 1 adetten fazla panelde sorunlar yaşadım ben. ya her birine ayrı mcu ve mcu lar arasında haberleşme veya mcu tipini arm olarak güncellemek çözüm olabilir gibi
SilErsin hocam clock senkronu nasıl olacak yada nasıl ayarlanabilir? bu arada arduino dan enerji kesildiğinde her seferinde saat sıfırlanır mı?
YanıtlaSilevet maalesef sıfırlanır. sıfırlanmaması için üzerinde minik bir buton pil bulunan RTC modülü gerekir.
Silhttps://ersinkecis.blogspot.com/2018/04/p10-led-panel-ile-real-time-clock.html
Silbu linkte sizin konuyla ilgili başka bir ufak çalışmam daha vardı.
ersin beey paylaşımınız için teşekkürler benim bu pinlerim dolu olmak zorunda kalıyor hangi pinlerin yerini değiştirebilirim acaba ?
YanıtlaSilTeşekkürler. Arduino UNO ile sorunsuz çalıştırdım fakat pinleri Arduino Megaya taşıdığımda panel hiç bir tepki vermedi. Bağlantılarda problem yok. Megaya kod yüklerken de sıkıntı yok. Bir fikriniz var mı?
YanıtlaSilbu kodlar P6 rgb paneli de çalıştırır mı?
YanıtlaSilmerhaba ersin bey ben kendi çapında bir numaratör benzeri bir şey yapmaya çalışıyorum(arkadaş arasında turnuva benzeri bir şey için) bir çok kısmını halletmeme rağmen birtek bir alta kaydırmayı yapamadım yani 1. sayı girilir 2. sayı girildiğinde 1. sayı 2. sıraya 2. sayı ise 1. sıraya oturur yani son girilen sayı 1. sıraya diğer sayılar ise 1 aşağı gider(3 adet p10 panel kullanıyorum alt alta duruyor
YanıtlaSil)
Bu yorum yazar tarafından silindi.
YanıtlaSilMerhaba Hocam türkçe karakter sorunu için ne yapabiliriz
YanıtlaSilKarekterleri kendin yapmalısın.
Sil