ゲームボタン(OBSAT-60UMQ)をテスト

アーケードゲーム機でよく使用されるゲームボタンのメーカーである三和電子から他とは違うタイプが出ていたので試してみました。正式な型番はOBSAT-60UMQ-G-HSW-12Vで筆者購入時の価格は2750円でした。

三和電子のこのような大きなボタンは裏側にオムロンのマイクロスイッチ(V-10-1A4)とウエッジ球が実装され、結構大きいために何らかの機器に組み込む場合は必然と大きくなってしまう。しかしこのボタンは無接点スイッチとLEDの基板によりコンパクトな形状となっている。しかもZHコネクタによって組立作業にも配慮されている。

試した回路、基板は下の写真のとおり。回路図は無く、ユニバーサルに適当に配線しています。試作は修正することも多いので片面に部品も配線も行っています。抵抗やコンデンサは基本的にチップを使っています。
ピンヘッダやすずメッキ線に色を塗っていますがATX電源の規格に準拠しており、黄色が12V、赤が5V、黒がグランド、白が信号線としています。

このタイプのボタンは12V用しかなく、電源には12Vが必要となります。さらに接続するマイコンの信号用に5V又は3.3Vなどのレギュレータが必要になります。
LEDの制御にはマイコンの信号電圧と電流の関係でフォトカプラを入れています。今は亡きTLP-521が手元にありましたので使用しています。コレクタ電流値がギリなので少し気になりますが・・・。
右側のSW OUTはプルアップしていますので待機でHI、押してLOWとなります。LED INはHIで消灯、LOWで点灯となります。

LEDには定電流ダイオード?が入っているので直接12Vかけても大丈夫です。点灯させてみたところウエッジ電球のタイプと比較すると少し暗い感じで実際に使用するには5V回路にする点も含めて基板を改造したほうがよさそうでした。

気になるスイッチ部分ですがフォトインタラプタを使用しているので無接点スイッチで接触不良の心配が軽減できます。そもそもこれ以外のモデルで使用されているマイクロスイッチはオムロンの資料で電気的耐久性が30万回と書かれており、かつ1分間に30回と記載されています。ゲーム用としてのボタンのスイッチ部分としては少々性能不足に思いますがこのモデルは無接点ですのでこちらのほうが耐久性は期待できます。三和電子の資料では電気的耐久性1000万回以上と記載されています。

また、通常スイッチ回路にはチャタリング防止として10μFのコンデンサを入れたりしますがその点は無接点なので不要です。

無意識に押したときのオシロとなりますが、約0.1msecとなっています。が、押す速度に依存しますので連打した場合はもちろんさらに短くなりますし、ゆっくり押すと傾斜がなだらかになってしまいますので手の震えが秒妙にある場合などを想定すると可能性は低いですがマイコン側ではチャタリングとなってしまう可能性はあります。

また、スイッチ部分には0.1mA程度流さないと接触不良を起こす可能性もあるが非接触であればその点も心配は不要と思われる。

まとめとして、下記の特徴があげられる。

良い点

・高耐久
・奥行きが短い
・ZHコネクタを採用
・見た目が以前からの物と変わらない

よくなかった点

・LEDが少々暗い
・クリック感が無い(スイッチのクリック感は客先によっては重要視される)
・12Vしかない

以上の点で設計上での置き換えは進めたいと考えるものの、少し注意しながらの置き換えが望ましいと思われる。

NeoPixel Ringを使ってみる

NeoPixel Ring – 16連フルカラーシリアルLEDを使ってみる

ゴーグルに埋め込んだり腕時計を作った人もいるようです。バッテリーの持ち時間が気になりますが、面白そうです。

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。

  • フルカラーLEDモジュール NeoPixel Ring – 16連フルカラーシリアルLED
    スイッチサイエンス adafruit
  • マイコンボード(PIC18F26k22搭載) ZEATEC co.,ltd. ZT-PIC18F26k2201(5V仕様)

接続

接続は下記のとおりです。LEDモジュールには加工してQIコネクタをつけています。

