SwitchScienceで販売されていた直線型接触位置+感圧センサ(FSLP)をArduinoで使った時のメモです。
プログラム
販売元のPololuからセンサとLEDテープを使ったサンプルプログラムが出ているので、LEDテープの部分を除いて使用する。
const int fslpDriveLine1 = 8;
const int fslpDriveLine2 = A3;
const int fslpSenseLine = A2;
const int fslpBotR0 = 9;
void setup() {
Serial.begin(9600);
}
void loop() {
int pressure, position;
pressure = fslpGetPressure();
if (pressure == 0) position = 0;
else position = fslpGetPosition();
Serial.print("pressure ");
Serial.print(pressure);
Serial.print(" position ");
Serial.println(position);
}
int fslpGetPosition() {
pinMode(fslpSenseLine, OUTPUT);
digitalWrite(fslpSenseLine, LOW);
pinMode(fslpDriveLine1, OUTPUT);
digitalWrite(fslpDriveLine1, LOW);
pinMode(fslpDriveLine2, OUTPUT);
digitalWrite(fslpDriveLine2, LOW);
pinMode(fslpBotR0, OUTPUT);
digitalWrite(fslpBotR0, LOW);
digitalWrite(fslpDriveLine1, HIGH);
pinMode(fslpBotR0, INPUT);
pinMode(fslpSenseLine, INPUT);
delayMicroseconds(10);
analogReset();
return analogRead(fslpSenseLine);
}
int fslpGetPressure() {
pinMode(fslpDriveLine1, OUTPUT);
digitalWrite(fslpDriveLine1, HIGH);
pinMode(fslpBotR0, OUTPUT);
digitalWrite(fslpBotR0, LOW);
pinMode(fslpSenseLine, INPUT);
pinMode(fslpDriveLine2, INPUT);
delayMicroseconds(10);
analogReset();
int v1 = analogRead(fslpDriveLine2);
analogReset();
int v2 = analogRead(fslpSenseLine);
if (v1 == v2) return 32 * 1023;
return 32 * v2 / (v1 - v2);
}
void analogReset() {
#if defined(ADMUX)
#if defined(ADCSRB) && defined(MUX5)
ADCSRB |= (1 << MUX5);
#endif
ADMUX = 0x1F;
ADCSRA |= (1 << ADSC);
loop_until_bit_is_clear(ADCSRA, ADSC);
#endif
}
配線
販売元サイトに載っているこの画像を元に配線する。
D1 : 8pin
D2 : A3
SL : A2 (4.7kΩ→9pin)
結果
センサをタッチしている強さと、タッチ位置が計測できた。感圧は軽く触った時と強く押した時で値の変化がみれるが、タッチ位置は先端から中間くらいまでは値の変化が見られるが、中間から末端くらいまでは1000を行ったり来たりであまり制度は良くなさそうだった。
ある程度のタッチ位置と、感圧なら取れるって感じの印象でした。