2017年7月17日月曜日

Arduinoアプリケーション用基本クラス

Arduino用の実験アプリをあれこれ作っているわけですが、アプリを作る場合、最低限必要な機能があるのでアプリケーション用基本クラスを作成しました。今後公開するアプリはみなこのクラスの派生クラスとして実装しますので、とりあえず公開しておきます。
時間を見てgithubに公開しようと思いますがそれまでの仮です^^;

KyaDefine.h

#ifndef _KyaDefine_h_
#define _KyaDefine_h_
/**
 * 定数定義
 *
 * filename:  KyaDefine.h
 *
 * @package
 * @version   1.0.0
 * @copyright Copyright (C) 2017 Yoshio Kiya
 * @date      2017-05-16
 * @author    木屋 善夫
 */
#define UINT unsigned int

// Arduino15\packages\digistump\hardware\avr\1.6.7\cores\tiny/Print.h で使っている!
//#ifndef BYTE
//  #define BYTE unsigned char
//#endif

#ifndef WORD
  #define WORD unsigned short
#endif

#ifndef DWORD
  #define DWORD unsigned long
#endif

#ifndef PCSTR
  #define PCSTR const char*
#endif

// 要素数を返す
#define numberof( a ) ((sizeof a) / (sizeof a[0]))

#define TRUE 1
#define FALSE 0

#if !defined( D0 ) && defined( ARDUINO_AVR_UNO )
  enum {
    D0  =  0,
    D1  =  1,
    D2  =  2,
    D3  =  3,
    D4  =  4,
    D5  =  5,
    D6  =  6,
    D7  =  7,
    D8  =  8,
    D9  =  9,
    D10 = 10,
    D11 = 11,
    D12 = 12,
    D13 = 13,
  };
#endif

#endif

KyaApp.h

#ifndef _KyaApp_h_
#define _KyaApp_h_
/**
 * アプリケーションの基本クラス
 *
 * filename:  KyaApp.h
 *
 * @package
 * @version   1.0.0
 * @copyright Copyright (C) 2017 Yoshio Kiya
 * @date      2017-05-16
 * @author    木屋 善夫
 */
#include
#ifdef KYA_TIMER_INTERVAL
  #ifndef ESP8266
    #include
  #else
    // ミリ秒をクロック数に換算 (@80MHz)
    #define MSEC2CLOCK(ms)  (ms * 80000L)
  #endif
#endif

#include

#ifdef KYA_DEBUG
#define TRACE KyaApp::trace( __FUNCTION__, __FILE__, __LINE__ );
#else
#define TRACE
#endif

// 3Dベクター
template
class KyaVec3 {
public:
  TYPE x;
  TYPE y;
  TYPE z;
};

// 時刻
typedef union KyaTime {
  DWORD val;
  struct {
    uint8_t s;
    uint8_t m;
    WORD h;
  };
};

//printf で小数を扱うためのマクロ
// ex. printf( "%d.%02d", printfFloat( val, 100 ) );
// 小数点以下2桁が表示される
#define printfFloat( v, c ) (int)v, abs( (int)((v - (int)v) * c) )

//// イベントハンドル
//@@ 関数ポインターではなくメンバー関数へのポインターにしなければならない
//template
//class KyaHandle
//{
//public:
//  void *mFunc( TYPE );
//  int mMilli;
//  TYPE mArg;
//
//  KyaHandle( void *func( TYPE ), int delay, TYPE arg ) {
//    mFunc = func;
//    mMilli = millis() + delay;
//    mArg = arg;
//  }
//}

class KyaApp
{
private:

protected:

public:
  static KyaApp* app;
  static char gPfb[256];

  /**
   * 構築
   *
   * @access public
   */
  KyaApp( ) {
    app = this;
  };

  /**
   * 設定
   *
   * @access public
   */
  virtual void onSetup( ) {
    TRACE
#ifdef KYA_TIMER_INTERVAL
  #ifndef ESP8266
    MsTimer2::set( KYA_TIMER_INTERVAL, timerEntry );  // 割り込みハンドラの設定
    MsTimer2::start();                                // タイマー割り込み開始
    Serial.println( "MsTimer2::start()" );
  #else
    // タイマ割り込みの設定
    noInterrupts();

    timer0_isr_init();

    // ハンドラのエントリを設定
    timer0_attachInterrupt( timerEntry );

    // 次回の割り込みが発生するまでの時間を設定
    timer0_write(ESP.getCycleCount() + MSEC2CLOCK(KYA_TIMER_INTERVAL) ); // 10msec

    interrupts();
  #endif
#endif  // KYA_TIMER_INTERVAL
  }

