2020年3月28日に記述
#タッチセンシングとは
機械部品なしでインターフェース(入力)を実装できる
例 IHの操作パネルなど
STM32のF0,F3シリーズなどには、タッチセンシングを利用するための機能がハードウェアとして備わっており(TSC)、これを利用することで、CPUリソースの消費を抑えることできる。また、ライブラリが存在する。
要約: 簡単に静電容量タッチのボタンを作れる(チューニングはまだ試していない。
ちなみにArduinoにもタッチセンサライブラリが存在する。(ハードではなくソフトで実現)
STM32のTSL(タッチセンシングライブラリ)ではキャリブレーションやリフレッシュを自動で実行(Cubeで生成する場合)するので、適当なパラメータでもうまく動作する気がする。
#やったこと
静電容量ボタンをためす
タッチしたらLチカをトグルする
実際に手動で記述するコードは20行程度でした (カンタンで理解してなくても使えそう
#環境
・NUCLEO-F303RE
・STM32CubeIDE
#資料
概要わかりやすい:STM32タッチセンシングコントローラ(TSC)のプレゼンテーション
TSCをSTM32Cubeで実行するやつ:UM1913 Developing applications on STM32Cube with STMTouch touch sensing library
#TSL(タッチセンシングライブラリ)での定義
単体のタッチボタン | Touchkey sensor |
直線形のタッチセンサ | Linear sensor |
円形のタッチセンサ | rotary sensor |
今回は単体のタッチボタンなのでTouchKeyに関する項目を設定する
#手順 (かんたん
-
STM32CubeIDEのDevice Configuration Toolで設定(GUIで設定できるところ)
-System Core のTSC
-1つのグループにつき1つのサンプリングコンデンサを接続、3つまでのセンサを指定(今回はセンサ1つ
-MiddlewareのTOUCHSENSEING
-Sensors selectionからTSCにて指定したピンを、タッチキーやロータリーセンサなどに割り当てる(今回はタッチキー
-
コード生成ボタンを押す
-main.cへのコード生成とTSCライブラリのファイルなどの追加が行われる(+自動でパラメータや初期化コードが生成されるtsl_user.cなど -
main.cの編集
-タッチセンサを条件に、Lチカのコードを記述
#手順 (詳しく
Sytem CoreのTSCから設定
グループ1のG6_IO1をサンプリングコンデンサ接続に設定
G6_IO3をセンサに指定(今回は合計1つ
次にMiddlewareのTOUCHSENSINGをEnableし、Sensors selectionへ
ここで、ラインやサークル型のボタンを利用する場合はLiner/Rotary sensors usedを設定するが、今回は通常のタッチボタンを実装するため、TouchKey sensorsのTSLPRM_TOTAL_TOUCHKEYSの個数を1とし、IO_TOUCHKEY1をTSCで利用するボタンを指定する(要:事前のTSC設定)
Config parametersでは、TSLPRM_USE_PROXを0に指定した。これは近接センサとして利用するかなので、今回は0。それ以外はたぶん初期値。
#main.cを編集する
main.cの追記する部分のみ記述します。自動生成のコメントから場所を察してください。
/* USER CODE BEGIN PV */
TSL_tTick_ms_T time_tick; //タッチセンスライブラリに、タイマを利用せず一定時間毎に実行する関数が存在する。そのカウンタ的な
uint16_t reference,delta,state,measure;//デバッグ用
/* USER CODE END PV */
int main(void){
/* USER CODE BEGIN 2 */
tsl_user_status_t tsl_status;
/* USER CODE END 2 */
while(1){
/* USER CODE BEGIN 3 */
tsl_status = tsl_user_Exec();
if (tsl_status != TSL_USER_STATUS_BUSY)//ここは怪しい、
{
if (MyTKeys[0].p_Data->StateId == TSL_STATEID_DETECT)//タッチセンサを読みだす
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); //LED ON
}
else
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);//LED OFF
}
}
//以下デバッグ用 SWVで見やすい
if (TSL_tim_CheckDelay_ms(10, &time_tick) == TSL_STATUS_OK)
{
measure=MyTKeys[0].p_ChD->Meas; //タッチキーの生の値
delta=MyTKeys[0].p_ChD->Delta; //なんか
reference=MyTKeys[0].p_ChD->Ref; //しきい値(時間とともにリフレッシュされて適切な値になる
state=MyTKeys[0].p_Data->StateId; //ボタンの状態 今回はタッチ中にTSL_STATEID_DETECTとなる
}
}
/* USER CODE END 3 */
}
#回路
回路はPB11とGNDを0.1µFで接続、センサのPB13は配線をちょっと伸ばしただけ(本当は10kΩとかを接続するらしい)
#実行結果
写真はなし
パラメータを調節していないため、銅線だけでなく、被膜部分をタッチしても反応した。
パラメータチューニングや、近接センサ機能は今後試すつもりです