ちょっと解説

基板上には16個のLEDが配置されていて信号の内容を簡単に説明すると、1とする信号と0とする信号を8bit x 3色分の24bitの信号を16個分並べて送信します。1とする信号は0.8μSecのHiと0.45μSecのLowの組み合わせの信号で、0とする信号は0.4μSecのHiと0.85μSecのLowの組み合わせの信号となります。
先にリセット信号を出したほうがいいみたいで、50μSecのLowを出してからそれぞれの信号を出力します。24bit単位でfor-nextで回しているとスープする際に少々時間が空いてしまいますが、そこはlowにしておいたほうが良いみたいです。さらに16個分のデータを送信後はHiにしておいたほうが良いみたいです。あとデータ送信の1回目は取りこぼしが発生しやすいのか意図しない表示になるため、スタート時に1回データ送信を行っています。
プログラムやメモリーにはまだ余裕があるので変数を触ればもっと多くのLEDや長いパターンも作れます。

  プロジェクトファイルも含めたサンプル 18f26k22_ws2812b  
  LEDのデータシート WS2812B  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

マイコン内臓LED(WS2822S)を使ってみる

フルカラーLEDはリアルタイムに色々表現できるのでとても楽しいLEDです。しかしここ数年、マイコンが搭載されてさらに楽しいLEDが出回ってきました。その一つがWE2822で、舞台向けなどの照明機器で使用されているDMX512という規格に似たフルカラーLEDのライブラリを作ったので紹介します。

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。電源は写真の様に5Vラインに直接5Vを供給して下さい。レギュレータを通すと電力不足で動きがおかしくなります。

  • マイコンボード(PIC16F1947搭載)…ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)
  • スイッチサイエンス WS2822SシリアルLEDスティックモジュール2本
    又はWS2822Sを20個接続したもの

WS2822Sについて

このLEDは上でも説明したとおりDMX512という規格に基づいて制御します。しかし、通常DMXの機器は機器のディップスイッチなどによってアドレス設定しますが、この場合アドレス設定もシリアル信号によって行います。
先にアドレス設定の信号を送信して再起動後、カラーデータを送信します。ちなみにアドレスの設定は何度も書き換えできるようです。下のライブラリでは起動後、USARTポートから「mode,1」と入力してアドレス設定モードにし、1秒程度接続します。後に「mode,2」と入力するかマイコンを再起動すればカラーデータが送信されます。

アドレス設定信号プロトコル

アドレス信号はADRIに入力します。そしてADROから出てきた信号を次のLEDのADRIに接続します。その時DAIは何でも良いようですが、念のためライブラリではHIとしています。プロトコル内容については下記資料で何とか理解できそうですが、アドレスの割り当て順については少々理解しにくかったので注意が必要です。
1個のLEDには3つのアドレスが必要?なため、一つ目を1と設定すると次は4となります。順に3を足した数値となり、1、4、7,10、13という感じになります。

カラーデータ信号プロトコル

カラーデータはDAIから入力し、それぞれのLEDにも並列に接続します。各色のデータ(3バイト)を並べて送るだけで制御できます。

接続

接続は下記のとおりです。アドレスの設定が出来れば3本でも出来ますが、トラブルが起きた際の事を考えるとアドレスも配線しておいたほうが無難です。
電源は通常のピンから供給するとレギュレータの許容値を超えるようですので、PORT1もしくはPORT2の5Vラインに入力して下さい。

 

WS2822S用ライブラリ WS2822S.zip

 
  WS2822Sデータシート WS2822S.pdf  
  プロジェクトファイルも含めたサンプル ZT-PIC16F194701_WS2822S.zip  
            ウィンカーも作ってみました 16f1947_ws2822_turnsignal.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
/*****************************************************************************************
マイコン内臓RGB LED(WS2822S)用ライブラリ 2015/11/04作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
#include "ws2822.c"をヘッダ部分に追加して起動と同時にライブラリを読み込むようにしてください。

ws2822_set_color();

ws2822_set_address(1,20);

*****************************************************************************************/
//DMX通信LED関係
#define PIN_ADDRESS     PIN_A1
#define PIN_COLORDATA     PIN_A3
int ws2822_led_value = 20;
int Color_R[20];
int Color_G[20];
int Color_B[20];

