マイコンArduinoを使って電光掲示板を作る。

 

 

マイコンArduinoを使って電光掲示板を作る。

 

続き

今回は3色カラー表示に挑戦していきます。

 

ただ単にカラーを変えるだけなら

// 赤色表示

    for (int k = 0;k < 32;k++) {
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ              // データのセット

// 緑色表示

    for (int k = 0;k < 32;k++) {
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
        digitalWrite(6,HIGH); // GREEN  緑データ              // データのセット
      else
        digitalWrite(6,LOW); // GREEN  緑データ              // データのセット

へ変えるか又は

// 橙色表示

    for (int k = 0;k < 32;k++) {
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0) {
        digitalWrite(6,HIGH); // GREEN  緑データ              // データのセット

        digitalWrite(9,HIGH); // RED    赤データ              // データのセット

      }
      else {
        digitalWrite(6,LOW); // GREEN  緑データ              // データのセット

        digitalWrite(9,LOW); // RED    赤データ              // データのセット

      }

で行えますが、出来たら文字単位でカラーを変えたい所です。

 

そこで最初に思いついたのが

// slx_5024
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
int scroll_speed = 5;
                    // 2文字では寂しいので5文字に変更 "あいうえお"
short data_hex[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0200, 0x0200, 0x3ffc, 0x0200, 0x03e0, 0x0e38, 0x1a2c,
                    0x3244, 0x22c4, 0x2384, 0x2304, 0x3e0c, 0x1878, 0x00e0, 0x0000,
                    0x0000, 0x0000, 0x2000, 0x2018, 0x2008, 0x200c, 0x2004, 0x2006,
                    0x2006, 0x3006, 0x3102, 0x3300, 0x1e00, 0x0e00, 0x0000, 0x0000,
                    0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3818, 0x0018,
                    0x0008, 0x0018, 0x0018, 0x0030, 0x0070, 0x03c0, 0x0700, 0x0000,
                    0x0000, 0x0fe0, 0x00e0, 0x0000, 0x1fe0, 0x1ff0, 0x00c0, 0x0180,
                    0x03c0, 0x07c0, 0x0c40, 0x1840, 0x3040, 0x207e, 0x0000, 0x0000,
                    0x0000, 0x0200, 0x0218, 0x7fec, 0x0206, 0x0200, 0x0200, 0x0ff8,
                    0x1a0c, 0x2204, 0x6204, 0x6204, 0x220c, 0x3ef8, 0x0c00, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};

void setup() {
  for (int i = 0; i < 11; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }

  digitalWrite(0,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(1,LOW); // A/BB   書き込み用RAM選択
  digitalWrite(6,LOW); // GREEN  緑データ
  digitalWrite(7,LOW); // CLK    クロック
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(9,LOW); // RED    赤データ
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
  change();
}

void loop() {
  for (int i = 0; i < 16; i++) {                        // アドレス0~15
    for (int j = 0; j < sizeof(address); j++)
      if ((i & 0x1 << j) != 0)                          // address[0]~address[3]にビットをセット
        digitalWrite(address[j], HIGH);
      else
        digitalWrite(address[j], LOW);
        
    for (int k = 0;k < 32;k++) {
      digitalWrite(6,LOW); // GREEN  緑データ
      digitalWrite(9,LOW); // RED    赤データ
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
      if (k < 16)
        digitalWrite(9,HIGH); // RED    赤データ
      else
        digitalWrite(6,HIGH); // GREEN  緑データ
      clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }

  count++;
  if (count > scroll_speed) {
    count = 0;
    scroll ++;
    if (scroll > sizeof(data_hex) / 2 - 32)
      scroll = 0;
    pos++;
    if (pos > 15) {
      pos = 0;
    }
  }
}

void write_ale_we() {
  digitalWrite(10,HIGH); // ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void clock_n(int n) {
  for (int i = 0;i < n;i++)
    clock();
}

void change() {
  short local_hex[sizeof(data_hex) / 2];          // sizeofの戻り値がバイト数なので2で割る

  // データをクリア
  for (int n = 0;n < sizeof(data_hex) / 2;n++) {  // sizeofの戻り値がバイト数なので2で割る
    local_hex[n] = 0;               // ビット数は不要 0で16ビット全て0
  }

  for (int i = 0;i < sizeof(data_hex) / 32;i++) {       // 32バイトで1文字
    for (int j = 0;j < 16;j++) {    // 16はデーター数
      for (int k = 0;k < 16;k++) {  // 16はビット数
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)  // 横データを
          local_hex[k + i * 16] |= 0x8000 >> j;         // 縦データに
      }
    }
  }
  
  for (int n = 0;n < sizeof(data_hex) / 2;n++) {  // sizeofの戻り値がバイト数なので2で割る
    data_hex[n] = local_hex[n];     // 元に戻す
  }
}

変数scroll_speedを追加

表示文字を"あいうえお"に変更

 

文字表示の様子


www.youtube.com

思っていたのと違う

 

更に手を加えて

    for (int k = 0;k < 32;k++) {
      digitalWrite(6,LOW); // GREEN  緑データ
      digitalWrite(9,LOW); // RED    赤データ
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
      if (k + scroll < 16 + 32)         // 1文字目
        digitalWrite(9,HIGH); // RED    赤データ
      else if (k + scroll < 32 + 32) // 2文字目
        digitalWrite(6,HIGH); // GREEN  緑データ
      else {                                       // 3文字目以降
        digitalWrite(9,HIGH); // RED    赤データ
        digitalWrite(6,HIGH); // GREEN  緑データ
      }
      clock(); // クロック
    }

に変更


www.youtube.com

それらしくなって来ました。

 

しかしこの方法では文字に対しての色指定が出来ないので他の方法を探っていきます。

 

次回は個別に色指定が出来る様に改造していきます。

 

では、また。

 

mckeechan.hatenadiary.com