マイコン関連

戻る

■ YAMAHA WR250R 車速センサー
■ PICでウインカーリレーを作る
■ PICで照度計モドキを作る
■ フォト・カプラとは


YAMAHA WR250R 車速センサー

ヤマハのオフロードバイクWR250R
WR250Rのメーターギヤはミッションにあるので、スプロケットの歯数を変更すると
スピードメーター,オドメーターが正確ではなくなってしまいます。 オフロードバイクの
ばあい、大抵は加速重視の歯数にするので、実際のスピードよりも多く表示されます。
オドメーターが余計に進んでしまうのはいやなので、余計に進まないように調整したいと
思いました。
マイコンです。 電子回路の知識に乏しく、とりあえず動いたというシロモノです。

■リアタイヤを手で回転させて、センサーからの信号を確認


■作成した回路図


無責任に回路です。 動かすにはソフトも必要です。
*LEDは動作確認の為に付けましたが、無くていいです。
車速パルスを1割引して実走テストしてみました。 とりあえず正常に動作しましたが
メーター読み80km/h以上がダメでした。 ソフトがいけないのかもしれません。
チャタリング対策の500を減らすか、無くしても良いかも?

■作成したプログラム

// ===========================================================================
// PIC       : 12F629
// IDE       : MPLAB IDE v8.63
// C Compiler: HI-TECH C Lite
// PROGRAM   : WR250R 車速パルス間引きプログラム
// ===========================================================================

#define	_LEGACY_HEADERS
#define	_XTAL_FREQ	4000000		//内蔵オシロ 4MHz
#include <pic.h>

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & UNPROTECT);

/*****************************************************************************
* define定義
*****************************************************************************/
#define _PULSE_INPUT_ON_	(GPIO & 0x20)		// GP5がHigh-LEVEL
#define _PULSE_INPUT_OFF_	(!(GPIO & 0x20))	// GP5がLow-LEVEL

/*****************************************************************************
* ノイズ対策関数      パルス入力の程度による
*****************************************************************************/
void NoiseDelay(void)
{
	__delay_us(500);
}

/*****************************************************************************
* メイン関数
*****************************************************************************/
void main(void)
{
	// ----------------------------------------------------------------------
	// 内部変数定義
	// ----------------------------------------------------------------------
	unsigned char		iCnt	= 0;		// 出力カウンタ
	const unsigned char	iMax	= 10;		// 間引きカウント
	const unsigned char	iMid	= 5;		// 中間(反転の判断)

	CMCON	= 0b00000111;

	// ----------------------------------------------------------------------
	// 【GPIO入出力】
	// bit5-0:   TRISIO5-0  TRISIO<3>は常に入力(1)
	//           bit1(=GP1=6ピン)を車速パルスの出力として使用する。
	//           bit2(=GP2=5ピン)をパルス出力の確認用として出力する。
	//           bit4(=GP4=3ピン)をパルス入力の確認用として出力する。
	//           bit5(=GP5=2ピン)を車速パルスの入力として使用する。
	// ----------------------------------------------------------------------
	TRISIO	= 0b00101000;

	// ----------------------------------------------------------------------
	// 【GPIOポート】
	// bit5-0:   GPIO I/Oピン
	// ----------------------------------------------------------------------
	GPIO		= 0x00;

	// ----------------------------------------------------------------------
	// 電源ON確認3秒  GP4 : ON->OFF
	// ----------------------------------------------------------------------
	GPIO |= 0x10;
	__delay_ms(2000);
	GPIO &= 0xEF;
	__delay_ms(1000);

	while(1)
	{
		// 入力:プルアップでLow-LEVELの場合
		//  (つまり、センサー側はHigh-LEVELになっている)
		if ( _PULSE_INPUT_OFF_ )
		{
			// 入力の確認用として、GP4=ON
			GPIO |= 0x10;

			// ノイズ対策
			NoiseDelay();
			if ( _PULSE_INPUT_ON_ )
				continue;

			// 出力High-LEVELカウント
			iCnt++;

			// パルス出力High-LEVEL (GP2,GP1)
			// 途中で反転させる
			GPIO = ( iCnt < iMid ) ? (GPIO | 0x06) : (GPIO & 0xF9);

			// 間引きカウントMAXでリセット
			if ( iCnt >= iMax )
				iCnt = 0;
			
			// 入力がHigh-LEVELになるのを待つ
			while ( _PULSE_INPUT_OFF_ )
			{
				asm("nop");
			}
		}
		else
		{
			// 入力の確認用として、GP4=OFF
			GPIO &= 0xEF;

			// ノイズ対策
			NoiseDelay();
			if ( _PULSE_INPUT_OFF_ )
				continue;

			// パルス出力Low-LEVEL (GP2,GP1)
			// 途中で反転させる
			GPIO = ( iCnt < iMid ) ? (GPIO & 0xF9) : (GPIO | 0x06);

			// 入力がLow-LEVELになるのを待つ
			while ( _PULSE_INPUT_ON_ )
			{
				asm("nop");
			}
		}
	}
}

