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

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

 

続き

新しい機能を追加しました。

 

半角英数字に対応しました。

表示カラーを3色選べます。

 

#include <EEPROM.h>
byte address[] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
short data_hex[16 * 31] = {0x0000, 0x3ffc, 0x0180, 0x7ffe, 0x4182, 0x5ffa, 0x1ff8, 0x3ffc,
                    0x2184, 0x2184, 0x3ffc, 0x2184, 0x3ffe, 0x0183, 0x01fe, 0x0000,
                    0x0000, 0x2184, 0x318c, 0x1988, 0x0998, 0x0180, 0x7ffe, 0x0640,
                    0x0640, 0x0640, 0x0440, 0x0c42, 0x1842, 0x3042, 0xe07e, 0x0000,
                    0x1000, 0x13fe, 0x1306, 0x7ffe, 0x7f06, 0x1306, 0x13fe, 0x1580,
                    0x3bfe, 0x7612, 0x17f2, 0x1312, 0x131a, 0x11f6, 0x701c, 0x0000,
                    0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x7ffe, 0x7ffe, 0x0180,
                    0x1998, 0x1188, 0x318c, 0x2184, 0x6186, 0xc182, 0x0f80, 0x0000,
                    0x0000, 0x11fe, 0x1100, 0x1100, 0x7d00, 0x11fe, 0x3906, 0x3966,
                    0x3524, 0x552c, 0xd138, 0x9118, 0x1338, 0x126e, 0x16c3, 0x0000};
