流行りのInternet of Things でLife is Tech ! のお父さんたちにクリスマスプレゼントをおねだりする

  • 35
    いいね
  • 0
    コメント

どうも!!いよいよ終わりが近づいてきましたアドベントカレンダー21日目!:point_up:
Life is Tech ! にてWebデザインコース、IoT入門 with MESH コースのメンターを担当してますだいふくです!!:sunglasses:

12月21日ともなると、もうじきクリスマス!
Life is Tech ! もあと2日もすればとってもとっても楽しいXmas Camp 2016 が始まります
今年も忘れられないクリスマスになりそうです!

ところでクリスマスといえば、やっぱりクリスマスプレゼントですよね:santa_tone2:
12月25日の朝起きた時のあのドキドキ感が未だに忘れられません
僕も子供のころは、サンタさんに手紙を書いて好きなものをお願いしていたものでした

ですが、今年で20歳になり大人の仲間入りをしてしまった僕のところにはサンタさんが来ません

悲しい。。。。。
まだクリスマスプレゼント欲しい。。。。。。。
誰か。。。。。。。。

はっ
そういえばLife is Tech ! には可愛らしいお子さんをお持ちのとっても素敵なパパサンタさん達がたくさんいました

お父さん① 『娘さんのことになるとデレッデレ』ことまるさん

marusan.jpg

お父さん② 『人の姿をした天使』ことたいちさん

TaichiSan.jpg

お父さん③ 『例え人に馬鹿にされても、故郷の言葉を守り抜く。おれは。』ことうみんちゅさん

UminchuSan2.jpg

UminchuSan2.png

お父さん④ 『すべり知らず爽やか王子』ことトッティさん

TottySan2.jpg

お父さん⑤ 『3人娘のエリートパパ』こときむてつさん

 KimutetsuSan.jpg

この人たちなら。。。
いやでも、さすがにプレゼント買ってくれるわけないか。。。

いやいや、諦めてはいけません
why don’t you change the world ?
技術力で、半径5メートルから世界を変えていきましょう

作るもの

そういえば最近こんなものが出ました

Amazon Dash Button

2016年12月5日に正式に日本でもサービス開始しましたAmazon Dash Button
ボタンひとつ押しさえすれば商品が届くという仕組みで、これぞまさにIoTプロダクトと言えるでしょう
一つあたり500円ですが、今ならキャッシュバックでなんとただで貰えるみたいです!

そんなAmazon Dash Buttonですが、ADB自作は他の幾つかのアドベントカレンダーでもやっていました。。。
なので今回は代わりにパパたちに駄々こねるボタンを作りたいと思います!
おねだりするもの

必要なもの

