JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > 鉄道部品制御のすすめ > 02 系速度計(スピードメーター)の制御方法

02 系速度計(スピードメーター)の制御方法

最終更新日さいしゅうこうしんび:2024-03-04
お知らせ
2024-03-01 神保町じんぼうちょう書泉しょせんグランデに東京とうきょうメトロの鉄道部品てつどうぶひん入荷にゅうかがあり、02 けい丸ノ内線まるのうちせん電車でんしゃ)の速度計そくどけい(スピードメータ)と正面行先表示器しょうめんいきさきひょうじき購入こうにゅうしました。この速度計そくどけいは、メータ電流計でんりゅうけいとなっているため、電流でんりゅうながすことではりうごかすことができます。また、メータの周囲しゅういにランプがあるほか、メータのバックライトもついていて、ひからせることもできます。

 東京の地下鉄、丸ノ内線の電車で実際に使われていたものです。私は鉄道にあまり詳しくないので、LED ランプや赤い針の意味はわかりませんが、メータ自体は電車が走る速度を示すものです。運転台についています。

 購入時、本体の端子台にコネクタケーブルが接続されていましたが、不要だったため、偶然神保町でお会いしたフォロワーさんが欲しいということだったので、手元にありません。

LED を光らせる

 速度計内部には、特に制御回路が入っていず、LED と電流制限抵抗、保護用ダイオードが入っているだけでした。したがって、各ランプを個別に制御できます。ただし 24 V をかける必要があるので、回路に工夫が必要です。

 Arduino の I/O 電圧は 5 V です。この速度計の LED 部はアノードコモン(プラス側が共通)となっているため、プラス側を 24 V に接続しておき、トランジスタでカソード(マイナス側)を GND に落とすことで LED を制御できます。トランジスタは複数個が 1 つの IC に収められたトランジスタアレイを使うのが便利です。

LED ランプと端子の対応図

 上の画像は、LED ランプと端子番号の対応を示した図です。端子については後述します。

メータ(針)を動かす

 この速度計には「FS 5 mA」と書かれています。FS とはフルスケールのことで、文字通りメータがフルになる電流を示しています。5 mA を流すことで速度計が 90 km/h を示します。メータは電流を流すことで針が動くので、流す電流を制御してあげればいいのです。電流を制御するのに、オペアンプを用いた電圧電流変換回路(V-I 変換)と、DAC という部品を使います。V-I 変換回路はその名の通り、入力電圧を電流に変換する回路です。

FS 5 mA と書かれている銘板

PWM ではダメなのか

 DAC の代わりに PWM が使えそうだと思ったかもしれません。PWM はデジタル信号のパルス幅を制御することで疑似的に数値を制御するものです。あくまでもデジタル信号なので、中間の電圧を出力することはできません。V-I 変換回路はオペアンプを使用したアナログ回路ですので、アナログ電圧を入力してあげる必要があります。なので、DAC が必要です。なお、ESP32 や PIC16F17 ファミリには DAC が内蔵されているものもあるため(PIC にはオペアンプが内蔵されている製品もある)それを使うことで部品点数やコストを減らすことができます。ただし、DAC の分解能(出力できる最小単位)が限られてくるのと、オペアンプの電源電圧が PIC の VDD となるため今回の用途で使うには工夫が必要です。

 なお、ローパスフィルタ(LPF)で PWM 信号を復調(アナログ電圧に)することもできますが今回は試していません。


広告


速度計の端子台

端子配置図

 この速度計は、裏の端子台で結線します。端子台にはニチフの絶縁被覆付 R 形圧着端子 TMEX1.25-4 が適合します。これはホームセンターでも購入できます。端子台は A 列、B 列、C 列がそれぞれ 10 端子あり、A1~A10、B1~B10、C1~C10 と呼ぶことにします。この端子番号は、端子台をよく見ると書かれているのですぐにわかるかと思います。

1 2 3 4 5 6 7 8 9 10
A 60 45 65 50 LED +24V 30 赤(左)丸
B 70 緑(右)丸 40 35 「前方予告」 バックライド +24V 25 0 「P」
C バックライト - バッテン 55 75 黒針 - 黒針 + 赤針 - 赤針 +

表は横スクロールができます。

