2015年1月8日木曜日

妖怪ウオッチ零式 改造大実験 其の弐

妖怪ウオッチにSW追加することができたので
今度はリモコン操作にチャレンジです。
妖怪が多すぎて、SWだけでは好きな物を好きなときに
呼び出せません。
ならば、テレビのリモコンでなんとか出来ないかと。

1・妖怪ウオッチ零式 その2 プログラム編
 イントロダクション
 リモコンデータ
 追加プログラム
2・妖怪ウオッチ零式 その2 工作編
 加工
 
戻る

2015年1月7日水曜日

妖怪ウオッチ零式 其の2 プログラム編 イントロダクション

まずは操作方法を決めます。
数字キーで1から3桁までの数字を入力できるようにします。
決定キーで数字の確定です。(簡易リモコン対応で音量キーも割当ます)
チャネル↑ は召還スイッチ
チャネル↓ は種族変更スイッチ
[12]は取り出しとします。
取り出しは、スイッチ操作と実際のメダルの挿入とで
メダル状態のつじつまが合わなくなったとき用です。

次に、リモコンモードに切り替えることにより
使えるようにします。電源ON時は通常モード
電源ON時に召還SWか種族変更SWが押されていたなら
リモコンモードに入ります。このとき2秒間リモコン操作LEDを点灯します。
また、種族変更SWでリモコンモードに入ったときには
赤外線受け取り時にリモコン操作LEDを点灯するようにします。

それでは回路図を。
PD0:赤外線リモコン受信モジュール
PD4:リモコン操作LED
PD5:赤外線リモコン受信モジュール+電源供給
赤外線リモコンモジュールは出来るだけ消費電流の
少ない物を選びます。リモコンモードではない時は
赤外線モジュールの電源はOFFにします。


・プログラム構成
 ・起動時のリモコンモード判定と初期化
 ・アイドル処理での操作キー判定

赤外線リモコン受信モジュール 仕様
    型番 OSRB389AA
     ・電源電圧範囲:DC2.7V~DC5.5V
       ・消費電流:0.9~1.5mA(無信号時)
       ・中心周波数:37.9kHz
       ・ピーク感度波長:940nm
 
低電圧で動作し、比較的消費電流の少ないものをつかいます。
・追加LED
とにかく小さな物が必要です、
たまたま使わずに(つかえずに)あった
表面実装用のLEDを頑張って使います。


・赤外線受信処理
 赤外線の受信に関してはChanさんの、赤外線ライブラリを使わせてもらいました。
  便利なものがあって大感謝です!
戻る

2015年1月6日火曜日

妖怪ウオッチ零式 其の2 プログラム編 リモコンデータ

リモコンは家にあるテレビのリモコンを使います。
リモコンコード表があったのでそれに従います。コードは
CH1:0x01 CH7:0x07
CH2:0x02 CH8:0x08
CH3:0x03 CH9:0x09
CH4:0x04 CH10:0x0a
CH5:0x05 CH12:0x0c
CH6:0x06 決定:0x3d


CH↑:0x1b    音量↑:0x1a
CH↓:0x1f    音量↓:0x1e

NECフォーマットのデータだということなので、
[リーダコード]
[カスタムコード16bit]
[データコード8bit]
[データコード(反転)8bit]
[ストップビット] となります。
赤外線ライブラリより受け取る[データコード]のみを参照します。
ライブラリの使い方は。
 IR_transmit()で初期化
 IrCtrl.stateの値を監視しIR_RECVEDに変わったら
 データが受信されているので
 IrCtrl.buff[]の中のデータを参照します。
 処理が終わったらIrCtrl.stateIR_IDLEをセットして
 バッファを解放し、次の通信に備えます。
戻る

2015年1月5日月曜日

妖怪ウオッチ零式 其の2 プログラム編 追加プログラム

1)まずは起動時にリモコンを使用するかを判定します。
if(!(PIND & (NEXT_SW)) ||
       !(PIND &(CHANGE_SW)) ){
 IR_initialize();//IR 初期化
//NEXT sw 又は CHANGE sw が押されていれば。(low
  set_sleep_mode(SLEEP_MODE_IDLE);// アイドルモードを設定 2.30mA
        sbi(PORTD,5); //IR +B on
       
        if (!(PIND &(CHANGE_SW))) {
            ir_mode = IR_ON_LED;//データ受信でLEDを点灯する

        }
        sbi(PORTD,4);//オレンジLED点灯
        _delay_ms(3000);
        cbi(PORTD,4);
       
        
 }else{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);// パワーダウンモードを設定 0.02mA
        cbi(PORTD,5); //IR +B off
        cbi(PORTD,4);

}
スリープモードをアイドルモードにしないと、IR制御用のカウンタが動きません。

