Página 1 de 1

ESP 32 e Jinx

Enviado: 06/Dez/2018, 14:18
por DJ_Elton
Sou novato aqui no fórum e tenho uma questão relacionada a Jinx e ESP32.
Eu tenho hoje um pequeno painel de Leds com 600 leds (30x20) WS2812, o qual utilizo com o Arduino Mega. Ele funciona muito bem, mas eu estou precisando controlar uma quantidade maior de Leds (1800 Leds) e infelizmente o Arduino Mega não tem essa capacidade de memória.
Assim estou precisando de ajuda com relação à programação do ESP32 para utilizá-lo no Jinx. No Arduino Mega utilizo o protocolo Glediator e COM3. Já entendi como configurar o Jinx para utilizar o protocolo ArtNet. Vi algumas coisas na internet, mas não achei nenhum passo a passo que eu pudesse utilizar além disso.
O que eu não sei é como programar o ESP32 para receber o protocolo ArtNet enviado pelo Jinx e controlar as fitas de Led WS2812.
Seria bacana se alguém pudesse me dar as dicas e o passo a passo que devo fazer para que o meu ESP32 possa receber o protocolo ArtNet vindo do Jinx e controlar os 1800 Leds (60x30).

Abaixo segue o código que utilizo no Arduino Mega

//##############################################################################
//##############################################################################
// #
// Glediator to WS2812 pixel converter #
// by R. Heller #
// V 1.0 - 07.01.2014 #
// wwww.SolderLab.de #
// #
// Receives serial data in Glediator protocol format @ 1 MBit/s #
// and distributes it to a connectect chain of WS2812 pixels #
// #
// Adjust the correct DATA PIN and the correct NUMBER OF PIXELS you are using #
// in the definitions section below before uploading this sketch to your #
// Arduino device. #
// #
// Maxiumim number of supported pixeles is 512 !!! #
// #
// In the Glediator software set output mode to "Glediator_Protocol", #
// color order to "GRB" and baud rate to "1000000" #
// #
//##############################################################################
//##############################################################################


//##############################################################################
// #
// Definitions --> Make changes ONLY HERE #
// #
// To find out the correct port, ddr and pin name when you just know the #
// Arduino's digital pin number just google for "Arduino pin mapping". #
// In the present example digital Pin 6 is used which corresponds to "PORTD", #
// "DDRD" and "6", respectively. #
// #
//##############################################################################

#define DATA_PORT PORTA
#define DATA_DDR DDRA
#define DATA_PIN 0 //This relates to PDA0 (PIN 22 on the Mega 2560)
#define NUMBER_OF_PIXELS 600


//##############################################################################
// #
// Variables #
// #
//##############################################################################

unsigned char display_buffer[NUMBER_OF_PIXELS * 3];
static unsigned char *ptr;
static unsigned int pos = 0;

boolean go = 0;


//##############################################################################
// #
// Setup #
// #
//##############################################################################

void setup()
{
// Set data pin as output
DATA_DDR |= (1<<DATA_PIN);


// Initialize UART
UCSR0A |= (1<<U2X0);
UCSR0B |= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) ;
UBRR0H = 0;
UBRR0L = 1; //Baud Rate 1 MBit (at F_CPU = 16MHz)

ptr=display_buffer;

//Enable global interrupts
sei();
}


//##############################################################################
// #
// Main loop #
// #
//##############################################################################

void loop()
{
if (go==1)
{
cli();
ws2812_sendarray(display_buffer, NUMBER_OF_PIXELS * 3);
sei();
go=0;
}
}


//##############################################################################
// #
// UART-Interrupt-Prozedur (called every time one byte is compeltely received) #
// #
//##############################################################################

ISR(USART0_RX_vect)
{
unsigned char b;
b=UDR0;

if (b == 1) {pos=0; ptr=display_buffer; return;}
if (pos == (NUMBER_OF_PIXELS*3)) {} else {*ptr=b; ptr++; pos++;}
if (pos == ((NUMBER_OF_PIXELS*3)-1)) {go=1;}
}


//##############################################################################
// #
// WS2812 output routine #
// Extracted from a ligh weight WS2812 lib by Tim (cpldcpu@gmail.com) #
// Found on wwww.microcontroller.net #
// Requires F_CPU = 16MHz #
// #
//##############################################################################

void ws2812_sendarray(uint8_t *data,uint16_t datlen)
{
uint8_t curbyte,ctr,masklo;
uint8_t maskhi = _BV(DATA_PIN);
masklo =~ maskhi & DATA_PORT;
maskhi |= DATA_PORT;

while (datlen--)
{
curbyte = *data++;

asm volatile
(
" ldi %0,8 \n\t" // 0
"loop%=:out %2, %3 \n\t" // 1
"lsl %1 \n\t" // 2
"dec %0 \n\t" // 3
" rjmp .+0 \n\t" // 5
" brcs .+2 \n\t" // 6l / 7h
" out %2,%4 \n\t" // 7l / -
" rjmp .+0 \n\t" // 9
" nop \n\t" // 10
" out %2,%4 \n\t" // 11
" breq end%= \n\t" // 12 nt. 13 taken
" rjmp .+0 \n\t" // 14
" rjmp .+0 \n\t" // 16
" rjmp .+0 \n\t" // 18
" rjmp loop%= \n\t" // 20
"end%=: \n\t"
: "=&d" (ctr)
: "r" (curbyte), "I" (_SFR_IO_ADDR(DATA_PORT)), "r" (maskhi), "r" (masklo)
);
}

}


//##############################################################################
// #
// End of program #
// #
//##############################################################################