JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > 鉄道部品制御のすすめ > 【鉄道部品】東京メトロ 8000 系 行先表示器の制御方法

【鉄道部品】東京メトロ 8000 系 行先表示器の制御方法

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

 半蔵門線の車両、東京メトロ 8000 系(メトハチ)のフルカラー側面行先表示器の制御方法になります。speedFunctions2 ライブラリを使用します。LED モジュールの解説やピン配置はこちらを参照してください。

配線

配線図

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

静止表示

 表示データを各自作成し、色定義を希望の色に変更して Arduino UNO に書き込んでください。

表示の様子
/*
 * SpeedFunctions ライブラリを使用する
 * https://74hc00.com/electronic/arduino/library/speedFunctions.php
 */
#include <speedFunctions2.h>
/*
 * ピン定義
 * DF は LOW に固定する
 */
//                   PH コネクタ側ピン番号
#define CTCLR 2   // カウンタ 4520 のクリア端子
#define CTCLK 3   // カウンタ 4520 のクロック端子
#define WE    4   // 6
#define MSEL  5   // 8
#define D2A   6   // 11_UPPER
#define D1A   7   // 12_UPPER
#define D0A   8   // 13_UPPER
#define D2B   9   // 11_LOWER
#define D1B   10  // 12_LOWER
#define D0B   11  // 13_LOWER
#define CLK   12  // 14

// 表示データ
const unsigned char data[32][112] PROGMEM = {
  // https://74hc00.com/app/8colors/ で作成してください
};

/*
 * 色定義
 * {B,G,R} の順で指定・8 階調なので 0 から 7 で指定
 */
uint8_t color[8][3] = {
  {0,0,0}, // 黒
  {0,0,7}, // 赤
  {0,7,0}, // 緑
  {0,7,7}, // 黄
  {7,0,0}, // 青
  {7,0,7}, // マゼンタ
  {7,7,0}, // シアン
  {7,7,7}, // 白
};

void setup() {
  pinMode(CTCLR, OUTPUT);
  pinMode(CTCLK, OUTPUT);
  pinMode(WE, OUTPUT);
  pinMode(MSEL, OUTPUT);
  pinMode(D2A, OUTPUT);
  pinMode(D1A, OUTPUT);
  pinMode(D0A, OUTPUT);
  pinMode(D2B, OUTPUT);
  pinMode(D1B, OUTPUT);
  pinMode(D0B, OUTPUT);
  pinMode(CLK, OUTPUT);

  // カウンタリセット
  high(CTCLR);
  low(CTCLR);

  // 色データの書き込み
  writeColor(color);
  // 表示データの書き込み
  for(uint8_t y=0; y<16; y++) {
    // 縦 16 ドット
    for(uint8_t x=0; x<112; x++) {
      // 横 112 ドット
      sendData1(pgm_read_byte(&data[y][x]));     // 上段
      sendData2(pgm_read_byte(&data[y+16][x]));  // 下段
      // クロック
      high(CLK);
      low(CLK);
    }
    // 書き込み
    high(WE);
    low(WE);
    // アドレスインクリメント
    high(CTCLK);
    low(CTCLK);
  }
}

void loop() {
}

/*
 * 関数群
 */

// 上段に送るデータを指定する関数
void sendData1(uint8_t data) {
  switch(data) {
    case 0:
      low(D0A);
      low(D1A);
      low(D2A);
      break;
    case 1:
      high(D0A);
      low(D1A);
      low(D2A);
      break;
    case 2:
      low(D0A);
      high(D1A);
      low(D2A);
      break;
    case 3:
      high(D0A);
      high(D1A);
      low(D2A);
      break;
    case 4:
      low(D0A);
      low(D1A);
      high(D2A);
      break;
    case 5:
      high(D0A);
      low(D1A);
      high(D2A);
      break;
    case 6:
      low(D0A);
      high(D1A);
      high(D2A);
      break;
    case 7:
      high(D0A);
      high(D1A);
      high(D2A);
      break;
  }
}

// 下段に送るデータを指定する関数
void sendData2(uint8_t data) {
  switch(data) {
    case 0:
      low(D0B);
      low(D1B);
      low(D2B);
      break;
    case 1:
      high(D0B);
      low(D1B);
      low(D2B);
      break;
    case 2:
      low(D0B);
      high(D1B);
      low(D2B);
      break;
    case 3:
      high(D0B);
      high(D1B);
      low(D2B);
      break;
    case 4:
      low(D0B);
      low(D1B);
      high(D2B);
      break;
    case 5:
      high(D0B);
      low(D1B);
      high(D2B);
      break;
    case 6:
      low(D0B);
      high(D1B);
      high(D2B);
      break;
    case 7:
      high(D0B);
      high(D1B);
      high(D2B);
      break;
  }
}

// 色データを書き込む関数
void writeColor(uint8_t color[8][3]) {
  high(MSEL);
  for(uint8_t y=0; y<8; y++) {
    for(uint8_t x=0; x<3; x++) {
      sendData1(color[y][0]);
      sendData2(color[y][0]);
      high(CLK);
      low(CLK);
      sendData1(color[y][1]);
      sendData2(color[y][1]);
      high(CLK);
      low(CLK);
      sendData1(color[y][2]);
      sendData2(color[y][2]);
      high(CLK);
      low(CLK);
    }
    high(WE);
    low(WE);
    high(CTCLK);
    low(CTCLK);
  }
  low(MSEL);

  // カウンタリセット
  high(CTCLR);
  low(CTCLR);
}

戻る
広告

右メニュー

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



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



上へ戻る