制御する

 このページに掲載の回路とプログラムで、うまくいけば黒針と赤針がそれぞれ行ったり来たりするはずです。注意点として、オペアンプには 9~12 V 程度以上の電圧を印加する必要があります。5 V ではメータを振り切ることができませんでした。定格電圧を確認の上、LED 電圧と同じ 24 V を使うのが楽ですので、今回はオペアンプに 24 V を使用しました。5 V ラインに誤って 24 V が掛からないように注意してください。GND は共通です。

 DAC には MCP4922 を使用しました。400 円と少し高いですが、12 bit 分解能(つまり、基準電圧を 2^12 = 4096 等分して出力できる)の DAC が 2 つ入っているため、赤針と黒針を制御できます。この DAC は SPI で制御します。Arduino には SPI 機能が搭載されていますが、MCP4922 は信号の方向が片方向のため、1 本ピンが無駄になってしまうのでチマチマと I/O 操作をする方法で実装しました。この DAC は SPI でデータを送ったあと、/LDAC 端子に負のパルスを入力しないと出力されません。/LDAC はラッチとして機能します。

 DAC の出力はオペアンプを使用した電圧電流変換回路を使いメータを動かします。1 kΩ の抵抗を使用することで、5 V が入力されたときに 5 mA が流れるようになります。オペアンプには安価な HTC 製の LM358N を使用しました。定格電圧に注意すれば大抵のオペアンプが使えると思いますが、選定がわからない方は同じものを使うのが良いと思います。

 LED は、すべてを点灯させるにはピン数が足りないので今回は実験として 7 個の LED のみを制御しています。random 関数を使用し、疑似乱数で光らせています。LED の駆動にはトランジスタアレイの TD62003APG を使用しました。回路図には TBD62003APG と書いてありますが、どちらでも動作します。手持ち部品の都合で前者を使用しましたが、購入する場合はより新しい(改良された)TBD62003APG をおすすめします。

 すべての LED を制御したい場合は 74HC595(シフトレジスタ)を使う、ピン数の多いマイコンを使うなど、出力ピンを確保する必要があります。

 今回使用した IC はすべて秋月電子通商で購入できます。

 DAC の分解能は 12 bit で 0~4095 の 4096 段階を出力でき、基準電圧(DAC の最大値)に 5 V を設定しています。DAC 値に 4095 を指定したときに5Vが出力されます。ですので、DAC 値が1であれば 5/4095 ≒ 0.0012 V が出力されます。この速度計はフルスケールが 90 km/h ですので、DAC 値 455 で 10 km/h を、45.5(小数には設定できないので 45 か 46)で 1 km/h を示します。

回路図 動作の様子

プログラム

 Arduino UNO 用です。

#define LED1      2
#define LED2      3
#define LED3      4
#define LED4      5
#define LED5      6
#define LED6      7
#define LED7      8

#define DAC_LDAC  10
#define DAC_SDI   11
#define DAC_SCK   12
#define DAC_CS    13

uint8_t led = 0;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);

  pinMode(DAC_LDAC, OUTPUT);
  pinMode(DAC_SDI, OUTPUT);
  pinMode(DAC_SCK, OUTPUT);
  pinMode(DAC_CS, OUTPUT);

  digitalWrite(DAC_CS, HIGH);   // CS は負論理
  digitalWrite(DAC_LDAC, HIGH); // LDAC は負論理
}

void loop() {
  // LED をランダムに制御
  led = random(128);   // 0 から 127 までの乱数生成
  digitalWrite(LED1, led&0b0000001 ? HIGH : LOW);
  digitalWrite(LED2, led&0b0000010 ? HIGH : LOW);
  digitalWrite(LED3, led&0b0000100 ? HIGH : LOW);
  digitalWrite(LED4, led&0b0001000 ? HIGH : LOW);
  digitalWrite(LED5, led&0b0010000 ? HIGH : LOW);
  digitalWrite(LED6, led&0b0100000 ? HIGH : LOW);
  digitalWrite(LED7, led&0b1000000 ? HIGH : LOW);

  // DAC 値を加減算
  for(uint16_t i=0; i<4096; i++) {
    DACOutput(i, 4095-i);
    delayMicroseconds(10);
  }
  for(uint16_t i=0; i<4096; i++) {
    DACOutput(4095-i, i);
    delayMicroseconds(10);
  }
}

// DAC に値を出力する関数(12 ビットなので各値 0~4095 の範囲)
void DACOutput(uint16_t dac1, uint16_t dac2) {
  // DAC1
  digitalWrite(DAC_CS, LOW);    // チップセレクト
  digitalWrite(DAC_SDI, LOW);   // DAC 選択
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  digitalWrite(DAC_SDI, HIGH);  // 入力バッファする
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  digitalWrite(DAC_SDI, HIGH);  // 出力ゲイン 1 倍にする
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  digitalWrite(DAC_SDI, HIGH);  // 出力有効
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  for(uint8_t j=0; j<12; j++) {
    if(dac1 & (0x800>>j)) digitalWrite(DAC_SDI, HIGH);
    else digitalWrite(DAC_SDI, LOW);
    digitalWrite(DAC_SCK, HIGH);
    digitalWrite(DAC_SCK, LOW);
  }
  digitalWrite(DAC_CS, HIGH);   // アンセレクト

  // DAC2
  digitalWrite(DAC_CS, LOW);    // チップセレクト
  digitalWrite(DAC_SDI, HIGH);  // DAC 選択
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  digitalWrite(DAC_SDI, HIGH);  // 入力バッファする
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  digitalWrite(DAC_SDI, HIGH);  // 出力ゲイン 1 倍にする
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  digitalWrite(DAC_SDI, HIGH);  // 出力有効
  digitalWrite(DAC_SCK, HIGH);
  digitalWrite(DAC_SCK, LOW);
  for(uint8_t j=0; j<12; j++) {
    if(dac2 & (0x800>>j)) digitalWrite(DAC_SDI, HIGH);
    else digitalWrite(DAC_SDI, LOW);
    digitalWrite(DAC_SCK, HIGH);
    digitalWrite(DAC_SCK, LOW);
  }
  digitalWrite(DAC_CS, HIGH);   // アンセレクト

  digitalWrite(DAC_LDAC, LOW);  // 出力ラッチ
  digitalWrite(DAC_LDAC, HIGH);
}

戻る
広告

右メニュー

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



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



上へ戻る