ショッカクポット(触覚センサ)に触れてみました

〔PICの動かせ方入門に戻る〕


タッチエンス(Touchence)のショッカクポットなる柔軟触覚センサが秋月通商で販売されていました。
もぉ、押して見たり、つまんで見たり、こすって見たりやぁ、なめて..あいやなめたりはしなかったなぁ
などとぉ触れて見たのでその感触を書いて置こう、あいや動作実験を行ったので記事にして置きます。

ショッカクポット 左は秋月通商さんの写真を失敬しています。
スポンジの変形によって起こる、三次元方向の変位検出を、
内蔵するLED-フォトトランジスタセンサ間の光量変化を利用して、
スポンジの変位に応じた電圧変化を出力するらしい。
なので、スポンジ表面の複数点(上下左右の4点)を計測することで、
表面の傾き、上下左右方向の「つまむ」動作等の検出が可能らしい。
詳しい内容は、秋月通商販売ページに記載の「取扱説明書」を参照下さい。

最初はPIC16F18326で行っていました、UARTがPCでは上手く送受信するのですがぁ、センサでは
動作しない。でぇ、「取扱説明書」の通信の仕様をみたら、ボーレートは57600bpsまあこれは良いがぁ、
ボーレート誤差 ±0.001% えぇぇー、こんなぁ誤差マイコンでだせるのぉ、みたいなぁ。
じゃあてんでぇ、所有するMyPICの最高性能の24EP256MC202(FCY60MIPS)で実験を行ったら動作した
なのでぇ、実験はこれで行っています

尚、実験完了後に18F26K22(Fosc64MHz)で行って見た、UARTの設定をBRGH=1/BRG16=1で行えば
動作した、(Fosc32MHz)でも動作した、
ならあってんでぇ、PIC16F18326(Fosc32MHz)をBRGH=1/BRG16=1で行ったら動いた!
ここの記事は、16F18326で記述する事にします
尚、UARTの設定をBRGH=1/BRG16=1で行えばボーレート誤差を抑える事が出来そうなので
"skUARTlib"をBRGH=1/BRG16=1の高速で16ビットのBaudRateの設定を行える様に機能を追加する
事に決めました。

《通信データについて》

LED-フォトトランジスタの設置位置  センサに送るリクエストコマンドは"0x6D"のみです。
 センサは"0x6D"を受けると、約1.2ms後に次の様に8byte返します。

 [CH1-byteH][CH1-byteL][CH4-H][CH4-L][CH2-H][CH2-L][CH3-H][CH3-L]

 LED-フォトトランジスタの計測点は4点で、10bitのデータです。
 byteHが上位2bitで、byteLが下位8bitとなります。

 尚、返されるデータは周辺の明かりに影響します、例えば室内の時は”0-90”程で
 晴れ空の下では"0-130"程で触れる前から反応しています。
 因みに電源ON時は、自動較正されるので"0"から始まります。

尚、上/下/左/右は便宜上決めています。

《配線について》

PICピン概要  センサピン図  センサピン概要

ショッカクポットにはコネクターケーブルが付いてきます、
コネクタを写真の様に上に向けた方向で、両コネクターとも左から1番です。
ですのでぇ、片側のコネクターを切り取りヘッダピンに半田付けしました。

リセットピン(RST)はLowでリセットが掛かりますので通常はHigh接続です。
又、UART/RSTピンは3.3V端子仕様ですので注意、電源は3.3V/5V両方用意する必要が有ります。
ショッカクポットは内蔵レギュレータで3.3Vに変換しているがぁ、必要ないよね?

16F18326使用配線図  回路電源は3.3Vで、
 ショッカクポット電源は5Vを使用した。

 I2C用のプルアップ抵抗は、
 PIC内蔵を使っています。


尚、RSTピンは接続しなくても動作はしました。

因みに電源を5.0VにしてUARTの
PIC側TXを分圧抵抗で3.3Vにして行って
見たが動作せず、な〜ぜぇ。

《ダウンロードプログラムについて》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
POTU.zip

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

ダウンロードしたら解凍して下さい、以下のファイル構成です。
 POTUsw.c・・・・・・・ショッカクポット(触覚センサー)のテストプログラム
 skPOTU.c・・・・・・・・ショッカクポット(触覚センサー)のライブラリファイル
 skPOTU.h・・・・・・・・ショッカクポット(触覚センサー)のヘッダファイル
 skI2CLCDlib.c・・・・I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h・・・・I2C接続LCDライブラリ用ヘッダファイル
 skI2Clib.c・・・・・・・・I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・・I2C通信を行う関数のヘッダファイル
 skUARTlib.c・・・・・・UART通信を行う関数ソースファイル
 skUARTlib.h・・・・・・UART通信を行う関数のヘッダファイル

 尚、CPUのクロックは32MHzを想定しています。

