JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > 鉄道部品制御のすすめ > 【鉄道部品】つくばエクスプレス スクロール表示器を制御する

【鉄道部品】つくばエクスプレス スクロール表示器を制御する

最終更新日さいしゅうこうしんび:2023-08-10

 TX〈つくばエクスプレス〉の車両で使われていたスクロール表示器(ドア上表示器)の制御方法になります。2023 年最初の記事です。

配線

配線図

 カウンタ IC 4520 を使用します。

静止表示

静止表示

 16 x 160 の表示データを作り、こちらのツールで配列に変換しスケッチ内に貼り付けてください。

// 高速関数ライブラリ
#include <speedFunctions2.h>

// 表示器の横幅は 16 文字
#define WIDTH 16*10

// ピン定義
#define CTCLR  2
#define CTCLK  3
#define SE     4
#define ABB    5
#define GREEN  6
#define CLOCK  7
#define WE     8
#define RED    9
#define AE     10
#define ENABLE 11

// カウンタ変数
unsigned long i,j;

// 表示データ
const unsigned char data[16][160] PROGMEM = {
  // 表示データを入れる。
};

void setup() {
  // 各ピンを出力に設定
  pinMode(CTCLR, OUTPUT);
  pinMode(CTCLK, OUTPUT);
  pinMode(SE, OUTPUT);
  pinMode(ABB, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(WE, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(AE, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  
  // アドレスリセット
  high(CTCLR);
  low(CTCLR);
  // RAM 切り替え:自動
  low(SE);
  // 表示
  high(ENABLE);

  // 表示データ送出
  for(i=0; i<16; i++) {
    for(j=0; j<WIDTH; j++) {
      setColor(pgm_read_byte(&data[i][j])); // 表示データの読み出し・出力
      high(CLOCK);
      low(CLOCK);
    }
    // RAM 書き込み
    high(AE);
    high(WE);
    low(WE);
    low(AE);
    // アドレスインクリメント
    high(CTCLK);
    low(CTCLK);
  }
}

void loop() {}

void setColor(unsigned char color) {
  switch(color) {
    case 0: // 黒
      low(RED);
      low(GREEN);
      break;
    case 1: // 赤
      high(RED);
      low(GREEN);
      break;
    case 2: // 緑
      low(RED);
      high(GREEN);
      break;
    case 3: // 橙
      high(RED);
      high(GREEN);
      break;
  }
}

スクロール

横幅よりスクロール文字数が大きい場合

スクロールの様子

 LENGTH に表示データの横幅を入れてください。

// 高速関数ライブラリ
#include <speedFunctions2.h>

// 表示器の横幅は 16 文字
#define WIDTH 16*10
// 表示データの横幅
#define LENGTH 224-WIDTH
// スクロールスピード 大きいほど遅い
#define SPEED 200

// ピン定義
#define CTCLR  2
#define CTCLK  3
#define SE     4
#define ABB    5
#define GREEN  6
#define CLOCK  7
#define WE     8
#define RED    9
#define AE     10
#define ENABLE 11

// カウンタ変数
unsigned long i,j,scroll;

// 表示データ
const unsigned char data[16][224] PROGMEM = {
  // 表示データを入れる。
};

void setup() {
  // 各ピンを出力に設定
  pinMode(CTCLR, OUTPUT);
  pinMode(CTCLK, OUTPUT);
  pinMode(SE, OUTPUT);
  pinMode(ABB, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(WE, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(AE, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  
  // アドレスリセット
  high(CTCLR);
  low(CTCLR);
  // RAM 切り替え:自動
  low(SE);
  // 表示
  high(ENABLE);
}

void loop() {
  // 右から現れる
  for(scroll=0; scroll<WIDTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=0; j<WIDTH-scroll; j++) {
        setColor(0);
        high(CLOCK);
        low(CLOCK);
      }
      for(j=0; j<scroll; j++) {
        setColor(pgm_read_byte(&data[i][j]));
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  // 左へスクロール
  for(scroll=0; scroll<LENGTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=0; j<WIDTH; j++) {
        setColor(pgm_read_byte(&data[i][j+scroll]));
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  // 左へ消えていく
  for(scroll=0; scroll<WIDTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=scroll; j<WIDTH; j++) {
        setColor(pgm_read_byte(&data[i][j+LENGTH]));
        high(CLOCK);
        low(CLOCK);
      }
      for(j=0; j<scroll; j++) {
        setColor(0);
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  delay(1000);
}

// 色を出力する関数
void setColor(unsigned char color) {
  switch(color) {
    case 0: // 黒
      low(RED);
      low(GREEN);
      break;
    case 1: // 赤
      high(RED);
      low(GREEN);
      break;
    case 2: // 緑
      low(RED);
      high(GREEN);
      break;
    case 3: // 橙
      high(RED);
      high(GREEN);
      break;
  }
}

横幅とスクロール文字数が等しい場合

スクロールの様子
// 高速関数ライブラリ
#include <speedFunctions2.h>

// 表示器の横幅は 16 文字
#define WIDTH 16*10
// スクロールスピード 大きいほど遅い
#define SPEED 200

// ピン定義
#define CTCLR  2
#define CTCLK  3
#define SE     4
#define ABB    5
#define GREEN  6
#define CLOCK  7
#define WE     8
#define RED    9
#define AE     10
#define ENABLE 11

// カウンタ変数
unsigned long i,j,scroll;

// 表示データ
const unsigned char data[16][160] PROGMEM = {
  // 表示データを入れる。
};

void setup() {
  // 各ピンを出力に設定
  pinMode(CTCLR, OUTPUT);
  pinMode(CTCLK, OUTPUT);
  pinMode(SE, OUTPUT);
  pinMode(ABB, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(WE, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(AE, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  
  // アドレスリセット
  high(CTCLR);
  low(CTCLR);
  // RAM 切り替え:自動
  low(SE);
  // 表示
  high(ENABLE);
}

void loop() {
  // 右から現れる
  for(scroll=0; scroll<WIDTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=0; j<WIDTH-scroll; j++) {
        setColor(0);
        high(CLOCK);
        low(CLOCK);
      }
      for(j=0; j<scroll; j++) {
        setColor(pgm_read_byte(&data[i][j]));
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  // 左へ消えていく
  for(scroll=0; scroll<WIDTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=scroll; j<WIDTH; j++) {
        setColor(pgm_read_byte(&data[i][j]));
        high(CLOCK);
        low(CLOCK);
      }
      for(j=0; j<scroll; j++) {
        setColor(0);
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  delay(1000);
}

// 色を出力する関数
void setColor(unsigned char color) {
  switch(color) {
    case 0: // 黒
      low(RED);
      low(GREEN);
      break;
    case 1: // 赤
      high(RED);
      low(GREEN);
      break;
    case 2: // 緑
      low(RED);
      high(GREEN);
      break;
    case 3: // 橙
      high(RED);
      high(GREEN);
      break;
  }
}

横幅よりスクロール文字数が小さい場合

スクロールの様子

 LENGTH に表示データの横幅を入れてください。

// 高速関数ライブラリ
#include <speedFunctions2.h>

// 表示器の横幅は 16 文字
#define WIDTH 16*10
// 表示データの横幅
#define LENGTH 64
// スクロールスピード 大きいほど遅い
#define SPEED 200

// ピン定義
#define CTCLR  2
#define CTCLK  3
#define SE     4
#define ABB    5
#define GREEN  6
#define CLOCK  7
#define WE     8
#define RED    9
#define AE     10
#define ENABLE 11

// カウンタ変数
unsigned long i,j,scroll;

// 表示データ
const unsigned char data[16][64] PROGMEM = {
  // 表示データを入れる。
};

void setup() {
  // 各ピンを出力に設定
  pinMode(CTCLR, OUTPUT);
  pinMode(CTCLK, OUTPUT);
  pinMode(SE, OUTPUT);
  pinMode(ABB, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(WE, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(AE, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  
  // アドレスリセット
  high(CTCLR);
  low(CTCLR);
  // RAM 切り替え:自動
  low(SE);
  // 表示
  high(ENABLE);
}

void loop() {
  // 右から現れる
  for(scroll=0; scroll<LENGTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=0; j<WIDTH-scroll; j++) {
        setColor(0);
        high(CLOCK);
        low(CLOCK);
      }
      for(j=0; j<scroll; j++) {
        setColor(pgm_read_byte(&data[i][j]));
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  // 左へスクロール
  for(scroll=0; scroll<WIDTH-LENGTH; scroll++) {
    for(i=0;i<16;i++) {
      for(j=0; j<WIDTH-LENGTH-scroll; j++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      for(j=0; j<LENGTH; j++) {
        setColor(pgm_read_byte(&data[i][j]));
        low(CLOCK);
        high(CLOCK);
      }
      for(j=0; j<scroll; j++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  // 左へ消えていく
  for(scroll=0; scroll<LENGTH; scroll++) {
    for(i=0; i<16; i++) {
      for(j=scroll; j<LENGTH; j++) {
        setColor(pgm_read_byte(&data[i][j]));
        high(CLOCK);
        low(CLOCK);
      }
      for(j=0; j<WIDTH-(LENGTH-scroll); j++) {
        setColor(0);
        high(CLOCK);
        low(CLOCK);
      }
      high(AE);
      high(WE);
      low(WE);
      low(AE);
      delayMicroseconds(SPEED);
      high(CTCLK);
      low(CTCLK);
    }
  }

  delay(1000);
}

// 色を出力する関数
void setColor(unsigned char color) {
  switch(color) {
    case 0: // 黒
      low(RED);
      low(GREEN);
      break;
    case 1: // 赤
      high(RED);
      low(GREEN);
      break;
    case 2: // 緑
      low(RED);
      high(GREEN);
      break;
    case 3: // 橙
      high(RED);
      high(GREEN);
      break;
  }
}

戻る

右メニュー

【表示がおかしい・崩れる場合】PC では Shift と F5 を同時押し。スマホではキャッシュを削除してみてください。



とうサイトでは Cookieくっきー使用しようします。くわしくは上記じょうきの「プライバシーポリシー・免責事項等めんせきじこうとう」もご確認かくにんください。



上へ戻る