最終更新日
記事公開日

プラレール衝突回避システムを作ってみた(PICプログラミング)

プラレール衝突回避システム

プラレール衝突回避システムとは?

分岐から一本道に戻るとき、タイミングが悪いと車両同士が衝突してしまうことがありますよね。

そこで、プラレールの情景パーツ『信号機 J-10』を改造して、車体がぶつからない装置を作ってみました。

仕組み

片方のレールに光センサを埋め込んでいます。

もう片方のレールには信号機を設置し、改造してモーターを取付けています。

2台の車両が同時に一本道に近づくと、光センサーがモーターにSTOP信号を送ります。

すると、信号機のストップレールが自動で上がり、片方の車両が一時的にその場に停止します。

数秒経つと、モーターがストップレールを自動で元に戻す仕組みになっています。

作り方[目次]

【1】電子回路の作成

プラレール衝突回避システムの電子回路(表)
回路(表)
プラレール衝突回避システムの電子回路(裏)
回路(裏)

回路図

プラレール衝突回避システムの電子回路図

部品表

部品名規格数量
ICPIC12f6831
CDSセルMI51271
サーボモーターSG-901
圧電スピーカーSPT081
ICソケット(8Pin)2227MC-08-031
ピンヘッダ(オスL型3Pin)PH-1X40RG 1
抵抗10kΩ2
可変抵抗(半固定ボリューム)10kΩ(103)1
積層セラミックコンデンサー104K(0.1μF / 250V)1
電池ボックス(単3×3本)SBH-331AS1
ユニバーサル基板両面スルーホール(72×47mm)1
スペーサー10mmタイプ1

※全て『秋月電子通商』で購入しました。

回路の解説

PICマイコン周りの回路解説

PICマイコン(12f683)
PICマイコン(12f683)

この電子回路には、PICマイコン(12f683)を使用しています。

PICマイコンとは、小さなパソコンみたいなもの。

プログラムを書き込んで、信号を自在に制御する為に使用します。

書き込むプログラム内容については、『2.プログラム』をご覧ください。

PICマイコンの回路を組む上でのルールで、1Pinにコンデンサ(0.1μF)、4Pinには抵抗(10kΩ)を取り付けるようになっています。

サーボモーター周りの回路解説

サーボモーター(SG-90)
サーボモーター(SG-90)

信号機のストップレールの上げ下げを制御しているのが、サーボモーターです。

普通のモーターはグルグル回りっぱなしですが、このサーボモーターは指示した位置で自由に止めることができます。

配線は、ケーブルの色に従ってください。

  • 茶 → GND
  • だいだい → 電源
  • 黄色 → 信号

CDS周りの回路解説

CDSセル(光センサ) MI5127
CDSセル(光センサ) MI5127

CDS(光センサ) は、光の量によって抵抗値が変わる素子です。

明るいとき:抵抗(小)
暗いとき:抵抗(大)

CDSは、レールにドリルで穴を空けて埋め込みました。

そのCDS上を車両が通ると、CDSは「暗くなった」と判断し、大きい抵抗となります。

しかし、このままCDSに電圧をかけても、PICマイコンの3Pinにかかる電圧は変化しないので、10kΩの抵抗で分圧しました。

分圧したことにより、3Pinにかかる電圧はCDSの抵抗に比例するようになっています。

ボリューム周りの回路解説

 可変抵抗(半固定ボリューム)10kΩ(103)と  圧電スピーカー(SPT08)
可変抵抗(半固定ボリューム)10kΩ(103)と 圧電スピーカー(SPT08)

ボリュームラインには、精密ドライバーで抵抗値を変えることができる『可変抵抗』を取り付けています。

これにより、音の大きさを調整します。

【2】プログラムの作成

PICkit3を使いPICマイコンにプログラムデータを書き込む
PICkit3を使いPICマイコンにプログラムデータを書き込む

PICマイコンにプログラムを書き込む際に必要なもの

  • PICkit3
  • PICkit対応アダプタキット(自作でも可)
PICkitアダプタキット
最安値・レビューをチェック

PICマイコンに書き込むソースコード

言語:XC8コンパイラ(C言語)