  /**
   * ループの中身
   *
   * @access public
   */
  virtual void onLoop() {
  }

  /**
   * タイマーハンドラ
   *
   * @access public
   */
  virtual void onTimer( ) {
  }

  /**
   * ミリ秒を 時分秒でシリアルに出力
   *
   * @param  DWORD ms ミリ秒
   * @param  const char* suffix 時分秒のあとに付ける文字列
   */
  void printMillis( DWORD ms, const char* suffix = NULL );

#ifdef KYA_TIMER_INTERVAL
  /**
   * 17ms毎にここが呼び出される
   */
  static void timerEntry( ) {
  #ifdef ESP8266
    // 次回の割り込みが発生するまでの時間を設定
    timer0_write(ESP.getCycleCount() + MSEC2CLOCK(KYA_TIMER_INTERVAL) ); // 10msec
  #endif

    // 割り込み処理ハンドラを呼び出す
    if ( KyaApp::app ) {
      KyaApp::app->onTimer( );
    }
  }
#endif  // KYA_TIMER_INTERVAL

  /**
   * LED 点滅
   *
   * @access public
   * @param
   */
//  static void blinkLED( UINT port, UINT blight, UINT usec, UINT count = 1, UINT duty = 128 );
  static void blinkLED( uint8_t port, uint8_t usec, uint8_t count = 1, uint8_t blight = 255, uint8_t duty = 128 );

  /**
   * LED 点滅
   *
   * @param  uint8_t port ピン番号
   * @param  WORD counter カウンター
   * @param  WORD high HIGH にする回数
   * @param  WORD low  LOW にする回数
   * @return WORD カウンター
   */
  static WORD blinkLED2( uint8_t port, WORD counter, WORD high, WORD low );

  /**
   * LED 点滅
   *
   * @param  uint8_t port ピン番号
   * @param  int high HIGH の時間(msec)
   * @param  int low  LOW  の時間(msec)
   */
  static void blinkLED3( uint8_t port, int high, int low );

  /**
   * LED 点滅
   *
   * @param  uint8_t port  ポート
   * @param  WORD pos   現在位置
   * @param  WORD speed 速度
   * @return 次の位置
   */
  static WORD winkLED( uint8_t port, WORD pos, WORD speed = 1 );

  /**
   * 書式付きコンソール出力
   *
   * @param  PCSTR format 書式文字列
   */
  static void printf( PCSTR format, ... );

  static void puts( PCSTR str ) {
    Serial.println( str );
  }

  static void putstr( PCSTR str ) {
    Serial.print( str );
  }

  /**
   * ミリ秒から時分秒を取得
   *
   * @access public
   * @param  unsigned long msec ミリ秒
   * @return KyaTime 時分秒
   */
  KyaTime msecToTime( unsigned long msec );

  /**
   * トレース
   *
   * @param
   * @return
   */
  static void trace( PCSTR func, PCSTR file, int line );
};

#endif

KyaApp.cpp

/**
 * アプリケーションの基本クラス
 *
 * filename:  KyaApp.cpp
 *
 * @package
 * @version   1.0.0
 * @copyright Copyright (C) 2017 Yoshio Kiya
 * @date      2017-05-16
 * @author    木屋 善夫
 */
#include "KyaApp.h"

KyaApp* KyaApp::app = NULL;
char KyaApp::gPfb[256];

/**
 * ミリ秒を 時分秒でシリアルに出力
 *
 * @param  DWORD ms ミリ秒
 * @param  const char* suffix 時分秒のあとに付ける文字列
 */
void KyaApp::printMillis( DWORD ms, const char* suffix ) {
  // 起動してからの時間を表示
  int h, m, s;
  s = ms / 1000;
  if ( s >= 60 ) {
    m = s / 60;
    s = s % 60;
    if ( m >= 60 ) {
      h = m / 60;
      m = m % 60;
    } else {
      h = 0;
    }
  } else {
    h = 0;
    m = 0;
  }

  char buff[255];
  sprintf( buff, "%02d:%02d:%02d", h, m, s );
  Serial.print( buff );

  if ( suffix ) {
    Serial.print( suffix );
  }
}

