だいぶ前からだけど、部費で買った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;
}