« 2011年4月 | トップページ | 2011年6月 »

3ch スイッチ(フタバ CPS-1 的なモノ)

前回、「PIC の I/O から出力できる電流は 25mA 程度だよ。」と書いた。ってことは最初に作った 3ch (AUX) スイッチは最大で 25mA 程度の機器しか接続できないということになる。25mA って LED 1個。これではちょっと寂しい。トランジスタのスイッチ使ってもう少し電流流せるように改良した回路と、ついでにバージョンアップしたソースコードを公開しておく。

まず最初に、使用部品は以下。

・ユニバーサル基盤         100円  小さいので十分
・8pin IC ソケット         100円  2個入り
・1/4W カーボン抵抗 5.1KΩ  50円  10個入り
・トランジスタ 2SC1815 Y    80円  4個入り
・積セラ コンデンサ 0.1uF  130円  5個入り
・PIC12F629                120円  1個
-------------------------------------------------
                      合計 580円

※価格は福岡の某電子パーツ屋さん価格

当初、これを作ろうと思ったときに目指したのはフタバの CPS-1 という製品。買うと確か 3000円くらい。しかし、自分で作ればコレ相当なモノがわずか 580円!(工具やらハンダやらケーブルやらは余りが家にあるの前提。)大人のホビーを目指すなら是非自作してみて欲しい。

ただし、完全に CPS-1 互換というワケではない。トランジスタに 2SC1815 を選んでいるので、流せる電流は最大 150mA となっている。CPS-1 は 200mA とかなってた気がしたのでちょっと少ない。

ちなみに、2SC1815 は増幅度 120~240 の Y を選択。ベース電流を約 1mA にしているので、増幅度が最低の 120 だったとしたら 1mA x 120 = 120mA となり、その程度の電流で抑えておくのが良いんだろうと思われる。LED だったら 20mA x 6 個。足りないなら別のトランジスタ使うといい。

参考までに 2SC1815 のベース電流 1mA というのは... 6V(受信機電圧) - 0.6(ベースエミッタ抵抗分) / 5.1kΩ = 約 1mA となっている。PIC の最大電圧は 5.5V だけど 受信機からの 6V そのまま入れてるってのは前回の回路図と同じ。ってことで回路図は以下。

Sw_a

渡り線使えばもう少し基盤を小さくできるが、作りやすさを重視した。これでも 15m x 25m くらいと十分小さいと思われる。

受信機からのパルス信号を GP3 で受け、Hi/Lo を確認して GP2 をオンオフしている。GP2 はトランジスタのベースに繋がっているので... GP2 がオンじゃないとトランジスタの先に繋げる機器に電気が流れない。0.1uFの積セラコンデンサが PIC12F629 の VDD と VSS に接続されているが... IC に対して 0.1uF の積セラを接続するというのは定石らしい。誤動作防止のおまじないになるとかなんとか。

そしてこの基盤に乗せる PIC12F629 用のプログラムソースは以下。対応する MPLAB IDE 8.60 以上、HI-TECH C は 9.81 をターゲットとしている。

「sw_a.zip」をダウンロード

そう言えば前回のソースも HI-TECH C 9.81 用なので、未満のバージョンを使っているとコンパルエラーになる。HI-TECH C は 9.80 と 9.81 で PIC の各種レジスタ用の定数名が変更になっているのよね。なぜ 0.01 程度のマイナーバージョンアップでこれだけ大がかりな変更をしたのかは謎だけれども... 過去の資産なんてない身分の人は素直に 9.81 用の定数名を使っておいた方がいいと思われる。

さらにいうと、このソースはアナログ付きの PIC12F675 がターゲットでもそのままコンパイルできるようになっている。PIC12F675 を使う場合は I/O のアナログをオフにする(デジタルにする)必要があるので、#ifdef _12F675 で ANSEL = 0x00; が実行されるようにしている。PIC12F675 が余ってる人もそのまま使って欲しい。

この回路は I/O 6ピン の PIC の 2ピン しか使っていない簡単な回路。プログラムも簡単だし C 言語だからアセンブラより理解しやすい(と、思う)。ラジコンユーザーのマイコン・電子工作入門としては最適なんじゃないかと思ったり思わなかったりする。

そして、前回のソースコード分の回路図はまた今度。

| | コメント (1) | トラックバック (0)

AUXスイッチとブレーキランプ ~ ソースコード編

PIC12F629 に手を出したという前回の日記から若干時間がった。その間、PIC12F629 で色々遊んでみたが... 基本的にあまり複雑なことをしようと考えないで、電飾制御用の単純なコードを処理するマイコンとして使うことにした。

まず、複雑なことをしようとすると電子的な知識の無さから回路を考えるのに苦労する。そして、実際の電子回路を伴うデバッグはとても面倒。それでもまだ 8pin の PIC12F629 だから何とかなる。だがしかし...

もう少し複雑なことをしたい。

だが PIC12F629 だとピンが足りない。

ピンが多い PIC に手を出す。

こうなると何かにはまる。PIC16F88 とか、ピンが多くて値段も手頃な PIC は福岡でも手に入る。でもこれらには手を出さないことにした。だって、この辺に手を出すとラジコンする時間が無くなるんだもん...