void ws2822_set_address(int start_add);
void ws2822_set_color();
void ws2822_send_one_packet(int mode,int set_data);
void ws2822_send_one_bit(int mode,int set_data);

//アドレスの書込み
void ws2822_set_address(int start_add){

    int tmp1 = 0;
    int tmp_data = 0;
    int tmp_start_add = start_add-1;
    int tmp_use_num = ws2822_led_value * 3;
    int tmp_set_address = 0;

    //カラーデータ送信ポートをHi
    output_bit(PIN_COLORDATA,1);

    //MTBP
    ws2822_send_one_bit(1,1);
    delay_us(88);

    //BREAK
    ws2822_send_one_bit(1,0);
    delay_ms(5);

    //MAB 12uS
    ws2822_send_one_bit(1,1);
    delay_us(8);

    //SC
    ws2822_send_one_packet(1,0x00);

    for(tmp1=tmp_start_add;tmp1<tmp_use_num;tmp1++){

        //セットするアドレスを用意 32uS
        tmp1++;
        tmp_data = tmp1;
        ws2822_send_one_packet(1,tmp_data);

        //セットするアドレスによってブロック番号を変える
        tmp1++;
        tmp_data = 0xf0;//0~255
        ws2822_send_one_packet(1,tmp_data);

        //アドレス書込み時の定数
        tmp1++;
        tmp_data = 0xd2;
        ws2822_send_one_packet(1,tmp_data);
        tmp1--;
    }
}

//カラーセット
void ws2822_set_color(){

    int tmp1 = 0;
    int tmp_data = 0;
    int tmp_set_address = 0;
    int tmp_end_num = ws2822_led_value;

    //MTBP
    output_bit(PIN_COLORDATA,1);
    delay_ms(5);

    //BREAK 88uS
    output_bit(PIN_COLORDATA,0);
    delay_us(88);

    //MAB 8uS
    output_bit(PIN_COLORDATA,1);
    delay_us(5);

    //SC
    ws2822_send_one_packet(2,0x00);

    //各データ
    for(tmp1=0;tmp1<tmp_end_num;tmp1++){
        //青色を設定
        ws2822_send_one_packet(2,Color_B[tmp1]);
        //緑色を設定
        ws2822_send_one_packet(2,Color_G[tmp1]);
        //赤色を設定
        ws2822_send_one_packet(2,Color_R[tmp1]);
    }
}


//1パケット分送信
void ws2822_send_one_packet(int mode,int set_data){

    int tmp_data = set_data;

    if(mode == 1){
        //アドレス設定送信

        //StartBit 4uS
        output_bit(PIN_ADDRESS,0);
        delay_us(3);delay_cycles(1);

        //アドレス送信
        output_bit(PIN_ADDRESS,bit_test(tmp_data,7));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,6));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,5));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,4));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,3));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,2));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,1));
        delay_us(3);//delay_cycles(1);
        output_bit(PIN_ADDRESS,bit_test(tmp_data,0));
        delay_us(3);//delay_cycles(1);
        
        //StopBit 8uS
        delay_cycles(3);
        output_bit(PIN_ADDRESS,1);
        delay_us(3);delay_cycles(8);
    }else if(mode == 2){
        //カラーデータ送信

        //アドレス送信ポートをHi
        output_bit(PIN_ADDRESS,1);

        //StartBit 4uS
        output_bit(PIN_COLORDATA,0);
        delay_us(3);delay_cycles(3);

        //アドレス送信
        output_bit(PIN_COLORDATA,bit_test(tmp_data,7));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,6));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,5));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,4));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,3));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,2));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,1));
        delay_us(3);delay_cycles(1);
        output_bit(PIN_COLORDATA,bit_test(tmp_data,0));
        delay_us(3);delay_cycles(1);
        
        //StopBit 8uS
        delay_cycles(3);
        output_bit(PIN_COLORDATA,1);
        delay_us(3);
    }
}

