必要な道具・部品
- こんな感じのジャンパーワイヤーセットちょっと高いけど便利
- こんな感じの小型ブレッドボード
- こんな感じのArduino用バニラシールド基板
- 超音波距離センサーモジュールHC-SR04
- はんだごてセット(はんだごては楽しい!)
第一段階
- 配線
- VCC(HC-SR04) <--繋ぐ--> 5v(Arudion)
- Trig(HC-SR04) <--繋ぐ--> Digital 12 (Arudion)
- Echo(HC-SR04) <--繋ぐ--> Digital 11 (Arudion)
- Gnd(HC-SR04) <--繋ぐ--> Gnd (Arudion)
まずは、ジャンパーワイヤーとブレッドボードを使って試してみる。
以下、センサーと青い箱の間を何かが通過したらカウントアップさせるようにしてみた。
サンプルスケッチ
/*
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);
}
第二段階
無事になんとなく動いたので、はんだごてで部品をつないでみた。完成品はこんな感じ。コンパクトに収まった。
まとめ
かなり簡単につくれてしまう。コーディングもセンサー相手で素直なので楽しい。センサーは壊れていない限り嘘やいい加減なことを言わない。次回は組み上がったもをIntel Edison+Arudionに乗せ変えて、Edison経由で操作してみることにする。Intel Edison+Arudionの入手元(PCパーツARKさんより提供してもったので、プチPR)。
上記のスケッチを参考に、Edison上でnodejs or python で処理を書いてみることにする。このあたりのmraaが参考になりそう。
完成バージョン1はIntel Edison+Arudionを提供してくださった、ARKさんで試験運用することになる。
最終系は、(日時,天気,湿度,気温,カウンター情報)をEndopointにポストするかダウンロードできるようにしたい。どんな時に人がきてどんな時に売り上げが上がるか調査できるようにしたい。精度は粗めだが、こういうのは動かしてデータを積んでいくとデータを相対的にある程度評価できるからまずは使ってみて様子をみることから始める。
同じようなシステムはすでにあるけど、高そう。手軽にリーズナブルにしかも自分でも簡単に作れてしまう時代に突入。また、時代が進化する。
後、何人店舗に入ったかがわかればコンバージョンはとれる。そのコンバージョンを上げることが目標になれば店舗スタッフにとってはわかりやすい目標になるのかもしれない。店舗のものが売れないのは、場所が原因?バイヤーが買ったものが原因?店舗スタッフのサービスが原因?とか改善箇所を洗い出す手助けにもなるはず。さらに、売り上げアップに繋がるコンバージョンを上げるために店舗スタッフが努力すれば、そこでの成果は一目瞭然なので、店舗で頑張っているスタッフさんの手助けになれれば嬉しい。店舗スタッフの処遇の改善にもつながったら嬉しい。