int pos = 0;
short inData = 0;
short value = 0;
boolean toggle = false;
boolean eep = false;
boolean completion = false;
boolean stopflag = false;
boolean pin13 = false;
boolean pin14 = false;
int count = 0;
int scroll = 0;
int scroll_speed = 0;
int margin = 64;
int color = 0;

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

  digitalWrite(11,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(12,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で有効
  Serial.begin(19200);
  pos = EEPROM.read(0x3ff) * 256;
  pos += EEPROM.read(0x3fe);
  if (digitalRead(13) == 0)
    eep = true;
  else
    change();
}

void loop() {
  if (Serial.available() > 0 && stopflag) {
    inData = Serial.read();
    if (!toggle) {
      value = inData * 256;
    }
    else {
      value |= inData;
      data_hex[pos++] = value;
    }
    toggle = !toggle;
  }

  if (eep) {
    if (!stopflag) {
      eep_disp();
      count++;
      if (count > scroll_speed) {
        count = 0;
        scroll++;
        if (scroll > pos + margin)
          scroll = 0;
      }
      if (digitalRead(14) == 0) {
        pos = 0;
        scroll = 0;
        toggle = false;
        stopflag = true;
        pin14 = true;
      }
      if (digitalRead(13) == 0 && !pin13 && !pin14) {
        eep = false;
        pin13 = true;
      }
      if (digitalRead(13) == 1)
        pin13 = false;
    }
    else if (digitalRead(13) == 0 && pos > 0) {
      for (int i = 0;i < pos;i++) {
        EEPROM.put(i * 2, data_hex[i]);
      }
      stopflag = false;
      if (pos > 0)
        EEPROM.put(0x3fe, pos);
    }
  }
  else {
    disp();
    count++;
    if (count > scroll_speed) {
      count = 0;
      scroll++;
      if (scroll > 16 * 5 + margin)
        scroll = 0;
    }
    if (digitalRead(13) == 0 && !pin13) {
      eep = true;
      pin13 = true;
    }
    if (digitalRead(13) == 1)
      pin13 = false;
    if (digitalRead(14) == 0 && !pin14) {
      color++;
      if (color > 2)
        color = 0;
      pin14 = true;
    }
    if (digitalRead(14) == 1)
      pin14 = false;
  }
}

void eep_disp(){
  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 < margin;k++) {
      if (k + scroll < margin || k + scroll > pos + margin - 1) {
        digitalWrite(6,LOW); // GREEN    緑データ              // データのセット
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      }
      else if ((EEPROM.read((k + scroll - margin) * 2) + EEPROM.read((k + scroll - margin) * 2 + 1) * 256 & 0x1 << i) != 0) {
        if (color == 0)
          digitalWrite(6,HIGH); // GREEN    緑データ
        else if (color == 1)
          digitalWrite(9,HIGH); // RED    赤データ
        else {
          digitalWrite(6,HIGH); // GREEN    緑データ
          digitalWrite(9,HIGH); // RED    赤データ
        }
      }
      else {
        digitalWrite(6,LOW); // GREEN    緑データ
        digitalWrite(9,LOW); // RED    赤データ
      }
        
      shift_clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void disp() {
  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 < margin;k++) {
      if (k + scroll < margin || k + scroll > 16 * 5 + margin) {
        digitalWrite(6,LOW); // GREEN    緑データ              // データのセット
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      }
      else if ((data_hex[k + scroll - margin] & 0x8000 >> i) != 0) {
        if (color == 0)
          digitalWrite(6,HIGH); // GREEN    緑データ              // データのセット
        else if (color == 1)
          digitalWrite(9,HIGH); // RED    赤データ              // データのセット
        else {
          digitalWrite(6,HIGH); // GREEN    緑データ              // データのセット
          digitalWrite(9,HIGH); // RED    赤データ              // データのセット
        }
      }
      else {
        digitalWrite(6,LOW); // GREEN    緑データ              // データのセット
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      }
        
      shift_clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

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

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 change() {
  short local_hex[16 * 5];

  // データをクリア
  for (int n = 0;n < 16 * 5;n++) {
    local_hex[n] = 0;             
  }

  for (int i = 0;i < 5;i++) {
    for (int j = 0;j < 16;j++) {
      for (int k = 0;k < 16;k++) {
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)
          local_hex[k + i * 16] |= 0x8000 >> j;       
      }
    }
  }
  
  for (int n = 0;n < 16 * 5;n++) {
    data_hex[n] = local_hex[n];
  }
}

太字のところが変更箇所

 

文字単位でEEPROMも制御していましたが半角英数字用に列単位での制御に変更
digitalRead(14)がEEPROMの書き込み時以外空いているのでカラー変更に利用できるように変更

 

切替の様子、半角英数字の表示


www.youtube.com

 

今回の12回目の投稿で終了となります。

いかがだったでしょうか?

この記事を見て作って見ようかなと思っていただければ幸いです。

 

では、また。

 

 

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

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

 

続き

卓上電光掲示板が完成いたしました。

 

5vDCアダプターに繋げて表示

 

ケーブル類を何とか収めました。

裏面にDCジャックとタクトスイッチを押す為の穴2つ

 

側面側にマイコンのUSBコネクタを配置

 

外からUSBコネクタを接続して書き換え可能

 

USBで接続と言う事はプログラムのアップデートも容易にできる。

 

と言う事で次回、新機能を追加して行きます。

 

では、また。

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

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

 

続き

今回は卓上電光掲示板風のケースを作って行きます。

 

3dプリンターで作ったケース

 

Fusion360データを作成

シンプルに角型にしています。

 

モジュールを組み込んで見ました。

表側

 

裏側

ただ、このままでは使えません。

 

書き換えるときに接続するUSBコネクタ、電源のジャック、モード切替のスイッチなどを取り付けなければなりません。

 

次回、最終仕上げで完成に持っていきます。

 

では、また。

 

 

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

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

 

続き

今回は余白をプログラムで表示できる様に改造して行きます。

 

余白データを無くしたプログラム

#include <EEPROM.h>
byte address[] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
short data_hex[16 * 31] = {0x0000, 0x3ffc, 0x0180, 0x7ffe, 0x4182, 0x5ffa, 0x1ff8, 0x3ffc,
                    0x2184, 0x2184, 0x3ffc, 0x2184, 0x3ffe, 0x0183, 0x01fe, 0x0000,
                    0x0000, 0x2184, 0x318c, 0x1988, 0x0998, 0x0180, 0x7ffe, 0x0640,
                    0x0640, 0x0640, 0x0440, 0x0c42, 0x1842, 0x3042, 0xe07e, 0x0000,
                    0x1000, 0x13fe, 0x1306, 0x7ffe, 0x7f06, 0x1306, 0x13fe, 0x1580,
                    0x3bfe, 0x7612, 0x17f2, 0x1312, 0x131a, 0x11f6, 0x701c, 0x0000,
                    0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x7ffe, 0x7ffe, 0x0180,
                    0x1998, 0x1188, 0x318c, 0x2184, 0x6186, 0xc182, 0x0f80, 0x0000,
                    0x0000, 0x11fe, 0x1100, 0x1100, 0x7d00, 0x11fe, 0x3906, 0x3966,
                    0x3524, 0x552c, 0xd138, 0x9118, 0x1338, 0x126e, 0x16c3, 0x0000};
int pos = 0;
short inData = 0;
short value = 0;
boolean toggle = false;
boolean eep = false;
boolean completion = false;
boolean stopflag = false;
boolean pin13 = false;
boolean pin14 = false;
int count = 0;
int scroll = 0;
int scroll_speed = 5;
int margin = 64;


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

  digitalWrite(11,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(12,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で有効
  Serial.begin(19200);
  pos = EEPROM.read(0x3ff) * 16;
  if (digitalRead(13) == 0)
    eep = true;
  else
    change();
}

void loop() {
  if (Serial.available() > 0 && stopflag) {
    inData = Serial.read();
    if (!toggle) {
      value = inData * 256;
    }
    else {
      value |= inData;
      data_hex[pos++] = value;
    }
    toggle = !toggle;
  }

  if (eep) {
    if (!stopflag) {
      eep_disp();
      count++;
      if (count > scroll_speed) {
        count = 0;
        scroll++;
        if (scroll > pos + margin)
          scroll = 0;
      }
      if (digitalRead(14) == 0) {
        pos = 0;
        scroll = 0;
        toggle = false;
        stopflag = true;
        pin14 = true;
      }
      if (digitalRead(13) == 0 && !pin13 && !pin14) {
        eep = false;
        pin13 = true;
      }
      if (digitalRead(13) == 1)
        pin13 = false;
    }
    else if (digitalRead(13) == 0 && pos > 0) {
      for (int i = 0;i < pos;i++) {
        EEPROM.put(i * 2, data_hex[i]);
      }
      stopflag = false;
      if (pos > 0)
        EEPROM.write(0x3ff, pos / 16);
    }
  }
  else {
    disp();
    count++;
    if (count > scroll_speed) {
      count = 0;
      scroll++;
      if (scroll > 16 * 5 + margin)
        scroll = 0;
    }
    if (digitalRead(13) == 0 && !pin13) {
      eep = true;
      pin13 = true;
    }
    if (digitalRead(13) == 1)
      pin13 = false;
  }
}

void eep_disp(){
  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 < margin;k++) {
      if (k + scroll < margin || k + scroll > pos + margin)
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      else if ((EEPROM.read((k + scroll - margin) * 2) + EEPROM.read((k + scroll - margin) * 2 + 1) * 256 & 0x1 << i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ
      else
        digitalWrite(9,LOW); // RED    赤データ
        
      shift_clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void disp() {
  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 < margin;k++) {
      if (k + scroll < margin || k + scroll > 16 * 5 + margin)
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      else if ((data_hex[k + scroll - margin] & 0x8000 >> i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
        
      shift_clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

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

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 change() {
  short local_hex[16 * 5];

  // データをクリア
  for (int n = 0;n < 16 * 5;n++) {
    local_hex[n] = 0;             
  }

  for (int i = 0;i < 5;i++) {
    for (int j = 0;j < 16;j++) {
      for (int k = 0;k < 16;k++) {
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)
          local_hex[k + i * 16] |= 0x8000 >> j;       
      }
    }
  }
  
  for (int n = 0;n < 16 * 5;n++) {
    data_hex[n] = local_hex[n];
  }
}

太字のところが余白無し用に改造した所

 

これでEEPROMモードで最大の31文字記憶出来る様になりました。


www.youtube.com

 

ソフト的には様になったので次回卓上電光掲示板風のケースを作って行きます。

 

では、また。

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

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

 

続き

今回はモジュールを連結して4文字表示の電光掲示板に改造していきます。

 

4文字用のプログラム

#include <EEPROM.h>
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
short data_hex[16 * 31] = {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, 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, 0x3ffc, 0x0180, 0x7ffe, 0x4182, 0x5ffa, 0x1ff8, 0x3ffc,
                    0x2184, 0x2184, 0x3ffc, 0x2184, 0x3ffe, 0x0183, 0x01fe, 0x0000,
                    0x0000, 0x2184, 0x318c, 0x1988, 0x0998, 0x0180, 0x7ffe, 0x0640,
                    0x0640, 0x0640, 0x0440, 0x0c42, 0x1842, 0x3042, 0xe07e, 0x0000,
                    0x1000, 0x13fe, 0x1306, 0x7ffe, 0x7f06, 0x1306, 0x13fe, 0x1580,
                    0x3bfe, 0x7612, 0x17f2, 0x1312, 0x131a, 0x11f6, 0x701c, 0x0000,
                    0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x7ffe, 0x7ffe, 0x0180,
                    0x1998, 0x1188, 0x318c, 0x2184, 0x6186, 0xc182, 0x0f80, 0x0000,
                    0x0000, 0x11fe, 0x1100, 0x1100, 0x7d00, 0x11fe, 0x3906, 0x3966,
                    0x3524, 0x552c, 0xd138, 0x9118, 0x1338, 0x126e, 0x16c3, 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,
                    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};
int pos = 0;
short inData = 0;
short value = 0;
boolean toggle = false;
boolean eep = false;
boolean completion = false;
boolean stopflag = false;
boolean pin13 = false;
boolean pin14 = false;
int count = 0;
int scroll = 0;
int scroll_speed = 0;
int margin = 64;


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

  digitalWrite(11,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(12,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で有効
  Serial.begin(19200);
  pos = EEPROM.read(0x3ff) * 16;
  if (digitalRead(13) == 0)
    eep = true;
  else
    change();
}

void loop() {
  if (Serial.available() > 0 && stopflag) {
    inData = Serial.read();
    if (!toggle) {
      value = inData * 256;
    }
    else {
      value |= inData;
      data_hex[pos++] = value;
    }
    toggle = !toggle;
  }

  if (eep) {
    if (!stopflag) {
      eep_disp();
      count++;
      if (count > scroll_speed) {
        count = 0;
        scroll++;
        if (scroll > pos + margin)
          scroll = 0;
      }
      if (digitalRead(14) == 0) {
        pos = 0;
        scroll = 0;
        toggle = false;
        stopflag = true;
        pin14 = true;
      }
      if (digitalRead(13) == 0 && !pin13 && !pin14) {
        eep = false;
        pin13 = true;
      }
      if (digitalRead(13) == 1)
        pin13 = false;
    }
    else if (digitalRead(13) == 0 && pos > 0) {
      for (int i = 0;i < pos + margin + margin;i++) {
        if (i < margin)
          EEPROM.put(i * 2, 0);
        else if (i >= pos + margin)
          EEPROM.put(i * 2, 0);
        else
          EEPROM.put(i * 2, data_hex[i - margin]);
      }
      stopflag = false;
      if (pos > 0)
        EEPROM.write(0x3ff, pos / 16);
    }
  }
  else {
    disp();
    count++;
    if (count > scroll_speed) {
      count = 0;
      scroll++;
      if (scroll > 16 * 9)
        scroll = 0;
    }
    if (digitalRead(13) == 0 && !pin13) {
      eep = true;
      pin13 = true;
    }
    if (digitalRead(13) == 1)
      pin13 = false;
  }
}

void eep_disp(){
  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 < 64;k++) {
      digitalWrite(9,LOW); // RED    赤データ
      if ((EEPROM.read((k + scroll) * 2) + EEPROM.read((k + scroll) * 2 + 1) * 256 & 0x1 << i) != 0) {
        digitalWrite(9,HIGH); // RED    赤データ
      }
      shift_clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void disp() {
  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 < 64;k++) {
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      shift_clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

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

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 change() {
  short local_hex[16 * 9];

  // データをクリア
  for (int n = 0;n < 16 * 9;n++) {
    local_hex[n] = 0;             
  }

  for (int i = 0;i < 9;i++) {
    for (int j = 0;j < 16;j++) {
      for (int k = 0;k < 16;k++) {
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)
          local_hex[k + i * 16] |= 0x8000 >> j;       
      }
    }
  }
  
  for (int n = 0;n < 16 * 9;n++) {
    data_hex[n] = local_hex[n];
  }
}

 

表示の様子


www.youtube.com

シフトするデータ量が増えたのでスクロールが遅くなった。

 

スクロール速度を早くした様子


www.youtube.com

 

上手く行きました。

 

4文字表示も上手く行っています。

ただ、今の方法だとEEPROMモードで余白分の8文字分256バイトが無駄に消費されてしまいます。(1024バイトの内256バイトは大きい)

 

なので次回は余白をプログラムで表示できる様に改造して行きます。

 

では、また。

 

 

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

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

 

続き

今回はEEPROMのデータのスクロール表示と表示数を増やしていきます。

 

書き替えたプログラム

#include <EEPROM.h>
byte address[] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
short data_hex[16 * 31] = {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, 0x3ffc, 0x0180, 0x7ffe, 0x4182, 0x5ffa, 0x1ff8, 0x3ffc,
                    0x2184, 0x2184, 0x3ffc, 0x2184, 0x3ffe, 0x0183, 0x01fe, 0x0000,
                    0x0000, 0x2184, 0x318c, 0x1988, 0x0998, 0x0180, 0x7ffe, 0x0640,
                    0x0640, 0x0640, 0x0440, 0x0c42, 0x1842, 0x3042, 0xe07e, 0x0000,
                    0x1000, 0x13fe, 0x1306, 0x7ffe, 0x7f06, 0x1306, 0x13fe, 0x1580,
                    0x3bfe, 0x7612, 0x17f2, 0x1312, 0x131a, 0x11f6, 0x701c, 0x0000,
                    0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x7ffe, 0x7ffe, 0x0180,
                    0x1998, 0x1188, 0x318c, 0x2184, 0x6186, 0xc182, 0x0f80, 0x0000,
                    0x0000, 0x11fe, 0x1100, 0x1100, 0x7d00, 0x11fe, 0x3906, 0x3966,
                    0x3524, 0x552c, 0xd138, 0x9118, 0x1338, 0x126e, 0x16c3, 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};
int pos = 0;
short inData = 0;
short value = 0;
boolean toggle = false;
boolean eep = false;
boolean completion = false;
boolean stopflag = false;
boolean pin13 = false;
boolean pin14 = false;
int count = 0;
int scroll = 0;
int scroll_speed = 5;
int margin = 32;


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

  digitalWrite(11,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(12,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で有効
  Serial.begin(19200);
  pos = EEPROM.read(0x3ff) * 16;
  if (digitalRead(13) == 0)
    eep = true;
  else
    change();
}

void loop() {
  if (Serial.available() > 0 && stopflag) {
    inData = Serial.read();
    if (!toggle) {
      value = inData * 256;
    }
    else {
      value |= inData;
      data_hex[pos++] = value;
    }
    toggle = !toggle;
  }

  if (eep) {
    if (!stopflag) {
      eep_disp();
      count++;
      if (count > scroll_speed) {
        count = 0;
        scroll++;
        if (scroll > pos + margin)
          scroll = 0;
      }
      if (digitalRead(14) == 0) {
        pos = 0;
        scroll = 0;
        toggle = false;
        stopflag = true;
        pin14 = true;
      }
      if (digitalRead(13) == 0 && !pin13 && !pin14) {
        eep = false;
        pin13 = true;
      }
      if (digitalRead(13) == 1)
        pin13 = false;
    }
    else if (digitalRead(13) == 0 && pos > 0) {
      for (int i = 0;i < pos + margin + margin;i++) {
        if (i < margin)
          EEPROM.put(i * 2, 0);
        else if (i >= pos + margin)
          EEPROM.put(i * 2, 0);
        else
          EEPROM.put(i * 2, data_hex[i - margin]);
      }
      stopflag = false;
      if (pos > 0)
        EEPROM.write(0x3ff, pos / 16);
    }
  }
  else {
    disp();
    count++;
    if (count > scroll_speed) {
      count = 0;
      scroll++;
      if (scroll > 16 * 7)
        scroll = 0;
    }
    if (digitalRead(13) == 0 && !pin13) {
      eep = true;
      pin13 = true;
    }
    if (digitalRead(13) == 1)
      pin13 = false;
  }
}

void eep_disp(){
  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(9,LOW); // RED    赤データ
      if ((EEPROM.read((k + scroll) * 2) + EEPROM.read((k + scroll) * 2 + 1) * 256 & 0x1 << i) != 0) {
        digitalWrite(9,HIGH); // RED    赤データ
      }
      shift_clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void disp() {
  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++) {
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      shift_clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

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

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 change() {
  short local_hex[16 * 9];

  // データをクリア
  for (int n = 0;n < 16 * 9;n++) {
    local_hex[n] = 0;             
  }

  for (int i = 0;i < 9;i++) {
    for (int j = 0;j < 16;j++) {
      for (int k = 0;k < 16;k++) {
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)
          local_hex[k + i * 16] |= 0x8000 >> j;       
      }
    }
  }
  
  for (int n = 0;n < 16 * 9;n++) {
    data_hex[n] = local_hex[n];
  }
}

太字が追加部分

EEPROM関連が大幅に変わりました。

以前の書き込みは2文字限定でしたが31文字までになりdata_hex[16 * 31]で領域を確保

digitalRead(13)のボタンで通常モードとEEPROMモードの切り替えが可能

digitalRead(14)のボタンでEEPROMの書き込みモードに切り替わります。

data_hex[16 * 31]と31文字までになっていますがEEPROMの容量が1024バイトで最後の1バイトに文字数を記憶しているからです。

 

電光掲示板の操作の様子。


www.youtube.com

 

次回モジュールを連結して4文字表示の電光掲示板に改造していきます。

 

では、また。

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

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

 

続き

文字数を増やしてスクロール表示も出来るように改造していきます。

 

その前に

注文していたコネクターがやっと来ました。

手前が今回のSLX-5040-71用 奥がSLX-5024でピンアサインは同じ

 

今回のプログラム

#include <EEPROM.h>
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
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, 0x3ffc, 0x0180, 0x7ffe, 0x4182, 0x5ffa, 0x1ff8, 0x3ffc,
                    0x2184, 0x2184, 0x3ffc, 0x2184, 0x3ffe, 0x0183, 0x01fe, 0x0000,
                    0x0000, 0x2184, 0x318c, 0x1988, 0x0998, 0x0180, 0x7ffe, 0x0640,
                    0x0640, 0x0640, 0x0440, 0x0c42, 0x1842, 0x3042, 0xe07e, 0x0000,
                    0x1000, 0x13fe, 0x1306, 0x7ffe, 0x7f06, 0x1306, 0x13fe, 0x1580,
                    0x3bfe, 0x7612, 0x17f2, 0x1312, 0x131a, 0x11f6, 0x701c, 0x0000,
                    0x0000, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x7ffe, 0x7ffe, 0x0180,
                    0x1998, 0x1188, 0x318c, 0x2184, 0x6186, 0xc182, 0x0f80, 0x0000,
                    0x0000, 0x11fe, 0x1100, 0x1100, 0x7d00, 0x11fe, 0x3906, 0x3966,
                    0x3524, 0x552c, 0xd138, 0x9118, 0x1338, 0x126e, 0x16c3, 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};
int pos = 0;
short inData = 0;
short value = 0;
boolean toggle = false;
boolean eep = false;
boolean completion = false;
int count = 0;
int scroll = 0;
int scroll_speed = 5;

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

  digitalWrite(11,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(12,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で有効
  Serial.begin(19200);

  if (digitalRead(13) == 0) {
    eep = true;
  }

  change();
}

void loop() {
  if (Serial.available() > 0) {
    inData = Serial.read();
    if (!toggle) {
      value = inData * 256;
    }
    else {
      value |= inData;
      data_hex[pos++] = value;
    }
    toggle = !toggle;
  }

  if (pos == 32 && !completion) {
    for (int i = 0;i < pos;i++) {
      EEPROM.put(i * 2, data_hex[i]);
    }
    completion = true;
  }

  if (eep)
    eep_disp();
  else
    disp();

  count++;
  if (count > scroll_speed) {
    count = 0;
    scroll++;
    if (scroll > 16 * 7)
      scroll = 0;
  }
}

void eep_disp(){
  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(9,LOW); // RED    赤データ
      if ((EEPROM.read(k * 2) + EEPROM.read(k * 2 + 1) * 256 & 0x1 << i) != 0) {
        digitalWrite(9,HIGH); // RED    赤データ
      }
      shift_clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void disp() {
  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++) {
      if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      shift_clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

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

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 change() {
  short local_hex[16 * 9];

  // データをクリア
  for (int n = 0;n < 16 * 9;n++) {
    local_hex[n] = 0;             
  }

  for (int i = 0;i < 9;i++) {
    for (int j = 0;j < 16;j++) {
      for (int k = 0;k < 16;k++) {
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)
          local_hex[k + i * 16] |= 0x8000 >> j;       
      }
    }
  }
  
  for (int n = 0;n < 16 * 9;n++) {
    data_hex[n] = local_hex[n];
  }
}

太字が追加部分

今回は「電光掲示板」とスクロール表示

スクロールするにはデータを縦で持つ方が都合がいいのでchange()で変換しています。

 

スクロール表示の様子


www.youtube.com

 

次回はEEPROMのデータをスクロール表示していきます。

同時に文字数も増やします。

 

では、また。