/**
 * LED 点滅
 *
 * @param
 * @return
 */
//void KyaApp::blinkLED( UINT port, UINT blight, UINT usec, UINT count, UINT duty )
void KyaApp::blinkLED( uint8_t port, uint8_t usec, uint8_t count, uint8_t blight, uint8_t duty )
{
  while ( (count --) > 0 ) {
    // on
    if ( blight < 255 ) {
      analogWrite( port, blight );
    } else {
      digitalWrite( port, HIGH );
    }
    if ( duty != 0 ) {
      delay( (usec * duty) >> 8 );
    }

    // off
    digitalWrite( port, LOW );
    if ( duty != 255 ) {
      delay( (usec * (255 - duty)) >> 8 );
    }
  }
}

/**
 * LED 点滅
 *
 * @param  uint8_t port ピン番号
 * @param  WORD counter カウンター
 * @param  WORD high HIGH にする回数
 * @param  WORD low  LOW にする回数
 * @return WORD カウンター
 */
WORD KyaApp::blinkLED2( uint8_t port, WORD counter, WORD high, WORD low ) {
  WORD t = (counter ++) % (high + low);

  if ( t < high ) {
    digitalWrite( port, HIGH );
  } else {
    digitalWrite( port, LOW );
  }

  return counter;
}

/**
 * LED 点滅
 *
 * @param  uint8_t port ピン番号
 * @param  int high HIGH の時間(msec)
 * @param  int low  LOW  の時間(msec)
 */
void KyaApp::blinkLED3( uint8_t port, int high, int low ) {
  int t = millis( ) % (high + low);
  if ( t < high ) {
    digitalWrite( port, HIGH );
  } else {
    digitalWrite( port, LOW  );
  }
}


/**
 * LED 点滅
 *
 * @param  uint8_t port  ポート
 * @param  WORD pos   現在位置
 * @param  WORD speed 速度
 * @return 次の位置
 */
WORD KyaApp::winkLED( uint8_t port, WORD pos, WORD speed ) {
  // LEDの点滅
  uint8_t b;
  if ( !(pos & 0x100) ) {
    // < 0x100 is rise
    b = (uint8_t)pos;
  } else {
    // >= 0x100 is set
    b = 0xFF - (uint8_t)pos;
  }
  analogWrite( port, b );

  return pos + speed;
}

/**
 * 書式付きコンソール出力
 *
 * @param  PCSTR format 書式文字列
 */
void KyaApp::printf( PCSTR format, ... ) {
  char buff[256];
  va_list arg;

  va_start( arg, format );
  vsnprintf( buff, sizeof( buff ) - 1, format, arg );
  va_end( arg );

  // 改行で分割しながら描画
  char* p = buff;
  char* f;
  while ( (f = strchr( p, '\n' )) != NULL ) {
    // 終端文字を設定
    *f = 0;
    // 改行付きで主力
    Serial.println( p );
    // 見つけた改行文字の次
    p = f + 1;
  }

  // 文字列が残っていたら主力する
  if ( *p ) {
    Serial.print( buff );
  }
}

/**
 * ミリ秒から時分秒を取得
 *
 * @access public
 * @param  unsigned long msec ミリ秒
 * @return KyaTime 時分秒
 */
KyaTime KyaApp::msecToTime( unsigned long msec )
{
  KyaTime res;

  // 秒単位に変換
  msec = msec / 1000;

  // 秒数を抽出
  res.s = (uint8_t)(msec % 60);

  // 分単位に変換
  msec = msec / 60;

  // 分数を算出
  res.m = (uint8_t)(msec % 60);

  // 時単位に変換
  msec = msec / 60;

  // 時間数を取得
  res.h = (WORD)msec;

  return res;
}


/**
 * トレース
 *
 * @param
 * @return
 */
void KyaApp::trace( PCSTR func, PCSTR file, int line ) {
  Serial.print( func );
  Serial.print( "() " );
  Serial.print( file );
  Serial.print( "(" );
  Serial.print( line );
  Serial.print( ")" );
  Serial.println( );
}

/**
 * 設定エントリ
 */