POTUsw.c

@ 起動後初期設定がされ、LCDの1行目に[ Tactile sensor ]が表示されます。

A @後、3秒後にセンサと通信が始まりセンサ値をLCDの1行目に[R0 U0 D0 L0 ]と表示されます。
  尚、表示されない場合は、センサへの"0x6D"が上手く届いていません。

B スポンジに触れましょう、Aの値が変わると思います。
  ・真上から押した場合はLCDの2行目に” [Pushe on] ”と表示されます。
  ・左端を押した場合はLCDの2行目に” [Press Left] ”と表示されます。
  ・右端を押した場合はLCDの2行目に”[Press Right] ”と表示されます。
  ・上端を押した場合はLCDの2行目に” [Press Up] ”と表示されます。
  ・下端を押した場合はLCDの2行目に” [Press down] ”と表示されます。
   (触れる場合は、やさしくおねがぁい、うふ)

skPOTU.c
skPOTU.h

ショッカクポット(触覚センサー)と送受信を行う為のライブラリ集です。

関数の使い方を説明します。

ans = POTU_ConvReq()
 触覚センサーへデータの変換要求を行う処理
 要求後、変換されたデータを得るまでは次の変換要求は行いません。
  char   ans : 1=変換要求を行った 0=変換要求は行っていない

ans = POTU_Read(*ch)
 触覚センサーの変換データを読み込む処理
  int   *ch   : 読み込んだデータを格納する配列(4ワード)のアドレスを指定する
        CH1:→ CH4:↑ CH2:↓ CH3:← の順番にデータを格納する
  char   ans : 1=読み込んだ 0=まだ読んでいない

ans = POTU_CheckSW(*ch)
 触覚センサーの状態を得る処理
 スイッチ的に調べます、当然浅くが反応して深くが反応する事になります。
  int   *ch   : センサー値を格納した配列(4ワード)のアドレスを指定する
        CH1:→ CH4:↑ CH2:↓ CH3:← の順番にセンサー値をセットする
  char   ans : 0=スポンジに触れていない
         1=真上から浅く押し込んだ     2=真上から深く押し込んだ
        11=センサーの上下を浅くつまんだ  21=センサーの上下を深くつまんだ
        12=センサーの左右を浅くつまんだ  22=センサーの左右を深くつまんだ
        31=センサーの右側を浅く押し込んだ 41=センサーの右側を深く押し込んだ
        32=センサーの上側を浅く押し込んだ 42=センサーの上側を深く押し込んだ
        33=センサーの下側を浅く押し込んだ 43=センサーの下側を深く押し込んだ
        34=センサーの左側を浅く押し込んだ 44=センサーの左側を深く押し込んだ
 例)
  int ans , ch[4] ;

  while(1) {
     // 変換要求を出す
     POTU_ConvReq() ;
     // 受信した内容を読み出す
     if (POTU_Read(ch) == 1) {
          // 受信した内容から触覚センサーの状態を得る
          ans = POTU_CheckSW(ch) ;
          if (ans != 0) {

          }
     }
  }
閾値の調整

"skPOTU.h"に閾値を設定する定義が記述されておりこれをいじるとぉ返される"ans"値が変わります。
この値は室内での値で約"0-90"程返された場合の閾値設定です。
晴れた日の外での返された値でこの閾値設定を使うと狂います。
なのでぇ、このプログラム処理のやりかたは余り良くない様に思います。


skUARTlib.c
skUARTlib.h

"skUARTlib.h"の記述 #define UART_BRGH16_USE のコメントを生かします。
センサとの通信は、57600bps Data=8bit Parity=none Stop=1bit Flow=noneです。
この内容は”FT232RL使用によりUSBをシリアル変換してマイコンと繋ぎます”を参照下さい。

skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.h
skI2Clib.c

このプログラムはLCDに表示を行う為の物とI2C関連の物です、詳しくはこちらの説明を参照下さい。


《その他》

実験の風景
上は実験風景の写真です。
やはりセンサの性格上、使用場所により返される値が気にはなる、
それに押したスポンジを放した時の形状復帰が遅いようなぁ...
さらにぃUART誤差±0.001%はチョットぉマイコンには厳しすぎる。
このセンサは操作は簡単だがぁ、動作させるにはなぁんだかぁ癖がありそう。





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