SSブログ

Arduinoで7個のポイント切り換えてみました [Arduinoで自動運転(DCC)]

こんにちは。今日の都内は爽やかな春の陽射しの1日になりました。

しかし、熊本&大分方面の地震は収まる気配がないようで、これ以上、被害が拡がらないことを願います。
そして、被害に遭われた皆様にお見舞い申し上げます。

さて、かなり間が開いてしまいましたが、arduinoを使っての自動運転の企みですが、ようやく7個のポイント制御ができるようになりました。

P1110240.JPG

今回はポイントの切り替えにはDC12Vの電源とモータードライバにはTA8428Kをポイント毎に使っています。
また、シフトレジスタはTC74HC595を2個直列で繋いで使用しました。
まずは、ポイントを繋がずにLEDの点灯/消灯で動作確認です。



スイッチを押すとオレンジのLEDが順次7個0.5ms点灯して切り替わるようにしています。
これをループさせるのはfor文で参考例がいろいろとネットにUPされているのですが、最後に消灯するのがなかなかうまくいかず、結局、下記のプログラムのように、ゼロを2回Writeすることで逃げました。
また、LEDは確認が終わったら外す予定でしたが、設置後のメンテナンス等を考慮して残すことにしました。
LEDの点灯の有無で回路が正常なのかポイントが異常なのかを切り分けることができるかと思いまいして。
ちなみに、DC12Vが流れるので、制限抵抗には1kΩの抵抗を入れています。

で、ポイントを繋いでの動作確認です。




これで7台のポイントを切り替える回路はできましたので、あとはプログラムでなんとかなりそうです。

今回は下記のようなプログラムで制御しています。

#define P01_R 1 // No.1 ポイント 右
#define P01_L 2 // No.1 ポイント 左
#define P02_R 3 // No.2 ポイント 右
#define P02_L 4 // No.2 ポイント 左
#define P03_R 5 // No.3 ポイント 右
#define P03_L 6 // No.3 ポイント 左
#define P04_R 7 // No.4 ポイント 右
#define P04_L 8 // No.4 ポイント 左
#define P05_R 9 // No.5 ポイント 右
#define P05_L 10 // No.5 ポイント 左
#define P06_R 11 // No.6 ポイント 右
#define P06_L 12 // No.6 ポイント 左
#define P07_R 13 // No.7 ポイント 右
#define P07_L 14 // No.7 ポイント 左

int latchPin = 2; // 74HC595のST_CPへ 白
int clockPin = 7; // 74HC595のSH_CPへ 緑
int dataPin = 4; // 74HC595のDSへ 黄色

int val;
int h;
int l;
int fw=1;

void setup() {
pinMode(latchPin, OUTPUT); // 白
pinMode(clockPin, OUTPUT); // 緑
pinMode(dataPin, OUTPUT); // 黄色
pinMode(8,INPUT); // 赤 スイッチNO/OFF
}

void loop() {
if (digitalRead(8)==HIGH){
if (fw==1){
point_onoff8(P01_R);
point_onoff8(P02_R);
point_onoff8(P03_R);
point_onoff8(P04_R);
point_onoff8(P05_R);
point_onoff8(P06_R);
point_onoff8(P07_R);
point_off();
}
else {
point_onoff8(P01_L);
point_onoff8(P02_L);
point_onoff8(P03_L);
point_onoff8(P04_L);
point_onoff8(P05_L);
point_onoff8(P06_L);
point_onoff8(P07_L);
point_off();
}
delay (200);
fw=fw*-1;
delay (2000);
}
}

void point_onoff8(int point_no) {
// ポイント point_no を切り替えます
// 送信中のlatchPinはグランド(LOW)レベル
digitalWrite(latchPin, LOW);
// シフト演算を使って切り替えるポイントを選択

point_no = point_no -1; /* ポイント設定 */

val = 1<<point_no; /* 変数にポイントを設定 */

h = val>>8; /* 変数をシフト */

l = val & 0xff; /* 変数をマスク */

shiftOut(dataPin, clockPin, MSBFIRST, h);
shiftOut(dataPin, clockPin, MSBFIRST, l);
// 送信終了後latchPinをHIGHにする
digitalWrite(latchPin, HIGH);
delay(500);
}


void point_off() {
// シフトレジスタをクリア
// 送信中のlatchPinはグランド(LOW)レベル
digitalWrite(latchPin, LOW);
// シフト演算を0クリア
shiftOut(dataPin, clockPin, MSBFIRST, 0);
shiftOut(dataPin, clockPin, MSBFIRST, 0);
// 送信終了後latchPinをHIGHにする
digitalWrite(latchPin, HIGH);
// 送信終了後latchPinをHIGHにする
delay(1000);
}

以上、あとは、基盤の作り込みになります。

nice!(1)  コメント(2)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 1

コメント 2

taka@

ダンボさん、こんにちは~

いつのまにやら自動運転ブログになってますね(^^ゞ
スゴイです。
敬服します~!


私もいずれ店内に簡単なジオラマ置いてこんなことをやってみたいと思っていますが・・・(いつのことやらw)


by taka@ (2016-05-07 13:29) 

目黒のダンボ

taka@さん、おはようございます。

コメントの返信が大変遅くなってしまい申し訳ありません。

>いつのまにやら自動運転ブログになってますね(^^ゞ
確かに自動運転のためのプログラムと食べログにばかりになってしまってますね。(笑)

>私もいずれ店内に簡単なジオラマ置いてこんなことをやってみたいと思っていますが・・・(いつのことやらw)
完成したら量産化して送りますね~!
って、いつ完成できるやら。。。^^;

by 目黒のダンボ (2016-05-13 09:19) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0