void setup() {
  Serial.begin( 115200 );
  Serial.println( "" );

  if ( KyaApp::app != NULL ) {
    KyaApp::app->onSetup( );
  } else {
    Serial.println( "KyaApp::app == NULL." );
  }
}

/**
 * ループエントリ
 */
void loop() {
  if ( KyaApp::app != NULL ) {
    KyaApp::app->onLoop( );
  } else {
    Serial.println( "KyaApp::app == NULL." );
    delay( 60 * 1000 );
  }
}

2017年7月7日金曜日

Ubuntu で Digispark Kickstarter

OS を Windows 10 から Ubuntu 17.04 に変えまして、Arduino IDE を使い始めたのですが Digispark Kickstarter に書き込みをしようとしたところエラーが発生しました。このあたりについてに日本語の情報が少ないようなのでメモ書き程度ですが記事にします。

■ スケッチ書き込み時に libusb-0.1-4 が見つからないと言われる

マイコンボードに書き込む」ボタンを押し「> Please plug in the device ... 」と表示されたところでUSBを差すと「error while loading shared libraries: libusb-0.1.so.4: cannot open shared object file: No such file or directory」とエラーが発生します。

最大6012バイトのフラッシュメモリのうち、スケッチが812バイト(13%)を使っています。
グローバル変数は13バイトのRAMを使用しています。
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
/home/kiya/.arduino15/packages/digistump/tools/micronucleus/2.0a4/micronucleus: error while loading shared libraries: libusb-0.1.so.4: cannot open shared object file: No such file or directory
どうやらライブラリーが足りないようです。

解決策は下記のページに書かれていました。
https://askubuntu.com/questions/311401/libusb-0-1-so-4-shared-lib-error-in-ubuntu-64-bit-system

[kiya@kiya ~]$ sudo apt-get install libusb-0.1-4

■ スケッチ書き込み時に micronucleus で例外が発生したと言われる

これでうまくゆくかと思ったら今度は「micronucleus: library/micronucleus_lib.c:66: micronucleus_connect: Assertion `res >= 4' failed.」というエラーが発生します…

最大6012バイトのフラッシュメモリのうち、スケッチが812バイト(13%)を使っています。
グローバル変数は13バイトのRAMを使用しています。
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
> Please plug in the device ...
micronucleus: library/micronucleus_lib.c:66: micronucleus_connect: Assertion `res >= 4' failed.
> Press CTRL+C to terminate the program.
Aborted (core dumped)
え〜、ツールの中で例外が発生したの?そんなこと言われたってどうしたいいのかわからないです…

対策は下記のページに書かれていました。どうやらデバイスへのアクセス権が不足しているらしいです。
https://digistump.com/wiki/digispark/tutorials/linuxtroubleshooting

1. 下記の内容の「/etc/udev/rules.d/49-micronucleus.rules」というファイルを作ります。

[kiya@kiya ~]$ sudo vi /etc/udev/rules.d/49-micronucleus.rules
# UDEV Rules for Micronucleus boards including the Digispark.
# This file must be placed at:
#
# /etc/udev/rules.d/49-micronucleus.rules    (preferred location)
#   or
# /lib/udev/rules.d/49-micronucleus.rules    (req'd on some broken systems)
#
# After this file is copied, physically unplug and reconnect the board.
#
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
#
# If you share your linux system with other users, or just don't like the
# idea of write permission for everybody, you can replace MODE:="0666" with
# OWNER:="yourusername" to create the device owned by you, or with
# GROUP:="somegroupname" and mange access using standard unix groups.
2. ルールをリロードします。
[kiya@kiya ~]$ sudo udevadm control --reload-rules

以上でスケッチを書き込めるようになりました。


2017年6月14日水曜日

Pro Micro (クローン) 不明なUSBデバイス

Sparkfun Pro Micro、コピー品だと Amazo で 500円、AliExpress なら 340円ほどで手に入ります。
Leonardo 互換でこのサイズなのでなにかと使いやすいのですが、ちょっとだけ癖がありますので備忘録として残します。

Arduino IDE で書き込む際に、「ボード」にて「Sparkfun  Pro Micro」を選択するのですが、その際現れる「プロセッサ」にはデフォルトで「ATmega32U4(3.3V,8MHz)」が選択されています。

