だいぶ前からだけど、部費で買ったArduinoを持って帰って、誰も使わないのをいいことに家で放置している。それで、忘れかけてたので思い出しがてら記事にしてみる。

---

肝心の皿センサーだが、見ての通りメイン基板から切ってコードの被膜を剥いである。

2つある黒いやつがフォトインタラプタとかいうセンサーになる。これはLEDとフォトダイオードを組み合わせたもので、下図の枠で囲った部分だ。


基盤を見ると端子の横にC,E,A,Kとあるがそれぞれ図中の記号の位置に対応する。フォトダイオードがLEDから光を受ける(=スリットが開放される)とR2にかかる電圧が降下するので、これを検知すればよい。

ちなみに信号線の接続先だが、右側つまり1が書いてある側(よく見るとコードの被膜が黒い)から1,2,3,4,5と番号を振ると、

1がD1(右側のセンサー)のC;

2がD1のA;

3がGND(両方のKとE);

4がD2(左側)のA;

5がD2のC、となる。

さて、ここでセンサー処理の仕組みに移る。

下図は、皿についている凹凸とセンサーの、起こりうる位置関係の変化を書きだしたものになる。(便宜上遮蔽を1、開放を0とする)

この図中の変化前後の組と、実際に検知された変化前後の組を比較して、一致すればその方向に回したことになるという算段だ。

実際にVcc=5V、R1=330Ω、R2=10KΩ(抵抗は適当に選んだので動作の保証はしない!)でVoutをArduinoのAnalog INに接続してみると開放時で500~600(だいたい2.5~3V)、遮蔽時で1000近く(ほぼ5V)になった。(追記:実際に5鍵コンの基盤を調べてみるとR1=220Ω、R2=2.2KΩだった。)

以上。一応Arduinoのスケッチを貼っておくので、参考までに。

#define ActiveTime 500 //皿を放してから入力が残る時間
#define Thres 750 //開放・遮蔽の閾値

int d1f,d2f;
int list[8][4]={
	{1,1,0,1},
	{1,0,1,1},
	{0,0,1,0},
	{0,1,0,0},
	{1,1,1,0},
	{1,0,0,0},
	{0,1,1,1},
	{0,0,0,1}
};

double timer;
bool toRight;

void setup() {
	timer=0;
	toRight=false;
	if(analogRead(A1)<Thres){
		d1f=0;
	}else{
		d1f=1;
	}
	if(analogRead(A2)<Thres){
		d2f=0;
	}else{
		d2f=1;
	}
}

void loop() {
	int d1l,d2l;
	
	if(analogRead(A1)<Thres){
		d1l=0;
	}else{
		d1l=1;
	}
	
	if(analogRead(A2)<Thres){
		d2l=0;
	}else{
		d2l=1;
	}
	
	bool triggered=false;
	int state[4]={d1f,d1l,d2f,d2l};
	
	for(int i=0;i<8;i++){
		if(memcmp(list[i],state,sizeof(int)*4)==0){ //組を比較
			if(i>=0 && i<4){
				timer=ActiveTime;
				toRight=true;
				triggered=true;
				break;
			}else{
				timer=ActiveTime;
				toRight=false;
				triggered=true;
				break;
			}
		}
	}
	
	if(!triggered){
		timer-=0.5;
	}
	
	if(timer>0){
		if(toRight){
			//右に回した時の処理
		}else{
			//左に回した時の処理
		}
	}else{
		timer=0;
		//入力しない時の処理
	}
	
	d1f=d1l;
	d2f=d2l;
}
【Arduino】5鍵コン(アスキーコン)の皿センサーを処理する

投稿ナビゲーション


コメントを残す

メールアドレスが公開されることはありません。