HOME >> 鉄道模型実験室 > ロータリスイッチのコード化
以前使用していた12接点のロータリスイッチを再利用するため、選択された端子情報をコード化する基板を作成することにしました。 そのいきさつは「スケッチの構成に関する一考察」(2021/1/15)を参照下さい。
.
■ コード化の方法
再利用しようとしているロータリスイッチを右に示します。 中央部にコモン端子があり、周囲には接続する端子がずらりと12個も配置されています。 ダイヤルを回すと、どれかの端子と中央のコモン端子が接続される構造ですが、単に機械的に接続されるだけのシンプルな構造です。
この様な多接点のロータリスイッチをコンピュータに取り込む場合には、信号線を少なくするために、コード化して送信するのが一般的です。 例えば秋月さんのサイトで見ると、“ DIPロータリースイッチ 0〜F 正論理 ” のように、スイッチの選択状態を16進数、即ち4個の信号線から取り出せるように一体的に構成されたスイッチを採用すれば簡単なのです。
しかし、ここでは右の写真のスイッチを再利用することにし、コード化の勉強と、電子工作の楽しみのために、あえてコード化基板を作ることにしました。
■ コート化基板の工作
最初に回路図を作成しましょう。 12個の端子の接続状態を4個のチャネルから、負論理で取り出す場合の回路図です。

基板は、25×15穴の標準的なユニバーサル基板から必要なサイズを切り出し、ダイードは汎用小信号高速スイッチング・ダイオード IN4148 を使用しました。
いつもの様に下手なハンダ付けですが、目視チェックでOKと判断して工作を進めました。 しかし、次に実施した点灯テストにて2ヶ所のハンダ付け不良を発見しました。 スイッチと基板の間の配線は、操作板に部品を取り付けてから実施しました。 信号取り出し線は、電源とGND線を含めて一ヶ所のピンホルダにまとめ、制御コンピュータと接続するようにしました。 その操作盤の裏側の状態を下に示す。
もう、機器と配線で一杯になってしまいました。 でも、操作盤の表はスッキリとしていますよ。
.
今回のロータリスイッチとスタートボタンを新設した状態を上に示す。 ダイヤル位置はとりあえず鉛筆で記入しておきました。
■ 通電テストの実施
まず、コード化基板などの配線が正しく実施されているどうかを確認するために、右のようなLEDを使った回路でチェックしました。 +5volt の電源はACアダプタを使っています。 LEDは、電源との間に10KΩの抵抗を挿入されていますので、信号線とGND間に直接取付けています。
そして、回路は負論理ですので、ロータリスイッチの端子がGNDと接続状態になるとLEDは消灯状態となります。 右の写真のように、ダイヤル1の選択状態では、どの端子とも接続していないので、全ての信号線が HIGH 状態になり、全てのLEDは点灯しています。 これによってこの回路は良好と判断できます。
全てのダイヤル位置をチェックすると、2ヶ所に不良個所が見つかり、ハンダ付けを修正しました。 やはり、ハード回路の点検は不可欠ですね。
■ デコーダの確認
信号線から送られて来た信号をもとに、Arduino を用いて選択されたダイヤル番号を確認する事にしましょう。 実験状態を下に示します。 4本の信号線を I/O 端子に接続し、さらに新しく設けたスイッチの信号線も接続しました。 スイッチの信号は正論理回路です。
// Every-rotary-1
// 2021.1.14
// Arduino Nano Every を使用する。
// PWM周波数を15.7kHzにする。
#define STRT 10
#define CH1 9
#define CH2 7
#define CH3 5
#define CH4 3
void setup() {
pinMode(STRT,INPUT);
pinMode(CH1,INPUT);
pinMode(CH2,INPUT);
pinMode(CH3,INPUT);
pinMode(CH4,INPUT);
TCA0.SINGLE.CTRLA = 0b0101; //PWM周波数の変更
Serial.begin(9600);
}
void loop() {
if (digitalRead(STRT)==HIGH){
if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH){
Serial.println("Dial 1");
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH){
Serial.println("Dial 2");
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH){
Serial.println("Dial 3");
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH){
Serial.println("Dial 4");
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW){
Serial.println("Dial 5");
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW){
Serial.println("Dial 6");
} else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW){
Serial.println("Dial 7");
} else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW){
Serial.println("Dial 8");
}
Serial.println(" ");
delay (20000);
}
}
確認のために使用したスケッチを右に示します。
********************************************
実験はノートパソコンの画面を使って、Arduino のシリアル通信によって送られてきたプリント命令を表示させるようにしています。 最初にダイヤルを指定位置に回し、スタートボタンを押すと、デコードされたダイヤル位置情報を返すものです。
プログラム全体はもぐらたたき方式で記述しており、IF文の判断条件は3個のチャネルの AND を取って判別させます。 CH4は今回はパスしています。
選択ダイヤル1番から順番に回して行った実験結果を下に示します。
****************************
Dial 1 Dial 2 Dial 3 Dial 4 Dial 5 Dial 6 Dial 7 Dial 8 Dial 1 Dial 2 Dial 3 Dial 4
****************************
返信されてきた情報は、ダイヤル設定位置に対して一つだけ返してきていることが確認出来ました。 ここでは、CH4はパスしていますので、Dial9 以降は始めに戻っています。
■ まとめ
これで、ロータリスイッチを使った選択方式を確認することが出来ました。 ラインプリント命令を、それぞれの運行モードに合せて記述すれば目的とする自動運転の制御が実現出来そうです。
なお、次回は、気なっていた if 〜 if 〜 文、 if 〜 else 〜 文、 if 〜 else if 〜 文の違いを確認しておきたいと思います。
2021/1/16 作成