2011年7月18日月曜日

aitendoのSTM32F103R基板を作ってみました(MapleIDE移植編)

irukaさんのページを参考にしてaitendoのSTM32F103R基板でもMapleIDEが動くようにしてみました。

pinModeがarduinoから拡張されてるのが新鮮です。
この基板のタクトスイッチはGNDに直接つながってるだけなので、INPUT_PULLUPを使いました。

Uploaderとしてavrdudeを使うにはauto_resetの設定に関係なくCOMxxにアクセスできないとavrdude.exeに処理が移らないようです。

後でファイルをアップしますが、今日は眠いので修正点の一覧だけで...

boards.txtに追加
##############################################################
Aitendo103R.name=Aitendo STM32F103R Mini to Flash
Aitendo103R.upload.file_type=bin
Aitendo103R.upload.maximum_size=108000
Aitendo103R.upload.ram.maximum_size=17000
Aitendo103R.upload.flash.maximum_size=108000
#Aitendo103R.upload.usbID=0483:DF11
Aitendo103R.upload.usbID=1EAF:0003
Aitendo103R.upload.altID=2
Aitendo103R.upload.uploader=avrdude
#Aitendo103R.upload.auto_reset=true
Aitendo103R.upload.protocol=ARMBOOT_STBEE
Aitendo103R.upload.speed=115200
#Aitendo103R.build.board=maple
Aitendo103R.build.board=Aitendo103R
Aitendo103R.build.mcu=STM32F103RB
Aitendo103R.build.family=cortex-m3
Aitendo103R.build.f_cpu=72000000L
Aitendo103R.build.core=maple
Aitendo103R.build.vect=VECT_TAB_FLASH
Aitendo103R.build.linker=maple/flashAitendo103R.ld
#Aitendo103R.build.linker=maple/flash.ld
Aitendo103R.build.using=armcompiler
Aitendo103R.build.density=STM32_MEDIUM_DENSITY
Aitendo103R.build.error_led_port=GPIOB
Aitendo103R.build.error_led_pin=8

libmaple.hは開始アドレスを指定

#ifdef BOARD_Aitendo103R
#define USER_ADDR_ROM 0x08002000
#else
#define USER_ADDR_ROM 0x08005000
#endif

boards.hはピンなサインを追加
#elif defined(BOARD_STM32VLD)
#include "maple_STM32VLD.h"
#elif defined(BOARD_Aitendo103R)
#include "maple_Aitendo103R.h"
#else

usb_config.h

#elif defined(BOARD_STM32VLD)
    #define VCOM_ID_PRODUCT      0x0004
    #define USB_DISC_DEV         GPIOB
    #define USB_DISC_PIN         9

#elif defined(BOARD_Aitendo103R)
    #define VCOM_ID_PRODUCT      0x0004
    #define USB_DISC_DEV         GPIOC
    #define USB_DISC_PIN         12
#else

maple_Aitendo103R.hを追加
PAxx, PBxx等のピン名でもアクセスできるようにしてみました。
/******************************************************************************
 * The MIT License
 *
 * Copyright (c) 2011 LeafLabs, LLC.
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *****************************************************************************/
/**
 * @file   maple_mini.h
 * @author Marti Bolivar <mbolivar@leaflabs.com>
 * @brief  Private include file for Maple Mini in boards.h
 *
 * See maple.h for more information on these definitions.
 */
