スライドスイッチ機能付感圧センサ(FSLP)を使ってみる

〔マイコンのトップに戻る〕


FSLPの画面1
秋月電子で「スライドスイッチ機能付感圧センサ(FSLP)」を販売
しています(左写真)、このセンサは押す場所や押す力加減に応じ
て抵抗値が変化します。
なので、この変化をマイコンのアナログ入力で読み取れば、
沢山スイッチを繋がなくてもこれ(FSLP)一個でその代わりになり
コンパクト化出来るのでは?っと思ったしだいでして実験して見ます。
このセンサにはコネクターが付属していますが、ピン間のピッチが
1mmです、何とか半田付けを行いました。 また、FSLPの裏には両面テープが付いています。

FSLPの画面2
 付属コネクターの拡大写真です。

 写真の左が表で、右が裏です。
 コネクターの表を上にしてFSLPも表で合わせ差し込みます。


タッチペンの画像
 FSLPはスタイラスペンも利用出来るらしいので、
 左の様な物をダイソーで購入して来てみた。
 上がDSi・DSLite用のタッチペンらしぃ。
 下がスマートフォン用のボールペン付タッチペン。
 (頭のゴム部分でタッチする様ですね)

FSLPのデータシートはこちらですが、 o-Familyさんこちらで日本語に訳した物を公開されています。

《Arduino》

(実験1の配線図)

FSLP-Arduinoでの配線図1
まず、FSLPに触れた場合、どんな数値が
得られるのかを調べる必要が有ります。
よってぇ、得られた数値をArduinoIDEの
シリアルモニターに表示させてみます。
その配線図が左です。

FSLPの右側4番線は使用しません。
データシートで、抵抗は4.6KΩ 1% と書いて有るのですが、
無いので 4.7KΩを使っています。

FSLPの1番(SL)と3番(D2)はデジタルピン
とアナログピンを切り替えながら制御する
事になるのでマイコンでは両方の機能を
割付けてあるピンに接続しないとだめです。
Arduinoはアナログ0番〜5番がデジタルの
14番〜19番に切り替えて利用できます。

以下の記述では下図の如く左右を決めます。
FSLP-Arduinoでの配線図3

(実験1のスケッチ)

@上記の回路の様に配線を行います。

Aarduinoボード(Arduino Duemilanove 328)はUSBケーブルで接続して、arduino IDEを起動させます。

BIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
// FSLPのデータを保存する構造体
struct {
     int SL_Pin ;   // FSLPの端子1(SL)と接続しているピン番号を保存
     int D1_Pin ;   // FSLPの端子2(D1)と接続しているピン番号を保存
     int D2_Pin ;   // FSLPの端子3(D2)と接続しているピン番号を保存
     int RO_Pin ;   // 抵抗(4.7K)を接続しているピン番号を保存
     int RAW_PRES ; // 
     int RAW_POSI ; // 
     int ON_OFF ;   // 
} FSLP ;

