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.
#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.