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); // 4mghz 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.

Yorumlar

Bu blogdaki popüler yayınlar

Arduino IDE Kod Satır Numaraları Nasıl Açılır

DMD2TUR | Arduino P10 Led Panel için Türkçe Karakter Desteği | Arduino P10 Led panel Türkçe yazı yazma