// PIC12F683 Configuration Bit Settings
// 'C' source line config statements
#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// 初期設定
#pragma config FOSC = INTOSCIO  // 内部クロックを使用する(3番Pinは入出力に)
#pragma config WDTE = OFF       // フリーズしたときに強制リセットするか?
#pragma config PWRTE = OFF      // 起動時、電源が安定するまで待つか?
#pragma config MCLRE = ON       // 外部からのリセット信号を受け付けるか?
#pragma config CP = OFF         // プログラムの外部読み取りを許可するか?
#pragma config CPD = OFF        // データの外部読み取りを許可するか?
#pragma config BOREN = ON       // 電源が不安定になったとき動作を停止するか?
#pragma config IESO = OFF        // 外部クロックが安定するまで内部クロックを使用するか?
#pragma config FCMEN = OFF       // 外部クロックが止まったとき内部クロックを使用するか?
#define _XTAL_FREQ 1000000      // delay_ms()などの関数用にクロック周波数を定義

void main(void)
{
    // OSCCON レジスタ(内部クロックの周波数を設定)
    // 1MHzに設定
    OSCCON = 0b01000000;

    // TRISIO レジスタ(GP0~GP5の入出力モードを設定)
    // GP3(4番Pin)、GP4(3番Pin)、GP5(2番Pin)を入力モードに設定
    TRISIO = 0b00111000;

    // ANSEL レジスタ(A/D変換のクロック・アナログ入力ピンを設定)
    // クロック:Fosc/16、アナログ入力ピン:ANS3(3番Pin)
    ANSEL = 0b01011000;

    // ADCON0 レジスタ(A/D変換の動作を設定)
    // A/D変換結果10bitを左詰めでセット、基準電圧:VDD、A/D変換ポート:AN3(3番Pin)、A/D変換指示:なし、A/D変換機能を使用する
    ADCON0 = 0b00001101;

    // CMCON0 レジスタ(コンパレータ機能の設定)
    // コンパレータを使用しない
    CMCON0 = 0b00000111;    

    // CCP1CON レジスタ(PWM機能の設定)
    // PWMモード有効
    CCP1CON = 0b00001100;

    // PR2 レジスタ(PWM周期の元となるデータを設定)
    // 最大値に設定(8bit = 255)
    PR2 = 255; 

    // T2CON レジスタ(TMR2/タイマー2の設定)
    // TMR2有効、プリスケーラ:1:16 
    T2CON = 0b00000110;

    // A/D変換
    __delay_us(25);
    GO = 1;
    while(GO);

    // CDS感度(値を小さくするとアップ)
    if (ADRESH > 150) {

        for (long l = 1; l < 15; l++) {

            // モーターを-90度あたりまで動かす
            if (l == 1) {
                CCPR1L = 35;
            }

            // 音 (1)
            for (long i = 1; i <= 219; i++) {
                GP1 = 1;
                __delay_us(568); 
                GP1 = 0;
                __delay_us(568);
            }

            // 音 (2)
            for (long i = 1; i <= 276; i++) {
                GP1 = 1;
                __delay_us(425);
                GP1 = 0;
                __delay_us(425);
            }

            // モーターを元の位置まで動かす
            if (l == 10) {
                CCPR1L = 19;
            }

        }

    }
    // CDSからの信号が低いときはモーターを動かさない
    else {
        CCPR1L = 0;
    }
}

レジスタの解説

レジスタとは?

PICには、『レジスタ』という様々なデータを格納しておくメモリがあります。

簡単に言うと、レジスタは設定内容を保存する箱です。

必要な機能を使う時には、その箱に「1」を入れたり、不要なときは「0」を入れたりします。

イメージ的には、飛行機の操縦席のような感じで、最初に「パチッ」「パチッ」とスイッチを入れていくわけです。

OSCCONレジスタの設定

例えば、PICで使用する内部クロックの周波数を決める場合。

『OSCCONレジスタ』という項目の設定を行います。

8桁の数字が用意してあるので、それぞれ「1」か「0」を選択し、その組み合わせで周波数が決まります。

