29
26

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.

ラズパイ+タクトスイッチでSlack用へぇボタン作成してみた

Last updated at Posted at 2016-03-31

ラズパイに接続されたタクトスイッチを押した時にSlackに「へぇ」と発言するトリビアの泉風のボタンを作ってみました

できたもの

ブレッドボードに接続されたボタンを押すと以下のようにSlackの特定チャンネルに「へぇ」と発言します。複数回押せばその回数「へぇ」と発言します。

Screen Shot 2016-03-31 at 11.43.22 AM.png

環境

  • ラズパイ3。別に3でなくても良いはず
  • タクトスイッチ
  • ブレッドボード
  • 1kΩの抵抗
  • オスメスジャンパー線3本

配線する

以下のように配線しました。
ここは本に書いてあったのをそのままですね。
配線図はfritzingというソフトを使って描いてみました。

qiitatest_bb.jpg

実際、こんな感じですね。

reduce.jpg

Pythonでボタンが押されたかを取得する

以下のようなプログラムを書きます。

inputsw.py
# おまじない
import RPi.GPIO as GPIO
import time
import signal
import sys

# Ctrl+CによってSIGINTシグナルが送信された時のハンドラ。終了前にGPIO.cleanupを呼び出す
def handler(signum, frame):
  print 'Signal handler called with signal', signum
  GPIO.cleanup()
  sys.exit(0)

# ハンドラの登録
signal.signal(signal.SIGINT, handler)

# GPIO9を入力として利用
GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.IN)
before = 0

# 無限ループ
while True:
  # 押された場合には1、押されていない場合0を返す
  now = GPIO.input(9)
  if before == 0 and now == 1:
    print("Push!!!")
  time.sleep(0.1)
  before = now

これでプログラム実行中にスイッチが押されたタイミングで標準出力に Push!!! と表示されます。中断したい場合にはCtrl + Cでシグナルを送信して中断します。

$python inputsw.py
Push!!!
Push!!!
Push!!!
^CSignal handler called with signal 2

Slackの特定チャンネルにへぇと呟かせる

最初から上記に組み込んでもいいのですが、PythonからSlackへの通知は初めてだったので最初はこちらだけのものを実装しました。

確認するとSlackでメンテナンスされているSlack用のライブラリがあったのでこれを使うようにします。

slackhq/python-slackclient

まずはインストールします。

$sudo pip install slackclient

公式のReadmeの内容で動くか確認してみます。
なお、tokenの部分については事前に以下のURLにアクセスしてtokenを発行し、発行されたtokenを設定してください。

slack-token

slack.py
import time
from slackclient import SlackClient

token = "xoxp-xxxxx"
sc = SlackClient(token)
print sc.api_call(
  "chat.postMessage", channel="#general", text="Hello from Python! :tada:",
  username='pybot', icon_emoji=':robot_face:'
)

実行してみます。

$python slack.py

設定があっていれば以下のようにSlackで表示されます。

Screen Shot 2016-03-31 at 10.56.07 AM.png

メッセージを変えてみます。
日本語を書いているのでUTF-8である旨も追記しています。

slack.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
from slackclient import SlackClient

token = "xoxp-xxxx"
sc = SlackClient(token)
print sc.api_call(
  "chat.postMessage", channel="#general", text="へぇ :neutral_face:",
  username='pybot', icon_emoji=':robot_face:'
)

Screen Shot 2016-03-31 at 11.21.28 AM.png

できましたね。

ボタンを押したタイミングでSlackでへぇと発言させる

単純に先ほどのプログラミング内容を最初に作成したinputsw.pyに持って行きます。

inputsw.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import signal
import sys
from slackclient import SlackClient

def post(sc):
  print sc.api_call(
    "chat.postMessage", channel="#general", text="へぇ :neutral_face:",
    username='pybot', icon_emoji=':robot_face:'
  )

def handler(signum, frame):
  print 'Signal handler called with signal', signum
  GPIO.cleanup()
  sys.exit(0)

signal.signal(signal.SIGINT, handler)

GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.IN)
before = 0
token = "xoxp-xxxxx"
sc = SlackClient(token)

while True:
  now = GPIO.input(9)
  if before == 0 and now == 1:
    print("Push!!!")
    post(sc)
  time.sleep(0.1)
  before = now

今回はバックグラウンドで実行してみます。

$python inputsw.py &

この状態でボタンを押すとSlackで発言されます。
複数押せば、押した数分だけ発言されます。

Screen Shot 2016-03-31 at 11.43.22 AM.png

うざい。

終わらせる時はプロセスをkillしましょう。

# プロセスIDを確認
$ps aux |grep python
pi        2630  0.4  1.4  18940 13872 pts/0    S    17:41   0:00 python inputsw.py
pi        2639  0.0  0.1   5724  1852 pts/0    S+   17:44   0:00 grep --color=auto python

# シグナルを送信
$kill -KILL 2630

# 終了を確認
$ps aux |grep python
pi        2641  0.0  0.1   5724  1832 pts/0    S+   17:44   0:00 grep --color=auto python
[1]+  強制終了            python inputsw.py

# ボタンを押しても何も発言されない

LEDやセンサーと組み合わせて色々するのもやってみたいですね!

29
26
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
29
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?