void setup()
{
     int i ;
  
     // シリアルモニターの初期化をする
     Serial.begin(9600) ;
     // スイッチ感圧センサーの初期化をする
     FSLP_Init(14,12,16,13) ;
}
void loop()
{
     int ans1 , ans2 ;

     ans1 = FSLP_ReadPressure() ;  // 押した圧力値を得る
     ans2 = FSLP_ReadPosition() ;  // 押した場所の値を得る
     Serial.print("PRES=") ;       // シリアルモニターに表示を行う
     Serial.print(ans1) ;
     Serial.print("  POSI=") ;
     Serial.println(ans2) ;
     delay(500) ;                  // 500ms毎に繰り返す
}
// センサーの初期化処理
void FSLP_Init(int sl,int d1,int d2,int ro)
{
     // センサー接続ポートの設定
     FSLP.SL_Pin = sl ;            // SENSE LINE    (SL):端子1
     FSLP.D1_Pin = d1 ;            // DRIVE LINE 1  (D1):端子2
     FSLP.D2_Pin = d2 ;            // DRIVE LINE 2  (D2):端子3
     FSLP.RO_Pin = ro ;            // RESISTOR LINE (RO)
}
// センサーの電荷を除去する処理
void FSLP_Reset()
{
     // 全接続ピンをGNDに落として電荷を逃がす
     pinMode(FSLP.SL_Pin,OUTPUT) ;
     pinMode(FSLP.D1_Pin,OUTPUT) ;
     pinMode(FSLP.D2_Pin,OUTPUT) ;
     pinMode(FSLP.RO_Pin,OUTPUT) ;
     digitalWrite(FSLP.SL_Pin,LOW) ;
     digitalWrite(FSLP.D1_Pin,LOW) ;
     digitalWrite(FSLP.D2_Pin,LOW) ;
     digitalWrite(FSLP.RO_Pin,LOW) ;
}
// 押した場所の位置を測定する処理
int FSLP_ReadPosition()
{
     int ans , i , x ;

     // 電荷を除去する
     FSLP_Reset() ;
     // 測定電圧をセットする
     digitalWrite(FSLP.D1_Pin,HIGH) ;
     digitalWrite(FSLP.D2_Pin,LOW) ;
     digitalWrite(FSLP.RO_Pin,LOW) ;
     pinMode(FSLP.RO_Pin,INPUT) ;
     pinMode(FSLP.SL_Pin,INPUT) ;
     // 電圧が安定するまで待つ
     delayMicroseconds(10) ;
     // 測定を行う(単純平均を行う)
     ans = 0 ;
     x = FSLP.SL_Pin - 14 ;             // アナログのピン番号に変換
     for(i=0 ; i < 15 ; i++) {
          ans = ans + analogRead(x) ;   // 値を読み込む
     }
     ans = ans / 15 ;

     return(ans) ;
}
// 押した場所の圧力を測定する処理
int FSLP_ReadPressure()
{
     int ans ;
     int v1 , v2 ;

     // 電荷を除去する
     FSLP_Reset() ;
     // 測定電圧をセットする
     digitalWrite(FSLP.D1_Pin,HIGH) ;
     pinMode(FSLP.SL_Pin,INPUT) ;
     pinMode(FSLP.D2_Pin,INPUT) ;
     digitalWrite(FSLP.RO_Pin,LOW) ;
     // 電圧が安定するまで待つ
     delayMicroseconds(10) ;
     // 測定を行う(ピン番号をアナログのピン番号に変換)
     v1 = analogRead(FSLP.D2_Pin-14) ;  // 値1を読み込む
     v2 = analogRead(FSLP.SL_Pin-14) ;  // 値2を読み込む
     // 計算を行う(64は2の累乗)
     ans = (64 * v2) / (v1-v2) ;

     return(ans) ;
}
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行い
 ます。

upload

D正常終了後、画面の右側に有るアイコン「SerialMonitor」ボタンをクリックしてシリアルモニター画面
 を起動させます、画面には "PRES=0 POSI=0" が500ms毎に表示されると思います。
 (POSI=1 がたまに表示される場合が有るかも)
 FSLPを押して見ましょう、PRES・POSI の数値が変化するはずです。

実験結果1  PRESはFSLPを押した時の圧力の強さを示し、数値が大きいほど強いです。
 POSIはFSLPを押した場所の位置を数値で表し、右側が数値が小さく左側で大きく
 なります。
 が、左図を見て下さい、これは押す(指で)場所の位置は同じ位置で押す力だけを強
 くして言った場合の図です。
 押す力が強くなっていけば押す場所位置は変わらなくても POSI の値は増えていき
 ます。
 また、押しながら右端から左端へスライドさせれば、POSI の値は増えていきます。

実験結果2

上の図で PRES の値を見て行きましょう。
図1は、指でFSLPに軽く触れた場合です、PRES は0で POSI に2〜9程の数値が現れます。
その後、指で軽く押せばPRES は1〜9程の数値が現れます、それから強く押した場合が図2です。
図3は、スマホ用タッチペンで強く押した場合ですがPRES は10程しか上がりません。
図4は、DS用タッチペンで強く押した場合です、強く押してもPRES は1ですね。
これはおそらく押す部分の面積が関係しています。
(秋月電子のこちらに書いて有る説明を読めば理解が深まるかも)

実験結果3

こんどはPOSI の値を見てみます。
図5は指で PRES=8 程の強さでセンサの真ん中を押した場合です、POSI は23〜25位ですね。
図6ではスマホ用タッチペンで PRES=8 程の強さでセンサの真ん中を押した場合です、POSI は24・25位ですね。
図7はDS用タッチペンで真ん中を押した場合ですが、POSI は10程です。

