←戻る
DCC用コントロールパネルを作る2(ポインタの省配線システム)

コレの続きで、ポインタの省配線システムと称して LocoPoint アダプタの作り方を紹介します。

メニュー
■回路図
■コントローラ部
■コントロールパネル
■ソースファイル
■ソースファイルのダウンロード
■動画
■今後について

本文
■回路図
←クリックすると拡大します。
※スイッチ入力部に以前はプルアップが付いていましたが、AVRのポート設定で不要になりました。

■コントローラ部
部品リスト
部品番号 部品名 単価 個数 仕入先
CN1 2.1mm標準DCジャック(基板取付用) MJ−179P 内径2.1mm外径5.5mm 40円 1個 秋月電子通商
CN2 ピンヘッダ(オス) 40P(1×40) 50円 1個 秋月電子通商
CN3 6極モジュラージャック 50円 1個 秋月電子通商
CN4 Dサブ コネクタ 9P・オス(基板取付用Lタイプ)[インチネジ] 60円 1個 秋月電子通商
U1 ATTINY2313-20PU AVRマイコン 367円 1個 マルツパーツ館
U1 20pin IC ソケット   1個  
R1,3,6 抵抗 1/4W 330Ω   3個  
R2 抵抗 1/4W 4.3kΩ   1個  
R4,7 抵抗 1/4W 47kΩ   2個  
R5 抵抗 1/4W 5.1kΩ   1個  
C1 電解コンデンサ 10uF   1個  
C2 0.1uF   1個  
TR1,2 2SC945 or 2SC1815   2個  
LED1     1個 秋月電子通商
PB1 ユニバーサル基板 1枚 千石
配線 0.2φポリウレタン銅線 294円 1個 マルツパーツ館
CBL 多芯ケーブル   1本  
SW1-8 スイッチ @80円 8個 電子パーツ通販のKURA
CASE TB-2B 231円 1個 共立エレショップ
ユニバーサル基板 TB-18 189円 1枚 共立エレショップ

■ハンダ面
電源は太めの錫めっき線及び、ポリウレタン線を使用し、その他信号線の配線は
ポリウレタン線で配線しました。
←クリックすると拡大します。

■部品面
DSUB,モジュラー,DC INジャックは、ユニバーサル基板泣かせです(ピッチが合いません)
ICソケットはちょうど良い20ピンがなかったのでもったいないけど・・・
LEDの制限抵抗が正式配線に治していなかったや・・・
←クリックすると拡大します。

←クリックすると拡大します。
カッターで開けました。

←クリックすると拡大します。
←クリックすると拡大します。
←クリックすると拡大します。
■コントロールパネル
イラストレーションボード言うちょっと厚めの紙を購入
1mm厚は私の持っていたポンチ+金槌ではつらいものがありました。
←クリックすると拡大します。
レイアウト図を書いて紙に印刷します。
←クリックすると拡大します。
イラストレーションボードから必要な大きさのパネルを切り出します。
←クリックすると拡大します。
今回は、のりで貼り付けました。
←クリックすると拡大します。

←クリックすると拡大します。
多芯ケーブルにスイッチを取り付けます。
←クリックすると拡大します。
スイッチには番号が1〜8まで振られています。
←クリックすると拡大します。
スイッチ側面には、cが書かれており、「c:close:直線」になる印を付けています。
←クリックすると拡大します。

■ソースファイル
やっつけソースなので、ソースコードが洗練されてないです・・・(^^;
ATtiny2313の個体差で、LocoNetの16600bpsが誤差範囲外で全く動かなかったので、AOSCCAL=0x59; の補正が必要でした。

#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "uart.h" #include "loconet.h" #define C 0x30 #define T 0x10 #define PMAX 8 #define SW_BIN PINB /*入力ポート*/ #define SW_BOUT PORTB /*出力ポート*/ #define SW_BPORTO DDRB /*ポート方向設定*/ #define SW_DIN PIND /*入力ポート*/ #define SW_DOUT PORTD /*出力ポート*/ #define SW_DPORTO DDRD /*ポート方向設定*/ void delay_ms(uint16_t ms){ while(ms--){ _delay_ms(1); } } ISR(TIMER0_COMPB_vect){ loconet_timer(800); } void point_c(uint8_t address,uint8_t cort) { uint8_t table[] = {0xb0,0x00,0x00}; // cmd,address,C/T table[1] = address; table[2] = cort; // cort = c or t loconet_send(table, 3); } int main(void){ uint8_t read_sw,read_sw_last; int i; init_uart(16600); OSCCAL=0x59; /* 今使っている attiny2313 個体差によるOSCの補正 */ /* 通常は不要と思われる */ //800us割り込み OCR0A = 100; OCR0B = 50; TIMSK |= 0b100; //COMPB割り込み TCCR0A = 0b00000010; TCCR0B = 0b00000011; SW_BPORTO = 0x00; SW_BOUT = 0x07; /* pull up */ SW_DPORTO = 0x00; /* 0000 0000 bit0,bit1 は、txd,rxdに割り当てられているので 0、入力ポートなので、0 */ SW_DOUT = 0xfc; /* pull up */ sei(); /* SW_PORT PD6 sw5 PD5 sw4 PD4 sw3 PD3 sw2 PD2 sw1 PD1 TXD PD0 RXD 0xfc 1111 1100 */ read_sw = ( SW_BIN & 0x07 ) | (( SW_DIN << 1 ) & 0xf8 ); // 今回の状態を読み込み(txd,txdを0xfcでマスク) for(i=0;i<=PMAX-1;i++){ // 初回の状態を読み込みポイントを設定する if((( read_sw >> i ) & 0x01) == 0) point_c(i,C); //close 直線 else point_c(i,T); //thrown 分岐 delay_ms(100); } while(1){ read_sw_last = read_sw; // 前回の状態を記録 read_sw = ( SW_BIN & 0x07 ) | (( SW_DIN << 1 ) & 0xf8 ); // 今回の状態を読み込み(txd,txdを0xfcでマスク) if(read_sw_last != read_sw){ // 前回の今回の値を比較 for(i=0;i<=PMAX-1;i++){ if((( read_sw >> i ) & 0x01) != (( read_sw_last >> i ) & 0x01)){ // ビットシフトさせて下位ビットを比較 if((( read_sw >> i ) & 0x01) == 0){ //close 直線 point_c(i,C); } else { point_c(i,T); } } delay_ms(100); } } } return 0; }

■ソースファイルのダウンロード
ダウンロード

■動画
YouTube
ニコニコ動画


2009.09.12 初版