//1ビット分送信
void ws2822_send_one_bit(int mode,int set_data){
    if(mode == 1){
        //アドレスデータを送信
        output_bit(PIN_ADDRESS,set_data);
        delay_cycles(7);
    }else if(mode == 2){
        //色データを送信
        output_bit(PIN_COLORDATA,set_data);
        delay_cycles(7);
    }
}

便利なスイッチ処理ライブラリ

マイコンソフトを作りこみしていると、スイッチ処理はよく使います。しかし単純に押すだけの処理なら簡単ですが、押した瞬間の1回だけ処理したい場合や長押し処理を使いたい場合など、意外と押すだけのボタンは高機能に使いたくなります。
そこでスイッチ処理のライブラリをまとめてみました。とりあえずはRA1だけですので、利用に合わせて増やしてください。長押しやダブルクリックにも対応しています。

OLYMPUS DIGITAL CAMERA

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。

  • マイコンボード(PIC16F1947搭載)…ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)
  • テスト用基板(ZT-PIC16F194701用)
 

スイッチ処理ライブラリ sw_process.zip

 
  プロジェクトファイルも含めたサンプル ZT-PIC16F194701_sw_process.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
/*****************************************************************************************
スイッチ用ライブラリ 2015/4/7作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
sw_process()をメインループに入れてください。下記の関数を追加することでそれぞれの動作の時に呼
び出されます。下記サンプルはRA1のみです。それ以外の入力に関してはRA1を参考に追記してください。

sw_a1には現在値を取得しています。

//押した時
void sw_a1_push(){
    fprintf(c1,"Push ok.\r\n");
}

//放した時
void sw_a1_release(){
    fprintf(c1,"Release ok.\r\n");
}

//長押し
void sw_a1_hold(){
    fprintf(c1,"Hold ok.\r\n");
}

//ダブルクリック
void sw_a1_wpush(){
    fprintf(c1,"Double click ok.\r\n");
}

また、50msec単位の割り込みでflicker_hi_oneを1にするフラグと長押し中との組み合わせで、設定ボ
タンを長押しすると設定値が高速で変わるといった使い方も出来ます。

//長押し中
void sw_a1_holdon(){
    if(flicker_hi_one == 1){
        flicker_hi_one = 0;
        //フリッカーハイのタイミングでしか処理しない
        test_val++;
        
        fprintf(c1,"Holdon ok. test_val=%u\r\n",test_val);
    }
}

*****************************************************************************************/

int sw_a1 = 0;//RA1の現在値
long holdup_a1 = 30000;//長押し判定値
long holdcount_a1 = 0;//押しているカウント値
long releaseup_a1 = 10000;//放している時の判定値
long releasecount_a1 = 0;//放しているカウント値
long history_a1 = 0;//スイッチの履歴

//押した時
void sw_a1_push();
//放した時
void sw_a1_release();
//長押し判定したとき
void sw_a1_hold();
//長押し中
void sw_a1_holdon();
//ダブルクリック
void sw_a1_wpush();

//スイッチ処理
void sw_process(){

    //********************
    //PIN_A1用ソース
    //********************
    //現在値を取得
    //ONでGNDの場合
    sw_a1 = !input(PIN_A1);
    //ONでVCCの場合
    //sw_a1 = input(PIN_A1);

    //長押し
    if(sw_a1==1){
        if(holdcount_a1<holdup_a1){
            holdcount_a1++;
        }else if(holdcount_a1==holdup_a1){
            holdcount_a1++;
            //スイッチを長押しした場合
            sw_a1_hold();
        }else{
            //ダブルクリック用変数割り当て
            releasecount_a1 = releaseup_a1;
            //長押ししたままの場合
            sw_a1_holdon();
        }
    }else{
        holdcount_a1 = 0;
    }

    //押した時
    if(history_a1 == 0 && history_a1 != holdcount_a1){
        sw_a1_push();

        //ダブルクリック用変数割り当て
        releasecount_a1 = releasecount_a1 + releaseup_a1;
    }

    //放した時
    if(history_a1 != 0 && holdcount_a1 == 0){
        sw_a1_release();
    }

    //ダブルクリックしたとき
    if(releasecount_a1>0){
        releasecount_a1--;
        if(releasecount_a1>releaseup_a1){
            sw_a1_wpush();
            releasecount_a1 = 0;
        }
    }

    history_a1 = holdcount_a1;
    //********************
    //そのほかの入力は上記を参考に追記してください。

}