【必要なものリスト】
・環境構築を終えたRaspberryPi3とその周辺機器(詳しくはこちらから
・LED
・ジャンプワイヤ
・タクトスイッチ
・1kΩ抵抗1本
・10kΩ抵抗1本

Need.jpg

【ライブラリインストール】

まずRaspberrypi3にてPythonを使ってGPIO制御するために、GPIO Pythonライブラリをインストールします

$ sudo apt-get install python-rpi.gpio

Life is Tech ! の社内コミュニケーションツールでもあるSlackを使い、Life is Tech ! のお父さんたちにプレゼントをおねだりしていきます
なのでPython用Slack SDKであるSlackerをRaspberrypi3にインストールしていきます

$ sudo pip install slacker

揃いましたでしょうか?

実装

電子工作

タクトスイッチをボタン代わりに、LEDをスイッチが押されたことを可視化するために使います

① RaspiのPin11番をLEDのアノードにつなぎ1kΩ抵抗を通してGNDにつなぎます

② Raspiの3.3Vをタクトスイッチにつなぎ、Pin21番でタクトスイッチの入力で読みとり、10kΩ抵抗を通しGNDにつなぎます

次の画像の通りに回路を組んでみましょう

スクリーンショット 2016-12-16 7.49.09.png

Slack Web API

回路が組めたら次はSlackのBotの設定をしましょう
Slackerを使うためにまず、自分が所属しているTeamのtokenを取得しなければなりません
取得したいtokenのTeamでログインした状態でSlack Web APIにアクセスをし、tokenを取得しましょう

https://api.slack.com/web

スクリーンショット 2016-12-20 4.52.09.png

tokenを取得したらtestしてみましょう
Try it now!をクリック

スクリーンショット 2016-12-20 5.43.48.png

Test Methodを押してみて、trueが帰ってきたらそのtokenが有効であることがわかります

スクリーンショット 2016-12-20 5.44.20.png

trueが帰ってきたら、そのtokenをコピーし、コーディングに移っていきましょう

コーディング

RaspiはNode.jsやシェルスクリプトなど様々な方法で制御可能ですが、今回はPythonを使ってコーディングしていきます!

'onedari.py'
#! /usr/bin/env python
# coding: utf-8

import RPi.GPIO as GPIO
import time
import signal
import sys
from slacker import Slacker

def handler(signum,frame):
    print'  Clean up',signum
    GPIO.cleanup()
    sys.exit(0)

def onedari(slacker,channel_name,message):
    slacker.chat.post_message(channel_name,message,username="baby",icon_emoji=':baby',link_names = 1)


signal.signal(signal.SIGINT,handler)

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(21,GPIO.IN)
val = 0
old_val = 0
state = 0

token = "xoxp-hogehogehogehogehogehgoehgoe(自分が取得したtoken)"
slacker = Slacker(token)
channel_name = "チヤンネル名"
message = "パパこれ買って"

while True:
    val = GPIO.input(21)
    if old_val == 0 and val == 1:
        print("Onedari")
        onedari(slacker,channnel_name,message)
        GPIO.output(11,True)
        time.sleep(0.5)
        GPIO.output(11,False)

    old_val = val

チャタリング防止

さてここでタクトスイッチを使う際に気をつけないといけない
チャタリングという現象について説明したいと思います

電子工作において、機器に使用する接点が機械的に接触したり離れたりするときに、小さな振動で小さな接触の繰り返しを起こします
この現象のことをチャタリングと呼びます

このチャタリングが厄介者で、電子工作においてよく悩ましい事態を招きます
今回の例で言うと、タクトスイッチを押したのに、LEDが光らない、Slackで通知してくれないなどの不具合が起きてしまう温床になる
購入したつもりができていなかったり、おねだりしたつもりが相手に伝わっていない事態になってしまうのです!

しかし、ソフト面で解決するのは以外と簡単
この小さな接触の繰り返しが起きてしまう時間分、delayを生じさせれば大丈夫です

ondeary.py
~~

while True:
    val = GPIO.input(21)        #タクトスイッチの入力を読み込み
    if old_val == 0 and val == 1:
        print("Onedari")
        onedari(slacker,channnel_name,message)
        GPIO.output(11,True)
        time.sleep(0.5)        #0.5秒待つ delayを生じさせる
        GPIO.output(11,False)

    old_val = val

さて、いよいよ実行してみましょう

$ python onedari.py

デモ

ADBまさしく、押せば押すほどパパたちにおねだりしていきます

sample.gif

実際にはこんな感じでおねだりしてます
usernameでbotの名前をしていでき、icon_emojiでbotのiconをつけ
line_names = 1でメンションにリンクをつけます

onedary.py
def onedari(slacker,channel_name,message):
    slacker.chat.post_message(channel_name,message,username="子供",icon_emoji=':baby',link_names = 1)

スクリーンショット 2016-12-21 10.31.18.png

またチャンネル投稿でなく、DirectMessageでおねだりしたい場合は、channel_nameに@相手のユーザー名でできます
また as_user=True にするとbotでなく、tokenを自作したユーザー自身が直接おねだりすることも可能です

onedary.py
channel_name = "@kimtetsu.kimura"
~~
slacker.chat.post_message(channel_name,message,as_user=True')

スクリーンショット 2016-12-21 10.31.31.png

まとめ

さて!
Life is Tech ! が誇る素敵なパパサンタ5人にプレゼントをおねだりすることが無事できました!
XmasCampの25日の朝、枕元に素敵な贈り物が置いてあることを楽しみにして、キャンプ頑張りたいと思います!

次は伝説スーパー黒ポロメンターはるふさんによる『踏み込んだGitの話』!!!
とっても楽しみです!
乞うご期待!!