ikkei blog

電子工作やパズルのブログです。主にLEDを使った電子工作をやっています。

PICkit2の延長ケーブルを作ってみた

2013年05月25日 23時56分15秒 | PIC
PICkit2の先に付けるISP用ケーブルですが、
適当にピンヘッダをハンダ付けして作っていました。
でも、これ使っているとピンがゆるゆるになってくるのです。


専用ケーブルもあるようですが、QIコネクタ付きケーブルを使って作ってみることにしました。

まず用意したのは6Pのソケットとプラグが接続されたハーネスQIケーブル6S-6P (140円)
と5Pのハウジング(30円)です。専用ケーブル(210円)より安い!
私はデジットで購入しましたが、共立エレショップでも扱っています。

もちろん、このハーネスだけで事足りるのですが、6番ピンがNCなので、
ターゲット側だけ5Pのハウジングに差し替えるのです。
カッターの先で爪を少し起こしてやると簡単に抜けます。

6番の青色のケーブルを抜いて、5Pに差し替えるとこうなります。


で、こういうことになります。


ターゲット側がピンヘッダの場合はこれで良いのですが、
ブレッドボードの場合は、ターゲット側がプラグの方が便利です。
そこで、用意したのが、QIケーブル6P-6P (140円)と5Pのハウジング(30円)です。


で、差し替えるとこうなります。




実際の使用状況がこれです。

「PIC12F509でLEDを回転点滅させてみた」のソースコード その2