#include "gpio.h"
#include "timer.h"
#include "wirish_types.h"
#ifndef _BOARD_MAPLE_MINI_H_
#define _BOARD_MAPLE_MINI_H_
#define CYCLES_PER_MICROSECOND    72
#define SYSTICK_RELOAD_VAL     71999 /* takes a cycle to reload */
#define BOARD_BUTTON_PIN          35
#define BOARD_LED_PIN             34
#define BOARD_NR_USARTS           3
#define BOARD_USART1_TX_PIN       26
#define BOARD_USART1_RX_PIN       25
#define BOARD_USART2_TX_PIN       9
#define BOARD_USART2_RX_PIN       8
#define BOARD_USART3_TX_PIN       1
#define BOARD_USART3_RX_PIN       0
#define BOARD_NR_SPI              2
#define BOARD_SPI1_NSS_PIN        7
#define BOARD_SPI1_MOSI_PIN       4
#define BOARD_SPI1_MISO_PIN       5
#define BOARD_SPI1_SCK_PIN        6
#define BOARD_SPI2_NSS_PIN        31
#define BOARD_SPI2_MOSI_PIN       28
#define BOARD_SPI2_MISO_PIN       29
#define BOARD_SPI2_SCK_PIN        30
#define BOARD_NR_GPIO_PINS        51
#define BOARD_NR_PWM_PINS         12
#define BOARD_NR_ADC_PINS          16
#define BOARD_NR_USED_PINS         8
#define BOARD_JTMS_SWDIO_PIN      22
#define BOARD_JTCK_SWCLK_PIN      21
#define BOARD_JTDI_PIN            20
#define BOARD_JTDO_PIN            19
#define BOARD_NJTRST_PIN          18
enum {
 PA0 = 11, PA1 = 10, PA2 = 9, PA3 = 8, PA4 = 7, PA5 = 6, PA6 = 5, PA7 = 4,
 PA8 = 27, PA9 = 26, PA10 = 25, PA11 = 24, PA12 = 23, PA13 = 22, PA14 = 21, PA15 = 20,
 PB0 = 3, PB1 = 33, PB2 = 2, PB3 = 19, PB4 = 18, PB5 = 17, PB6 = 16, PB7 = 15,
 PB8 = 32, PB9 = 34, PB10 = 1, PB11 = 0, PB12 = 31, PB13 = 30, PB14 = 29, PB15 = 28,
 PC0 = 35, PC1 = 36, PC2 = 37, PC3 = 38, PC4 = 39, PC5 = 40, PC6 = 41, PC7 = 42,
 PC8 = 43, PC9 = 44, PC10 = 45, PC11 = 46, PC12 = 47, PC13 = 14, PC14 = 13, PC15 = 12,
 PD0 = 48, PD1 = 49, PD2 = 50,
};
#endif
maple_Aitendo103R.cpp
全ピンアクセスできるようにPIN_MAPを拡張
boardPWMPinsはこれから修正します。

/******************************************************************************
 * The MIT License
 *
 * Copyright (c) 2011 LeafLabs, LLC.
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *****************************************************************************/
/**
 * @file   maple_mini.cpp
 * @author Marti Bolivar <mbolivar@leaflabs.com>
 * @brief  Maple Mini PIN_MAP and boardInit().
 */
#include "maple_Aitendo103R.h"
#include "gpio.h"
#include "wirish_debug.h"
#ifdef BOARD_Aitendo103R
/* Since we want the Serial Wire/JTAG pins as GPIOs, disable both SW
 * and JTAG debug support */
