読者です 読者をやめる 読者になる 読者になる
一人もくもく会 α verでサービス開始しました。

ダイソーのプチ電車をリモコンで操作できるよう改造

ダイソーのプチ電車をリモコンで前進、後退、ストップの操作ができるようになりましたので
詳細を公開します。
失敗談はこちら

まず構成を説明します。
ダイソーのプチ電車は3台連結構成になっており、
中央に電池を入れてモーターを動かす仕組みになっています。

失敗談でも書きましたが、改造のために何度も分解していると
タイヤが空回りするようになったり、ギアが壊れたりするので
中央の車体は一切改造せず、モーターに導線を伸ばして接続するだけ、
という形にしました。
これで何かあって回路を外しても通常通りに遊ぶことも出来ます。

ということで先頭車両に回路を入れ、この2台は必須な構成となります。
電池ボックスと回路でギリギリなので中身の余分なプラスチックを切り落とします。
これくらいの改造だったら回路無しに戻すのにも特に支障はありません。
板を切り落とすだけなのでシンプルでした。
DSC_0269

これに下記の回路を載っけます。
電源スイッチ、赤外線受信部、LEDは位置を調整できるよう空中配線です。
単4電池2本ボックス、回路ともに丁度外枠と同じサイズです。
(ユニバーサル基板16x9だったと思います)
DSC_0270

蓋を閉めたところ。
DSC_0271
電源スイッチ、赤外線受信部は面倒だったので窓から出しています。
気になる人はどこかに設置すると良いと思います。
窓から回路が丸見えになるので、窓には内側から車内の絵を貼ったりすると
見栄えが良くなると思います。

これが実際に操作したところです。
[video width="640" height="360" mp4="http://program.alphabrend.com/wp-content/uploads/2014/05/ir_train_encoded.mp4"][/video]

では回路の説明をします。
・PIC12F675
・単4電池2本
・赤外線受信モジュールでソニーリモコンを受信して操作
・Y14H-1C-5DSのリレーを使って電池のオン、オフを操作
・941H-2C-5Dのリレーを使って前後、左右の切り替え
・上記2個のリレーにより、モーターと電池を直結。
・回路側はHT7750Aで5Vに昇圧
・電池用にスイッチを設置。
恐らく赤外線受信モジュールがずっと動いているせいで
以前失敗した9Vの電池も放置しておいたらなくなっていたので
手動スイッチ必須っぽいです。

挫折していたEagleですが
久々にやってみたらすんなり回路がかけたっぽい気がするので公開します。
何か間違っていたらすみません。
irtrain_circuit

プログラムです。
赤外線受信の詳細はこちらの記事で解説しています。

#include <xc.h>

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = ON, MCLRE = OFF

#define IR GPIO5
#define LED GPIO2
#define RELAY_ON GPIO1
#define RELAY_DIR GPIO0
#define TIMEOUT 27500
#define _XTAL_FREQ 4000000 // delay用に必要(クロック32MHzを指定)


#define __delay(x) _delay((unsigned long)((x)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))

char lastInput = 1;
char isSony = 0;
char data = 0;
unsigned long time = 0;
unsigned char inputCount = 0;
unsigned char dataCount = 0;

void setData(int no, char row) {
    //sonyは7bitなのでそれ以外は無視
    if (no >= 7) return;
    data |= row << no;
}

void motorGo() {
    RELAY_ON = 0;
    RELAY_DIR = 0;
    __delay_ms(1);
    LED = 1;
    RELAY_ON = 1;
}

void motorBack() {
    RELAY_ON = 0;
    RELAY_DIR = 1;
    __delay_ms(1);
    LED = 1;
    RELAY_ON = 1;
}

void motorStop() {
    __delay_ms(1);
    LED = 0;
    RELAY_ON = 0;
    RELAY_DIR = 0;
}

main()	{
    GPIO = 0;
    CMCON = 0x07;		// コンパレータ未使用
    TRISIO = 0b00100000;
    //プリスケーラ8=8μS…カウント75で600μ(1T)…だけどなぜか64くらいっぽい…
    OPTION_REG = 0b10000010;
    TMR0 = 0;
    ANSEL = 0b00110000;

    char val;

    while(1) {
        val = IR;
        while (val == lastInput) {
            if (TMR0 > 200) {
                time += TMR0;
                TMR0 = 0;
            }
            if (time + TMR0 > TIMEOUT) {
                if (inputCount > 2 && isSony) {
                    switch (data) {
                    case 1:
                        motorGo();
                        break;
                    case 4:
                        motorStop();
                        break;
                    case 7:
                        motorBack();
                        break;
                    }
                }
                isSony = 0;
                inputCount = 0;
                dataCount = 0;
                data = 0;
            }
            val = IR;
        }

        time += TMR0;
        inputCount++;
        if (inputCount == 2) {
            if (192 < time && time < 320) {
                isSony = 1;
            }
        } else if (inputCount > 2) {
            if (isSony && !(inputCount % 2)) {
                if (time < 100) {
                    setData(dataCount, 0);
                } else {
                    setData(dataCount, 1);
                }
                dataCount++;
            }
        }
        lastInput = val;
        time = 0;
        TMR0 = 0;
    }
}

ちょっとスピードが速いので自前PWMした方がいいかもしれません。

車体以外にも色々パーツがあったような気がするので
他にも色々連動させて作れないか試してみたいですね。
あと、もう1車両後ろにも連結できるので
何か思いついたらそっちに回路を入れて拡張することも出来そうです。

プラレールは非常に高いので、
プチ電車で大掛かりなシステムが構築できたら
安価で無改造プラレールを超える遊びが出来そうな気がします。