5V,16MHz版にこの状態で書き込んでしまうとブートローダーが破壊され「不明なUSBデバイス(デバイス記述子要求の失敗)」と表示されてシリアル接続ができなくなり、以後書き込むことができなくなってしまうのです。

こうなってしまった場合は単独では復旧させることは難しいと思います。

私の場合は、AdruinoISP スケッチを書き込んだ Arduino UNO に Pro Micro を接続して、「書込装置」に「Arduino as ISP」を選択して「ブートローダーを書き込む」にて復旧させることができました。

Arduino UNO Pro Micro 信号
D13 15 SCK
D12 14 MISO
D11 16 MOSI
D10 RST RESET
5V VCC
GND GND
 

2016年9月11日日曜日

Google Apps Script スプレッドシートから実行

健康管理のために毎食のカロリーを記録しています。
カロリー計算にはGoogleスプレッドシートに各食材のカロリー、グラム数、グラムあたりのカロリーを入力して計算させています。
このグラムあたりのカロリーを持ってくるのが一手間なんですよねぇ。始めの頃はネットで調べたり以前作ったカロリー表から持ってきていたのですが、このスプレッドシートへの記録も初めて3ヶ月、だいぶ情報が溜まってきました。
ということで、食材を入力すると過去のデータを検索して同名があれば自動でgあたりのカロリーを入力するマクロを作成しました。

前置きが長くなりましたがここからが本題です。

いざ出来上がったはいいのですが、このマクロを起動する方法を調べると、旧バージョンでは「スクリプトマネージャ」というものがあってそこから実行できたらしいのですが、新バージョンではこれがなくなり「スクリプトエディタ」を開いてそこから実行するしかないらしいのです…これではいくらなんでも使いにくすぎますよね。

何か方法はないかと調べてみると、スプレッドシートにメーニューを追加できる!おお!ここのメニューに自作関数を入れてやればできるじゃん!
function onOpen(){
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [];
  menu.push( {name: "myFunctionの実行", functionName: "myFunction"} );
  spread.addMenu( "マクロ", menu );
}
簡単!

2016年4月11日月曜日

ムーヴ・ラテ メーター交換


1眼メーターをタコメーター付きの2眼に交換したのでその記録です。

■対象車両スペック

メーカー名ダイハツ車種名ムーブ・ラテ
グレード名X排気量660 cc
年式平成18年 (2006年) 7月型式DBA‐L550S

■情報集め

まずは情報集め。私のやりたいことそのものを書かれている方がいらっしゃいました\(^o^)/


どうやら1眼と2眼ではカプラーの配線がかなり違っているらしいのでこの情報を探しましたが、探し方が悪いのか見つかりませんでした。

友人が整備工場をやっているのでそちらに問い合わせるも予想通りサービスマニュアルはディーラーでないと無理…

う~ん、一番肝心の配線図がないとどうにもならない…
上記ページには手作りらしき変換図の写真がアップされていますが年式によっても違いがあるらしく不安だなぁと思いつつもとりあえずどの程度費用がかかるかの概算を出すためパーツ物色を始めました。

■パーツの物色

細かいことはこの後をみてもらうとして、結論としては合計で1万円以下で出来そうなのでいっちょ頑張ってみるか~ということになりました。

1. メーター

これがなきゃ話にならないわけで…
ヤフオクの相場は4~6千円くらいで走行距離によって値段が違ってくるような感じでした。

2. メーターフード

ヤフオクの相場は500円~1500円くらい。私のラテのインパネは白なのですが、2眼の白は無いようでちょっと残念。ざっと見た感じではシルバーか木目。木目は6千円とかしている…

3. メーター裏コネクタ

上記のページの方はターミナルリリースツールを使って配線を組み替えたそうなのですが、もとに戻すことを考えると変換ケーブルを自作するのが良いだろうと思い検索してみたところ、メーターのコネクタは「住友​電装​ 025​型​ NH​ 40極​ カプラー​」らしいということがわかりました。これをググってみると幾つかの通販サイトで扱っており価格はオスメスセットで1050円。

4. OBD2コネクタ

回転数信号を取り出すのはハンドル下のOBD2(故障診断コネクタ)が良いらしいので、このコネクタも同様に探しました。「住友電装製 OBD-Ⅱ16極オス端子側カプラ」こちらはカプラと端子1本で880円。

5. 電工ペンチ

