2011年6月12日日曜日

REGZA RD-BZ800のリモコンをVIZIO(TV)で使えるようにする(構想)

REGZA RD-BZ800のリモコンをVIZIO(TV)で使えるようにする。
普段はSONYの学習リモコンを使ってるのですが、これが妻に評判が悪い。
 

REGZAのリモコンを学習するにはボタン数が少ない。
シフト機能も使えるけどボタンの刻印が無いから、よく使わないボタン機能を忘れてしまう。
RD-BZ800のリモコンには
  • テレビコントロールのプリセット値にVIZIOの項目が無い
  • 機能別の独立したボタンが多すぎ
  • シンプルリモコンがシンプルすぎ
 

左上の青色文字部分がテレビコントロール部分
IRremoteのサンプルプログラムIRrecvDumpをちょいと手直ししてリモコンコード変換機にしてます。
機能 VIZIO TV SONY TV REGZA TV
電源 8F7010EF A90(12bits) 2FD48b7
Vol Up 8F7040BF 490 2FD58A7
Vol Down 8F70C03F C90 2FD7887
Ch Up 8F7000FF 90 2FDD821
Ch Down 8F70807F 890 2FDF807
入力切り替え 8F70639C(HDMI) A50 2FDF00F
地上波アナログ 8F7004FB 3AE9(15bits) 2FDDE21
地上波デジタル 8F70847B 26E9 2FD5EA1
BS110 8F7020DF 1AE9 2FD3EC1
CS110 8F70A05F 6AE9 2FDBE41

VIZIOのリモコン受光部はここ
 


初代HDDレコーダーClipOnのアルミヘアライン仕上げのB&O風デザインリモコン。
このGUIがしっかりしてればこれだけのボタン数でかなりのこと出来るんだけどね...
アナログ放送が停波したら別用途に利用予定。
IRRemoteライブラリをちょっと修正
  • sendNECを実行すると受信機能が破壊される
  • sendNECにリピート送信を追加
コンパイルサイズは
Binary sketch size: 8816 bytes (of a 32256 byte maximum)
 /*
 * IRremote: IRrecvDump - dump details of IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */
/*
 * IRremote: IRrecvDump - dump details of IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */
/*
  Masahiko KANETAKA
  kane4d@gmail.com
  http://kane4d.blogspot.com/
 
  Port MAP
  D0   I  RX
  D1   O  TX
  D2
  D3   O  IR LED Drive
  D4
  D5
  D6
  D7   I  IR Receiver module(PL-IRM1261)
  D8
  D9
  D10
  D11
  D12
  D13  O  LED
*/
//#define DEBUG 1
//#define CORE_LED0_PIN 13
#define MAKER_CODE 0x8F700000
#define REMOTE_CMD(x) ( MAKER_CODE | x )
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  irrecv.blink13(true);
}
// based on Print::printNumber
void printHex64(unsigned long long n)
{
  unsigned char buf[sizeof(unsigned long long) * 2];
  unsigned long i = 0;
  if (n == 0) {
    Serial.print('0');
    return;
  }
  while (n > 0) {
    buf[i++] = n & 0xf;
    n >>= 4;
  }
  for (; i > 0; i--) {
    Serial.print((char) (buf[i - 1] < 10 ?
      '0' + buf[i - 1] :
      'A' + buf[i - 1] - 10));
  }
}
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
    irsend.sendNEC(results->decode_type, 32);
    if (results->value == REPEAT){
      //repeat code
      irsend.sendNEC(REPEAT, 32);
    }else if ((results->value & 0xFFFF0000) == MAKER_CODE){
      irsend.sendNEC(results->decode_type, 32);
    }
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
    switch(results->value){
      case (0xA90):
        Serial.print("Power ");
        irsend.sendNEC(REMOTE_CMD(0x10EF), 32);
        break;
      case (0x490):
        Serial.print("Vol.Up ");
        irsend.sendNEC(REMOTE_CMD(0x40BF), 32);
        break;
      case (0xC90):
        Serial.print("Vol.Down ");
        irsend.sendNEC(REMOTE_CMD(0xC03F), 32);
        break;
      case (0x90):
        Serial.print("CH.Up ");
        irsend.sendNEC(REMOTE_CMD(0x00FF), 32);
        break;
      case (0x890):
        Serial.print("CH.Down ");
        irsend.sendNEC(REMOTE_CMD(0x807F), 32);
        break;
      case (0xA50):
        Serial.print("InputSel ");
        irsend.sendNEC(REMOTE_CMD(0x639C), 32);
        break;
      case (0x3AE9):
        Serial.print("ChiAna ");
        irsend.sendNEC(REMOTE_CMD(0xD42B), 32);
        break;
      case (0x26E9):
        Serial.print("ChiDigi ");
        irsend.sendNEC(REMOTE_CMD(0x847B), 32);
        break;
      case (0x1AE9):
        Serial.print("BS110 ");
        irsend.sendNEC(REMOTE_CMD(0x20DF), 32);
        break;
      case (0x6AE9):
        Serial.print("CS110 ");
        irsend.sendNEC(REMOTE_CMD(0xA05F), 32);
        break;
    }

  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  printHex64(results->value);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}
