P10 Led panel etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
P10 Led panel etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

P10 Led Panel Nasıl Sürülür - Arduino kod


P10 led panel data adresleri

   

 16 Şubat 2022 tarihinde yayınladığım yazımda P10 led panel devre incelemesi 'ni konu almıştım. O yazının sonuna eklediğim video (P10 Led Panel Nasıl Çalışır) içeriğinde detaylı izleyebilirsiniz. P10 Led panelin çalışma prensibi konusunda bir fikir edindik, ancak göndereceğimiz verilerin panel üzerinde hangi sırayla çalışacağına dair herhangi bir fikir edinme şansımız olmadı. Aşağıda paylaştığım kodu Arduino IDE 'de yeni bir skecth 'e kopyala/yapıştır yaparak kullanabilirsiniz, pin bağlantıları #define satırlarında belirlenmiştir. Ben bu denemede Arduino Mega kullandım farklı bir kart kullanırsanız pinlerde gerekli değişiklikleri yapmanız gerekmekte, 51 mega için MOSI, 52 ise SPI CLK pinidir.

    İlk yazdığım test kodunda data pininden sadece 1 kez LOW sinyal gönderip, datayı shift ettim, peşinden datayı HIGH konumuna çekerek 127 kez daha shift ederek yanan ledin panel üzerindeki yolculuğunu görmüş olduk.

P10 led panel data map

Gönderdiğimiz ilk bilgi biti panelin şekildeki duruşuna göre, sağ en üstteki lede denk geliyor. Her shift ettiğimizde(yani CLK pinine gönderdiğimiz her pulse için) data sola kayıyor, 74HC595 8 bit olduğunda 8 inci bite ulaştığında ilk entegreden çıkıp ikinci entegrenin ilk bitinden giriyor. Mavi alanlarda gördüğünüz 1 den 16 ya kadar olan sayılar devredeki 74HC595 'lerin sıralamasını ifade etmekte. Aşağıdaki kod içinde kullandığım displayArea[][] dizisinin paneldeki yerleşimi de alanlar içerisinde yazıyor. Bu kod ile panelde bir ledi yakmak için yapılması gereken tek şey bu dataların değiştirilmesi. Unutmayın 74HC595 'ler  ledlerin GND sini sağladığı için 0 olan bitler ledin yanmasını sağlayacak.

Aşağıdaki kod yazının başında yer alan görseli ekrana basıyor olacak.
#include <Arduino.h>
#define _oe 9
#define _a 6
#define _b 7
#define _latch 8
//#define _data 51 // Mega Spi.Data
//#define _clk 52  // mega Spi.Clock
#include <SPI.h>
void Latch();
void clearScreen();
uint8_t _row = 0;
uint16_t brightness = 500;
volatile uint8_t displayArea[4][16];
void writeData();
void Latch();
void setup()
{
  pinMode(_oe, OUTPUT);
  pinMode(_a, OUTPUT);
  pinMode(_b, OUTPUT);
  pinMode(_latch, OUTPUT);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV4); // 4Mhz 12,8khz
  SPI.begin();

  digitalWrite(_oe, LOW);
  digitalWrite(_a, LOW); // 00 01 10
  digitalWrite(_b, LOW);
  digitalWrite(_latch, LOW);

  // TIMER 1 for interrupt frequency 100 Hz:
  cli();      // stop interrupts
  TCCR1A = 0; // set entire TCCR1A register to 0
  TCCR1B = 0; // same for TCCR1B
  TCNT1 = 0;  // initialize counter value to 0
  // set compare match register for 100 Hz increments
  OCR1A = 19999; // = 16000000 / (8 * 100) - 1 (must be <65536)
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 8 prescaler
  TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10);
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  sei(); // allow interrupts