2011.6.4(土)

YAMAHA WR250R ノーマル フロントスプロケット:13T、リアスプロケット:43T
FRONT(T)REAR(T)CHAIN(L)減速比スピード(%)
1242 3.500.94 
1243 3.580.92 
1244 3.670.9 1割引で釣り合う歯数
1245 3.750.88 
1246 3.830.86 
1247 3.920.84 
1248 4.000.82 
1249 4.080.81 
1250 4.170.79 
1251 4.250.77 
1252 4.330.76 
1342 3.231.02 
1343 108L3.311 ノーマル
1344 3.380.97 
1345 3.460.95 
1346 3.540.93 
1347 3.620.91 
1348 3.690.89 1割引で釣り合う歯数
1349 3.770.87 
1350 3.850.86 よくあるローギヤ
1351 3.920.84 
1352 4.000.82 
1442 3.001.1 
1443 3.071.07 
1444 3.141.05 
1445 3.211.02 
1446 3.291 
1447 3.360.98 
1448 3.430.96 
1449 3.500.94 
1450 3.570.92 
1451 3.640.9 
1452 3.710.89 
※スピード(%)の計算値は小数点第2位で切り捨てています。
※タイヤの減りなどによっても変わります.スピードメーターに正確を追い求めないほうが精神安定上よろしいかと思います.

2011.6.4(土),2012.6.9(土)

■作成したプログラムVer.2
入力パルスのカウント×90%の整数値の変化で出力パルスを作ればいいと、今更ながら分かりました。
以下、どうぞ

// ===========================================================================
// PIC       : 12F629
// IDE       : MPLAB IDE v8.63
// C Compiler: HI-TECH C Lite
// PROGRAM   : WR250R 車速パルス間引きプログラム Ver.2
// ===========================================================================

#define	_LEGACY_HEADERS
#define	_XTAL_FREQ	4000000		//内蔵オシロ 4MHz
#include 

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & UNPROTECT);

/*****************************************************************************
* define定義
*****************************************************************************/
#define _PULSE_INPUT_ON_	(GPIO & 0x20)			// GP5がHigh-LEVEL
#define _PULSE_INPUT_OFF_	(!(GPIO & 0x20))		// GP5がLow-LEVEL

void OutPulse(void);

/*****************************************************************************
* 外部変数定義
*****************************************************************************/
const unsigned short	iInMax	= 500;		// 入力MAX
unsigned short		iInCnt	= 0;			// 入力カウンタ
unsigned short		iOutCnt	= 0;			// 出力カウンタ
unsigned short		iRate	= 89;		// 比率 89%

/*****************************************************************************
* ノイズ対策関数      パルス入力の程度による
*****************************************************************************/
void NoiseDelay(void)
{
	//__delay_ms(1);
	//__delay_us(500);
	__delay_us(100);
}