void boardInit(void) {
    disableDebugPorts();
}
extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = {
    /* Top header */
 // .*?/\*\s+D(\d+)/(P[A-G]\d+).*?\*/
 // \2 = \1,
    {GPIOB,   NULL, NULL, 11, 0, ADCx}, /* D0/PB11 */
    {GPIOB,   NULL, NULL, 10, 0, ADCx}, /* D1/PB10 */
    {GPIOB,   NULL, NULL,  2, 0, ADCx}, /* D2/PB2 */
    {GPIOB, TIMER3, ADC1,  0, 3,    8}, /* D3/PB0 */
    {GPIOA, TIMER3, ADC1,  7, 2,    7}, /* D4/PA7 */
    {GPIOA, TIMER3, ADC1,  6, 1,    6}, /* D5/PA6 */
    {GPIOA,   NULL, ADC1,  5, 0,    5}, /* D6/PA5 */
    {GPIOA,   NULL, ADC1,  4, 0,    4}, /* D7/PA4 */
    {GPIOA, TIMER2, ADC1,  3, 4,    3}, /* D8/PA3 */
    {GPIOA, TIMER2, ADC1,  2, 3,    2}, /* D9/PA2 */
    {GPIOA, TIMER2, ADC1,  1, 2,    1}, /* D10/PA1 */
    {GPIOA, TIMER2, ADC1,  0, 1,    0}, /* D11/PA0 */
    {GPIOC,   NULL, NULL, 15, 0, ADCx}, /* D12/PC15(OSC32_OUT) */
    {GPIOC,   NULL, NULL, 14, 0, ADCx}, /* D13/PC14(OSC32_IN) */
    {GPIOC,   NULL, NULL, 13, 0, ADCx}, /* D14/PC13 */
    /* Bottom header */
    {GPIOB, TIMER4, NULL,  7, 2, ADCx}, /* D15/PB7 */
    {GPIOB, TIMER4, NULL,  6, 1, ADCx}, /* D16/PB6 */
    {GPIOB,   NULL, NULL,  5, 0, ADCx}, /* D17/PB5 */
    {GPIOB,   NULL, NULL,  4, 0, ADCx}, /* D18/PB4 */
    {GPIOB,   NULL, NULL,  3, 0, ADCx}, /* D19/PB3 */
    {GPIOA,   NULL, NULL, 15, 0, ADCx}, /* D20/PA15 */
    {GPIOA,   NULL, NULL, 14, 0, ADCx}, /* D21/PA14 */
    {GPIOA,   NULL, NULL, 13, 0, ADCx}, /* D22/PA13 */
    {GPIOA,   NULL, NULL, 12, 0, ADCx}, /* D23/PA12(USB_DP) */
    {GPIOA, TIMER1, NULL, 11, 4, ADCx}, /* D24/PA11(USB DM) */
    {GPIOA, TIMER1, NULL, 10, 3, ADCx}, /* D25/PA10 */
    {GPIOA, TIMER1, NULL,  9, 2, ADCx}, /* D26/PA9 */
    {GPIOA, TIMER1, NULL,  8, 1, ADCx}, /* D27/PA8 */
    {GPIOB,   NULL, NULL, 15, 0, ADCx}, /* D28/PB15 */
    {GPIOB,   NULL, NULL, 14, 0, ADCx}, /* D29/PB14 */
    {GPIOB,   NULL, NULL, 13, 0, ADCx}, /* D30/PB13 */
    {GPIOB,   NULL, NULL, 12, 0, ADCx}, /* D31/PB12 */
    {GPIOB, TIMER4, NULL,  8, 3, ADCx}, /* D32/PB8(LED2) */
    {GPIOB, TIMER3, ADC1,  1, 4,    9}, /* D33/PB1 */
    {GPIOB, TIMER4, NULL,  9, 4, ADCx}, /* D34/PB9(LED1) */
   
    {GPIOC,   NULL, ADC1,  0, 0,   10}, /* D35/PC0(S2) */
    {GPIOC,   NULL, ADC1,  1, 0,   11}, /* D36/PC1(S3) */
    {GPIOC,   NULL, ADC1,  2, 0,   12}, /* D37/PC2 */
    {GPIOC,   NULL, ADC1,  3, 0,   13}, /* D38/PC3 */
    {GPIOC,   NULL, ADC1,  4, 0,   14}, /* D39/PC4 */
    {GPIOC,   NULL, ADC1,  5, 0,   15}, /* D40/PC5 */
    {GPIOC,   NULL, NULL,  6, 0, ADCx}, /* D41/PC6 */
    {GPIOC,   NULL, NULL,  7, 0, ADCx}, /* D42/PC7 */
    {GPIOC,   NULL, NULL,  8, 0, ADCx}, /* D43/PC8 */
    {GPIOC,   NULL, NULL,  9, 0, ADCx}, /* D44/PC9 */
    {GPIOC,   NULL, NULL, 10, 0, ADCx}, /* D45/PC10 */
    {GPIOC,   NULL, NULL, 11, 0, ADCx}, /* D46/PC11 */
    {GPIOC,   NULL, NULL, 12, 0, ADCx}, /* D47/PC12 */
   
    {GPIOD,   NULL, NULL,  0, 0, ADCx}, /* D48/PD0(OSC_IN) */
    {GPIOD,   NULL, NULL,  1, 0, ADCx}, /* D49/PD1(OSC_OUT) */
    {GPIOD,   NULL, NULL,  2, 0, ADCx}, /* D50/PD2 */
};
extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = {
    3, 4, 5, 8, 9, 10, 11, 15, 16, 25, 26, 27
};
extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = {
    3, 4, 5, 6, 7, 8, 9, 10, 11,
    33,
    35, 36, 37, 38, 39, 40,
};
#define USB_DP 23
#define USB_DM 24
extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = {
    BOARD_LED_PIN, BOARD_BUTTON_PIN, USB_DP, USB_DM,
    48, 49, //OSC
    12, 13, //OSC32
};
#endif

