Edison Intelに乗せる前にArduinoで超音波距離センサモジュールHC-SR04を使って人がある範囲を通過したらカウントするというデバイスを作ってみた


## 必要な道具・部品
* こんな感じの[ジャンパーワイヤーセット](http://www.amazon.co.jp/dp/B001P2O0BM)ちょっと高いけど便利
* こんな感じの[小型ブレッドボード](https://www.switch-science.com/catalog/1475/)
* こんな感じの[Arduino用バニラシールド基板](https://www.switch-science.com/catalog/991/)
* [超音波距離センサーモジュールHC-SR04](http://www.amazon.co.jp/dp/B004U8TOE6/)
* はんだごてセット（はんだごては楽しい！）

## 第一段階

* 配線
 * VCC(HC-SR04) 　<--繋ぐ--> 5v(Arudion)
 * Trig(HC-SR04)　<--繋ぐ--> Digital 12 (Arudion)
 * Echo(HC-SR04)　<--繋ぐ--> Digital 11 (Arudion)
 * Gnd(HC-SR04)　 <--繋ぐ--> Gnd (Arudion)

まずは、ジャンパーワイヤーとブレッドボードを使って試してみる。
以下、センサーと青い箱の間を何かが通過したらカウントアップさせるようにしてみた。

![IMG_0511.jpg](https://qiita-image-store.s3.amazonaws.com/0/18766/360388e7-3dd6-b315-fdb3-ea847f3af888.jpeg "IMG_0511.jpg")

### サンプルスケッチ

[このあたりを参考にした](http://arduinobasics.blogspot.jp/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html?m=1)

```ino:sketch_HCSR04.ino
/*
   HC-SR04 Ping distance sensor:
   VCC to arduino 5v 
   GND to arduino GND
   Echo to Arduino pin 11
   Trig to Arduino pin 12
   */

#define echoPin 11 // Echo Pin
#define trigPin 12 // Trigger Pin
#define LEDPin 13 // Onboard LED

int defaultDistance = 0; // centimètre 
int prevDistance = 0;
int counter = 0;
int adjustment = 3; // centimètre
boolean lock = false;
int maximumRange = 500; // Maximum range needed
int minimumRange = 3; // Minimum range needed
int unlockReadyCounter = 0;
int unlockReadyCounterAdjusment = 1;

void lockCounter() {
    digitalWrite(LEDPin, LOW);
    unlockReadyCounter = 0;
    lock = true;
}

void unlockCounter() {
    if (unlockReadyCounter > unlockReadyCounterAdjusment) {
        digitalWrite(LEDPin, HIGH);
        unlockReadyCounter = 0;
        lock = false;
    } else {
        unlockReadyCounter++;
    }
}

void LEDBlink(int c) {
    for (int i = 0; i < c; i++) {
        digitalWrite(LEDPin, HIGH);
        delay(500);
        digitalWrite(LEDPin, LOW);
    }
}

void init() {
    lock = false;
    defaultDistance = 0;
    prevDistance = 0;
    unlockReadyCounter = 0;
    counter = 0;
    digitalWrite(LEDPin, HIGH);
    LEDBlink(3);
}

void setup() {
    Serial.print("Start setup...");
    Serial.begin(115200);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
    LEDBlink(3);
}

void loop() {
    //capture the time the board has been running
    int time = millis()/50;
    if (time == 0) {
        init();
    }

    long duration, distance; // Duration used to calculate distance
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10); // overhead 
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = duration/58.2;

    if (defaultDistance == 0) {
        LEDBlink(2);
        defaultDistance = distance;
        Serial.print("Default Distance: ");
        Serial.println(defaultDistance);
        lockCounter();
    } else if ( 
            distance >= maximumRange ||
            distance <= minimumRange ||
            defaultDistance <= distance ||
            defaultDistance > prevDistance
            ) { // lock condtion
        lockCounter();
    } else if (
            (defaultDistance - adjustment) > distance
            ) { // unlock condtion
        unlockCounter();
        Serial.print("unlockReadyCounter: ");
        Serial.print(unlockReadyCounter);
        Serial.println(" count.");
    }
    if (lock == false) {
        LEDBlink(1);
        lockCounter();
        counter++;
        Serial.print("Counter: ");
        Serial.print(counter);
        Serial.println(".");
        Serial.print("Detected Distance: ");
        Serial.print(distance);
        Serial.println("cm.");
    }
    if (distance && unlockReadyCounter == 0) {
      prevDistance = distance;
    }
    delay(50);
}
```

## 第二段階

無事になんとなく動いたので、はんだごてで部品をつないでみた。完成品はこんな感じ。コンパクトに収まった。

![IMG_0517.jpg](https://qiita-image-store.s3.amazonaws.com/0/18766/aaf59131-c95e-3bf0-a854-3a8a9c76873f.jpeg "IMG_0517.jpg")

## まとめ
かなり簡単につくれてしまう。コーディングもセンサー相手で素直なので楽しい。センサーは壊れていない限り嘘やいい加減なことを言わない。次回は組み上がったもをIntel Edison+Arudionに乗せ変えて、Edison経由で操作してみることにする。[Intel Edison+Arudionの入手元](https://www.ark-pc.co.jp/i/10390002/)（PCパーツARKさんより提供してもったので、プチPR）。

上記のスケッチを参考に、Edison上でnodejs or python で処理を書いてみることにする。このあたりの[mraa](https://github.com/intel-iot-devkit/mraa/tree/master/examples)が参考になりそう。

完成バージョン1は[Intel Edison+Arudion](https://www.ark-pc.co.jp/i/10390002/)を提供してくださった、ARKさんで試験運用することになる。

最終系は、(日時,天気,湿度,気温,カウンター情報)をEndopointにポストするかダウンロードできるようにしたい。どんな時に人がきてどんな時に売り上げが上がるか調査できるようにしたい。精度は粗めだが、こういうのは動かしてデータを積んでいくとデータを相対的にある程度評価できるからまずは使ってみて様子をみることから始める。


同じようなシステムはすでにあるけど、高そう。手軽にリーズナブルにしかも自分でも簡単に作れてしまう時代に突入。また、時代が進化する。

後、何人店舗に入ったかがわかればコンバージョンはとれる。そのコンバージョンを上げることが目標になれば店舗スタッフにとってはわかりやすい目標になるのかもしれない。店舗のものが売れないのは、場所が原因？バイヤーが買ったものが原因？店舗スタッフのサービスが原因？とか改善箇所を洗い出す手助けにもなるはず。さらに、売り上げアップに繋がるコンバージョンを上げるために店舗スタッフが努力すれば、そこでの成果は一目瞭然なので、店舗で頑張っているスタッフさんの手助けになれれば嬉しい。店舗スタッフの処遇の改善にもつながったら嬉しい。

![IMG_0515.jpg](https://qiita-image-store.s3.amazonaws.com/0/18766/6b277513-8aca-2ba0-afdd-4c87eecae723.jpeg "IMG_0515.jpg")