入出力ポートの増設モジュールの使用例

マイコンの入力ポートが足りないことはありがちです。そんな時によく使われるのがシリアルパラレル変換のロジックIC。入力モジュールと出力モジュールを接続し、入力信号をそのままマイコンを通して出力信号としています。

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。
TTL8点出力モジュール…ZT-74HC595
TTL8点入力モジュール…ZT-74HC165
マイコンボード(PIC16F1947搭載)…ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)

接続

接続は下記のとおりです。

 

74HC165用ライブラリ tc74hc165.zip

 
  TC74HC165データシート TC74HC165AP.pdf  
  TPIC6B165Nデータシート TPIC6B165N.pdf  
  プロジェクトファイルも含めたサンプル ZT-PIC16F194701_74hc595_74hc165.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

入力モジュールのライブラリ

/*****************************************************************************************
74HC165用ライブラリ 2015/4/10作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
#include "tc74hc165.c"をヘッダーに追加してください。
取得したい変数を用意してtest_val = tc74hc595();というように使います。

*****************************************************************************************/
//シリアルパラレル変換
int tc74hc165_8(){
    //PIN_E3	QH シリアルデータ
    //PIN_E4	CK クロック
    //PIN_E5	S/L データ送信開始指示

    int tmp1 = 0;
    int tmp_ans = 0;

    //S/L
    output_bit(PIN_E5,0);
    output_bit(PIN_E5,1);

    for(tmp1=0;tmp1<8;tmp1++){
        //CK
        output_bit(PIN_E4,0);
        
        if(input(PIN_E3) == 0){
            bit_set(tmp_ans,7-tmp1);
        }else{
            bit_clear(tmp_ans,7-tmp1);
        }

        //CK
        output_bit(PIN_E4,1);

    }

    return tmp_ans;
}
long tc74hc165_16(){
    //PIN_E3	QH シリアルデータ
    //PIN_E4	CK クロック
    //PIN_E5	S/L データ送信開始指示

    int tmp1 = 0;
    long tmp_ans = 0;

    //S/L
    output_bit(PIN_E5,0);
    output_bit(PIN_E5,1);

    for(tmp1=0;tmp1<16;tmp1++){
        //CK
        output_bit(PIN_E4,0);
        
        if(input(PIN_E3) == 0){
            bit_set(tmp_ans,15-tmp1);
        }else{
            bit_clear(tmp_ans,15-tmp1);
        }

        //CK
        output_bit(PIN_E4,1);

    }

    return tmp_ans;
}

 

出力モジュールのライブラリ

/*****************************************************************************************
74HC595用ライブラリ 2015/4/1作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
#include "tc74hc595.c"をヘッダーに追加してください。
出力する値を入れてtc74hc595(0x1234);というように使います。

*****************************************************************************************/
//シリアルパラレル変換
void tc74hc595_8(int setdata){
    //PIN_E0	SI or SER シリアルデータ
    //PIN_E1	SCK クロック
    //PIN_E2	RCK ラッチ

    int tmp1 = 0;

    for(tmp1=0;tmp1<9;tmp1++){
        output_bit(PIN_E0,bit_test(setdata,8-tmp1));
        output_bit(PIN_E1,1);
        output_bit(PIN_E1,0);
    }
    output_bit(PIN_E2,1);
    output_bit(PIN_E2,0);
}
void tc74hc595_16(long setdata){
    //PIN_E0	SI or SER シリアルデータ
    //PIN_E1	SCK クロック
    //PIN_E2	RCK ラッチ

    int tmp1 = 0;

    for(tmp1=0;tmp1<17;tmp1++){
        output_bit(PIN_E0,bit_test(setdata,16-tmp1));
        output_bit(PIN_E1,1);
        output_bit(PIN_E1,0);
    }
    output_bit(PIN_E2,1);
    output_bit(PIN_E2,0);
}

 

