コンテンツへスキップ

1

ラズパイからSlackへの通信をSlack APIのSlack Incoming WebHooksでやります。

目次

  • Slackとは
  • slackへの通知
  • やってみた

slackとは

slackとは、スチュワート・バターフィールドによって開発されたチームコミュニケーションツールです。基本的にはITっぽいLINEみたいなもので、大学やIT系の集団がよく使っており、コードを送ったりするときに便利です。 公式Slack 機能 、公式slack サインイン

APIについて

slackにはいろいろと便利機能が有るらしく、今回の通知機能もslackが提供していすサービス「Incoming WebHooks」「Outgoing WebHooks」を使用します。 公式Slack API

APIとは、

ソフトウェアからOSの機能を利用するための仕様、またはインターフェースのこと。一般的にAPIといった場合は、OSの機能を利用するための関数を指す。APIの概念が登場するまでは、OSの機能を利用するためのプログラムをそのつど開発していたが、APIの登場によりそれらの関数を呼び出すだけでOSの機能を利用できるようになった。最近では、Webサービスの機能を外部から利用するためのインターフェースもAPIと呼ばれる。

from API(エー ピー アイ)とは - コトバンク

APIを使うと、OS(windowsなど。人間やアプリケーションとハードウェアの中間で頑張っている)の機能を呼び出せるという事だと思います。

slackへの通知

今回は簡単のためにSlack Incoming WebHooksを使用します(前提として、slackにすでにサインインしているものとします)。Incoming WebHooksはslackが提供しているAPIの一つで、外部からslackへ送信する機能です。slack側から送信することはできないようです。

通知をするまでの手順です。

  • Slackアプリを作成
  • Incoming WebHooksを有効化し、各種設定をする
  • テスト

Slack Incoming Webhookの設定

ここからSlackn App Directory,検索バーからincoming webhooksを検索して選びます。投稿先のチャンネルを選び、追加します。私はあらかじめSlackでtestチャンネルを作っておきました。プライベートチャンネルも選べます。また、この画面下の方でアイコン画像の設定もできます。

なんやかんや設定して、保存します。

slackwebのインストール

ラズパイにslakwebをインストールします。pipとはPythonのパッケージをインストールするのを簡単にするツールです。apt-getと同じ感覚で使えます。Pythonパッケージに関するツールなので、今回のコードはPythonで書いていきます。ラズパイに以下のように入力すればインストール完了です。

$sudo pip install slackweb
デバック

一応slackwebはインストールできたものの、You should consider upgrading via the 'pip install --upgrade pip' command.というメッセージが出ているので指示に従いました。pip はpythonのapt-get見たいなものです。するとまたもエラー。

$pip install --upgrade pip
Collecting pip
 Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB)
   100% |████████████████████████████████| 1.4MB 207kB/s
Installing collected packages: pip
Successfully installed pip-8.1.1
You are using pip version 8.1.1, however version 19.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
inomata@inomata-desktop:~$ pip install --upgrade pip
Traceback (most recent call last):
 File "/usr/bin/pip", line 9, in <module>
   from pip import main
ImportError: cannot import name main

どうやら参考サイトによると、aptで入れたpipと今入れようとしたpipに互換性がないために怒られてしまっている模様。

$python -m pip uninstall pip
 Successfully uninstalled pip-19.0.3

これ、uninstallするのって19のほうなんですね。このあと

$ sudo apt install python-pip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python-pip はすでに最新バージョン (8.1.1-2ubuntu0.4) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

こんな感じ。まあ問題はない。

この章の参考

やってみた

まずは動作テストです。コードはpythonで書きます。ラズパイにはPythonが標準でインストールされています。incomingSlackwebhools_test.pyを作成し、emacs(好きなエディタ)で開きます。

$touch incomingSlackWebhooks_test.py
$emacs incomingSlackWebhooks_test.py 
import slackweb
slack = slackweb.Slack(url="incoming設定ページでコピーしたURL")
slack.notify(text= "hello world")

