スケッチ

マジックナンバーが埋め込んであるし、かなり汚いです。ゴメンナサイ
ほんとはちゃんとしたクラスライブラリにするとよいのですが。

ライセンスはパブリックドメイン相当扱いとします。
商用利用も含め、無料でご自由にご利用いただけます。


//静電容量に溜まった電荷を測定
//バナナで一応動いた

// http://search.hatena.ne.jp/search?word=[banana]

int pos = 0;
const int ain1 = 1;
const int ain2 = 5;

const int r1 = 1+14;
const int r2 = 5+14;
const long Rp =33000; //internal pullup 25k ohm

long v=0,v1=0,v2=0,v1v2=0;
long Rall;

int i,j;
int poslist[8];
int posavg,posidx,istouch0=0,istouch=0;
long w1=50,w2=50;
long deg0; //bias
const long pitch1=128;
const long pitch2=1500;
long wpitch=pitch2-pitch1,vtouch;
// C ド 130.81
//C ド 261.62
//C ド 523.25
void setup() {
long _v1,_v2;

Serial.begin(9600); // 9600bpsでポートを開く
pinMode(r1, INPUT);
pinMode(r2, INPUT);
Serial.println("start");
//myservo.attach( 9 );
noTone(11);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
digitalWrite(r1,LOW);
digitalWrite(r2,LOW);
delay(1000);
sense();


Serial.print("v1 ");
Serial.print(v1);
Serial.print(" v2 ");
Serial.println(v2);

vtouch=(v1+v2)*10;


Serial.print("w1 ");
Serial.print(w1);
Serial.print(" w2 ");
Serial.println(w2);
Serial.print("vtouch ");
Serial.println(vtouch);
}

void sense(void){
v1=0;
v2=0;

for(i=0;i<5;i++){
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
digitalWrite(r1,LOW);
digitalWrite(r2,LOW);
delay(1);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
delay(1);

pinMode(r1, INPUT);
pinMode(r2, OUTPUT);

digitalWrite(r1,LOW);
digitalWrite(r2,LOW);
delay(1);



v1+=analogRead(ain1);
delay(1);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
digitalWrite(r1,LOW);
digitalWrite(r2,LOW);
delay(1);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
delay(1);
pinMode(r1, OUTPUT);
pinMode(r2, INPUT);
digitalWrite(r1,LOW);
digitalWrite(r2,LOW);
delay(1);
v2+=analogRead(ain2);
delay(1);
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
digitalWrite(r1,LOW);
digitalWrite(r2,LOW);
delay(1);
}

}

void loop() {

long deg,deg1,deg2;

sense();
Serial.print("v1 ");
Serial.print(v1);
Serial.print(" v2 ");
Serial.println(v2);
v1v2=v1+v2;

deg1=1000-1000*v1/v1v2;
deg2=1000*v2/v1v2;
deg=(deg1+deg2)/2;
Serial.print(" deg1 ");
Serial.print(deg1);
Serial.print(" deg2 ");
Serial.print(deg2);
Serial.print(" avg ");
Serial.println(deg);

deg=wpitch*deg/1000+pitch1;

Serial.print(" freq ");
Serial.print(deg);

Serial.println(" ");



pos=deg;

if (v1v2>vtouch && deg>pitch1 && deg0){
posidx=(posidx+1)&7;
poslist[posidx]=pos;
posavg=0;
for(i=0;i<8;i++){
posavg+=poslist[i];
}
posavg/=8;


}else{

posidx=0;
for (j=2;j<8;j++){
poslist[j]=posavg;
}
poslist[0]=pos;
poslist[1]=pos;
posavg=pos;
}
tone(11,posavg);
istouch0=9;
}else {
noTone(11);
istouch0--;
posidx=(posidx+1)&7;
poslist[posidx]=posavg;
}

}