ってことで、前回は F104 のリアの自動点滅するLEDを3ch目(AUX)でオンオフするコードと回路を作った(AUX スイッチ)。今回は TB03、ツーリングカー用の電飾を作る。(ST/AUX スイッチ)仕様は以下。

(1)ヘッドランプ 2灯 x 2(左右) = 4灯
(2)テールランプ 1灯 x 2(左右) = 2灯
(3)ブレーキランプ 1灯 x 2(左右) = 2灯
(4)合計 8灯
(5)ヘッドランプ、テールランプは 3ch目(AUX)でオンオフできる
(6)ブレーキランプはスロットル(ST)が Lo のときに点灯する

合計 8個の LED をさせるので、AUX スイッチより回路は複雑になる。そして、電流のことも考えないといけない。PIC12F629 の I/O ピンで出力可能な電流は 25mA 程度らしい。正直、F104 用の AUX スイッチを作ったときはこの辺をまったく考慮していなかった。素人って怖い。でも、自動点滅型の赤色 LED 1個だから... 20mA 程度かな。足りたんだと思う。

AUX スイッチは F104 以外でも使う予定だし、その場合用の回路も考えておくことにしよう。兎に角、LED たくさん使う場合は PIC12F629 の I/O からの出力にそのままつないではダメで、この場合は「トランジスタ」を使ってあげる必要があるらしい。「トランジスタ」とかなんか本格的な電子工作っぽい。

さて、トランジスタ使った実際の回路の話はまた次回。今回はプログラムのソースコードのお話。

前回の AUX スイッチで成功したコードを元に、改良を加えていこう。

AUX スイッチでは GP3 で受信機の AUX パルス信号を受信し Hi/Lo を判定していた。今回の ST/AUX スイッチでは、その名の通り、ST、ステアリングのパルス信号も見る必要がある。GP3 ここは GP3 の隣、GP4 を使う。そして、GP3 用と GP4 用の wait_lo/wait_hi 関数を作成した。

void wait_lo3()
{
    while (1) {
        if (!GPIO3) {
            __delay_us(100);
            if (!GPIO3) break;
        }
    }
}

void wait_lo4()
{
    while (1) {
        if (!GPIO4) {
            __delay_us(100);
            if (!GPIO4) break;
        }
    }
}

void wait_hi3()
{
    while (1) {
        if (GPIO3) break;
    }
}

void wait_hi4()
{
    while (1) {
        if (GPIO4) break;
    }
}

wait_lo 関数で 100us 以上の Lo を待ち、それがあったら今度は wait_hi 関数で Hi(パルスの立ち上がり)を待つ。そして、Hi の間隔を見て、出力ピンの出力をオンオフさせてあげる。AUX を処理したら ST を処理して、それが終わったら AUX を... このように交互に処理させてあげることにする。最適化がない HI-TECH C の Lite Mode だと同じループ内でふたつの処理をさせない方が楽と思う。

unsigned char aux;

~略~

while (1) {
    if (aux) {
        // aux 処理
        ~略~
    } else {
        // st 処理
        ~略~
    }
    
    // aux 変数を反転させる
    aux = aux ^ 1;
}

こんな感じ。これはこれで動く。最初はこれで動かしてた。でも、これだと AUX と ST と、両方のパルス信号を確実に入力してる場合にしか動作しない。気分的にブレーキランプはいらないな... と思って ST 側のコネクタを外すと... 繋がってない ST 側の Li をずっと待ってしまう。このコードだとループの最初が AUX 側の処理なので、受信機の電源をオンにしたときに送信機の AUX が Hi の状態だとヘッドランプとテールランプが点灯した状態で ST の無限ループに入ってしまう。

まあ、これは「仕様です。」としてもいい内容かも知れない。が、何となく気になるので wait_ 関数を以下のように変更する。

#define LO_TIMEOUT  200
#define HI_TIMEOUT  200

unsigned char wait_lo3(void)
{
    unsigned int i = 0;
    while (1) {
        if (!GP3) {
            __delay_us(100);
            if (!GP3) return 1;
            return 0;
        }
        i++;
        if (i >= LO_TIMEOUT) break;
    }
    return 0;
}

unsigned char wait_hi3(void)
{
    unsigned int i = 0;
    while (1) {
        if (GP3) return 1;
        i++;
        if (i >= HI_TIMEOUT) break;
    }
    return 0;
}

// ※GP4用も同じく作る

まあ、ループにタイムアウトを設けてやればいいのよね。定数で定義しているタイムアウトの数字は PIC のクロックに応じて変更してあげた方がいい。例えば PIC12F683 の 8MHz を使うなら倍とか。4MHz で大体 2~3ms くらいでタイムアウトする。それくらいの速度で AUX と ST の監視を切り替えるようにした。MPLAB のプロジェクト付きソースコードは以下。

「sw_ta.zip」をダウンロード

このコード、とりあえず動く。コメントたくさん書いてるので見ればなんとなく理解できると思われる。ちなみに、このプログラムを使った基盤は既に作成済みでTB-03 用に新しく作った HSV-010(GT-500) のボディに搭載されている。3ch 目でヘッドライトオンオフできる市販パーツってあまりないので、個人的にかなり満足している。(このボディはホンダなのにフェラーリカラーという謎仕様になっているので今度写真アップする。)

...次回に続く。

| | コメント (0) | トラックバック (0)

« 2011年4月 | トップページ | 2011年6月 »