10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

カウントダウンだけで宴会は盛り上がるをIoT化してみた。

Last updated at Posted at 2018-03-17

カンパイシェア (1) (2) に引き続き宴会ネタで恐縮です。

Q. 飲み会で一番盛り上がる瞬間は?

A. カンパイ!

ということで、そのカンパイをさらに盛り上げるため、カウントダウンを組み合わせることにした。

スクリーンショット 2018-03-16 15.27.59.png

参考にしたのはDPZの「カウントダウンだけで宴会は盛り上がる」である。

スクリーンショット 2018-03-13 14.52.55.png

新年でなく、なんでもないタイミングでもカウントダウンさえすれば盛り上がることを体現した事例で、カウントダウンとカンパイを組み合わせればさらに盛り上がることは必至である。

[スクリーンショット 2018-03-13 20.41.31.png]
(http://portal.nifty.com/kiji/180126201872_1.htm)

クラッカー噴出装置を製作 (IoT化) し、カンパイシェアでグラスをピカらせるのと同時にクラッカーを鳴らしてみることにした。

構成

スマートスピーカー (Google Home または Amazon Alexa) を入力として、Node-REDを経由してwebhookリクエストをMQTTリクエスト (Publish) へ変換し、Milkcocoa経由でカウントダウンIoT、カンパイシェア、ラズベリーパイ、PepperへMQTTリクエスト (Subscribe) を送る構成とした。

カウントダウンIoT構成.png

カウントダウンIoT

MQTTリクエストを受信するとLEDバーを点灯し、リレー操作でギヤードモータを動作させ、クラッカーの引き出し紐を引かせる。

カンパイシェア

MQTTリクエストを受信するとリングLEDを点灯し、振動モーターを動作させる。詳細の動作はこちら

ラズベリーパイ

MQTTリクエストを受信するとgoogle-home-notifierへ変換し、Google Homeにカウントダウンを発声させる。

Pepper

MQTTリクエストを受信するとカウントダウンを発声させる。

配線図

カウントダウンIoTの配線図を説明する。

スクリーンショット 2018-03-14 22.18.55.png

Wio-Node は Grove コネクタが 2ポート装備されているが、PORT0 はコードの書き換え用途のシリアルポートとして使用するため、PORT1 のみを使用して実現する。
PORT1には VCC、GND、IO4、IO5 が配線されているため、IO4 を LEDバー (WS2812) 制御用、IO5 をギヤードモータを操作するリレー操作用に割り当てる。VCC と GND は共用とする。

カウントダウンIoT配線図.png

これで Groveコネクタ 1本で制御できるようになった。A8 カードケースへ収めるため、電源は Li-Po バッテリーを使用する。(モバイルバッテリーなど USB 電源でも動作可。)

スクリーンショット 2018-03-13 23.40.00.png

クラッカー噴出装置

クラッカー噴出装置は先行特許 特開2013-252401 が存在する。

スクリーンショット 2018-03-17 10.55.01.png

本発明はギヤードモータの軸にプーリー、または、クランクを取り付けて、クラッカー紐をプーリーに巻き付けて固定、または、クランクに固定して、モータを作動させることにより、プーリーの回転によるクラッカー紐の巻き上げ、または、クランクの引き上げによるクラッカー紐の引き下げでクラッカーを発砲させる仕組みである。プーリーにはクラッカー紐を取り付けるための穴が空けられており、クラッカー紐を穴に通して結んで固定される。(本広報にはクランクを用いた構成図の説明はない。)

侵害を回避するため、今回新たなクラッカー紐の引き出し機構を開発した。

カウントダウンIoT配線図.png

ギヤードモータの軸にφ12.3の ツマミ を取り付けて、上部を十字に溝を掘り、クラッカー紐を L字型 に挟み (モータを動作させてテンションが掛かった際にクラッカー紐が抜けないようにするため L字型 に挟むことがポイント!)、モータを作動させることにより、クラッカー紐を引き下げる仕組みである。プーリーの穴にクラッカー紐を通して結んで固定させる必要は無く、クラッカー紐の取り付けもクラッカー発砲後の取り外しも容易となる。

つまみ部(拡大)
つまみ(実物).png

クラッカー装着図
装着時(発報前).png

クラッカー発砲後
発報後.png

ソースコード

ソースコードはこちら

ESP8266_LED_MOTOR.ino
#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <Milkcocoa.h>

#define WLAN_SSID       ""  // Wi-Fi
#define WLAN_PASS       ""  // Wi-Fi

#define MOTORPIN 5  // Wio-Node IO5 => MOTOR
#define LEDPIN 4    // Wio-Node IO4 => WS2812
#define NUMPIXELS 5   // Number of LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);

WiFiClient client;

#define MILKCOCOA_APP_ID      ""  // MilkCocoa Application ID
#define MILKCOCOA_DATASTORE   ""  // MilkCocoa Datastore Name
#define MILKCOCOA_SERVERPORT  1883

const char MQTT_SERVER[] PROGMEM    = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM  = __TIME__ MILKCOCOA_APP_ID;

Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);

int red, green, blue, strength, timer;

void onpush(DataElement *elem) {
  Serial.println("onpush");
  Serial.print("r:");
  Serial.print(elem->getInt("r"));
  Serial.print(",g:");
  Serial.print(elem->getInt("g"));
  Serial.print(",b:");
  Serial.print(elem->getInt("b"));
  Serial.print(",s:");
  Serial.print(elem->getInt("s"));
  Serial.print(",t:");
  Serial.print(elem->getInt("t"));
  Serial.println();

  red = elem->getInt("r");
  green = elem->getInt("g");
  blue = elem->getInt("b");
  strength = elem->getInt("s");
  timer = elem->getInt("t");

  if (strength) {
//    countdown(red, green, blue);
    countdown(255, 0, 0);
    digitalWrite(MOTORPIN, HIGH); 
    delay(5000);
    digitalWrite(MOTORPIN, LOW); 
  } else {
    led(0, 255, 0);
  }
}

void led(int v_r, int v_g, int v_b) {
  strip.setBrightness(50);
  for(int i=0;i<NUMPIXELS;i++){
    strip.setPixelColor(i, strip.Color(v_r, v_g, v_b));
    strip.show();
    delay(50);
  }
}

void countdown(int v_r, int v_g, int v_b) {
  strip.setBrightness(50);
  int v_t;
  if (timer) {
    v_t = timer;
  } else {
    v_t = NUMPIXELS;
  }
  for(int i=0;i<v_t;i++){
    strip.setPixelColor(i, strip.Color(v_r, v_g, v_b));
    strip.show();
  }
  for(int i=0;i<v_t;i++){
    strip.setPixelColor(v_t-i-1, strip.Color(0, 0, 0));
    strip.show();
    delay(1000);
  }
}

void setupWiFi() {
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void setup() {
  pinMode(15, OUTPUT);  // for Wio-Node
  digitalWrite(15, 1);  // for Wio-Node
  Serial.begin(115200);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  setupWiFi();
  Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
  pinMode(MOTORPIN, OUTPUT); 
}

void loop() {
  milkcocoa.loop();
  led(255,255,255);
}

まとめ

複数同時にクラッカーを鳴らすとさらに盛り上がることを確認できた。(外国人の方にもウケました!)
みなさまの盛り上がりに少しでも貢献できれば幸いです。良きパリピライフを!!

[スクリーンショット 2018-03-14 21.06.35.png]
(https://youtu.be/tpOUzTTVZyg)

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?