00000000:31KHz
00010000:125KHz
00100000:250KHz
00110000:500KHz
01000000:1MHz
01010000:2MHz
01100000:4MHz
01110000:8MHz

今回、1MHzの内部クロックを使用したいので、「01000000」を選択しました。

プログラムには、 以下のように記載します。

OSCCON = 0b01000000;

※先頭の「0b」は2進数であることを示しています。

その他 、今回のプログラムで使用したレジスタは以下の通りです。

TRISIO レジスタ(GP0~GP5の入出力モードを設定)

00000001:GP0のみ入力、GP1~4は出力
00000010:GP1入力
00000100:GP2入力
00001000:GP3入力
00010000:GP4入力
00100000:GP5入力

今回のプログラムでは、以下のように設定しました。

TRISIO = 0b00111000;

ANSEL レジスタ(A/D変換のクロック・アナログ入力ピンを設定)

0000xxxx:Fosc/2
0001xxxx:Fosc/8
0010xxxx:Fosc/32
0011xxxx:Frc(500KHz以下の内部クロック)
0100xxxx:Fosc/4
0101xxxx:Fosc/16
0110xxxx:Fosc/64

xxxx1000:ANS3(3番Pin)アナログ入力、ANS0~2はデジタル入出力
xxxx0100:ANS2(5番Pin)アナログ入力
xxxx0010:ANS1(6番Pin)アナログ入力
xxxx0001:ANS0(7番Pin)アナログ入力

今回のプログラムでは、以下のように設定しました。

ANSEL = 0b01011000;

ADCON0 レジスタ(A/D変換の動作を設定)

0xxxxxxx:A/D変換結果を左詰めでセット
1xxxxxxx:A/D変換結果を右詰めでセット

x0xxxxxx:基準電圧を1番Pin(VDD)に
x1xxxxxx:基準電圧を6番Pin(VREF)に

xxxx00xx:7番Pin(AN0)をA/D変換ポートに
xxxx01xx:6番Pin(AN1)をA/D変換ポートに
xxxx10xx:5番Pin(AN2)をA/D変換ポートに
xxxx11xx:3番Pin(AN3)をA/D変換ポートに

xxxxxx0x:3A/D変換指示:開始
xxxxxx1x:3A/D変換完了

xxxxxxx0:3A/D変換指示:A/D変換機能を使用しない
xxxxxxx1:3A/D変換指示:A/D変換機能を使用する

今回のプログラムでは、以下のように設定しました。

ADCON0 = 0b00001101;

CMCON0 レジスタ(コンパレータ機能の設定)

x0xxxxxx:コンパレータの結果を出力しない
x1xxxxxx:コンパレータの結果をCOUTに出力する

xxx0xxxx:コンパレータの結果を反転しない
xxx1xxxx:コンパレータの結果を反転する

xxxx0xxx:コンパレータ入力スイッチビットを使用しない
xxxx1xxx:コンパレータ入力スイッチビットを使用する

xxxxx000:7番Pin(GP0)、6番Pin(GP1)、5番Pin(GP2)をデジタル入出力に使用しない
xxxxx111:7番Pin(GP0)、6番Pin(GP1)、5番Pin(GP2)をデジタル入出力に使用する

今回のプログラムでは、以下のように設定しました。

CMCON0 = 0b00000111;

CCP1CON レジスタ(PWM機能の設定)

xxxx0000:CCPモジュールを使用しない
xxxx0100:キャプチャモード、立ち下がりエッジごと
xxxx0101:キャプチャモード、立ち上がりエッジごと
xxxx0110:キャプチャモード、立ち上がりエッジ4回ごと
xxxx0111:キャプチャモード、立ち上がりエッジ16回ごと
xxxx1000:コンペアモード、一致時に出力をセット
xxxx1001:コンペアモード、一致時に出力をクリア
xxxx0100:コンペアモード、一致時にソフトウェア割込みを生成
xxxx1010:コンペアモード、スペシャルイベントトリガ
xxxx1100:PWM制御モードを使用する

今回のプログラムでは、以下のように設定しました。

CCP1CON = 0b00001100;

PR2 レジスタ(PWM周期の元となるデータを設定)