slackで指定したチャンネルに「hello world」と届いていればOKです。

画像

incomingの方はすぐですね。同様にすればセンサーの値を取得して変数に与えたりできます。今で元にメスのジャンパーピンがないのでできませんが、何もしないと面白くないので以下のような日にちを伝えるプログラムdateForSlack.pyを作成しました。

# -*- coding: utf-8 -*-

import slackweb
import datetime

slack = slackweb.Slack(url = "incoming設定ページでコピーしたURL")
date = datetime.date.today()
slack.notify(text = "今日は"+str(date))
print("今日は"+str(date))

datetimeというのは実行したときの日付を取得するモジュールです。型変換して文字列にして出力しています。出力結果は以下のようになります。

$cd dateForSlack.pyがあるところ
$python dateForSlack.py

この章の参考

raspberry pi のpythonライブラリはpipよりart-getで入れるのが断然早い -からあげ

IPアドレスを調べるときの参考 ifconfigが非推奨に!? ifconfigコマンドを使わずにRaspberry PiのIPアドレスを調べる方法 -猿まね電子工作

ラズパイを繋いだときに、ホストアドレスからランダムに指定されるのがデフォルトのはず。固定アドレスにする時 Raspbian(jessie)の固定IPアドレス設定方法 -俺の技術メモ

雑談

参考のリンクを書く場所で迷っています。文章の邪魔をしないようにしつつ文章のすぐ近くに配置すれば情報元の対応がわかりやすいですが、一方でこの投稿でほしい情報がすべて手に入るのであれば対応がわかる必要がないから最後にまとめて書くのが親切かもしれない。いろいろなパターンでやってみるつもりです。

送信機のテスト回路を作ってみました。受光素子を使ってみたくなったからです。うまくやればこれでセンサ、無線通信ができるはずです。

作ったもの

作ったものは受信チェッカーです。赤外線受信素子を使用したごく簡単な構成の回路をブレットボードに刺しただけなので作った感は薄いですが。この回路は送信機や受光素子のテストに使えます。

機能

  • 4.5~5.5V電源
  • 受光素子が対応している変調周波数の赤外線を受信するとLEDが点滅する。

動作

図1:作成物
図2:試験の様子

テスト用の送信機はテレビのリモコンを使いました。どこのメーカーのも大体FM38kHzらしいです。

狭い室内でやったところ、光が反射するので360度反応しました。机の下でも大丈夫! だだし経路が目測3mくらいまでで、4mくらいになるとまっすぐ向けていても反応しませんでした。送信機の電力を大きくすると伸びる?かもしれない。送信機を作ったらやってみます。

材料

図3: IRM0101 (右側はカバーを外したもの)
  • 赤外線受光素子PL-IRM0101  1 38kHzを受信するとVoutがVccから0V(HighからLow)に落ちます。
  • pnpトランジスタ 2SA1015
  • 発光ダイオード 持ってたやつ 1
  • 抵抗器 22kΩ 220Ω 1つずつ
  • コンデンサ 22μF
  • 電池ソケットと乾電池3つ

4.5~5.5V電源なら何でもいいです。乾電池3つでは一般的に4.5Vです。電圧を測ってみたら4.8Vでした。

回路


図4:回路構成

回路は上記の通りです。参考の本のまんまです。

使用センサの電源が4.5V~5.5Vだったので、5V電源と書いています。端っこのJがバッテリにつながるコネクタです。回路としてイメージしやすいようにできればと書き加えたものです。実際には私はこれに電池ソケットと電池3本4.5V をつなぎました。

以下は回路の解釈です。

この回路は基本的なスイッチング回路です。スイッチング回路とは、トランジスタの「ベースに条件を満たす電圧がかかった時にエミッタコレクタ間に電流が流れる」という特性をスイッチとして利用した回路です。ここで使用している2SA1015はpnp型のトランジスタですので、電圧がしきい値以下(OFF)の時にスイッチがONになります。