aitendoのSTM32F103R基板を作ってみました(armon移植編)

液晶工房(aitendo)777円基板のSTM32F103Rでirukaさんのarmonを動くようにしてみました。

  • Boot1で起動アドレス($8000000と$8002000)の切り替え
  • LED D1, D2の点灯
というシンプルな修正です。
BASEBOARD = AITENDO103Rでmakeします。

修正分(init.c, monit.c, aitendo103r-0000.hex, aitendo103r-2000.hex)のファイルはここから落してください。

リセットボタンではUSBが初期化されない既知の不具合があります。
MapleIDEを動かすのが目的なので、この問題は後回しです。
USBケーブルの抜き差しでしのいでます。

init.cとmonit.cの差分情報です。

--- monit.c Tue Jan 20 07:05:12 1970
+++ monit.c Tue Jan 20 07:05:12 1970
@@ -325,6 +325,10 @@
 #define FLASH_END_ADR 0x08020000 // 128k
 #endif

+#ifdef AITENDO103R
+#define FLASH_END_ADR 0x08020000 // 128k
+#endif
+
 #ifdef STBEE_MINI
 #define FLASH_END_ADR 0x08020000 // 128k
 #endif
--- init.c Tue Jan 20 07:05:12 1970
+++ init.c Tue Jan 20 07:05:12 1970
@@ -5,6 +5,7 @@
 #BASEBOARD = CQ_STARM
 #BASEBOARD = STBEE
 #BASEBOARD = STBEE_MINI
+#BASEBOARD = AITENDO103R
  */
 #include "stm32f10x.h"
 #include "platform_config.h"
@@ -51,6 +52,17 @@

 #endif

+#ifdef AITENDO103R
+#define LED_PORT  GPIOB
+#define LED_PIN   GPIO_Pin_9
+
+#define HWTYPE 2
+#define ROMSIZE (128/32) // 32kBの倍数.
+#define RAMSIZE (20/4)  //  4kBの倍数.
+#define SIGNATURESTRING "AITENDO103R"
+
+#endif
+

 #ifdef STBEE_MINI
 #define LED_PORT  GPIOA
@@ -283,6 +295,65 @@
 }
 #endif