void loop() { 
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

腕時計電池の下調べ

アナログ時計を力技で開けてみました。
 


ALBAの月齢表示する懐中時計
 


裏面
 

 SR916SWを使ってる。
時計屋さんの指紋がべったり残ってる。

裏ぶたの刻印
右下の凹んだ部分が工具の差し込み口になってました。

最近、ダイソーでSR系のボタン電池の扱いが減ってる。
どこで安い電池を入手するか思案中。

2011年6月11日土曜日

腕時計の電池交換

腕時計をしなくなったのはいつごろからだろうか?
「電池の切れ目が縁の切れ目」
10気圧防水時計は時計屋さんで交換すると高いんですよねぇ。
そんな訳で動作しないが捨てられない時計が溜まってしまいました。

メタボの重たい腰を持ち上げて、この「Cooの腕時計」さんのサイトを参考に電池交換しました。
ダイビングするわけではないので、防水性能は自己責任ということで...

使用したボタン電池
  • CR2016 50円(秋月)
  • CR2025 60円(秋月)
  • SR626 105円(ダイソー)
  • SR927 安いのが見つからず断念 SR920(ダイソー)で代用するか思案中

基本方針
  • 裏ぶたの説明書きをよく読む
  • AC端子の位置確認
  • スプリングを紛失しないように注意
  • 指紋を残さない

用意した道具は
です。

電池交換用にdealeXtreameで購入したバキューム式ピックアップツール($4.19)を使いました。
購入してから気づいたのですが、同じものでもっと安い($3.62)のが有ったんです。

吸盤は大中小の3種類付属。
今回は中サイズをチョイス


後部に使ってない吸盤を収納できます。
タンタルコンデンサの足にさして収納してます。

CASIO G-SHOCK PRT-401J(SR927 x 2)
ファーブル昆虫記の文庫本が同梱されてました。
ファーブルにちなんでバックライトがフンコロガシなんです。


ベルトの合成皮革部分が加水分解?して破損
安いSR927が見つからず今回は電池交換断念

CASIO G-SHOCK GT-000(CR2016)




G-SHOCKは圧電素子に接続するスプリング部分以外はゴムで保護されてる。

裏ぶたの注意書き

ゴムに付着した緑色のものは???
先の細いピンセットで留め金を外す。
嫌いなMAXELL電池が入っている。
未使用でサイババ状態になった古電池。


新しい電池をセットしてAC(All Clear)ジャンパーショートする。
このモデルはACの刻印が見にくい。
 

リセット後は製造年が表示されるのかな?
95年製

CASIO G-SHOCK DW-8800(CR2016)


何年も電池切れ状態だったけど電話帳は消えてませんでした。




CASIO G-SHOCK 裏ぶた未確認(CR2016)




これはMade in KOREAです。

SEIKO ALBA U.K.G GORI(CR2025)
この時計だけ分解写真付きです。 
G-Shockは必ずゴムシートが入ってるけど、これには入ってないです。

裏ぶたには圧電素子と注意書きが付いてます。
一度も電池交換してないので純正電池が入ってました。

電池を吸着
 あとは新しい電池を入れて、AC(All Clear)後ねじ止めで作業終了。




マジックテープのベルトが長いのでスキーウエアや手袋の上に装着できます。

ねじ止め式じゃない時計がまだあるけど、面倒なので後回しと云うことで...

2011年6月6日月曜日

arduinoでLCメータを妄想してみる

morecat_labさんのtwitterでaruduinoの周波数カウンタのライブラリを知りました。
精度、安定度は不明ですが周波数から逆算するLCメータが作れるのでは? なんて考えました。
基本的考え方はtiny2313vでLCメータと同じでソフト部分だけ妄想してみました。

実数を使うとどれくらいメモリーを消費するか調べるために基本部分だけです。
コンパイルサイズは
Binary sketch size: 6406 bytes (of a 32256 byte maximum)
なので余裕です。

ハード部分は後日tiny2313vでLCメータを分解して再利用予定。

/*
  Martin Nawrath KHM LAB3
  Kunsthochschule f¸r Medien Kˆln
  Academy of Media Arts
  http://www.khm.de
  http://interface.khm.de/index.php/labor/experimente/
 */
/*
  Masahiko KANETAKA
  kane4d@gmail.com
  http://kane4d.blogspot.com/
 
  Port MAP
  D0   I  RX
  D1   O  TX
  D2
  D3   I  LC Mode SW (High: C, Low: L)
  D4   I  Zero Adjust Botton
  D5   I  Wave(Frequency)
  D6   O  LCD d7
  D7   O  LCD d6
  D8   O  LCD d5
  D9   O  LCD d4
  D10  O  LCD enable
  D11  O  LCD rs
  D12  O  Relay drive
  D13  O  LED
*/
#define USE_SERIAL
#define USE_LCD
#include <FreqCounter.h>
#ifdef USE_LCD
#include <LiquidCrystal.h>
#endif
double getfreq(unsigned int f_comp = 10, int gateTime = 100);
#ifdef USE_LCD
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);
#endif