xxxxxxxx:PWM周期をセット

今回のプログラムでは、以下のように設定しました。

PR2 = 255;

T2CON レジスタ(TMR2/タイマー2の設定)

00000xxx:ポストスケーラ (1:1)
00001xxx:ポストスケーラ (1:2)
00010xxx:ポストスケーラ (1:3)
00011xxx:ポストスケーラ (1:4)
00100xxx:ポストスケーラ (1:5)
00101xxx:ポストスケーラ (1:6)
00110xxx:ポストスケーラ (1:7)
00111xxx:ポストスケーラ (1:8)
01000xxx:ポストスケーラ (1:9)
01001xxx:ポストスケーラ (1:10)
01010xxx:ポストスケーラ (1:11)
01011xxx:ポストスケーラ (1:12)
01100xxx:ポストスケーラ (1:13)
01101xxx:ポストスケーラ (1:14)
01110xxx:ポストスケーラ (1:15)
01111xxx:ポストスケーラ (1:16)

xxxx0xxx:タイマー2無効
xxxx1xxx:タイマー2有効

xxxxxx00:プリスケーラ(1:1)
xxxxxx01:プリスケーラ(1:4)
xxxxxx10:プリスケーラ(1:16)

今回のプログラムでは、以下のように設定しました。

T2CON = 0b00000110;

サーボモーター(SG-90)制御のコード解説

PICでサーボ―モーターを動かすには、PWM機能を使用します。

PWM機能は、簡単に言えばパルスを出す機能。

サーボモーター(SG-90)を動かすには、20msのパルス周期で、0.5ms~2.4msのパルス幅を送る必要があります。

送るパルス幅によってモーターの可動角度(0~180度)が変わるので、PIC側のPWMもできるだけモーター側のパルスに合わせなくてはいけません。

PICのPWM周期(PWM Period)は、以下の計算式によって算出します。

PWM Period = (①PR2 + 1 × ②PICの1サイクル時間) × (1 / ③クロック数) × ④プリスケーラ

①PR2(255)

PR2は、PWM周期の元となるデータです。

PR2レジスタにより、最大値『255』に設定しています。

②PICの1サイクル時間(4μs)

OSCCONレジスタにより、今回のプログラムで実行される内部クロック周波数は1MHzに設定しています。

周期はクロック数の逆数で求められるので、1 ÷ 1となり、周波数1MHzの1クロック周期は1μs。

(※内部クロック数を4MHzに設定している場合は、1 ÷ 4で周期は0.25μsとなります)

PICの場合、一つの命令(1サイクル)を実行するのに4クロックが必要なので、結果、サイクル時間は『4μs』となります。

③クロック数(1MHz)

OSCCONレジスタにより、今回のプログラムで実行される内部クロック周波数は1MHzに設定しているので、『1』となります。

④プリスケーラ(16)

プリスケーラは、周期を長く調整するための機能です。

今回、T2CONレジスタにより、16:1に設定しているので、約16倍の周期となります。

プリスケーラを設定しないと、周期が1ms程度にしかならず、サーボモーター(SG-90)のパルス周期20msにはほど遠い数値です。

これらをさきほどの計算式に当てはめると、

PWM Period = (255 + 1 × 4) × (1 / 1) × 16 = 16384μs = 16.38ms

PWM周期は、『16.38ms』に設定されていることになります。

しかし、これではサーボモーター(SG-90)のパルス周期『20ms』に比べると、少し短いです。

そこで、『16.38ms』周期に合わせて、比率でモーターが動くパルス幅(デューティー)を出力します。

ちなみに、デューティーは10bitで設定します。

CCPR1Lレジスタで上位8bit、CCP1CONレジスタに下位2bitを振り分けます。

しかし実際には、CCP1CONレジスタの下位2bitは「00」のまま変更しません。

CCPR1Lレジスタの上位8bitの値だけを変更して、モーターを制御します。

理由は、10bitの下2桁を変えても大きな違いが出ない為です。

例えば、

10bitの2進数「1111111111」を10進数に直すと「1023」

10bitの2進数「1111111100」を10進数に直すと「1020」