74HC165 8ビットシフトレジスタ

マイコンの入力ポートが足りないことはありがちです。そんな時によく使われるのがシリアルパラレル変換のロジックIC。入力ポートは4.7kΩのプルアップをしてディップスイッチに接続されています。ディップスイッチはONでGNDに落ちます。それ以外の配線は下記の図のとおりです。S/Lなどはソースのほうを参照してください。SINは74HC165を2個以上使用するときに使います。

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。
ロジックIC…74HC165(実験時には東芝製TC74HC165を使用しました)
マイコンボード(PIC16F1947搭載)…ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)

接続

接続は下記のとおりでロジックICから各ディップスイッチへの配線は記載を省略しています。CKにクロック信号、S/Lの信号でQHからシリアルデータが送信されます。

 

74HC165用ライブラリ tc74hc165.zip

 
  TC74HC165データシート TC74HC165AP.pdf  
  TPIC6B165Nデータシート TPIC6B165N.pdf  
  プロジェクトファイルも含めたサンプル ZT-PIC16F194701_tc74hc165.zip  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
/*****************************************************************************************
74HC165用ライブラリ 2015/4/10作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
#include "tc74hc165.c"をヘッダーに追加してください。
取得したい変数を用意してtest_val = tc74hc595();というように使います。

*****************************************************************************************/
//シリアルパラレル変換
int tc74hc165_8(){
    //PIN_E0    QH シリアルデータ
    //PIN_E1    CK クロック
    //PIN_E2    S/L データ送信開始指示

    int tmp1 = 0;
    int tmp_ans = 0;

    //S/L
    output_bit(PIN_E2,0);
    output_bit(PIN_E2,1);

    for(tmp1=0;tmp1<8;tmp1++){
        //CK
        output_bit(PIN_E1,0);
        
        if(input(PIN_E0) == 0){
            bit_set(tmp_ans,7-tmp1);
        }else{
            bit_clear(tmp_ans,7-tmp1);
        }

        //CK
        output_bit(PIN_E1,1);

    }

    return tmp_ans;
}

74HC595,TPIC6B595N 8ビットシフトレジスタ

マイコンの出力ポートが足りないことはありがちです。そんな時によく使われるのがシリアルパラレル変換のロジックIC。似たようなICでNJU3711Dというのも有りますが、連結できない点や上位グレードも入手性が悪い点もあり、こちらのほうが一般的だと思います。写真はTPIC6B595Nで組んでいます。

74HC595が35mAに対し、150mA流せるので7セグのコモンにも使用できます。さらに350mA流せるTPIC6A595NEでも使用できると思います。

■□使用機器□■

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。
 
ロジックIC 74HC595 or TPIC6B595N
(実験時には東芝製TC74HC595を使用しました)
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)
 

■□接続□■

接続は下記のとおりでロジックICから各LEDへの配線は記載を省略しています。SIにシリアル信号、SCKにクロック信号を送信し、RCKのラッチ信号で出力ポートへ適用します。

接続は下記のとおりでロジックICから各LEDへの配線は記載を省略しています。SIにシリアル信号、SCKにクロック信号を送信し、RCKのラッチ信号で出力ポートへ適用します。

74HC595用ライブラリ tc74hc595.zip

TC74HC595データシート TC74HC595AP.pdf

TPIC6B595Nデータシート TPIC6B595N.pdf

プロジェクトファイルも含めたサンプル ZT-PIC16F194701_tc74hc595.zip

開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