double frq1_r = 0.0F, frq2_r = 0.0F, frq3_r = 0.0F;
double val_r;
int cnt;
bool cal_bool = false;
#define pinLed (13)
#define pinRelay (12)
#define pinZeroAdjBtn (4)
// High: C, Low: L
#define pinLCModeSW (3)
#define DEFAULT_TRY_COUNT (3)
//1000pF + 100uH
#define CAL_CAP (1000.0F)
double getfreq(unsigned int f_comp, int gateTime)
{
  double _frq_r = 0.0F;
  FreqCounter::f_comp = f_comp;   // Cal Value / Calibrate with professional Freq Counter
  for(int i = 0; i < DEFAULT_TRY_COUNT; ++i){
    FreqCounter::start(gateTime);  // 100 ms Gate Time
    while (FreqCounter::f_ready == 0) ;
    _frq_r += FreqCounter::f_freq;
  }
  return _frq_r / DEFAULT_TRY_COUNT;
}
void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode(pinRelay, OUTPUT);
  pinMode(pinZeroAdjBtn, INPUT);
  pinMode(pinLCModeSW, INPUT); // High: C, Low: L
#ifdef USE_SERIAL
  Serial.begin(9600);        // connect to the serial port
  Serial.println("LC Meter v0.1");
#endif
#ifdef USE_LCD
  lcd.clear();
#endif
  //frq1_r = frq2_r = frq3_r = 0.0F;
}
void loop() {
  if ( ! digitalRead(pinZeroAdjBtn) && ! cal_bool ){
    //zero cal
    digitalWrite(pinRelay, false);
    delay(30);
    frq1_r = getfreq();
    digitalWrite(pinRelay, true);
    delay(30);
    frq2_r = getfreq();   
    digitalWrite(pinRelay, false);
    cal_bool = true;
  }else{
    cal_bool = false;
    if ( frq1_r > 0.0 && frq2_r > 0.0 ){
      digitalWrite(pinRelay, false);
      delay(30);
      frq3_r = getfreq();
      if (digitalRead(pinLCModeSW)){
        //CALC_C
        //val_r = CAL_CAP * ( (frq1_r / frq3_r) ^ 2 - 1.0 ) / ( (frq1_r / frq2_r) ^ 2 - 1.0 );
        val_r = (frq1_r + frq3_r) / frq3_r;
        val_r *= (frq1_r - frq3_r) / frq3_r;
        val_r *= frq2_r / (frq1_r + frq2_r) ;
        val_r *= frq2_r / (frq1_r - frq2_r) ;
        val_r *= CAL_CAP;
      }else{
        //CALC_L
        //val_r = CAL_C * ( (frq1_r / frq3_r) ^ 2 - 1.0 ) * ( (frq1_r / frq2_r) ^ 2 - 1.0 ) / CAL_CAP /( (2 * M_PI frq1_r)^2 );
        val_r = (frq1_r + frq3_r) / frq3_r;
        val_r *= (frq1_r - frq3_r) / frq3_r;
        val_r *= (frq1_r + frq2_r) / frq2_r;
        val_r *= (frq1_r - frq2_r) / frq2_r;
        val_r /= CAL_CAP;
        val_r /= 4 * M_PI * M_PI * frq1_r * frq1_r;
      }
#ifdef USE_SERIAL     
      Serial.println(val_r);
#endif
#ifdef USE_SERIAL     
      lcd.println(val_r);
#endif
    }
   
  }
  digitalWrite(pinLed,!digitalRead(pinLed));  // blink Led
 
}