/*****************************************************************************
* メイン関数
*****************************************************************************/
void main(void)
{
	// ----------------------------------------------------------------------
	// 【コンパレータ・コントロール・レジスタ】
	// bit6:   COUT:  コンパレータ出力
	// bit4:   CINV:  コンパレータ出力反転  1 - 出力反転 / 0 - 出力非反転
	// bit3:   CIS:   コンパレータ入力スイッチ
	// bit2-0: CM2-0: コンパレータモード  111 - コンパレータOFF(GP2-0はデジタルIO)
	// ----------------------------------------------------------------------
	CMCON	= 0b00000111;

	// ----------------------------------------------------------------------
	// 【GPIO入出力】
	// bit5-0:   TRISIO5-0  TRISIO<3>は常に入力(1)
	//           bit5(=GP5=2ピン)を車速パルスの入力として使用する。
	//           bit4(=GP4=3ピン)
	//           bit3(=GP3=4ピン)
	//           bit2(=GP2=5ピン)
	//           bit1(=GP1=6ピン)を車速パルスの出力として使用する。
	//           bit0(=GP0=7ピン)
	// ----------------------------------------------------------------------
	TRISIO	= 0b00101000;

	// ----------------------------------------------------------------------
	// 【GPIOポート】
	// bit5-0:   GPIO I/Oピン
	// ----------------------------------------------------------------------
	GPIO		= 0x00;

	// ----------------------------------------------------------------------
	// 電源ON確認3秒  GP4 : ON->OFF
	// ----------------------------------------------------------------------
	GPIO |= 0x10;
	__delay_ms(2000);
	GPIO &= 0xEF;
	__delay_ms(1000);

	// ----------------------------------------------------------------------
	// 無限ループ
	// ----------------------------------------------------------------------
	while(1)
	{
		// 入力:Low-LEVELの場合
		if ( _PULSE_INPUT_OFF_ )
		{
			// ノイズ対策
			NoiseDelay();
			if ( _PULSE_INPUT_ON_ )
				continue;

			OutPulse();
			
			// 入力がHigh-LEVELになるのを待つ
			while ( _PULSE_INPUT_OFF_ )
			{
				asm("nop");
				asm("nop");
				asm("nop");
			}
		}
		else
		{
			// ノイズ対策
			NoiseDelay();
			if ( _PULSE_INPUT_OFF_ )
				continue;

			OutPulse();

			// 入力がLow-LEVELになるのを待つ
			while ( _PULSE_INPUT_ON_ )
			{
				asm("nop");
				asm("nop");
				asm("nop");
			}
		}
	}
}

/*****************************************************************************
* パルス出力処理
*****************************************************************************/
void OutPulse(void)
{
	unsigned short iRateVal;		// 計算値

	// 入力カウント
	iInCnt++;

	// 計算値(結果は小数部切捨ての整数)
	iRateVal = iInCnt * iRate / 100;

	// 計算値が変化したら
	if ( iOutCnt != iRateVal )
	{
		// 出力カウンタを更新する
		iOutCnt = iRateVal;

		// パルス出力反転 (GP1)
		if ( GPIO & 0x02 )
		{
			GPIO &= 0xFD;
		}
		else
		{
			GPIO |= 0x02;
		}
	}

	// カウンタをリセット
	if ( iInCnt >= iInMax )
	{
		iInCnt = 0;
		iOutCnt = 0;
	}	
}

2011.6.4(土),2012.6.9(土),2012.6.15(金)



PICでウインカーリレーを作る

PICのプログラムは初歩のLEDピカピカ。12F509の単価が安い(@60)ので、 以前作成した(ネットの回路を参考に作った)ICウインカーリレーをPICで作ったらどうなるか、 試してみました。
12Vから5Vに減圧する必要があるなど設計上のデメリット?があるのと、部品数もあまり変わらない ような気がしてます。
また、部品を寝かせて配置したので、面積は若干大きくなってしまっています。 収穫は、電子部品の知識。。

2011.11.26(土)




PICで照度計モドキを作る




フォト・カプラとは

1次側(入力信号)と2次側(出力信号)がLEDを介して信号の検出を行う部品らしいです。 安いものでも@300円位。テストで1次側に5V電源をそのまま接続したからなのか、ひとつ故障させてしまいました。 電子パーツ屋さんで試しに購入したHCPL-2611は、米AVAGO社の製品。東芝ではTLP2601が相当品との事。
(やっぱり日本語があるといいな、と思いつつ・・)
1次側はLEDが内蔵されている事を念頭に(というよりデータシートに従えって?)定電流ダイオードを挟む。
信号の検出は6番ピンで、プルアップ抵抗を使用。

2012.1.29(日)