クラッピーの拍手をカウントしてみた

KumaMCNガチ勢のガチ本です。
クラッピーチャレンジ Advent Calendar 2017 8日目の記事です！

クラッピーチャレンジを始めてから最初に作った拍手のカウントについて紹介しまーす。

完成動画はこれ。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">拍手がカウントできるようになったよー<a href="https://twitter.com/hashtag/KumaMCN?src=hash&amp;ref_src=twsrc%5Etfw">#KumaMCN</a> <a href="https://twitter.com/hashtag/%E3%82%AF%E3%83%A9%E3%83%83%E3%83%91%E3%82%BD%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#クラッパソン</a> <a href="https://twitter.com/hashtag/%E3%82%AF%E3%83%A9%E3%83%83%E3%83%94%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#クラッピーチャレンジ</a> <a href="https://t.co/EEBw3z66dL">pic.twitter.com/EEBw3z66dL</a></p>&mdash; 藤本賢志 (@sotongshi) <a href="https://twitter.com/sotongshi/status/835927710979350529?ref_src=twsrc%5Etfw">2017年2月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まずは、スイッチの部分を作ります。
使用したのはこれ。ダイソーに売ってあるケーブルを壁に固定するやつです。
![25035503_1662301183791222_40102437_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/6de9952b-a785-655a-8087-541b2eb3eef2.jpeg)

クラッピーを解体して、一個はそのまま上部に、もう一個は口の裏側に引っ掛ける部分だけ折って曲げて入れるとちょうどいいです。
導線をはんだ付けしましょう。（…はんだ付けしにくいです。削ったらいいかも。）
中が汚いのはいろいろ試行錯誤していたせいですｗｗｗ （書けるペンとか試していた。）
![25035433_1662301113791229_1442166122_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/2b6d39de-57a4-c40b-a0e2-6d789080cf0a.jpeg)

拍手するときに、次のように接触することでスイッチになります。
![24992919_1662301163791224_628580510_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/9d8d9cc9-2d83-80d0-eaf0-fe2b0b530bc2.jpeg)

クラッピーの底をカッターで少し切り、下から導線を出します。
![25075257_1662301160457891_317282021_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/2777a874-f86f-df8d-e008-94a5afa92b2e.jpeg)

Bluetoothでワイヤレスにしたかったので、Bluno Nano Arduinoを使用しました。（…まだできていない、クラッピーの中に埋め込みたい）
赤い導線を3Vに、黒い導線をアナログピン（A3）に挿します。A3からGNDへ抵抗を挿します。
![25086881_1662301130457894_764489773_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/9f9b2536-4bb1-c44d-3c6b-3dd2b8d58739.jpeg)

Blunoをパソコンと接続します。
Blunoに書き込むArduinoプログラムはこちら。
ONになっている間カウントし、ONからOFFになったときに（ある程度カウントされていることで、ノイズで拍手カウントされなくなります）、シリアル通信で文字"8"（もしくは拍手カウント数）を送ります。

~~~
int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3
                       // outside leads to ground and +5V
int val = 0;           // variable to store the value read
int count = 0;
int clap = 0;
int preclap = 0;
int clapcount = 0;
void setup()
{
  Serial.begin(9600);          //  setup serial
}

void loop()
{
  val = analogRead(analogPin);    // read the input pin
  //Serial.println(val);
  if(val > 50){
    count++;
    clap = 1;
    //Serial.println("ON");
  }else{
    clap = 0;
    //Serial.println("OFF");
  }
  if(preclap == 1 && clap == 0 && count > 500) {
    clapcount++;
    //Serial.println(clapcount);
    Serial.println("8");
    count = 0;
  }
  preclap = clap;
}
~~~

文字を受け取ってカウントする（もしくは拍手カウント数を受け取って表示）するPythonプログラムはこちら。
Qtを使っています。

~~~
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
import serial
import serial.tools.list_ports
import re

# TODO
# Reset Button
# Close Serial
class ClappyCount(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.ser = serial.Serial()
        self.ser.baudrate = 9600
        # print(list(serial.tools.list_ports.comports())[0][0])
        # self.ser.port = list(serial.tools.list_ports.comports())[0][0]
        self.ser.port = "COM7"
        self.ser.open()

        self.LCDDisplay = QLCDNumber(self)
        BoxLay = QVBoxLayout()
        BoxLay.addWidget(self.LCDDisplay)
        self.setLayout(BoxLay)
        self.setGeometry(500, 500, 300, 200)
        self.setWindowTitle('パチパチ数')
        self.clapcount = 0
        self.LCDDisplay.display(self.clapcount)
        self.show()
        self.showMaximized()
        timer = QTimer(self)
        timer.timeout.connect(self.Update)
        timer.start(100)

    def Update(self):
        self.buf = self.ser.readline()
        if self.buf != "":
            # self.clapcount = int(self.buf.decode('utf-8'))
            self.clapcount += 1;
        self.LCDDisplay.display(self.clapcount)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = ClappyCount()
    sys.exit(app.exec_())
~~~

Windowsでコマンドプロンプトを開き、Pythonプログラムを実行しましょう。（Anacondaよく使ってます。環境切替に。）
アナログ入力のノイズが多く、うまくカウントされない場合があったので、難しかったです。
つくると3では、来場者にたくさんカウントしてもらって楽しかったです。

以上です。