昔風な32×16 LEDマトリックス(HD-0158-RG0019A)を動かす

未分類

はじめに

LEDマトリックス、電光掲示板で使われているアレのことだ。前々から気になっていたが、大阪日本橋のパーツショップで安くなっているのを発見したので思い切って購入してみた。
1800円だったところ1200円になっていた。

よくあるI2CやSPIやttl接続ではなく、独自の信号規則に則って制御しないといけない。でもあまり難しく考える必要はない。殆どの部分はパネル側のICがやってくれるので自分ですることと言ったら表示データを送信することくらいだ。データシートは古くて見つからなかったようだが独自の調査結果が印刷された紙が隣においてありそれがとてもわかりやすい、ありがたい。ちなみにこの説明はメーカー公式のものではないので注意とのこと。

このデータシートにあるプログラムはC言語で書かれていて、ライトな電子工作民にとっては役に立たないと思われるので、Arduinoで作った記録を載せようと思う。

Arduinoとの接続配線

電源と制御信号入力端子はそれぞれ、EH6pin,PH12pinだ。電源のピンはブレッドボードで使うようなメスのジャンパワイヤーで代用できたが、できればちゃんとしたケーブルを用意したほうがいいだろう。

信号入力端子

制御信号端子用にPH12ピンのケーブルを買って反対側をジャンパワイヤとはんだ付けしてArduinoと接続した。digitalwriteが使えるピンならどこにつないでもいいと思う。
私は、順にこのように設定した。

#define SEin 2 //内部バッファ切り替えモード選択(LOW=自動HIGH=手動(推奨))
#define ABBin 3 //内蔵バッファ切り替えモードが手動のときにRAM-A/RAM-Bを選択
#define A3in 4 //内蔵バッファアドレス指定
#define A2in 5 //内蔵バッファアドレス指定
#define A1in 6 //内蔵バッファアドレス指定
#define A0in 7 //内蔵バッファアドレス指定
//ここはGNDに接続
#define DGin 9 //緑表示データを1行分上位ビットから入力(HIGH=on)
#define CLKin 10 //データ読み取りクロック入力、立ち上がり時にピンの状態をチェックされる
#define WEin 11 //内部バッファへの書き込み信号(ALE inがHighのとき有効)
#define DRin 12 //赤表示データを1行分上位ビットから入力(HIGH=on)
#define ALEin 13 //アドレスラッチ有効(Highでアドレスを読み込み)

駆動部電源はジャンパワイヤのメスーオスを2本作り、Arduinoの5V,GNDと接続した。LED部電源はUSBからジャンパワイヤのメスピンにする小物をつくっていたのでそれを使った。

プログラム

#define SEin 2 //内部バッファ切り替えモード選択(LOW=自動HIGH=手動(推奨))
#define ABBin 3 //内蔵バッファ切り替えモードが手動のときにRAM-A/RAM-Bを選択
#define A3in 4 //内蔵バッファアドレス指定
#define A2in 5 //内蔵バッファアドレス指定
#define A1in 6 //内蔵バッファアドレス指定
#define A0in 7 //内蔵バッファアドレス指定

#define DGin 9 //緑表示データを1行分上位ビットから入力(HIGH=on)
#define CLKin 10 //データ読み取りクロック入力、立ち上がり時にピンの状態をチェックされる
#define WEin 11 //内部バッファへの書き込み信号(ALE inがHighのとき有効)
#define DRin 12 //赤表示データを1行分上位ビットから入力(HIGH=on)
#define ALEin 13 //アドレスラッチ有効(ラッチとは記憶のこと)

#define NUM_PANEL 1 //パネルの枚数
int count=0;
void setup() {
  // 初期化
  pinMode(SEin,OUTPUT);
  pinMode(ABBin,OUTPUT);
  pinMode(A3in,OUTPUT);
  pinMode(A2in,OUTPUT);
  pinMode(A1in,OUTPUT);
  pinMode(A0in,OUTPUT);
  pinMode(DGin,OUTPUT);
  pinMode(CLKin,OUTPUT);
  pinMode(WEin,OUTPUT);
  pinMode(DRin,OUTPUT);
  pinMode(ALEin,OUTPUT);

  digitalWrite(SEin,LOW);
  digitalWrite(ABBin,LOW);
  digitalWrite(A3in,LOW);
  digitalWrite(A2in,LOW);
  digitalWrite(A1in,LOW);
  digitalWrite(A0in,LOW);
  digitalWrite(DGin,LOW);
  digitalWrite(CLKin,LOW);
  digitalWrite(WEin,LOW);
  digitalWrite(DRin,LOW);
  digitalWrite(ALEin,LOW);
}

void loop() {
  count++;
  // put your main code here, to run repeatedly:
  for(int j=0;j<16;j++){
    for(int i=0;i<32;i++){
      digitalWrite(CLKin,LOW); //クロック線をLOWに
      digitalWrite(DRin,LOW); 
      digitalWrite(DGin,LOW);
      if((i+j+count+1)%10<=1){ 
        digitalWrite(DRin,HIGH);//あかLEDをオンにする
      }
      if((i+j+count)%10<=1){
        digitalWrite(DGin,HIGH);//緑LEDをオンにする
      }
      digitalWrite(CLKin,HIGH);//このタイミングでDRinとDGinの電圧がチェックされる
    }


    /*
    digitalWrite(A0in,LOW);  //行アドレス指定
    digitalWrite(A1in,LOW);   //行アドレス指定
    digitalWrite(A2in,LOW);   //行アドレス指定
    digitalWrite(A3in,LOW);   //行アドレス指定
    */
    

    setLine(j);//行アドレス指定
  
    digitalWrite(ALEin,HIGH);//4行でバッファに書き込み
    digitalWrite(WEin,HIGH);
    digitalWrite(WEin,HIGH);
    digitalWrite(WEin,LOW);
    digitalWrite(ALEin,LOW);
    if(count>=10000)count=0;
  }
}


void setLine(int y) {
  for (int i = 0; i < 4; i++) {
    digitalWrite( A0in-i, (y & 1U));
    y = y >> 1;
  }
}

動作している様子

意外と電気を食うのでDCコンバーターを買った(出力5V25A)。特価200円なり\(^o^)/ 1ヶ月後に見たら売り切れてた。もう1個くらい買ってたほうが良かったと後悔

LNはどちらでも動いた

コメント

タイトルとURLをコピーしました