3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

STM32 TSC 静電容量センサ タッチセンシングする (STM32CubeIDE) その1 単体のタッチセンサ編

Last updated at Posted at 2020-03-28

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に関する項目を設定する

#手順 (かんたん

  1. STM32CubeIDEのDevice Configuration Toolで設定(GUIで設定できるところ)
       -System Core のTSC
         -1つのグループにつき1つのサンプリングコンデンサを接続、3つまでのセンサを指定(今回はセンサ1つ
       -MiddlewareのTOUCHSENSEING
         -Sensors selectionからTSCにて指定したピンを、タッチキーやロータリーセンサなどに割り当てる(今回はタッチキー
     

  2. コード生成ボタンを押す  
        -main.cへのコード生成とTSCライブラリのファイルなどの追加が行われる(+自動でパラメータや初期化コードが生成されるtsl_user.cなど

  3. main.cの編集
        -タッチセンサを条件に、Lチカのコードを記述

#手順 (詳しく

 Sytem CoreのTSCから設定
 グループ1のG6_IO1をサンプリングコンデンサ接続に設定
 G6_IO3をセンサに指定(今回は合計1つ

image.png

 次にMiddlewareのTOUCHSENSINGをEnableし、Sensors selectionへ
image.png

 ここで、ラインやサークル型のボタンを利用する場合はLiner/Rotary sensors usedを設定するが、今回は通常のタッチボタンを実装するため、TouchKey sensorsのTSLPRM_TOTAL_TOUCHKEYSの個数を1とし、IO_TOUCHKEY1をTSCで利用するボタンを指定する(要:事前のTSC設定)

 次にConfig parametersを設定する
image.png

 Config parametersでは、TSLPRM_USE_PROXを0に指定した。これは近接センサとして利用するかなので、今回は0。それ以外はたぶん初期値。

 最後にimage.pngでコードを生成する

#main.cを編集する

 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Ωとかを接続するらしい)
image.png

#実行結果
 写真はなし
 パラメータを調節していないため、銅線だけでなく、被膜部分をタッチしても反応した。
 パラメータチューニングや、近接センサ機能は今後試すつもりです

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?