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

2020年3月28日に記述
#タッチセンシングとは
　機械部品なしでインターフェース(入力)を実装できる
　例　IHの操作パネルなど

　STM32のF0,F3シリーズなどには、タッチセンシングを利用するための機能がハードウェアとして備わっており(TSC)、これを利用することで、CPUリソースの消費を抑えることできる。また、ライブラリが存在する。

　要約:　簡単に静電容量タッチのボタンを作れる(チューニングはまだ試していない。


　ちなみにArduinoにもタッチセンサライブラリが存在する。(ハードではなくソフトで実現)
　STM32のTSL(タッチセンシングライブラリ)ではキャリブレーションやリフレッシュを自動で実行(Cubeで生成する場合)するので、適当なパラメータでもうまく動作する気がする。

#やったこと
　静電容量ボタンをためす
　タッチしたらLチカをトグルする
　**実際に手動で記述するコードは20行程度でした (カンタンで理解してなくても使えそう**

#環境
・NUCLEO-F303RE 
・STM32CubeIDE

 
#資料
　概要わかりやすい:[STM32タッチセンシングコントローラ（TSC）のプレゼンテーション](https://www.st.com/content/ccc/resource/sales_and_marketing/presentation/product_presentation/group0/c3/1b/f5/5a/b9/a9/4a/2a/39.Touch%20sensing%20controller%20(TSC)/files/39.STM32L4-Peripheral-Touch%20Sensing%20Controller%20(TSC)%20Final_JP.pdf/jcr:content/translations/en.39.STM32L4-Peripheral-Touch%20Sensing%20Controller%20(TSC)%20Final_JP.pdf)
　TSCをSTM32Cubeで実行するやつ:[UM1913 Developing applications on STM32Cube with STMTouch touch sensing library](https://www.st.com/resource/en/user_manual/dm00210526-developing-applications-on-stm32cube-with-stmtouch-touch-sensing-library-stmicroelectronics.pdf)

#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から設定
　グループ１のG6_IO1をサンプリングコンデンサ接続に設定
　G6_IO3をセンサに指定(今回は合計1つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/1ff8dc1a-d021-41f6-c232-3162f32060e3.png)


　次にMiddlewareのTOUCHSENSINGをEnableし、Sensors selectionへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/cf2609a8-0411-5f0f-1681-16f34bf238cf.png)

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


　次にConfig parametersを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/01ff6881-691d-a3ef-f1d1-2742764f3f8f.png)


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

　最後に![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/7dcef153-bc6b-71f2-94cb-a6c76a125002.png)でコードを生成する

#main.cを編集する

　main.cの追記する部分のみ記述します。自動生成のコメントから場所を察してください。

```cpp: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/89534b34-e1a1-f1d7-11b7-0c6bdce13d41.png)


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