ギボシなどをかしめる電工ペンチは持っていたのですが、メーター裏のコネクタは025型でかなり細くかしめるには専用の工具が必要そうだったので探してみたところAmazonで売ってました。「エーモン 1431 細線用電工ペンチ」1768円

■部品調達

品名価格
メーター2,214円
フード2,376円
025型NHコネクタ1,410円
OBD2コネクタ1,210円
電工ペンチ1,768円
電線120円
合計9,098円

1.メーター

ヤフオクにて950円で出品されているものを発見!速攻入札、2日後に無事落札出来ました。走行距離は46345km、かなり減ってしまいますが乗り潰すつもりなので問題ないかな?
落札価格は950円でしたがストアだったので消費税込みで1026円、送料は1188円とちょっとお高め、合計2214円でした。

2. メーターフード

こちらもヤフオク、即決1500円税込み1620円でした。送料は756円、合計2376円でした。

3. 025型NHコネクタ

ユニークシステムにて、オス/メス(端子付き)セット税込み1050円、送料360円、合計1410円でした。

4. OBD2コネクタ

配線.comにて、オスコネクタ864円(税込み)、オス端子1本86円(税込み)、送料260円、合計1210円でした。

5. 細線用電工ペンチ

こちらはAmazonにて1768円で購入プライム会員なので送料は無料でした。

6. 電線

025型NHの端子は0.2~0.5mmの電線に対応しているらしいのですが、どの太さが正解なのかよくわからず、ググっていると0.3mmの電線とのセット販売というのが引っかかってきたので、0.3mmにすることにしました。
近所のカインズホームにゆくと切り売りが1m20円、6色ほどあったので、20円×6本購入。合計120円でした。

■変換ケーブル作成


1. 配線図作成

上記のでめきん33さんの記事を元に、変換ケーブルの配線図を作成しました。
※水色が自身のピン番号、橙色が相手のピン番号

2. ケーブル作成

0.3mmの電線を10cmに切り両端に025型NHのオスメス端子を圧着、これを32本作成しました。
まずは、オスカプラ(車両側)に1眼の配線が刺さっているところ全てに端子を挿しまして、次に1ピンから順にメスカプラ(メーター側)の対応するピンへ刺してゆきました。
30cmほど残った白ケーブルに025型NHのメス端子とOBD2オス端子を圧着、メータ側の38ピンとOBD2オスカプラの9ピンをつないで出来上がりです。

■換装

いよいよ換装です。はたしてちゃんと動くでしょうか?

1. 現在の走行距離を記録

特に必要ないかなとも思うのですが、車検の時に走行距離が減っていることについて聞かれた時に説明するためオドメーターの写真をとっておきます。(実走行距離の証拠にも何もなりませんが^^;)

2. 現メーターの取り外し

これはめっちゃ簡単、メーターパネルフードの左下のあたりに内張り剥がしを差し込んで左下、右下、右上、左上の順に嵌めこみを外してやるだけ、メーター本体も手前に引っ張ってやるだけで簡単に外れました。

3. 変換ケーブ装着

2眼(タコメーター付き)と車両側カプラの間に変換ケーブルを挟んで回転信号を取り出すOBD2コネクタを下に垂らしてやれば出来上がり。

4. OBD2コネクタ接続

ハンドル下のOBD2コネクタに回転数信号取り出し線を接続。
実は、はじめこのコネクタの名称がわからずカプラが購入できなかったので、余った025型NHオス端子を直接挿していました(写真がそうです)これでも十分に実用になりましたのでOBD2カプラ(約千円)がもったいないのであれば直結でも良いかもしれません。

5. メーター取り付け

取り外しの逆で至極簡単。

6. 完成

キーを入れスイッチをオン、とりあえず警告ランプ類は正しく動作、エンジンを掛けるとタコメーターも正しく動作!う~ん、感無量。

7. 最後に新メーターの距離を記録

1. 同じ意味で一応新メーターの走行距離を記録しておきます。しかし、走行距離が半分近くになってしまった^^;まぁ、この車8万キロでタイミングベルト交換してあるのでそれほど不自由はしないでしょう。

■最後に

諸々調べたりするのに1週間、オークションや通販でパーツを揃えるのに1週間、変換ケーブルの作成に2日ほどかかりましたが、やはりタコメータがあるとなんとなく気持ちいいです\(^_^)/