と、誤差程度にしかなりません。

よって、デューティー値をモーターに出力するには、以下のようにCCPR1Lレジスタにだけ値を設定したプログラムを書きます。

CCPR1L = x;

※PIC12F683の場合、PWMの出力は5番Pin(CCP1)固定になっています。

xに入る値の計算式は以下の通り。

①デューティー比 × ②PICの1サイクル時間 × (③PR2 + 1)

モーターを-90°動かす場合(デューティー:0.5ms)

① デューティー比

0.5ms ÷ 16.38ms = 0.0305 ≒ 0.03

②PICの1サイクル時間

OSCCONレジスタにより、今回のプログラムで実行される内部クロック周波数は1MHzに設定しています。

周期はクロック数の逆数で求められるので、1 ÷ 1となり、周波数1MHzの1クロック周期は1μs。

PICの場合、一つの命令(1サイクル)を実行するのに4クロックが必要なので、結果、サイクル時間は『4μs』となります

③PR2

PR2レジスタにより、最大値『255』に設定しています。

これらをさきほどの計算式に当てはめると、

CCP = 0.03 × 4 × (255 + 1) = 30.72 ≒ 30

10進数 → 30

10bitの2進数に変換 → 0000011110

CCPR1Lレジスタに設定する上位8bitを切り取る:00000111

10進数に変換 → 7

よって『モーターを-90°動かす』場合は、

CCPR1L = 7;

とプログラムを書きます。

なお、8bitの2進数を4で割ることでも、上位6bitの値を求めることができます。

0000011110 ÷ 2 = 000001111

000001111 ÷ 2 = 00000111

0000000111 → 10進数:7

30( 10進数 ) ÷ 4 = 4 ≒ 7

モーターを+90°動かす場合(デューティー:2.4ms)

デューティー比 = 2.4ms ÷ 16.38ms = 0.1465 ≒ 0.14

CCP = 0.14 × 4 × (255 + 1) = 143.36 ≒ 143

10進数 → 143

10bitの2進数に変換 → 0010001111

CCPR1Lレジスタに設定する上位8bitを切り取る:00100011

10進数に変換 → 35

よって『モーターを+90°動かす』場合は、

CCPR1L = 35;

とプログラムを書きます。

A/D変換のコード解説

A/D変換とは、アナログ信号をデジタル信号に変換する機能です。

今回の回路で使用している光センサーから、PICへ送られる信号は『アナログ信号』です。

光センサーからPICへ1.5Vくらいの電圧が信号として送られているわけですが、PIC側のプログラムで、直接『1.5』という数字を受け取ることはできません。

PIC側(デジタル側)で受け取ることができるのは、そのアナログ信号は「1か?」「0か?」という情報だけ。

つまり、「信号があるか?」「ないか?」です。

現実世界のデータはアナログ信号。

パソコンやPICの中で扱っているデータはデジタル信号です。

僕と同じでプログラミングから入った人は混乱しがちな部分ですが、光センサーから送られてくる「1.5」という数値に値を付け足したり、IF文で分岐するようなことはできません。

そこで、必要になるのが『A/D変換』機能です。

A/D変換を使えば、「1.5」というアナログ信号を16bitのデジタル信号に変換してくれます。

例えば、3V電源でCDSからPICへ1.5Vのアナログ信号が送られた場合。

A/D変換により、

「0000100000000000」

という16桁・2進数のデジタルデータに変換されます。

これを10進数に直すと、

「2048」

16bitの最大値「1111111111111111」は、10進数に直すと「4096」なので、電源3Vの約半分と考えれば、

「1.5」

という数字を導き出せます。

※あくまで考え方の参考例です。

A/D変換は、以下のコードで実行されます。

__delay_us(25);
GO = 1;
while(GO);

A/D変換されたデータの取り扱い

A/D変換されたデータは『10bit』で返され、ADRESHレジスタとADRESLに振り分けられます。

今回の場合、ADCON0レジスタでA/D変換結果は『左詰め』で返すよう指定しているので、上位8bitがADRESHレジスタに、下位2bitがADRESLレジスタに格納されます。