/*****************************************************************************************
74HC595用ライブラリ 2015/4/1作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
出力する値を入れてtc74hc595(0x1234);というように使います。

*****************************************************************************************/
//シリアルパラレル変換
void tc74hc595_16(long setdata){
    //PIN_E0    SI or SER シリアルデータ
    //PIN_E1    SCK クロック
    //PIN_E2    RCK ラッチ

    int tmp1 = 0;

    for(tmp1=0;tmp1<17;tmp1++){
        output_bit(PIN_E0,bit_test(setdata,16-tmp1));
        output_bit(PIN_E1,1);
        output_bit(PIN_E1,0);
    }
    output_bit(PIN_E2,1);
    output_bit(PIN_E2,0);
}

温度計でファンを制御してみる

温度計LM61を使ったついでにファンも接続して制御してみました。温度によって停止、LOWスピード、HIスピードと変わります。

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。
ファン DC12V用 テスト時は40mm 0.35Aの物を使用
高精度IC温度センサー Texas Instruments LM61CIZ
有機ELキャラクターディスプレイモジュール Sunlike Display Tech. Corp. SO2002AWYB-UC-WB-U
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)

接続

接続は下記のとおりです。

ちょっと解説

LM61に関しての解説はLM61を使ってみるの記事のほうをご確認ください。FANの制御に関してはON-OFFを10mSecサイクルぐらいをLOW出力として、HI出力はONという感じにしています。ON-OFFだけの制御では回転斑があってカラカラ音が少し多いような気もします。電圧を細かく制御するのはちょっと面倒なのでLOWの時は5V回路を組んでおいてそちらから供給するようにしたほうが良いかもしれません。

プロジェクトファイルも含めたサンプル 16f1947_lm61_fan
開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

お手ごろスペックのマイコン基板

マイコン基板とは

何らかの回路を組む場合、マイコンをよく使う方は定番のマイコンチップ、定番の電源回路、定番のコネクタがあると思います。それらの定番を基板にしたのがマイコン基板であり、世間的にはArduinoやMbed基板があります。それぞれに使い勝手やドキュメントの豊富さ、長期供給、開発環境の作りやすさなどの点でメリットデメリットがあります。

筆者は色々な点で総合的にPICマイコンが合っていると判断し、様々な開発で使用してきました。これはあくまで個人的な意見でこれが最善という事ではありません。得意とするPIC16Fや18FといったマイコンではUSBメモリやLANポートも使うには非力でそれらを使うには別途基板が必要になったりします。逆にモジュールがあれば非力でも結構使えるという事もあります。例えばRFIDタグ用機器は無線技術も必要となりますが既存基板と組み合わせることで設計製作した実績があります。

その筆者の経験で作られてきたテンプレートを1枚の基板にまとめたのが右の写真のマイコン基板です。
少しオーバーですが、色々作ってきたというノウハウと工夫が凝縮されています。
ハイスペックではありませんが使い勝手は抜群だと自負しています。

PIC18F46K22マイコン基板

そしてその基盤にコネクタを付け、いつも使っているスイッチやディスプレイを接続することでユニット化までを定番としています。
何かを作るときとりあえずこれで作ってみていらないものは省いて必要なものは追加します。

もちろんソフトウェアも定番ソフトがあり、常に生産性は追及しています。
そしてそれらの回路図もプログラムソースも公開しています。

制御マイコンユニット

ユニバーサル基板を使用した試作

製品製作の流れ

回路を組む場合、基本的な手順としてはブレッドボードでテストし、次にユニバーサル基板でテストの後、リジッド基板として製作します。もちろん何度も使用している回路パターンでは試作を行わずリジッド基板を製作しますが、初めての半導体やモジュールを使う場合はその周辺だけを試作することは頻繁にあります。また、基本回路をライブラリとして作る事もよくあります。
そこで、ユニバーサル基板で試作を製作する場合は皆さんどのように組まれていますでしょうか?普通、部品面には部品を並べ、はんだ面には配線を行うと思います。しかし自分の場合ははんだ面に部品を並べ、配線もはんだ面に行います。 そこで、ユニバーサル基板で試作を組む動画を紹介します。