clearScreen();
displayArea[1][6]=0x99;
displayArea[2][6]=0x99;
displayArea[3][6]=0b10000001;
displayArea[0][5]=0b11000011;
displayArea[1][5]=0b11100111;
displayArea[2][5]=0b11100111;
displayArea[3][5]=0b11100111;
displayArea[3][10]=0b11001111;
displayArea[0][9]=0b10110110;
displayArea[1][9]=0b10000110;
displayArea[2][9]=0b10111111;
displayArea[3][9]=0b11000110;
displayArea[1][14]=displayArea[2][14]=0b11111011;
displayArea[3][14]=displayArea[1][13]=0b11011;
displayArea[0][13]=0b11111011;
displayArea[2][13]=0b11011111;
displayArea[3][13]=0b111011;
}
void loop()
{
  // put your main code here, to run repeatedly:
}
ISR(TIMER1_COMPA_vect)
{
  digitalWrite(_oe, LOW);
  writeData();
}
void clearScreen()
{
  for (uint8_t row = 0; row < 4; row++)
    for (uint8_t col = 0; col < 16; col++)
      displayArea[row][col] = 0xFF;
}
void writeData()
{
   for (uint8_t row = 0; row < 4; row++)
   {
     digitalWrite(_a, row & 1);
     digitalWrite(_b, row & 2);
    for (uint8_t col = 0; col < 16; col++)
    {
      SPI.transfer(displayArea[row][col]);
    }
    Latch();
    digitalWrite(_oe, HIGH);
    delayMicroseconds(brightness);
    digitalWrite(_oe, LOW);
   }

}
void Latch()
{
  digitalWrite(_latch, HIGH);
  digitalWrite(_latch, LOW);
}


Sonuç :


Bu konuyu da Youtube Kanalım 'da detaylı anlattım:(P10 Led Panel Nasıl Sürülür) Keyifli seyirler dilerim.



Herkese kolay gelsin.

P10 Led Panel Nasıl Çalışır

 P10 Led Panel 32x16 toplamda 512 tane ledden oluşur. Üzerinde Hub1.2 adı verilen 8x12 lik iki adet bağlantı noktası ve 5v güç giriş bağlantısı bulunur. Hub1.2 bağlantılarının aşağıdaki resme göre soldaki giriş, diğeri ise diğer panellere bağlanabilmesi için çıkış olarak ayarlanmıştır.

P10 led panel

P10 Led panel pinoutHub1.2 bağlantı noktasının pin tanımlamaları  yandaki şekilde gösterilmiştir. ENABLE pinine HIGH sinyal uygulandığında panel aktif olur, bu pin LOW sa panelden diğer tüm parametrelere bakılmaksızın görüntü alamıyoruz.

A ve B pinleri panelde satır seçme işlemi için kullanılır. Panelin yukardan aşağıya doğru (panelin arkasındaki yön gösteren oklardan dikey olan yukarı konumu gösteriyorken) 16 satıra sırasıyla A1-A16 isimlerini verirsek seçme işlemi şu şekilde olacak 

(Burada seçme işlemiyle kastedilen ledlerin anodlarına + voltajın verilmesini sağlamaktır, A ve B nin durumuna göre seçili satırda bulunan ledlerin anodu enerjilendirilmiş olur)

BASeçilen Satırlar
00A1-A5-A9-A13
01A2-A6-A10-A14
10A3-A7-A11-A15
11A4-A8-A12-A16

DATA pini ledlerin katodlarınında belirleyicidir, yani data pininde gönderdiğimiz sinyalin LOW olduğu kısımlara denk gelen ledler çalışıyor olacak, data gönderim işlemi kısaca şöyle, data pininin seviyesi CLK pini üzerinden pir pulse gönderilerek 74HC595 'in registerine kaydırılır, A,B 0 0 iken sarı satırlar üzerine binecek olan data gönderimi yapılacak, gönderdiğiniz her data bir öncekileri ileri kaydıracak şekilde tasarlanmıştır. Tek bir satırda 8*16 = 128 tane led vardır, her birinin yanma sönük kalma durumu bu şekilde registerlara yazdırılır, sonra SCLK pinine pulse gönderilerek ilk satırın veri gönderimi tamamlanmış olur. SCLK pulse 74HC595 lerin registerlerindeki datayı çıkışlarına, yani ledlere göndermiş olur, SCLK pulse gelmeden çıkışlar yüksek empedans durumundadır. Aynı rutin 4 satıra da uygulanarak, tüm ekranın taraması tamamlanmış olur.

P10 panel data akışı

şekilde de görüldüğü üzere ilk gönderdiğiniz data şuanda 128 yazan hücreden girip yolculuğunu sol atta 1 yazan hücrede tamamlar, varsa bir sonraki panelin 128 yazan hücresinden girerek yoluna devam eder.


P10 led panelin çalışma prensibi ve devre analizi ile devresinde bulunan 74HC245 74HC04 74 HC138 ve 74HC595 entegrelerinin de nasıl çalıştığını incelediğim videoma yazının sonunda ulaşabilirsiniz. Keyifli seyirler.



Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...