2013年05月24日 23時53分09秒 | PIC
研修の講師とかやっていたので、つい何でも演習課題にしてしまうクセがある。(笑
昨日の解答です。


/*
 * 5 LED rotation
 *
 *  Created: 2013/05/19
 *  Author: ikkei
 *  modified: 500ms

 sink output
    GP0--LED1
    GP1--LED2
    GP2--LED3
    GP4--LED4
    GP5--LED5

 */

//#include "pic.h" //MPLAB V8
#include <xc.h>

//__CONFIG(UNPROTECT & MCLRDIS & WDTDIS & INTRC); //MPLAB V8
#pragma config OSC = IntRC  // internal RC oscillator
#pragma config WDT = OFF    // WDT disabled
#pragma config CP = OFF     // Code protection off
#pragma config MCLRE = OFF  // GP3/MCLR pin function is digital input


unsigned char led_patt[] = { 0x01, 0x01, 0x02, 0x02, 0x04, 
                             0x04, 0x10, 0x10, 0x20, 0x20};
unsigned char pat_cnt;

#define STEP 195  // 256us * 195 = 50ms
#define T_STEP 256 - STEP

int main(void) {
    TRIS = 0x00;
    // wake up disable, pull-up enable, clock source internal, prescaler 1/256
    // internal 4MHz -> 1/4 -> 1/256 -> TM0     256us clock
    OPTION = 0x87; 
    TMR0 = T_STEP;
    pat_cnt = 0;
    while(1){
        if (TMR0 == 0){
            TMR0 = T_STEP;
            GPIO = ~led_patt[pat_cnt];
            pat_cnt++;
            pat_cnt %= 10;
        }
    }
}




はい、いじったのは配列の中身を倍の10個にして、回しました。
単純と言えば、単純ですけど。
cdeさん、合ってました?

他にも方法があるかと思います。

ただ、この方法はプログラムの構造をいじらずにリソースだけいじっているので
バグになりにくいと言うことです。



では、ついでにこの勢いでナイトライダーを作ってみましょう。
LEDを直線状に並べ替えて、点灯します。


単純に直線的に移動する(三角波?)8状態を並べてみたら、速すぎたので、
データを増やしました。
ただ増やすだけでは芸がないので、正弦波で移動するようにしてみました。

そしたら、変数領域が足りないと言うエラーが出ました。
RAMが41バイトしか無かったのね。orz
で、constを慌てて付けました。
ま、AVRじゃこう簡単にはいかないけど。

ソースコードです。



/*
* 5 LED rotation
*
* Created: 2013/05/19
* Author: ikkei
* Knight rider

sink output
GP0--LED1
GP1--LED2
GP2--LED3
GP4--LED4
GP5--LED5

*/

//#include "pic.h" //MPLAB V8
#include <xc.h>

//__CONFIG(UNPROTECT & MCLRDIS & WDTDIS & INTRC); //MPLAB V8
#pragma config OSC = IntRC // internal RC oscillator
#pragma config WDT = OFF // WDT disabled
#pragma config CP = OFF // Code protection off
#pragma config MCLRE = OFF // GP3/MCLR pin function is digital input


const unsigned char led_patt[] = { 0x01, 0x01, 0x01, 0x01, 0x01,
0x02, 0x02, 0x04, 0x10, 0x10,
0x20, 0x20, 0x20, 0x20, 0x20,
0x10, 0x10, 0x04, 0x02, 0x02};
unsigned char pat_cnt;

#define STEP 195 // 256us * 195 = 50ms
#define T_STEP 256 - STEP

int main(void) {
TRIS = 0x00;
// wake up disable, pull-up enable, clock source internal, prescaler 1/256
// internal 4MHz -> 1/4 -> 1/256 -> TM0 256us clock
OPTION = 0x87;
TMR0 = T_STEP;
pat_cnt = 0;
while(1){
if (TMR0 == 0){
TMR0 = T_STEP;
GPIO = ~led_patt[pat_cnt];
pat_cnt++;
pat_cnt %= 20;
}
}
}





いかがでしょうか?
これも配列の中をいじっただけです。

繰り返し表示するだけだったら、この方法でプログラムの構造を変えずに
配列の中身だけいじって色々出来ます。




「PIC12F509でLEDを回転点滅させてみた」のソースコード

2013年05月23日 21時28分37秒 | PIC
先のブログ「PIC12F509でLEDを回転点滅させてみた」のソースコードを開示します。
PICの作法はよく分かっていませんので、変なところが有るかも知れません。

/*
 * 5 LED rotation
 *
 *  Created: 2013/05/19
 *  Author: ikkei

 sink output
    GP0--LED1
    GP1--LED2
    GP2--LED3
    GP4--LED4
    GP5--LED5

 */

//#include "pic.h" //MPLAB V8
#include <xc.h>

//__CONFIG(UNPROTECT & MCLRDIS & WDTDIS & INTRC); //MPLAB V8
#pragma config OSC = IntRC  // internal RC oscillator
#pragma config WDT = OFF    // WDT disabled
#pragma config CP = OFF     // Code protection off
#pragma config MCLRE = OFF  // GP3/MCLR pin function is digital input


unsigned char led_patt[] = { 0x01, 0x02, 0x04, 0x10, 0x20};
unsigned char pat_cnt;

#define STEP 195  // 256us * 195 = 50ms
#define T_STEP 256 - STEP

int main(void) {
    TRIS = 0x00;
    // wake up disable, pull-up enable, clock source internal, prescaler 1/256
    // internal 4MHz -> 1/4 -> 1/256 -> TM0     256us clock
    OPTION = 0x87; 
    TMR0 = T_STEP;
    pat_cnt = 0;
    while(1){
        if (TMR0 == 0){
            TMR0 = T_STEP;
            GPIO = ~led_patt[pat_cnt];
            pat_cnt++;
            pat_cnt %= 5;
        }
    }
}



見て分かる通り、タイマーを使って配列の中身を出力しているだけです。
50msのタイマー設定なので、1周250msとなります。



では、問題です。
1周500msにするにはどうすれば良いでしょうか?
出来るだけ簡単な方法で実現して下さい。

デジットの「1.5VでLED点灯回路キット」を作ってみた

2013年05月22日 22時17分54秒 | 電子工作
気が付いたら、積みキットが色々あるので、腐らないうちに作っていこうと思います。(笑
まずは、先日買ったこんなLEDが出てきたので、
乾電池1個でLEDを点けるのは、特別なことでは無くなってしまいました。

と言うわけで、デジットのこんなキットは回路の研究に役立てようと思います。
「1.5VでLED点灯回路キット」


タイトルのまんまですが、このキットはLEDは基板に実装します。


1Ωを直列に入れて電流波形を見てみると、ピークは170mAにも達しています。

テスターでは98mAでした。

回路はインダクタを隣り合わせにして結合させ、ブロッキング発振器にして、
さらに、負荷電流を18mAに制限するようにフィードバックを掛けています。
0.6[V] ÷ 33[Ω] = 18[mA]

トランジスタ2個で、巧妙な回路構成です。



ちなみに、例のLEDの場合も測定してみました。




波形を見てみると、よく似ています。周波数が違うだけです。
デジットのが30kHzに対して、これは100kHzです。

テスターでは91mAと、これまたよく似ています。



さらに、ジャンク箱を見てみると、ありました。秋月のキットです。
「1.5V電池白色LED投光キット」


このキットは、単3が2本の電池ボックスに組み込んで、ケースにしてしまうと言うアイデア商品です。
ただ、そのため部品の前加工がたくさん有って、作るのに時間が掛かりました。
同様に、上と同じ条件にするため、単4で点灯させます。


波形を見ても分かる通り、電流は少なめです。

周波数は130kHzで、ピークでも50mAしか流れていません。
テスターでは35mAでした。
やはり上の2つに比べれば、少し暗い感じです。

こちらの回路は発振に555を使ったタイプです。



結局、どれも似た感じのインダクタを使った昇圧回路でした。
定電流に制御するかどうかがポイントですね。


PIC12F509でLEDを回転点滅させてみた

2013年05月21日 22時49分45秒 | PIC
SOPな8P PICを入手したので、LEDを回転点滅させてみた。
回路図はこれです。

出力出来るポートを全部使って、LEDを5個つないでみました。
一度にLEDを 1個しか点けないので、抵抗は1つです。

PICkit2をつないでブレッドボードに組んでみました。


電池で動作させたところです。


ま、LEDを点けるだけなので、大したコードではないのだけれど、
最近私はAVR漬けなので、
PIC使いの人はどんなコードを書くのか、ちょっと聞いてみたい気がします。

出来た人はコメントかツイッターで教えて下さい。
よろしくお願いします。

追記 毎分240回転、つまり1周250msで回転させます。