休みというのに、こんな自宅内に引き篭もって半田ごて握っているとですね、Facebookのアホウからこんな通知が。
iPhone 002

「Facebookでもっと友達をみつけよう」

やかましいw

そもそもFacebookは友達でも無いのに友達かも?とか、
むしろ積極的に他人になりたい
お方まで「友達かも?」と写真付で押し付けるのが気に入らん。
そりゃぁFB側からすると、ソーシャルグラフこそが基板なんでしつこくなるのも分かるけど。

ある日会社のお知り合いの人から友達申請が来たので許可すると、「ともだちかも?」に
水着のおねぇちゃんが沢山表示され、
なんだ?なんだ?とよくみるとAKB48のプロモーションアカウントの山だった
ちゅー事がありました。

もうやだ(笑)


ま、おいといて、米屋太さんからパチったTZR250(3XV)のタコメータですが、早く返さないと、という事でちょっとだけやっつけ仕事入れつつ(サーセン)、回路を組んでみました。
iPhone 006

16ピンのソケットが無かったので、20ピンのゲタに7774Aを装着してます。
また、手持ちに丁度良いのが無かった為、3MAのタコ基板から150Kの抵抗、ツェナーダイオード等の入力インターフェイスをパチってます。


全体感はこんな感じ。
iPhone 005

ちゅーことで、穴の開いた黒いタンクを黄色いタンクに換装しつつ試してみることとしました。
iPhone 003

んで火入れ。

もっとブリブリまわせばいいのですが、音楽教室の向かいという立地条件では、私の良心リミッターが発動しますので、これが限界です。
あぁ、しかしなんだかステッピンな感じすね。
アイドリング時にピクピクしているのは故障とかでは無く、「正確」なだけです。
シングルなんて、毎回この程度の回転数の差は生じています。
なんとなくこれみてると自分用ほしくなってきました。

でも良くみるとフカした際に時々ノイズを食っている感じはしますね。
原因は色々と考えられますが、まぁ電線剥いて突っ込んでるだけなんで、、、。
入力回路はヤマハ純正NS製のものをそのまま引っ張ってきているのですが、手を抜いてパルス検出をRising edgeで見ているのが原因かも知れません。
回路からしてFalling edgeが正しいとは思いますのでそちらに変えてみようかと思います。
その他と言えば、7774側のPowerSave機能をエンジンが掛かっている時にも使ってるってのが気になるかな。
これは正直時間のかかる処理だろうと思うので、パルス検出したら無効にする様にしてみます。
その他、、、これはもうどうしようも無いのですが失火、ちゅーか発火ミス。
CDIが発火してくれないと、どうしようもないですが、可能性は低いと思ってます。

アナログタコメーターならタルい動きで色々吸収できますけど、ステッピングタコはソフトで吸収するしかありません。

まぁなんのかんのとゴタク並べるよりは波形見た方が早いんですが・・・。

ノイズ食ってるっていうとコンデンサーガーとかアーシングガーとか言って電線変えたりコンデンサ変えたりしてみたい気もしますが(嘘です)、今回の場合はノイズを吐いているという表現になるかもしれません。
詳細はこの辺に書いておきました。

ソフト側で常識を超えた回転数の差が出たら無視するなどのノイズリダクション処理も検討します。
(ちなみに自作YPVSコントローラでは入れてます)

3XV純正メーターは登りの追従性は良く、下り(電圧を抜く方向)は本当に遅い事が良く分かります。
登りのピックアップを良くする為に下りが犠牲になっている可能性があります。
3XVのタコは頑張って作ってあり、メーターのスケールも現物合わせして微妙に回転数の間隔が違っています。
PICソースを見れば分かりますが、少しこのスケールにあわせて調整しています。

ピックアップについては機械式タコとデイトナの電気式タコを比較してますので参考までに。


あ、あと米屋太さん、アルモクさん、業務連絡です。
レッドゾーンランプですが、別に組もうと思っています。
なんでかつーと、、、ベーヤタさんタコメータみてくんないからw
もっと上の方に簡単につけられて、ダイヤルで調整できる小さい箱にした方が良いよね?

動作確認まで行きましたので、現時点での回路図とソースと公開します。
いつもの事ながらBSDライセンスですんで、煮るなり焼くなりどうとでも。


無題


ソースはこんな感じ。
作りかけなんで参考までに。まだ改造します。
追記:ベーヤタ号はバッテリーレスなので、ちょっと変な動きをしました。
修正が必要です。
[コードを表示する]
/* -----------------------------------------------------------------------------------------
              PIC12F1822 Pinout
              +--------+
          Vdd |1      8| GND
 Captre>- RA5 |2      7| RA0 -> OUT_B
  LED  <- RA4 |3      6| RA1 -> OUT_A
  MCLR -> RA3 |4      5| RA2 -> Suspend
              +--------+
----------------------------------------------------------------------------------------- */

#include <xc.h> // include standard header file

// set Config bits
#pragma config FOSC=INTOSC	// Oscillator Selection bits
#pragma config PLLEN=OFF	// PLL Enable bit
#pragma config WDTE=OFF		// Watch dog timer enable bit
#pragma config MCLRE=OFF	// MCLEAR enable bit
#pragma config CLKOUTEN=OFF	// Clock Out Enable bit
#pragma config IESO=OFF		// Internal External Switchover bit
#pragma config FCMEN=OFF	// Fail-Safe Clock Monitor Enable bit
#pragma config CP=OFF		// Code Protection bit
#pragma config CPD=OFF		// Data Code Protection bit
#pragma config BOREN=ON		// Brown-out Reset Enable bits
#pragma config WRT=OFF		// Flash Memory Self-Write Protection bits
#pragma config STVREN=ON	// Stack Overflow/Underflow Reset Enable bit
#pragma config BORV=LO		// Brown-out Reset Voltage Selection bit
#pragma config LVP=OFF		// Low-Voltage Programming Enable bit