ここで使用しているフォトダイオードは赤外線を受講しているときOFF、していないときONになるように作られています。なので、赤外線を受信したときにスイッチがONになります。

22kΩ抵抗はベース電流を抑えるためのものです。Voutが5Vの時、ベース電圧が4.3Vくらいなので、

$$ \frac{V}{R} = \frac{4.3[V]}{22k[Ω] }\simeq 0.195 [mA] $$

だいたい0.2mAになります。一方で、2AS1015、LED、220Ω抵抗のループを見ると、大雑把にLEDで2Vの電圧降下があるとしたとき

\begin{equation} \frac{V}{R} = \frac{3[V]}{220[Ω]} =13.6 [mA] \end{equation}

なので、LEDには14mAくらい流れると思います。LEDは電流が多く流れるほど明るく光りますので、電流調整用です。

右端のコンデンサはバイパスコンデンサです。コンデンサは直流は通さないが交流は通すという特徴があります。詳細は下に書きました。ノイズは交流なので、直流回路で発生するノイズの交流信号を流してGNDに逃がしたり、電源を外した時にすぐに電圧がゼロにならないように緊急用電源としてついています。ICを使っているとき、ノイズや電源が急になくなることが故障の原因になるかもしれないからです。導線を使っている限りリアクタンス(コイル成分) は発生してしまうんですが、これは電流変化に応じて機電圧が生じるので、急に電圧がゼロになると予期せぬ動きをしかねません。

コンデンサの電圧、電流についてです。電圧Vは電荷量Qに比例しますので、キャパシタンスCを用いて

\begin{equation} Q = CV \end{equation}

\begin{equation} i = \frac{dQ}{dt} = C\frac{dv}{dt} \end{equation}

と書けます。小文字のi,vは交流であることが多いので、慣例に従ってみました。微分は微小時間あたりの微小変化です。例えばここに正弦波V=Acos(ωt)をいれるとコンデンサ電流IはI=Aωsin(ωt)=Aωcos(ωt+π/2)になるので、ちょこっと波長が遅れるわけです。

ここでωは各周波数で、周波数fとはω=2πfという関係があります。コンセントの電圧は東日本ではf=60Hzです。一方、直流はこの各周波数が0ですので、コンデンサの電流は下のようになって流れません。

\begin{equation} i =C\frac{dv}{dt} = C 0 = 0 \end{equation}

確かに変化分がなければただの2枚の板ですもんね。初めて知ったときはコペルニクス的回転って感じでした。そういうのって回路記号にも表れていて、FETとMOSトランジスタの記号の違いとかも面白いですね。

フォトダイオード


図5:受光素子ICの構成

受光素子の中身はどれもだいたいこんな感じみたいです。フォトダイオードの出力をアンプで増幅し、波形を整えて全体の出力とします。今回使った素子は、出力の直前でHigh信号とLow信号を反転させていました。


図6:素子に電圧を印加している時の図
図7:素子内部のエネルギーのイメージ(光導電効果)

半導体のバンドギャップ以上のエネルギーをもつ光が照射されると、光導電効果を起こして電子と正孔が動き、電流が流れます。 図7は上下に粒子のエネルギーの大きさを、左右に位置を表しています。光にエネルギーを貰うと電子は伝導体に入って移動します。電子がなくなった部分を正孔と言います。

このあたりはよくご存じの方には説明する必要は無いので、初めてこういう原理を知る方が読んでもイメージできる様に書いたつもりですが、かなり雑なので気になった方は参考に乗せた本や詳しいサイトで調べてみることをおすすめします。


図8:素子内部のエネルギーのイメージ(光起電力効果)

似たような効果で光起電力効果というのがあります。 n型半導体とp型半導体が接着されているもの(pn接合)に光が照射されると、半導体内部で同じように(違うといえば違うけど)電子と正孔が動き、電子はP層からn層へ、さらに外部回路へ出ていきます。 まとめると、光で電が流れるようになるので光スイッチのような感じで使えます。