2)アイドル処理
赤外線データの受信をチェックして、対応の処理を行います。
数字KEYの場合には、決定KEYが押されるまで、数値編集を行います。
 // IR receve check
 uint8_t frm_len;
 if (IrCtrl.state == IR_RECVED) {
           
   frm_len = IrCtrl.len;
   if (IrCtrl.fmt==NEC) {
    if (frm_len == 32) {// frame lengh 32 bit
               
         if (ir_mode==IR_ON_LED) { //データLED点滅
             sbi(PORTD,4);
             _delay_ms(100);
             cbi(PORTD,4);
         }
                              
     switch (IrCtrl.buff[2]) {
      case NEXT_CODE:
           sw_stat = NEXT_SW;//押下状態 SET
           break;
      case CHANGE_CODE:
           sw_stat = CHANGE_SW;//押下状態 SET
           break;
   //KEY数値の代入 東芝TVリモコンkey code 1~9固定値が前提 
     case TV_CH1:
     case TV_CH2:
     case TV_CH3:
     case TV_CH4:
     case TV_CH5:
     case TV_CH6:
     case TV_CH7:
     case TV_CH8:
     case TV_CH9:
          //KEY 数値の代入
          key_code[key_index++]= IrCtrl.buff[2];
          break;
     case TV_CH10://KEY の代用
           key_code[key_index++]= 0;
           break;
     case ENTER_CODE://決定キー
     case ENTER_CODE_2://音量Up
     case ENTER_CODE_3://音量Down
          //3桁入力Key値の変換
           for (j=0; j<key_index; j++) {//*10倍
             key_val=  (key_val << 3) + (key_val << 1);
             key_val += key_code[j];
           }
                            
           if (medal_soket==INSERT) {//メダル状態は装着。
               eject_medal_sw();
               _delay_ms(EJECT_VOICE_WAIT);
                                
               medal_soket = EJECT;//メダル状態をイジェクトに。
           }
           pat_attr = 0;
           pat_index = 0;
           output_medal_sw(key_val-1);//音声を発生
           key_val=0;//入力値 初期化
           key_index=0;//入力桁 初期化
           medal_soket = INSERT;//メダル状態を装着に。                            
           break;
     case EJECT_CODE:
           if (medal_soket==INSERT) {//メダル状態は装着。
              eject_medal_sw();
              _delay_ms(EJECT_VOICE_WAIT);
              medal_soket = EJECT;//メダル状態をイジェクトに
           }
           break;
                            
    default:
           break;
   }          
  }
 }
    if (key_index>3) {//key数値は3桁まで
       key_index=0;//3桁越えたら強制的にはじめから入力
    }
   IrCtrl.state = IR_IDLE;//recive next frame

}

3)追加宣言
#include "ir_ctrl.h"
#define IR_ON_LED 2
#define IR_ON  1

#define IR_OFF 0

#define NEXT_CODE 0x1b //東芝BF40 ch^
#define CHANGE_CODE 0x1f //東芝BF40 chv
#define ENTER_CODE 0x3d //東芝BF40 OK
#define ENTER_CODE_2 0x1a //東芝BF40 音量UP
#define ENTER_CODE_3 0x1e //東芝BF40 音量Down
#define EJECT_CODE 0x0c //東芝BF40 CH12
#define TV_CH1 0x01 //東芝BF40
#define TV_CH2 0x02 //東芝BF40
#define TV_CH3 0x03 //東芝BF40
#define TV_CH4 0x04 //東芝BF40
#define TV_CH5 0x05 //東芝BF40
#define TV_CH6 0x06 //東芝BF40
#define TV_CH7 0x07 //東芝BF40
#define TV_CH8 0x08 //東芝BF40
#define TV_CH9 0x09 //東芝BF40
#define TV_CH10 0x0a //東芝BF40
#define TV_CH11 0x0b //東芝BF40

#define TV_CH12 0x0c //東芝BF40
unsigned char ir_mode=0;//赤外線モード
戻る


2015年1月4日日曜日

妖怪ウオッチ零式 その2 工作編 加工

まずは赤外線リモコン受信モジュールの取り付けです。
うまい具合にサーチライトの根元の隙間に収まります。
赤い電池ボックスとの間に挟み込みゴム片で押さえつけてあります。

信号線
+電源はCPUに接続
GNDは電池ボックスの端子に
つなぎます。











次に確認用のLEDを取り付けます。
サーチライトの後ろにはよゆうが
まったくありません






表面実装用のLEDにリード線をつけ
後ろの隔壁に穴をあけ
リードを通します。
ハンダ付けは両面テープの上に
LEDをのせ固定した状態で行うと
なんとかなります。










これで、部品の組み込みは完了です。
思いのほか問題はおこりませんでした!





戻る