// Definitions
#define _XTAL_FREQ  8000000        // this is used by the __delay_ms(xx) and __delay_us(xx) functions

#define OUTA		LATA1
#define OUTB		LATA0
#define SMD_SBY	LATA2
#define SM_SENS	RA3
#define LED		LATA4
#define INPULSE	RA5

#define HH()	{OUTA=1;OUTB=1;}
#define LH()	{OUTA=0;OUTB=1;}
#define LL()	{OUTA=0;OUTB=0;}
#define HL()	{OUTA=1;OUTB=0;}

#define TURN_L 1
#define TURN_R 0
#define SM_PULSE_INTERVAL	5
#define RPM1000	5
#define RPM6000	80
#define RPM9000	123
#define RPM_CV	1	//correction value
#define RPMMAX	280
// Global
unsigned int gSMTarget = 0;
unsigned int gPos = 0;

/* -----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- */
void interrupt Interrupt()
{
	if(CCP1IF)
	{
		signed char deg;
		unsigned int ccpr1;

		// Reset Timer1
		TMR1H=0;
		TMR1L=0;
		
		// RPM
		ccpr1 = ((CCPR1H * 0x100)|CCPR1L) + 1;
		gSMTarget = (unsigned int)(822858UL/ccpr1);
		if(gSMTarget>=RPM1000) gSMTarget -= RPM1000;
		if(gSMTarget>=RPM6000) gSMTarget += RPM_CV;
		if(gSMTarget>=RPM9000) gSMTarget += RPM_CV;
		
		if(gSMTarget>RPMMAX) gSMTarget = RPMMAX;
		PIR1bits.CCP1IF = 0;
		LED = 1;
	}
	
	// Timer1: Timeout means engine stop
	if(TMR1IF) {
		gSMTarget = 0;
		TMR1IF = 0;
		LED = 0;
	}
}

/* -----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- */
void rotate(int dir)
{
	static signed char phase = 0;
	
	if( dir ) {
		phase++;
		phase %= 4;
	}	
	else
	{
		phase--;
		if( phase < 0 ) phase = 3;
	}	

	switch( phase ) {
		case 0: HH(); break;
		case 1: LH(); break;
		case 2: LL(); break;
		case 3: HL(); break;
		default: break;
	}	
	__delay_ms(SM_PULSE_INTERVAL);
}

/* -----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------- */
void main ( ) 
{
	int ii, jj;

	OPTION_REG =	0b00000000;	// 
	WPUA =		0b00000000;	// pull-up pins
	
	// set up oscillator control register
	OSCCON=		0b01110010;	// 8Mhz

	// Set up I/O pins
	// PORT A Assignments
	APFCON=		0b00000001;	// CCP1 function is on RA5
	TRISA=		0b00101000;	// 
	PORTA=		0b00000000;	// Reset port
	ANSELA=		0b00000000;	// Disable analog input
	LED = 1;

	// Set up Capture input
	// Timer1 Clock Source Select bits
	T1CONbits.TMR1CS=0;		// 00 = Timer1 clock source is instruction clock (FOSC/4)
	T1CONbits.T1CKPS=0x01;		// Timer1 Input Clock Prescale Select bits 1:2 Prescale value
	T1CONbits.T1OSCEN=0;		// Dedicated Timer1 oscillator circuit disabled
	T1CONbits.nT1SYNC=1;		// 1 = Do not synchronize external clock input
	T1CONbits.TMR1ON=0;		// Timer1 On bit

	// Set up Capture input
	//CCP1CON=	0b00000100;	// Capture mode: every falling edge
	CCP1CON=		0b00000101;	// Capture mode: every rizing edge
	// Reset CCP1/Timer interrupt flag
	CCP1IF=0;
	TMR1IF=0;

	// Initialize Stepping motor postion
	__delay_ms(300);
	SMD_SBY = 1;

	//while( 1 ) {rotate( TURN_L );}

	while( 0 != SM_SENS ) {rotate( TURN_L );}
	while( 0 == SM_SENS ) {rotate( TURN_R );}
	gPos == 0;

	// start

	for( ii = 0; ii <  8; ii++ ) {rotate( TURN_R );}
	__delay_ms(1000);
	for( jj = 0; jj < 14; jj++ ) {
		for( ii = 0; ii < 14; ii++ ) {
			rotate( TURN_R );
		}
		__delay_ms(300);
	}
	for( ii = 0; ii < 200; ii++ ) {
		rotate( TURN_L );
	}
	__delay_ms(1000);
	
	

	// Enable Interrupt
	PEIE=1;			// Enable peripheral interrupt
	GIE=1;			// enable global interrupt
	CCP1IE=1;			// enable the CCP1 interrupt   
	TMR1IE=1;			// enable Timer1 intterupt on
	TMR1ON=1;			// Timer1 On

	while(1) {
		if( gSMTarget > gPos ) {
			SMD_SBY = 1;
			rotate( TURN_R );
			gPos++;
			continue;
		} else if( gSMTarget < gPos ) {
			SMD_SBY = 1;
			rotate( TURN_L );
			gPos--;
			continue;
		} else {
			SMD_SBY = 0;
		}
	}
}