8 Nisan 2018 Pazar

P10 LED Panelleri Arduino ile Kullanmak

Bismillahirrahmanirrahim.

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 );      
}

20 yorum:

  1. Merhaba Ersin güzel bir paylaşım olmuş

    YanıtlaSil
  2. merhaba hocam ledler yanmadı nedeni nedir acaba yardım eder misiniz?

    YanıtlaSil
  3. ç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ıtlaSil
  4. Merhaba Ersin Hocam;
    Arduino 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...

    YanıtlaSil
    Yanıtlar
    1. 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.

      Sil
  5. Elinize aklınıza sağlık Ersin Bey.Çok faydalı bir yazı oldu benim için.

    YanıtlaSil
  6. exit status 1
    'dmd' was not declared in this scope

    hatası alıyorum.. yardım eder misiniz

    YanıtlaSil
  7. Ersin bey teşekkürler paylaşımınız için. Ekranı 32x32 olarak nasıl tanitiriz arduinoya? Ya da 48x64 gibi...

    YanıtlaSil
    Yanıtlar
    1. 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

      Sil
  8. Ersin 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ıtlaSil
    Yanıtlar
    1. evet maalesef sıfırlanır. sıfırlanmaması için üzerinde minik bir buton pil bulunan RTC modülü gerekir.

      Sil
    2. https://ersinkecis.blogspot.com/2018/04/p10-led-panel-ile-real-time-clock.html
      bu linkte sizin konuyla ilgili başka bir ufak çalışmam daha vardı.

      Sil
  9. 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ıtlaSil
  10. Teş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ıtlaSil
  11. bu kodlar P6 rgb paneli de çalıştırır mı?

    YanıtlaSil
  12. merhaba 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
  13. Merhaba Hocam türkçe karakter sorunu için ne yapabiliriz

    YanıtlaSil