JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > 鉄道部品制御のすすめ > 東京メトロ 02 系 ドア上表示器を動かす

東京メトロ 02 系 ドア上表示器を動かす

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

 以前販売されていた、東京メトロ 02 系(丸ノ内線)のドア上ドットマトリクス式表示器の制御方法になります。speedFunctions2 ライブラリを使用します。

 2023 年 1 月に新宿のハンズで販売された方南町支線用のものも見た目は異なりますが、制御方法は同じになります。


広告

配線

配線図

 LED モジュールは、DUG です。IN 側に Arduino を接続してください。

静止表示

「地雷女子になりたい」と表示した様子

 上の画像は、静止表示の例です。表示データは各自で作成してください。この表示器は横 11 文字なので、16 x 176 の表示データを作り、こちらのツールで配列に変換しスケッチ内に貼り付けてください。

#include <speedFunctions2.h>

#define RED 2
#define GREEN 3
#define CLOCK 4
#define LATCH 5
#define RESET 6

#define WIDTH 16*11

unsigned long i,j;

const unsigned char data[16][176] PROGMEM = {
  // 表示データを入れてください
};

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(RESET, OUTPUT);
}

void loop() {
  low(RESET);
  high(RESET);
  for(i=0;i<16;i++) {
    for(j=0;j<WIDTH;j++) {
      setColor(pgm_read_byte(&data[i][j]));
      low(CLOCK);
      high(CLOCK);
    }
    low(LATCH);
    high(LATCH);
  }
}

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 に表示データの横幅を入れてください。WIDTH を引いていますので、数値部分のみを変更してください。

#include <speedFunctions2.h>

#define RED 2
#define GREEN 3
#define CLOCK 4
#define LATCH 5
#define RESET 6

#define WIDTH 16*11
#define LENGTH 288-WIDTH  // 288 の部分を変える

unsigned long i,j,k;

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

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(RESET, OUTPUT);
}

void loop() {
  // 右から現れる
  for(i=0;i<WIDTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=0;k<WIDTH-i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<i;k++) {
        setColor(pgm_read_byte(&data[j][k]));
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  // 左へスクロール
  for(i=0;i<LENGTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=0;k<WIDTH;k++) {
        setColor(pgm_read_byte(&data[j][i+k]));
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  // 左へ消えていく
  for(i=0;i<WIDTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=i;k<WIDTH;k++) {
        setColor(pgm_read_byte(&data[j][LENGTH+k]));
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  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>

#define RED 2
#define GREEN 3
#define CLOCK 4
#define LATCH 5
#define RESET 6

#define WIDTH 16*11

unsigned long i,j,k;

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

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(RESET, OUTPUT);
}

void loop() {
  // 右から現れる
  for(i=0;i<WIDTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=0;k<WIDTH-i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<i;k++) {
        setColor(pgm_read_byte(&data[j][k]));
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  // 左へ消えていく
  for(i=0;i<WIDTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=i;k<WIDTH;k++) {
        setColor(pgm_read_byte(&data[j][k]));
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  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>

#define RED 2
#define GREEN 3
#define CLOCK 4
#define LATCH 5
#define RESET 6

#define WIDTH 16*11
#define LENGTH 80 // スクロールデータ横幅

unsigned long i,j,k;

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

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(RESET, OUTPUT);
}

void loop() {
  // 右から現れる
  for(i=0;i<LENGTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=0;k<WIDTH-i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<i;k++) {
        setColor(pgm_read_byte(&data[j][k]));
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  // 左へスクロール
  for(i=0;i<WIDTH-LENGTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=0;k<WIDTH-LENGTH-i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<LENGTH;k++) {
        setColor(pgm_read_byte(&data[j][k]));
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<i;k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

  // 左へ消えていく
  for(i=0;i<LENGTH;i++) {
    low(RESET);
    high(RESET);
    for(j=0;j<16;j++) {
      for(k=i;k<LENGTH;k++) {
        setColor(pgm_read_byte(&data[j][k]));
        low(CLOCK);
        high(CLOCK);
      }
      for(k=0;k<WIDTH-(LENGTH-i);k++) {
        setColor(0);
        low(CLOCK);
        high(CLOCK);
      }
      low(LATCH);
      high(LATCH);
    }
  }

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



上へ戻る