+#ifdef AITENDO103R
+/*******************************************************************************
+* Function Name  : GPIO_Configuration
+* Description    : Configures the different GPIO ports.
+* Input          : None
+* Output         : None
+* Return         : None
+*******************************************************************************/
+void GPIO_Configuration(int sp)
+{
+ GPIO_InitTypeDef GPIO_InitStructureA;
+ GPIO_InitTypeDef GPIO_InitStructureB;
+ GPIO_InitTypeDef GPIO_InitStructureC;
+ GPIO_InitTypeDef GPIO_InitStructureD;
+
+ // GPIO A,B,C,D にクロックを与える.
+ RCC_APB2PeriphClockCmd(
+     RCC_APB2Periph_GPIOA |
+     RCC_APB2Periph_GPIOB |
+     RCC_APB2Periph_GPIOC | /* == RCC_APB2Periph_GPIO_IOAIN      */
+     RCC_APB2Periph_GPIOD   /* == RCC_APB2Periph_GPIO_DISCONNECT */
+     , ENABLE);
+
+ // GPIO_B
+ GPIO_InitStructureB.GPIO_Pin   = 0;
+ GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructureB.GPIO_Mode  = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOB, &GPIO_InitStructureB);
+
+ // GPIO_B.9 = LED1, GPIO_B.8 = LED2
+ GPIO_InitStructureB.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_8;
+ GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructureB.GPIO_Mode  = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOB, &GPIO_InitStructureB);
+
+ GPIO_SetBits(GPIOB , GPIO_Pin_9); // LED消灯.
+ GPIO_ResetBits(GPIOB , GPIO_Pin_8); // LED点灯.
+
+ //
+ // 0x0800_2000 起動でビルドした場合はユーザーファームウェアへのJUMP処理を行わない.
+ //
+#if BOOTLOADER_MODE
+ GPIO_SetBits(GPIOB , GPIO_Pin_8); // LED消灯.
+ GPIO_ResetBits(GPIOB , GPIO_Pin_9); // LED点灯.
+ int boot_jumper_pin ;
+ boot_jumper_pin = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2);
+ if(check_cold(sp))
+ if(boot_jumper_pin) { //ジャンパーオープン.
+  int *resvec = (int *) 0x08002000; // reset vector
+  int adrs = resvec[1];
+  if((adrs & 0xfff00000) == 0x08000000) { // 0x0800_0000 ~ 0x080f_ffff までの間にjump.
+   call_func(adrs);
+  }
+ }
+#endif
+}
+#endif
+
+

 #ifdef STBEE
 /*******************************************************************************
@@ -476,6 +547,15 @@
  GPIO_InitStructureA.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructureA.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructureA);
+
+#ifdef AITENDO103R
+ GPIO_InitTypeDef GPIO_InitStructureC;
+ // GPIO_C.8 = LED
+ GPIO_InitStructureC.GPIO_Pin   = GPIO_Pin_8;
+ GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructureC.GPIO_Mode  = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIOC, &GPIO_InitStructureC);
+#endif

  GPIOA->ODR = 0;  // USB D+ D- をGNDにする.

2011年7月10日日曜日

aitendoのSTM32F103R基板を作ってみました

液晶工房777円基板のSTM32F103Rを作ってみました。
目標はMapleとして使える環境構築です。
 


MCUはSTM32f103RBを8MHz駆動です。
この基板は新発売なのにSTM32F2xxを考慮したVSSになってません。少しだけ残念です。

今回は注射器を使ってペーストハンダを盛りつけてみました。

 


MCU等の高級部品は手ハンダで、それ以外の抵抗やコンデンサをコテライザーのホットブローで取り付けました。

 リフロー炉と違いペーストハンダの未加熱部分が出るので、ジップロックにアルコールを入れて基板洗浄します。
歯ブラシでゴシゴシします。濁ってるのはフラックスと未加熱のボールはんだです。


接点のある部品を取り付けたら完成です。
J2(Boot0) 2-3Close
J4 1-3、2-5Close
J6 = Open
でシリアルからST社のFlash Loader Demonstratorを使ってirukaさんのarmonを書き込みました。

次回はMaple環境構築編

aitendoのUSBaspを作ってみました

液晶工房777円基板に入っていたUSBaspを作ってみました。

MCUはATMEGA8Lを12MHzで使い、3.3Vレギュレータは省略しました。

 パイオニアのMac互換機時代のガラス製マウスパッドです。


ツェナーダイオードは3端子のRD3.6Mを無理やり使ってます。

FirmwareはAVR-DoperをHIDモード専用で再コンパイルしてます。
hardware.h
34行目
#define ENABLE_HID_INTERFACE    1
39行目
#define ENABLE_CDC_INTERFACE    0

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)後ねじ止めで作業終了。




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

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