M5Stack으로 LED 매트릭스 패널(HUB-75)을 빛나게 합니다.
참고
HUB75 LED Matrix Panel
옥외의 높은 곳에, 휘도가 약간 높은 LED 디스플레이가 있으면, 대체로 이 규격의 LED 패널이 사용되고 있습니다(아마). 최근에는 국내에서도 쉽게 구입할 수 있게 되었습니다. 거기의 휘도가 있어, 제어에 필요한 기기도 그만한 가격으로 입수할 수 있기 때문에, 업무용으로서는 꽤 널리 사용되고 있다고 하는 인상입니다.
HUB75의 사양에 대해서는, 아래의 기사로 상세하게 쓰여져 있으므로, 여기서는 요점만 씁니다.
또한 64x64 패널의 경우 HUB75E라는 HUB75를 확장한 규격이 사용되는 경우가 많습니다. HUB75E는 GND 핀을 하나 잡고 대신 열을 지정하는 E 핀을 추가합니다. ABCDE 의 5bit 로 지정하는 것으로, 32 열 (x2=64 열) 지정할 수 있습니다.
사용한 것
LED Matrix Panel 은, 같은 외형을 하고 있어도, 신호 주위의 사양 (핀 배치, HIGH/LOW 의 해석)이 다른 일이 있는 것 같습니다.
결선
실제로 결선하려고 하고 나서 깨달았습니다만, M5Stack 의 디폴트로 나와 있는 핀 뿐이라면, 미묘하게 핀수가 부족해 R2, G2, B2 에 결선할 수 없었습니다. 억지로 내놓고 충분하게 할 수도 있습니다만, 실험이므로 우선 이번에는 R2, G2, B2는 없이 했습니다. 이 때문에 패널의 상반부만 빛납니다.
M5Stack의 18과 19 핀은 LCD에 사용되므로 LED 패널이 빛나는 동안 LCD를 움직이면 버그됩니다. 1, 3의 핀은 시리얼 통신에 사용되고 있으며, 35, 36은 input only이므로 이번 용도에는 사용할 수 없습니다.
LED Matrix Panel은 5V 동작이지만 M5Stack의 3.3V 출력을 직접 넣어도 문제없이 동작하는 것 같습니다.
상당히 거칠지만 이런 결선에서도 빛났습니다. 단, 조금이라도 만지면 노이즈가 튀어 깜박입니다.
전체 점등 프로그램
실험이므로, 여러가지 쉽도록 Arduino로 써 보았습니다. PIN_R1, PIN_G1, PIN_B1을 HIGH로 설정하거나 LOW로 설정하면 색상을 변경할 수 있습니다.
#define PIN_A 18
#define PIN_B 19
#define PIN_C 21
#define PIN_D 22
#define PIN_R1 16
#define PIN_G1 26
#define PIN_B1 17
#define PIN_CLK 2
#define PIN_OE 23
#define PIN_LAT 5
void setup()
{
pinMode( PIN_A, OUTPUT );
pinMode( PIN_B, OUTPUT );
pinMode( PIN_C, OUTPUT );
pinMode( PIN_D, OUTPUT );
pinMode( PIN_R1, OUTPUT );
pinMode( PIN_G1, OUTPUT );
pinMode( PIN_B1, OUTPUT );
pinMode( PIN_CLK, OUTPUT );
pinMode( PIN_OE, OUTPUT );
pinMode( PIN_LAT, OUTPUT );
digitalWrite( PIN_A, LOW );
digitalWrite( PIN_B, LOW );
digitalWrite( PIN_C, LOW );
digitalWrite( PIN_D, LOW );
digitalWrite( PIN_R1, LOW );
digitalWrite( PIN_G1, LOW );
digitalWrite( PIN_B1, LOW );
digitalWrite( PIN_LAT, LOW );
// OE のみ HIGH で OFF になる
digitalWrite( PIN_OE, HIGH );
digitalWrite( PIN_CLK, LOW );
}
void loop()
{
int i = 0;
char d = 0;
for ( d = 0; d < 16; d++ ){
// ラッチはこのタイミングで HIGH にする必要があるぽい
digitalWrite( PIN_LAT, HIGH );
// (R=1,G=1,B=1)
digitalWrite( PIN_R1, HIGH );
digitalWrite( PIN_G1, HIGH );
digitalWrite( PIN_B1, HIGH );
// R2,G2,B2 も結線できている場合
// digitalWrite( PIN_R2, HIGH );
// digitalWrite( PIN_G2, HIGH );
// digitalWrite( PIN_B2, HIGH );
// RGB データ (R=1,G=1,B=1) を 64ibt 分転送する
for ( i = 0; i < 64; i++ ){
digitalWrite( PIN_CLK, HIGH );
digitalWrite( PIN_CLK, LOW );
}
// LED を消灯する (データ転送時のちらつきを防ぐ)
digitalWrite( PIN_OE, HIGH );
// LED パネルの光らせる列を 4bit で指定する
digitalWrite( PIN_A, ( d & 1 ) );
digitalWrite( PIN_B, ( d & 2 ) >> 1);
digitalWrite( PIN_C, ( d & 4 ) >> 2);
digitalWrite( PIN_D, ( d & 8 ) >> 3);
// 4bit で指定した列に RGB データを転送する
digitalWrite( PIN_LAT, LOW );
// LED を点灯する
digitalWrite( PIN_OE, LOW );
}
}
중간색 점등 프로그램
LED가 켜지는 시간의 길이를 조정하여 중간색을 표현해 보는 테스트입니다.
// setup() と #define は上のプログラムと同じなので省略
// 色調(階調)の設定
inline void SET_RGB( char r, char g, char b, int j ){
digitalWrite( PIN_R1, r > j ? HIGH : LOW );
digitalWrite( PIN_G1, g > j ? HIGH : LOW );
digitalWrite( PIN_B1, b > j ? HIGH : LOW );
}
char d = 0;
void loop()
{
int i = 0;
int j = 0;
for ( j = 0; j < 16; j++ ){ // RGB 16 階調 (16x16x16=4096色)
for ( d = 0; d < 16; d++ ){
digitalWrite( PIN_LAT, HIGH );
for ( i = 0; i < 64; i++ ){
SET_RGB( d, i/4, 15-d, j );
digitalWrite( PIN_CLK, HIGH );
digitalWrite( PIN_CLK, LOW );
}
digitalWrite( PIN_OE, HIGH );
digitalWrite( PIN_A, ( d & 1 ) );
digitalWrite( PIN_B, ( d & 2 ) >> 1);
digitalWrite( PIN_C, ( d & 4 ) >> 2);
digitalWrite( PIN_D, ( d & 8 ) >> 3);
digitalWrite( PIN_LAT, LOW );
digitalWrite( PIN_OE, LOW );
}
}
}
240MHz 동작이라면 256계조라도 할 수 있을 것입니다만, 위의 프로그램으로 256계조로 하면 깜박거렸습니다. 16 계조 정도로 하고, 간신히 깜박거리지 않게 되었습니다. 성실하게 256 계조 한다면, 역시 DMA 등을 사용할 필요가 있을 것 같습니다.
결론
여러가지 중도반단이 되어 버렸기 때문에, ESP32 에서도 조금 진지하게 써 정보 추기할 때(언제?).
Reference
이 문제에 관하여(M5Stack으로 LED 매트릭스 패널(HUB-75)을 빛나게 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mml/items/c08946c91053ef23c441
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#define PIN_A 18
#define PIN_B 19
#define PIN_C 21
#define PIN_D 22
#define PIN_R1 16
#define PIN_G1 26
#define PIN_B1 17
#define PIN_CLK 2
#define PIN_OE 23
#define PIN_LAT 5
void setup()
{
pinMode( PIN_A, OUTPUT );
pinMode( PIN_B, OUTPUT );
pinMode( PIN_C, OUTPUT );
pinMode( PIN_D, OUTPUT );
pinMode( PIN_R1, OUTPUT );
pinMode( PIN_G1, OUTPUT );
pinMode( PIN_B1, OUTPUT );
pinMode( PIN_CLK, OUTPUT );
pinMode( PIN_OE, OUTPUT );
pinMode( PIN_LAT, OUTPUT );
digitalWrite( PIN_A, LOW );
digitalWrite( PIN_B, LOW );
digitalWrite( PIN_C, LOW );
digitalWrite( PIN_D, LOW );
digitalWrite( PIN_R1, LOW );
digitalWrite( PIN_G1, LOW );
digitalWrite( PIN_B1, LOW );
digitalWrite( PIN_LAT, LOW );
// OE のみ HIGH で OFF になる
digitalWrite( PIN_OE, HIGH );
digitalWrite( PIN_CLK, LOW );
}
void loop()
{
int i = 0;
char d = 0;
for ( d = 0; d < 16; d++ ){
// ラッチはこのタイミングで HIGH にする必要があるぽい
digitalWrite( PIN_LAT, HIGH );
// (R=1,G=1,B=1)
digitalWrite( PIN_R1, HIGH );
digitalWrite( PIN_G1, HIGH );
digitalWrite( PIN_B1, HIGH );
// R2,G2,B2 も結線できている場合
// digitalWrite( PIN_R2, HIGH );
// digitalWrite( PIN_G2, HIGH );
// digitalWrite( PIN_B2, HIGH );
// RGB データ (R=1,G=1,B=1) を 64ibt 分転送する
for ( i = 0; i < 64; i++ ){
digitalWrite( PIN_CLK, HIGH );
digitalWrite( PIN_CLK, LOW );
}
// LED を消灯する (データ転送時のちらつきを防ぐ)
digitalWrite( PIN_OE, HIGH );
// LED パネルの光らせる列を 4bit で指定する
digitalWrite( PIN_A, ( d & 1 ) );
digitalWrite( PIN_B, ( d & 2 ) >> 1);
digitalWrite( PIN_C, ( d & 4 ) >> 2);
digitalWrite( PIN_D, ( d & 8 ) >> 3);
// 4bit で指定した列に RGB データを転送する
digitalWrite( PIN_LAT, LOW );
// LED を点灯する
digitalWrite( PIN_OE, LOW );
}
}
LED가 켜지는 시간의 길이를 조정하여 중간색을 표현해 보는 테스트입니다.
// setup() と #define は上のプログラムと同じなので省略
// 色調(階調)の設定
inline void SET_RGB( char r, char g, char b, int j ){
digitalWrite( PIN_R1, r > j ? HIGH : LOW );
digitalWrite( PIN_G1, g > j ? HIGH : LOW );
digitalWrite( PIN_B1, b > j ? HIGH : LOW );
}
char d = 0;
void loop()
{
int i = 0;
int j = 0;
for ( j = 0; j < 16; j++ ){ // RGB 16 階調 (16x16x16=4096色)
for ( d = 0; d < 16; d++ ){
digitalWrite( PIN_LAT, HIGH );
for ( i = 0; i < 64; i++ ){
SET_RGB( d, i/4, 15-d, j );
digitalWrite( PIN_CLK, HIGH );
digitalWrite( PIN_CLK, LOW );
}
digitalWrite( PIN_OE, HIGH );
digitalWrite( PIN_A, ( d & 1 ) );
digitalWrite( PIN_B, ( d & 2 ) >> 1);
digitalWrite( PIN_C, ( d & 4 ) >> 2);
digitalWrite( PIN_D, ( d & 8 ) >> 3);
digitalWrite( PIN_LAT, LOW );
digitalWrite( PIN_OE, LOW );
}
}
}
240MHz 동작이라면 256계조라도 할 수 있을 것입니다만, 위의 프로그램으로 256계조로 하면 깜박거렸습니다. 16 계조 정도로 하고, 간신히 깜박거리지 않게 되었습니다. 성실하게 256 계조 한다면, 역시 DMA 등을 사용할 필요가 있을 것 같습니다.
결론
여러가지 중도반단이 되어 버렸기 때문에, ESP32 에서도 조금 진지하게 써 정보 추기할 때(언제?).
Reference
이 문제에 관하여(M5Stack으로 LED 매트릭스 패널(HUB-75)을 빛나게 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mml/items/c08946c91053ef23c441
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(M5Stack으로 LED 매트릭스 패널(HUB-75)을 빛나게 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mml/items/c08946c91053ef23c441텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)