雑談

最近思うのが、教科書として大学で推薦されている本って自分で確かめなくていいからとてもありがたい。本によっては完全に間違ってるものもあるじゃないですか、コードをそのまま書いても動かないとか。私がお世話になってる方の本も似たようなことがあって、それは編集の方のミスらしいです。他にも先生が自分の授業で推薦しようとしていた本をボツにした理由を話していたのを聞いたことがあります。筆者本人の認識が完全に間違っていることもありますし。という訳で、本はちゃんと能動的に確かめながら読まないといけないという認識に変化しました。 下に乗っている参考の本は授業で使っている本が多いので、私が授業を受けている先生の考えでは正しいということになりますので、ちょっと安心です。

今後はいろんな本を参考にしながら文章を書いていきたいと思います。

追記(2019/3/18) 段落構成を変更しました。内容は変更ありません。

参考

新版 電子物性 松澤剛雄・高橋清・斉藤幸喜 森北出版株式会社

PICマイコンでつくるインドア・プレーン―ラジコン飛行機を作って飛ばそう (電子工作シリーズ) 田中光一 CQ出版社

例題と演習で学ぶ 電気回路(第2版) 服藤憲司 森北出版

パスコンって何?

赤外線リモコン受信器の製作

ジャンル:IoT 前回 =>Web × IoT メイカーズチャレンジに参加-前編

概要

今回web IoT メイカーズチャレンジのハッカソンに参加し、結果ありがたいことに最優秀賞をいただくことができました。作ったのは動く植木鉢「uekibati 2.5 動く苔」です。

web IoT メイカーズチャレンジとは

前回のをコピペ

Web×IoT メイカーズチャレンジでは、こうした「フルスタックなスキル」やアイデアを素早く形にできる「プロトタイピング力」を身につける機会としていただけるよう、実際にモノづくりを体験する 2 つのプロセスでイベントを構成 下記HPより引用

https://webiotmakers.github.io/

ラズパイとjavascritを使ったIoTをやってみような総務省主催のイベントです。日本各地でやっているらしいですが、俺は前橋でやりました。 12/15,16,1/19,20で開催されます。

HP=> https://webiotmakers.github.io/

作ったもの

動く植木鉢「uekibati 2.5 動く苔」です。下に簡単に機能を説明します。

生育環境情報の取得

気温、湿度、気圧、土壌の湿り気を取得します。CHIRIMENを使用してセンサから情報を取得しています。

動く

窓辺などで使用していると、洗濯物などによって植木鉢がある場所が暗くなると日陰から移動します。

光センサから取得する情報が一定値を下回ると移動を開始、一定値を上回ると停止します。光センサのライントレースで移動します。ラズパイでやるのは大変なのでarduinoでやってます。

取得情報の通知

IFTTTを使用してuekibatiが移動を開始した時に光度や湿度などを通知します。

顔の表示

湿り気などが規定値を超えるとLEDの顔が^v^から泣き顔に変化します。

喋る

移動を開始するときに「暗いので移動するよ」「明るいので止まるよ」など言う。このあたりのことは全く分かりません。

特典について

raspberry pi 3 model B+ をいただきました。また、東京で3月に行われるスマートIoT推進フォーラム総会に招待していただき展示させていただけるそうです。

雑談

通知が私の役割だったんですが、全然ダメでした。マジ悔しい。javascriptの構文すらいまいちわかってなかったのは完全に準備不足でした。 3月までに通知機能のみではなく、擬似的に会話できていると感じられるようにしたいです。

追記(2019/3/11):最優秀賞の特典として、スマートIoT推進フォーラムにお招き頂き、3/8にパネルで作品を紹介させて頂きました。全国の代表のアイデアや技術を学ぶことができました。さまざまな方と繋がることができる良い機会となりました。ありがとうございました。

追記(2019/3/18) 段落構成を変更しました。内容は変更ありません。