電子回路入門　チャタリング防止

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614 "電子部品ごとの制御を学べる! Raspberry Pi 電子工作実践講座")に沿って引き続き進めていきます。

#**チャタリングとは？**
スイッチを押したときに、その反動でONとOFFを短い間隔で繰り返すことです。
マウスを使用しているときにワンクリックしたはずなのに、ダブルクリックとして判定されてしまった。スイッチの劣化に伴って振動も増えてきたりするので、そんなことがあると思います。(私はありました(´・ω・`))

マウスの場合は
![チャタリング.png](https://qiita-image-store.s3.amazonaws.com/0/195542/b542fce4-6f29-73bb-f18b-7f1522f6c377.png)


これを防止するためには**プログラムで防止**する方法と、**電子回路で防止**する方法があります。

#**使用部品**
- PSoC 5LP
- LED
- 抵抗(100,470,1kΩ)
- [コンデンサ](http://akizukidenshi.com/catalog/g/gP-05103/)(10μF)
- [SN74HC14N](http://akizukidenshi.com/catalog/g/gI-08879/)(シュミットトリガ,NOT回路)
- [タクトスイッチ](http://akizukidenshi.com/catalog/g/gP-03647/)

#**プログラムで防止**
スリープさせてチャタリングを解消しましょう。
イメージとしては以下。一度ONしたら数ミリ秒の間、スイッチの状態を読み込まないようにする。
![プログラムチャタリング.png](https://qiita-image-store.s3.amazonaws.com/0/195542/5cc96ae3-4a06-4a27-27ca-65621ee92507.png)
欠点として、スリープさせるのでその間の時間が無駄になる。

##**回路図**
ボタンを追加(※pull UP)
※常時電流ががピンに対して流れている(ON)。ボタンを押すとグランド(-)とつながり、電流がグランドに流れてピンには流れなくなる(OFF)。なぜグランドに流れるようになるのかというと、電流も人間と同じで近道を通りたいので、わざわざPsoCを通ってグランドへ行きたくない。そんな感じです。逆に**pull down**も存在します。(ボタン押すとピンに電流が流れる。わかりやすいが少々問題がある。)
![チャタリング_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/6522ae83-2c3e-7815-03ee-4fb56c7e863e.png)
ボタンと抵抗の位置を逆にするとpull downになります。
プルアップのボタンに対してつけている抵抗を**プルアップ抵抗**と呼び、一般的には10kΩを使用するみたいです。私は1kΩ使用しました。この抵抗値は適当でいいですが(ショートしないように)、10kΩを使用すると覚えておけばいいと思います。
![チャタリング_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/811c51ca-8e89-6411-8eed-3ab082405b0b.png)

##**プログラム**
待ち時間5m秒を与えてやります。
ちなみにこのプログラムはボタンを押すとLEDが消灯します。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    int sw = 0;
    for(;;)
    {
     if(sw != SW_Read()){
      sw = SW_Read();
      CyDelay(5);
     }
     if(sw == 1){
      LED_Write(1);
     }else{
      LED_Write(0);
     }
    }
}
```

#**電子回路で防止**
コンデンサを使用して電圧の上昇を緩やかにします(充電してます)。それにより、一瞬で５Vに上がることが無くなり、チャタリングが防止されます。コンデンサにはいろいろな役割がありますが、ここでは電圧の上昇を緩やかにするものだと思ってください。

そして、**シュミットトリガ**を使用して2値化します。シュミットトリガ...かっこいい名前（＾ｕ＾）
シュミットトリガとは...2つの閾値を利用してONかOFFを分ける方式。
分けている2つの閾値を**スレッショルド電圧**と呼びます。かっこいい名前（＾ｕ＾）
今回はＳＮ７４ＨＣ１４Ｎを使用。
ＳＮ７４ＨＣ１４Ｎの場合、VT+が今回の場合3Vくらいかな？VT-が2Vくらい。(要仕様書参照)
VT+を越えた時ONになり、VT-を下回らないとOFFにはなりません。

- コンデンサを使用した波形(黄色)
- シュミットトリガ使用後の波形(下図)

![スレッショルド.png](https://qiita-image-store.s3.amazonaws.com/0/195542/b6e98f5c-c134-da72-b24d-f048816b14ab.png)
欠点として、部品が増えるので費用が少々増える。

##**回路図**
![シュミットトリガ_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/63c930d7-ce47-0d36-4e65-fc8539ae8edd.png)
コンデンサには極性が無いので安心て付けてください。(電解コンデンサとかは極性がある)
コンデンサにつながってる470Ωの値を変更することで電圧の上昇が変化します。
抵抗を大きくするとさらに緩やかに電圧が上昇するようになり、小さくするとすぐに上昇するようになります。この抵抗の値はチャタリングしている時間によって変更してください。
[計算してくれるサイト](https://www.petitmonte.com/robot/howto_capacitor_calc.html)


今回の場合：
5V
1kΩ+470Ω=1.47kΩ
10uF

0.06811046705076393秒
でも、満充電の場合の時間だから…


ＳＮ７４ＨＣ１４Ｎの配線に注意。〇が書いてある部分が1番ピンの位置になります。
ＳＮ７４ＨＣ１４Ｎはシュミットトリガ付きのNOT回路なので、2回通すことによって元の値に戻ります。
![シュミットトリガ_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/c13ca3fc-989f-7198-39a7-17603ca86b04.png)


##**プログラム**
先に書いたプログラムからチャタリング防止用のスリープを取ったものになります。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    int sw = 0;
    for(;;)
    {
     if(sw != SW_Read()){
      sw = SW_Read();
     }
     if(sw == 1){
      LED_Write(1);
     }else{
      LED_Write(0);
     }
    }
}
```

#あとがき

オシロスコープで実際の値を見てみましたが、今回使用したスイッチはあまりチャタリングしないようです…
[こんなボタン](http://akizukidenshi.com/catalog/g/gP-04580/ "パネル取り付け用押しボタンスイッチ")がチャタリングしやすいみたいです。