赤外線による車両検出は基板設計が終わり発注しましたが手元に届くにはまだまだ時間があります。
ということで、TOMIXから発売されているTCSセンサーをAVRに接続し、その信号を元にBDL168のパケットを送出する実験をします。
TCSセンサーには写真のようにコンパクトなワンタッチ設置型、レール型およびスラブレール用とあります。
今回は設置の簡単なTCSワンタッチ装着センサーを利用しますが全て構造、配線は全く同じです。
内部構造
内部構造はいたって簡単で、フォトカプラが2つ入っており、車輪がセンサーに接触することによりフォトカプラーがONになります。
このときレール上の電流の向きによってONになるフォトカプラが異なり、どちらのフォトカプラがONになったかどうかで進行方向も検知できます。
しかし、DCCで利用した場合はどちらのフォトカプラもONになってしまうため進行方向は検知できません。
以下に内部回路の略図を載せておくので参考にしてください。
09/10/12追記:フォトカプラの内部は記号のようにLEDが入っているだけなので実際にはLED点灯時と同様に電流制限抵抗が必要です。実物のTCSセンサーには下図のレールB側に2.2kΩの抵抗が接続されているようです。hashizumeさん、コメントありがとうございます。
AVRとの接続
TCSセンサーは接続する方向さえ気をつければスイッチと同じように使えるので、入力ピンをプルアップしておき、フォトカプラがONになるとGNDに接続されるように配線します。
回路図のLocoNet接続部分は省略しています。以前の記事のAVRとLoconetの接続を参照してください。
プログラム
車両を検知したらBDLのセクション1の検出信号をLocoNetに送信し、最後に検出してから1秒間検出が無ければ非検出信号を送信するようにします。これは、センサーのON、OFFを毎回送信していると自動制御をする上で大変めんどくさいことになるのであらかじめチャタリング回避するためです。
次の例はATtiny2313にLocoNetとTCSセンサーを接続し、BDL168(アドレス1)のセクション1の情報として送出するサンプルです。
回路は上の図の通りです。
また、次のファイルが必要です。
- uart.h(LocoNet対応版)
- uart.c(LocoNet対応版)
- loconet.h
- loconet.c
これらは、AVRからLocoNetに送信からダウンロードできます。
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "uart.h" #include "loconet.h" volatile int16_t sens_timer = 0; volatile int8_t sens_end = 0; void delay_ms(uint16_t ms){ while(ms--){ _delay_ms(1); } } ISR(TIMER0_COMPB_vect){ loconet_timer(800); if(sens_timer>=0){ sens_timer -= 8; if(sens_timer<0) sens_end = 1; } } int main(){ init_uart(16600); //800us割り込み(8MHz時) OCR0A = 100; OCR0B = 50; TIMSK |= 0b100; //COMPB割り込み TCCR0A = 0b00000010; TCCR0B = 0b00000011; sei(); delay_ms(200); uint8_t BDL_ON[] = {0xB2,0x00,0x50}; uint8_t BDL_OFF[] = {0xB2,0x00,0x40}; sens_timer = 0; while(1){ if((PIND&0x40)==0){ if(sens_timer < 0){ //初めての検出 loconet_send(BDL_ON,3); sens_timer = 12500; } sens_timer = 12500; } if(sens_end==1){ //最後の検出から一定時間経過 sens_end=0; loconet_send(BDL_OFF,3); } } return 0; }
コメント: 1 件