なのでぇ、人はこの位の強さって言うのは感覚なので真ん中を押したとプログラム判断する場合に、
例えば23〜25なら真ん中を押したとする場合にちょっと強く押したら数値が30とかになる訳ですよ。
だからぁ、スイッチ的に判断させるなら指では右・真ん中・左の三点スイッチ位でしょうかね、
タッチペンなら5点位判断可能でしょうけどね。(点数を増やすと隣を押した事になってしまいますね)
Arduinoへ4本配線して三点スイッチではねぇ....圧力やスライダーを加味すればぁ....
複合スイッチとしてぇ......FSLPセンサがもう少し長ければなぁ.....
まぁ、自分が行いたい操作に応じてプログラミングを行えば良いんではないかい。
まぁ、色々試してみそ!。

スケッチについて

FSLPセンサを押してその位置や強さを計測する方法はここでは詳しくは説明していません、
興味ある人はデータシートを参考にして下さい。

 FSLP_Init(sl,d1,d2,ro)
  初期化を行う処理で、接続するArduinoピンの番号を保存します。
   sl :FSLPの1番端子に接続しているピンの番号を指定します
   d1 :FSLPの2番端子に接続しているピンの番号を指定します
   d2 :FSLPの3番端子に接続しているピンの番号を指定します
   ro :抵抗(4.7K)に接続しているピンの番号を指定します
  slとd2に接続するピンはアナログピンの0番〜5番の何れかに繋ぎます。
  但し、ピン番号指定はデジタルピン番号にて指定する。(0番に繋いだら14番と指定です)

 FSLP_Reset( )
  センサの電荷を除去して、読み取り値のノイズを少なくする為の処理です。

 ans = FSLP_ReadPosition( )
  押した場所の、位置を読み取る処理です。
  読み取り値はふらつきが有るので15回読んで単純平均化しています。
   ans :押した位置に応じた値を返します

 ans = FSLP_ReadPressure( )
  押した場所の、押す力加減(圧力)を読み取る処理です。
  計算に使っている64とは2の累乗で、32・64・128などです。
  圧力値の感度が変わる様な気がします、適当に書換えてちょうだい。
   ans :押した圧力に応じた値を返します

スケッチ中に、電圧が安定するまで待つと言う事で10usのウエイトが入れて有りますが、
データシートでは5〜10us辺りで感度を調整する様になっています、これも適当に書換えてちゃぶだい。

(実験2の配線図)

FSLP-Arduinoでの配線図2
この配線図を実験1の配線図に加えましょう。

実験2では、FSLPに指で触れればLEDの右・中央・左の三か所が緑色で点灯します。
FSLPの右側を指で軽く押すとLEDの右が青色点灯、強く押すと赤色点灯。
FSLPの中央・左側も同じように点灯です。

RGB LEDアレイは左下が1番ピンです。
1番ピンをLOW(GND)にするとLEDは赤色点灯です。
2番ピンをLOW(GND)にするとLEDは青色点灯です。
3番ピンをLOW(GND)にするとLEDは緑色点灯です。

抵抗は各色毎に抵抗値を変更した方が良いのですが、
ここでは面倒なので470Ωで行っています。


(実験2のスケッチ)

実験2のスケッチはこちらからダウンロードして下さい。
ダウンロードスケッチの保存先と開き方はこちらを参照下さい。
尚、スケッチのsetup( )とloop( )を実験1のスケッチで書き換えれば、実験1で利用できます。

スケッチについて

LEDの配線を変えた人は下記の様に記述されています書き換えましょう。
#define RIGHT_LED   4   // 右側LED端子と接続しているピン番号
#define CENTER_LED  3   // 中央LED端子と接続しているピン番号
#define LEFT_LED    2   // 左側LED端子と接続しているピン番号
#define RED_LED     8   // 赤色点灯の端子と接続しているピン番号
#define GREEN_LED   9   // 緑色点灯の端子と接続しているピン番号
#define BLUE_LED   10   // 青色点灯の端子と接続しているピン番号

 ans = FSLP_ScanSW()
  FSLPセンサの状態を調べる処理です。
  この関数は指で操作した場合のサンプルスケッチです、
  センサの押す位置として右・中央・左の3点でチェックしています、それはなぜかってぇ
  私の指が太いからさぁ、指の小さい人は4点〜5点位でプログラミングすればいけるかもね。
   ans :センサの押している位置を返します、押していない場合は0を返す
        1=センサの右側を軽く押した
        2=センサの真ん中辺りを軽く押した
        3=センサの左側を軽く押した
       11=センサの右側を強く押した
       12=センサの真ん中辺りを強く押した
       13=センサの左側を強く押した

  この関数を実行した後、下の変数が使用可能です。
   FSLP.RAW_PRES:センサを押した時の圧力値が保存されています
   FSLP.RAW_POSI :センサを押した場所の位置が保存保存されています
   FSLP.ON_OFF  :スイッチのON/OFF状態情報が保存されています(ON=1 OFF=0 接触した=-1)

 ※このサンプル関数を参考にして自分が操作したい様にプログラミングして下さい。