例えば、A/D変換により「1000100011」というデータが返ってきたら、『左詰め』の場合は、

ADRESHレジスタ:10001000
ADRESLレジスタ:11xxxxxx

となります。

もし、ADCON0レジスタでA/D変換結果を『右詰め』で返すよう指定した場合は、下位8bitがADRESLレジスタに、上位2bitがADRESHレジスタに格納されます。

例えば、A/D変換により「1000100011」というデータが返ってきたら、『右詰め』の場合は、

ADRESHレジスタ:xxxxxx10
ADRESLレジスタ:00100011

となります。

『左詰め』『右詰め』どちらを選んでも構いませんが、よほど精密な数値を取得する必要がなければ、『左詰め』を選ぶ方が処理は楽です。

例えば、

10bitの2進数「1111111111」を10進数に直すと「1023」

10bitの2進数「1111111100」を10進数に直すと「1020」

となり、下2桁のデータは、数値にほとんど影響を与えません。

よって、ADRESLレジスタは無視して、ADRESHレジスタの値だけ参照すれば十分です。

プログラム内でも、

if (ADRESH > 150) {

のように、そのまま8bitデータとしてADRESHレジスタの値を使用できます。

対して『右詰め』を選んだ場合、

A/D変換後の結果は、

ADRESHレジスタ:00000010
ADRESLレジスタ:00100011

という形でデータが格納されていることになります。

これを繋げて一つのデータ(16bit)にする必要があります。

ところが、ADRESHレジスタとADRESLレジスタのデータを単純にくっつけるわけにはいきません。

8bit分のデータを加え、16bitに変換してから結合します。

ADRESHレジスタ:00000010 00000000
ADRESLレジスタ:00000000 00100011

ADRESLレジスタの方は頭に「0」がくっついただけなので、特別な処理は必要ありません。

ADRESHレジスタの方には、「100000000(2進数)」という値を掛けて、8桁を16桁に上げる必要があります。

よって、

Ad_data = ( ADRESH * 256) + ADRESL;

※100000000(2進数)= 256(10進数)

という処理を行い、ようやくプログラム内のデータとして扱うことができます。

今回作成したプログラムでは『左詰め』を選んでいますので、 『左詰め』 で、引き続きCDS(光センサ)の感度調整について解説します。

CDSの感度調整

CDS(光センサ) は、光の量によって抵抗値が変わる素子です。

明るいとき:抵抗(小)
暗いとき:抵抗(大)

ためしに、

CCPR1L = ADRESH;

とプログラムに書いて、A/D変換後に出力される電圧をテスタで計測したところ、

一番明るいとき:1.2V
真っ暗にしたとき:3V

※電源5V

というデータが取れたので、


1.2v / 5v * 256 = 61.44
3.0v / 5v * 256 = 153.6

という計算の元、「150」という数値にしました。

if (Ad_data > 150) {

値をもっと小さくすれば、もっと感度が良くなり、少しの光でも反応するようになります。

試走の結果でも「150」がベストで、車両がCDSの上を通ったときのみ反応する感度でした。

それ以上値を小さくすると、人の影や日中の明るさによって反応してしまい、誤作動を起こしてしまいます。

音の出力コード解説

音は、人間が感じ取っている空気の振動です。

周波数は、1秒間の振動数です。

周波数が高い(振動数が多い)ほど、音は高くなります。

つまり、音の周波数が分かれば、出したい音を出すことができます。

各音階の周波数は以下の通り。

音階周波数
261.6
ド# 277.1
293.6
レ# 311.1
329.6
ファ349.2
ファ#369.9
392.0
ソ#415.3
440.0
ラ#466.1
493.8
523.2

振動が1回起こる時間(周期)は、逆数で求めることができます。

周期 = 1 ÷ 周波数

例えば、『ド』の音を出したい場合。

周期 = 1 ÷ 261.6Hz = 0.003822s = 3822μs

パルスが出ているのは、1周期の半分なので、

3822μs ÷ 2 = 1911μs

よって、delay関数でスピーカーにそのパルスを出せば音が鳴ります。

__delay_us(1911);

音を出す長さは、

for (long i = 1; i <= xxx; i++) {

の部分で指定しています。

「for文」と言われるプログラム命令文により、{ } の中に囲まれた部分をxxx回繰り返しています。

一秒間『ド』の音を出す場合は、 周波数(1秒間の振動数)そのまま『261』を指定します。

for (long i = 1; i <= 261; i++) {

ちなみに、音は「カンカンカン」みたいな踏切音が出したかったんですが、僕の音感が無さすぎて挫折しました・・・

【3】信号機への取り付け方法

CDSをレールに取り付ける

プラレールのレール中央に埋め込まれたCDS(表)
プラレールのレール中央に埋め込まれたCDS(表)
ホットボンドでCDSを固定(裏)
ホットボンドでCDSを固定(裏)

CDSは、1/4直線レールの真ん中にCDSの大きさの穴(約5mm)を空け、裏からホットボンドで固定しています。

また、ケーブルと地面が接触する部分が少し浮き上がったので、レールをヤスリで削ってケーブルの通り道を作っています。

モーターマウントの3Dデータ作成

信号機にサーボモーターを取付けるためのマウント(土台)は、3Dプリンタで作成しました。

3Dモデリングデータの作成

信号機とモーターを繋ぐベースマウントの3Dモデリングデータ
ベースマウントの3Dモデリングデータ

信号機とモーターを繋ぐベースマウント・・・2本

3Dデータのダウンロード ⇒ data1.amf

ベースマウント補強材の3Dモデリングデータ
ベースマウント補強材の3Dモデリングデータ

ベースマウント補強材 ・・・ 2本

3Dデータのダウンロード ⇒ data2.amf

3Dプリンタでモーターマウント造形

3Dプリンタ本体『 ダヴィンチ Mini W』
3Dプリンタ本体『 ダヴィンチ mini w』

使用した3Dプリンタ本体は「XYZプリンティングジャパン ダヴィンチ mini w 」です。

※このオレンジ色のモデルは完売品となっており、現在は後継機『ダヴィンチ mini w+』が販売されています。

プラスが付いたモデル『ダヴィンチ mini w+』は、Wi-Fi機能付きです。

わざわざ、USBケーブルでパソコンに繋がなくていいので、今から買う人は正直うらやましい・・・

【3Dプリンター】ダヴィンチ mini w+(XYZプリンティングジャパン)
最安値・レビューをチェック
XYZプリンティングジャパン ダヴィンチ Mini用 フィラメント(PLA樹脂) イエロー
最安値・レビューをチェック

信号機にサーボモーターを取り付ける

プラレールの信号機パーツ(J-10)に取り付けられたサーボモーター(SG-90)前方・上アングル
前方・上アングル
プラレールの信号機パーツ(J-10)に取り付けられたサーボモーター(SG-90)前方・横アングル
前方・横アングル
プラレールの信号機パーツ(J-10)に取り付けられたサーボモーター(SG-90)後方・上アングル
後方・上アングル
プラレールの信号機パーツ(J-10)に取り付けられたサーボモーター(SG-90)後方・横アングル
後方・横アングル

信号機側に穴を空けるスペースがなく、強度は強くありません。

その為、モーターが動いた際にグラグラしたので、後で補強材を追加しました。

信号機とサーボモーターの接続部分アップ
信号機とサーボモーターの接続部分アップ

信号機の切り替えノブとサーボモーターのアームには、精密ドリルで2mmの穴を空け、M2×10mmの 取り付けネジを挿入(ナットは無し)

その他、取り付けネジは全てM2×6mmを使用しています。

サーボモーターの取り付けに必要なもの

M2×10mm ・・・ 1 ヶ
M2×6mm ・・・ 8 ヶ
M2ナット ・・・ 8ヶ

以上、「プラレール衝突回避システム(PICプログラミング)」でした。

この記事のURLをコピー

メールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

関連情報

運営者プロフィール
ガッタン

2歳の息子の為に買ったプラレールでしたが、気付いたら自分がドハマりしていました。美しく実用的なレイアウトを追い求める30代・2児の父。職業はIT系フリーランス。電子配線の業務経験あり。