《PIC16F1827》

こんどはPIC16F1827を使用してFSLPセンサと接続をして見ます。
前回FT232RLモジュールを記事にしたので、センサから読み取った数値をパソコンで表示させます。
なので、FT232RLモジュールの話は前回の記事を参照下さい。

(配線図)

PIC16F1827ピン構成図 左はPIC16F1827のピン構成図です。

PICの今回使用するピン番号は14番(VDD
:5V)と5番(VSS:GND)を電源に配線します。

USART関連ピンは7番(RX)と8番(TX)です
RX=受信 TX=送信
FSLPセンサとの接続するピンは、
1番(RA2/AN2)をFSLPの1番(SL)ピンへ
2番(RA3)をFSLPの2番(D1)ピンへ
3番(RA4/AN4)をFSLPの3番(D2)ピンへ
18番(RA1)を抵抗(4.7K)にそれぞれ配線します。
FSLP-PICでの配線図 1番(RA2/AN2)と3番(RA4/AN4)ピンは
デジタルとアナログを切替えて制御する
ので両方の機能が割付けて有るピンを
使用して下さい。
18番(RA1)と2番(RA3)ピンはデジタル
入出力可能なピンを使用して下さい。

PIC12F1822は接続ピンが足りないので
この実験はきびしいでしょう。
モニターをこちらに変えればOKですがぁ

LEDは、PICからPCへデータを送ると点灯
しますが、無くても可能です。
尚、この回路はUSBからの電源を利用しています。


(ダウンロードプログラムについて)

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
FSLP.lzh(Ver1.00)
FSLP.lzh(Ver1.10) ライブラリとMPLAB X用に変更 *1)

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。 *1)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
FSLP.c・・・・・・・・・・・・・・・ 本体のサンプルプログラムソースファイル *1)
skUARTlib.c・・・・・・・・・・ USART通信を行う関数ソースファイル *1)
skUARTlib.h・・・・・・・・・・ USART通信を行う関数のインクルードファイル *1)
skMonitorUART.c・・・・・ USARTモニターライブラリ関数ソースファイル
skMonitorUART.h・・・・・ USARTモニターライブラリ用インクルードファイル

FSLP.c

実験結果12  PICから送られてきたFSLPセンサの値をTera Termにて表示したのが
 左図です。

 Arduino時と同じ様に表示しています、が、しかし表示される値は大分
 異なっています、プログラムの作り方によるのかもですがPICの方が
 かなり感度が良い様です。

 FSLPに触れていないのに、PRES=0ですがPOSIは数値が現れている
 FSLPを押した時は、FSLPの右端でPOSIの値は10位の数値で、
 左端になると1000位の数値が表示されます。
 (Arduinoでは3〜60位でした)
 FSLPを押した時にしかPOSIの数値はあてにならない様な感じです。
 なので、PRESが0でないならPOSIの数値を読むとプログラミング
 しないとだめかもね。

また、FSLPを強く押した時のPRES値がArduinoでは60位までの数値でしたが、PICでは100位の数値
まで現れます。
やはり、自分がどんな操作をした時にどんな数値が得られるのかを調べてプログラミングする必要が
有りそうですね。

skUARTlib.c/skUARTlib.h と skMonitorUART.c/skMonitorUART.h

この関数群はパソコン(PC)と通信する為に必要であり、FSLPセンサの制御には関係ないです。
この関数の使い方については、FT232RLモジュールの前回の記事を参照下さい。

《その他》

実験風景  左はArduinoでの実験2の写真です。

 ここでは右端を押すと数値が小さいと書いていますが、
 もちろんセンサをひっくり返せば左端が小さいですよ、
 念の為に。

 こちらにリング型も有りますねぇ、制御線が1本増えますがぁ、
 携帯音楽プレイヤーに使えそう。

 PICの容量検知モジュール(CPS/CSM)を使ったタッチセンサの
 記事はこちらを参照下さい。




ライブラリとMPLAB X用に変更(*1) 2015/10/26


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.