5時起きを支える技術 - Raspberry Piで作る二度寝を防止する目覚まし時計
この記事は「さくらインターネット(その2) Advent Calendar 2016」の19日目の記事です。
7時始業
さくらインターネットでは今年の10月より新たに「さぶりこ」という勤怠に関する制度が始まりました。
さぶりこについては横田さんのAdvent Calendarの記事で詳しく紹介されています。
自分の会社が「勝手に定時の30分早く帰って良い」となったら、どうなったか? - P2P today ダブルスラッシュ
自分はこの制度の中の「さぶりこフレックス」を使用し、ここ3ヶ月ほど就業時間を7時〜16時にしています。
7時始業とすることで満員電車を避けることができ、非常に快適な生活を送れています。
問題
しかし、ひとつ問題を挙げるとすれば、起きる時間も早くする必要があるということです。布団が恋しいこの季節に5時に起きるのは少々つらいときもあります。
この問題をどうにかできないかと考え、Raspberry Piを使って解決を試みることにしました。
作ったもの
今回「二度寝を防止する目覚まし時計」を作成しました。
普通の目覚まし時計では、アラームを止めて即刻布団に引き返せてしまいます。 これでは、二度寝も避けられません。なんとかして布団に戻れない状況を作る必要があります。
そこで、アラームを止めるために計算問題を解く必要のある目覚まし時計としました。 計算問題を解くうちに目が覚め、二度寝したい欲も和らぐだろうという狙いです。
また、さらに目を覚ましやすい環境を作るため、起床時に照明が自動的にオンとなるように照明コントローラーも作成し、目覚まし時計と協調動作するようにしています。
概要
Raspberry Pi Zeroを2台用いて実装しています。
1台は目覚まし時計、もう1台は照明をオン/オフするコントローラーです。
セットした時間の5分前にWebsocketを通じて照明がオンにされます。
そして時間がくるとアラームが鳴り、計算問題を解くことを要求します。
かといって、ずっとアラームが鳴りっぱなしというのも近所迷惑ですので、タッチセンサに触れている間はアラームを停止する仕組みとなっています。
また、起床時以外にはDash Buttonで照明を操作できるようにしています。 これは、今回作った照明コントローラーを取り付けたところ、手動でのスイッチ操作が困難になってしまったためです。完全に設計ミス。
実物
実際に動かした様子
www.youtube.com 目覚まし時計を実際に動かした様子です。実際に運用する際には3桁の計算ぐらいが解く時間的に良いかもしれません。
www.youtube.com
Dash Buttonを使って照明をオン/オフした様子です。サーボモーターでスイッチのオン/オフを切り替えています。
Dash Buttonの仕様で1回pushした後、しばらく次のpushを受け付けなくなる(10秒ほど)ようでちょっと困る場合もありそうです。
配線
hiramine.comさんの情報を参考にユニバーサル基板にハンダ付けしています。
LCD (Liquid Crystal Display) に文字列を表示する(WebIOPi 利用)
最初、メッキ線で全部配線しようと始めたものの、クロスできないことに気付いて途中からビニール線に切り替えました。完全に行き当たりばったりといった感じ。
電子工作の感想
今回初めて電子工作で機能を持ったものを作成しました。
そのなかで感じたことを簡単に挙げてみます。
お金がかかる
めっちゃお金がかかります。Piから始り、wifiドングル、ACアダプタ、センサ、LCD、その他各種パーツ、道具、あらゆるものにお金がかかります。
パーツ1個だけ見ると安く見えますが、それらを組み合わせひとつの機能するものを作ろうとすると結構な金額になります。
今回作ったものもすべて合計すると諭吉さんが2枚ほど飛んでいるような気がします…。
■追記
何にどれくらいのお金がかかったか下の記事にまとめました。
電子工作は案外お金がかかる。何にどれぐらい費用がかかったか計算してみました。 - 無理しない感じ
時間がかかる
ソフトウェアの世界とは異なり、パーツや道具を手に入れるのに時間がかかります。npm install
で欲しいものをすぐに取得できる世界観ではありません。
これは結構じれったくて、作りたい熱があるときに「あっ、あれ足りないじゃん!」みたいなことになると萎えます。
なので、パーツを買うときには入念に足りないものがないか確認した方がいいです。送料もかかるしね。
学ぶのが大変
知識があまりにも乏しいのに加え、どこから学べばいいかの道筋を示す情報も少ないように感じました。
「センサをつなげて動かしてみた」というところから次へ進むステップが見出しづらく、やりたいことを実現するために何をどうやって学べばいいのかなーと今も手探り状態です。
終わりに
今回はローカルネットワークにしか繋がっていないのでIoTって呼ぶことができないのですが、次はインターネットに繋いでIoTと呼べるものを作ってみたいです。
ソースコード
GitHub - hogesuke/alarm-clock: 電子工作でつくる目覚まし時計
GitHub - hogesuke/light-controller: サーボモーターで照明をオンオフするコントローラー
GitHub - hogesuke/light-dash-button: 照明をdash-buttonで制御
クレジット
アラーム音には Music is VFR さんのものを利用させて頂きました。
参考
LCD (Liquid Crystal Display) に文字列を表示する(WebIOPi 利用)
Raspberry Pi でUSBスピーカーを動かす - それマグで!
サーボモーター(SG-90)を試す - Raspberry Pi 備忘録 / Mbedもあるよ!
GitHub - hortinstein/node-dash-button: A small module to emit events when an Amazon Dash Button is pressed
懐かしいはてブ記事で打線組んだ。「考え方」「人生」編
はてブを大学生のころから使いだして、おおよそ10年ほど経つらしいことに気付いた。
大学生のころは何かとこじらせていて「考え方」とか「人生」とかそういったタグが付く記事を好んで読んでいた記憶がある。
たぶん、あと少しで社会人になってしまう恐怖を紛らしていたんじゃないかと思う。
見返すと懐かしい記憶が蘇ってきたので、思い出深い記事を打順にして振り返ってみる。
1(二) 人生は神ゲーだ
なるほど、といった感じ。つらい気持ちから一時的に目をそらすことができる。
2(遊) すごい物を見てもへこたれない人
こういう考え方をマネしたいと思うんだけど、そんな簡単ではないよね。
3(中) 価値の判断基準が自分の外にある人間は表現者になれない
今読んでも心がチクチク痛む記事。自分はいまだに「精神的な背骨」を作れていない気がする。
4(一) 1ヶ月間だけ、思い切りがんばれば。
自分のなかで「考え方」といえばこの人。この記事を印刷して学習机の引き出しに忍ばせていたのは何とも微笑ましい思い出。
5(三) 要は、勇気がないんでしょ?
はてブ界隈でもトップ3に入る名フレーズ(と勝手に思っている)。いまもブコメでたまに見かける。改めて読むとかなりマッチョな感じ。
6(左) バイキング式のレストランで給仕を待つ君たちへ
404 Blog Not Found:バイキング式のレストランで給仕を待つ君たちへ
「助けて!ダンコーガイ」みたいなことをやっていた頃だと思う。マッチョである。
7(右) なんとなく最近不調かな、と思ったら気をつけること
ライフハック的な。当時はやたらとこういう記事が上がってきていた気がする。
8(捕) 仕事の悩みのヒント
まだ就職する前だというのに「仕事の悩み」についてのページをブクマしていた。仕事をする前からすでに仕事について悩んでいた当時の自分、とても心配である。
9(投) 20年来のつらさがほぼ消えたことについて
大学生のころはやたらとだるかった記憶がある。モラトリアム期間が一番つらかったかもしれない。
ベルメゾンで頑丈本棚っていう高さ180cmの収納力抜群の本棚を買った
いままで使っていた本棚が小さく、本が入りきらなくなったので新しいものを購入しました。 それが先日届いたので紹介してみます。
全貌
奥行 30cm × 高さ 180cm × 幅 120cm
なかなか迫力がある大きさです。
狭い部屋に高さ180cmの本棚はけっこう存在感があります。
買ったもの
値段は以下のような感じです。
- 本体 ¥32,900
- 送料 ¥3,500
- 組立代行 ¥2,000
- 消費税 ¥2,632
合計 ¥41,032 でした。
本棚を買うにあたっていろいろと見比べていましたが、このサイズの本棚としては結構お手頃なお値段です。
ただ、値段以上にしっかりとした作りを感じられます。「頑丈」を謳っているだけあり、スチールの棚板はかなり重厚な作りとなっています。外枠の厚さも3cmあり、かなりの重量を支えてくれそうです。
外枠は化粧板ということで、安っぽさがあるかと不安でしたが、かなり近づかない限り見た目本物の木であるように見えます。安物の化粧板によくあるツルツルテカテカな感じがなく、きめ細かいザラつき加工がされているので偽物感がなく手触りもいいです。
地震対策
高さ・重量も結構あるので、地震対策をしないとかなり危険と思われます。
当初は突っ張り棒を考えていたのですが「ふんばる君」なるものが良いという評判を聞いたのでそれを導入しました。
- 出版社/メーカー: ニトムズ
- メディア: ホーム&キッチン
- 購入: 9人 クリック: 9回
- この商品を含むブログを見る
これは家具の前部に傾斜の付いたゴム状の板を挟み込ませて転倒を防ぐものです。
板の厚さはこんな感じ。けっこう硬めの材質です。
挟み込んだ様子です。思ったより目立ちません。
傾斜の具合です。けっこう傾いているように見えますが、正面から見るとまったく気になりません。
ひとりで設置するのは少々大変でした。できれば誰かに手伝ってもらうほうがいいでしょう。
しかし、これを導入するだけで震度6弱程度まで耐えられる対策ができると考えるとなかなか良いアイテムだと思います。見た目的にも突っ張り棒ほど目立たないのも嬉しいポイントです。
おわりに
新しい本棚に本を詰め込んでみたところ、以前と較べて収納力高すぎてスカスカになってしまい少々寂しい感じになってしまいました。
でも、気兼ねなく本が買えるので良しとします。
- 出版社/メーカー: ニトムズ
- メディア: ホーム&キッチン
- 購入: 9人 クリック: 9回
- この商品を含むブログを見る
RaspberryPiに接続したフルカラーLEDをPWMでグラデーションさせる
以下の記事でPWMでLEDの明るさの調整をすることができました。
hogesuke.hateblo.jp
つづいて、フルカラーLEDを使ったグラデーションに挑戦してみたいと思います。
フルカラーLEDのグラデーション
PWMを使って赤・緑・青の各色の明るさを変えることによりグラデーションさせることできます。
下の動画は実際にPWMを使ってグラデーションさせた様子です。
ちなみに使っているフルカラーLEDは以下のものです。
放熱基板付1WハイパワーフルカラーRGBLED OSTCWBTHC1S: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販
PWMを使ってグラデーションさせるコード
以下はRubyでwiringpiを使ってグラデーションさせるコードです。
※ wiringpiのインストールについては下の記事を参照してください
PWMでRaspberryPiに接続したLEDの明るさを変える - 無理しない感じ
require 'wiringpi' RED_LED = 4 GREEN_LED = 5 BLUE_LED = 6 SLEEP_TIME = 0.01 begin io = WiringPi::GPIO.new io.soft_pwm_create(RED_LED, 100, 100) io.soft_pwm_create(GREEN_LED, 0, 100) io.soft_pwm_create(BLUE_LED, 0, 100) while true (0..100).each do |x| io.soft_pwm_write(BLUE_LED, x) sleep(SLEEP_TIME) end (0..100).each do |x| io.soft_pwm_write(RED_LED, (100 - x)) sleep(SLEEP_TIME) end (0..100).each do |x| io.soft_pwm_write(GREEN_LED, x) sleep(SLEEP_TIME) end (0..100).each do |x| io.soft_pwm_write(BLUE_LED, (100 - x)) sleep(SLEEP_TIME) end (0..100).each do |x| io.soft_pwm_write(RED_LED, x) sleep(SLEEP_TIME) end (0..100).each do |x| io.soft_pwm_write(GREEN_LED, (100 - x)) sleep(SLEEP_TIME) end end rescue Interrupt io.soft_pwm_write(RED_LED, 0) io.soft_pwm_write(GREEN_LED, 0) io.soft_pwm_write(BLUE_LED, 0) end
上記のコードを sample_color.rb
として保存してください。
また、上記のコードは各色をそれぞれ以下のピンに接続した場合を前提としています。
- 赤 -> GPIO23
- 緑 -> GPIO24
- 青 -> GPIO25
実行
$ sudo ruby sample_color.rb
グラデーションする様子を確認できるでしょうか。
処理を止める際は Ctrl + C
を入力してください。
超カンタンに解説
初期状態では赤のみ点灯させ、その後、以下のように変化させています。
- 青をだんだんと明るく
- 赤をだんだんと暗く
- 緑をだんだんと明るく
- 青をだんだんと暗く
- 赤をだんだんと明るく
- 緑をだんだんと暗く
以上を繰り返すことで、赤 から 緑、青、そしてまた赤に戻るグラデーションをつくることができます。
おわりに
PWMを使ったLEDの明るさ調整を応用して、フルカラーLEDでグラデーションを実現できました。 これを利用して電子工作の表現の幅も広がりそうです。
Raspberry Pi 3 Model B (Element14)
- 出版社/メーカー: RASPBERRY-PI
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
PWMでRaspberryPiに接続したLEDの明るさを変える
RaspberryPiでLEDの点灯は簡単にできたので、次にLEDの明るさ調整を試してみたいと思います。
PWM
明るさの調整は、PWM(Pulse Width Modulation)という方法用いることで実現可能です。
PWMというのはパルス信号のONである時間(パルス幅)を調整することにより流れる電流量を変えるような仕組みです。
OFFの時間と較べONの時間が長くなるほど電流量が大きくなり、短くなるほど電流量が小さくなります。 その特性を利用することでLEDの明るさを調整することが可能となります。
以下の動画は実際にPWMでLEDの明るさを動的に変えて点滅させた様子です。
Raspberry PiでPWMを利用する
それでは、Raspberry PiでPWMを利用するにはどうすればいいでしょうか。
WiringPiというライブラリを使用することで簡単にPWMを利用可能です。
wiringpiのインストール
以下はRubyでWiringPiを使用する場合の説明となります。
Raspbian Jessieの場合、WiringPiはすでにインストールされているため、RubyからWiringPiを操作するためのGemをインスールすればOKです。
ただし、 ruby-dev が入っていないとGemのインストールに失敗するので、先にインストールしておきます。
$ sudo apt-get install -y ruby-dev $ sudo gem install wiringpi
RubyでPWMを使用するコード
require 'wiringpi' LED = 4 begin io = WiringPi::GPIO.new io.soft_pwm_create(LED, 0, 100) while true (0..100).each do |x| io.soft_pwm_write(LED, x) sleep(0.01) end (0..100).each do |x| io.soft_pwm_write(LED, (100 - x)) sleep(0.01) end end rescue Interrupt io.soft_pwm_write(LED, 0) end
上記のコードを sample.rb
で保存してください。
ちなみに、上記のコードではLEDを GPIO23 に接続した場合の例となります。
※ RaspberryPiのピン番号とWiringPiのピン番号は異なるので注意が必要です。それぞれの対応は以下のページで確認できます(下の方の画像)。
実行
$ sudo ruby sample.rb
だんだんと明るくなり、その後、だんだんと暗くなることを確認できると思います。
処理を止める際は Ctrl + C
を入力してください。
ちょっとだけ雑に解説
8行目の soft_pwm_create
の3番目の引数 100
は pwm_range
です。
io.soft_pwm_create(LED, 0, 100) # 8行目
pwm_range
は何かというと、LEDの明るさを何段階に設定するか、というように考えると分かりやすいかと思います。
100を設定した場合、100でもっとも明るく、0でもっとも暗くなります。
今回のコードでは0からはじめ、 soft_pwm_write
で1ずつ値を加えるように書き換えています。
100までいったところで、今度は1ずつ減らすように書き換えています。
このようなコードで、だんだんと明るく、その後だんだんと暗くなるような点滅を実現できます。
おわりに
ライブラリを使うことで簡単にPWMを使用し、LEDの明るさを変えることができました。
今度はフルカラーLEDを使って色をだんだんと変えていくような実装を試してみたいと思います。
参考
PWM制御
Rubyでwiringpiを使う | ぬわーーーーーーー!!!
Raspberry Pi 3 Model B (Element14)
- 出版社/メーカー: RASPBERRY-PI
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
Raspberry Pi Zeroに無線LAN経由でsshできるようにする
せっかく小さいRaspi Zeroですから、キーボードやモニタは接続せずにsshで操作したいですね。先日sshできるようにしたので、その工程をメモとして残しておきます。
無線LANアダプタを用意する
Raspi ZeroはRaspi3とは異なり無線LAN機能を標準で搭載していないので、別途、無線LANアダプタを購入する必要があります。
BUFFALOの下の商品がオススメです。ドライバのインストールが必要がなく、差し込むだけで使用可能です。値段も1000円以下と他と較べても安いのも魅力です。
ただ、Amazonレビューでも指摘されていますが、かなり熱を持ちます。これが機器の動作に影響するのか分かりませんが、いまのところは問題なく使えています。
BUFFALO エアーステーション 11n/g/b 150Mbps USB2.0用 無線LAN子機 ソフトウェアルーター機能付 エコパッケージ WLI-UC-GNME
- 出版社/メーカー: バッファロー
- 発売日: 2015/08/05
- メディア: Personal Computers
- この商品を含むブログを見る
また、Raspi ZeroにはmicroBの口しかないので変換ケーブルも必要です。
iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK
- 出版社/メーカー: バッファロー
- 発売日: 2011/11/01
- メディア: エレクトロニクス
- 購入: 15人 クリック: 54回
- この商品を含むブログを見る
無線LANアダプタを接続する
それでは早速、無線LANアダプタをUSBに差し込みます。
念のため、認識されているか lsusb コマンドで確認します。
$ lsusb Bus 001 Device 002: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070] Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ちゃんと機器の名称が表示されているので問題なさそうです。
アクセスポイントの設定をする
つぎにアクセスポイントに接続するための設定を行います。
wpa_passphrase コマンドを使い、設定に必要なテキストを生成します。
$ wpa_passphrase [SSID] [パスフレーズ] network={ ssid=[SSID] #psk=[パスフレーズ] <- この行は削除して構いません psk=[暗号化されたパスフレーズ] }
上記のテキストをコピーし /etc/wpa_supplicant/wpa_supplicant.conf
ファイルに追記します。
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
もしくは以下のようにすることで一発で追記可能です。
$ sudo sh -c "wpa_passphrase [SSID] [パスフレーズ] >> /etc/wpa_supplicant/wpa_supplicant.conf"
設定できたら再起動します。
$ sudo shutdown -r now
Raspberry Pi にsshする
Raspiの再起動が完了したら無線LANでネットに接続できるようになっているはずです。
pingを飛ばして確認してみます。
$ sudo ping -c 5 www.yahoo.co.jp
もし Unknown host
のように表示されたら接続できていません。もう一度設定を確認してみてください。
ネットへの接続を確認できたら、実際にRaspiにsshしてみます。
まず、ssh先のIPアドレスを確認するため ifconfig コマンドを叩きます。
$ ifconfig
wlan0 の inetアドレス が割り当てられたIPアドレスです。
接続元のPCから先ほど確認したIPアドレスに向けてsshしてみます。
piユーザの初期パスワードは raspberry
です。
$ ssh pi@[IPアドレス]
接続できたでしょうか。
IPを固定する
これまでの手順でsshできるようになったのですが、DHCP環境では割り当てられるIPアドレスが変わってしまいます。
その状態では毎回接続先IPアドレスを確認する必要があるので、IPアドレスを固定する設定を行います。
なお、以下の手順は Raspbian Jessie 環境のものとなります。 Raspbian Wheezy では手順が異なるためご注意ください。
dhcpcd.confファイルの編集
まず /etc/dhcpcd.conf
ファイルに以下の例のように追記します。
interface wlan0 static ip_address=192.168.1.12/24 static routers=192.168.1.1 static domain_name_servers=210.147.235.3
上記の例では 192.168.1.12 にIPアドレスを固定しています。
routersやdomain_name_serversの値は使用しているルータやプロバイダによって異なりますので、ご自身で確認していただく必要があります。
ちなみにBIGLOBEのDNSサーバは サーバ情報一覧:BIGLOBE会員サポート で確認できます。
MACアドレスの確認
次に、無線LANアダプタのMACアドレスを確認します。 ifconfig コマンドを叩きます。
wlan0 Link encap:イーサネット ハードウェアアドレス xx:xx:xx:xx:xx:xx
wlan0 のハードウェアアドレスがそれです。
この値を控えておいてください。ルータ側の設定で必要となります。
ルータの設定
固定IPのルータ側の設定を行います。
使用しているルータによって設定方法が異なるのですが、私が使用している PR-500KI を例として説明します。
ルータの設定ページをブラウザで開きます。PR-500KIでは http://192.168.1.1/ でした。
設定画面の 詳細設定 -> DHCPv4サーバ設定 -> DHCP固定IPアドレス設定 を開きます。
DHCP固定IPアドレスエントリの 編集 ボタンからレコードを追加します。
前手順で確認したMACアドレスと設定したIPアドレスを入力します。
レコードを追加後、有効にチェックを入れ、 設定 ボタンをクリックします。
その後、ルータの再起動がかかるので起動されるまでしばらく待ちます。
固定IPへssh
$ ssh pi@192.168.1.12
接続できれば固定IPの設定成功です。
おわりに
これでキーボードもモニタも接続せずにRaspi Zeroを操作できるようになりました。邪魔なコードがなくなって超スッキリです。開発も捗りそうです。
BUFFALO エアーステーション 11n/g/b 150Mbps USB2.0用 無線LAN子機 ソフトウェアルーター機能付 エコパッケージ WLI-UC-GNME
- 出版社/メーカー: バッファロー
- 発売日: 2015/08/05
- メディア: Personal Computers
- この商品を含むブログを見る
iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK
- 出版社/メーカー: バッファロー
- 発売日: 2011/11/01
- メディア: エレクトロニクス
- 購入: 15人 クリック: 54回
- この商品を含むブログを見る
Raspberry Piで静電容量式タッチセンサ(AT42QT1010)を使う
Raspberry Pi Zeroで静電容量式タッチセンサ(AT42QT1010)を試してみたので簡単に使い方をメモしておきます。
使ったもの
これです。赤が渋くてカッコいい。1000円を切るお値段というのも嬉しいですね。
ちなみにピンヘッダは付属していないので別に調達する必要があります。自分はL字のものをハンダ付けしました。
uxcell ピンヘッダ プラスチック製 メタル製 ブラック シルバートン コンピュータ成分 3枚入り 40 ピン 2.54mm
- 出版社/メーカー: uxcell
- メディア:
- この商品を含むブログを見る
タッチセンサ氏近影
サイズ感が分かるでしょうか、100円玉より一回り大きいといった感じです。
裏側(?)です。この白線の丸の中に触れるとセンサが反応します。
配線
タッチセンサのピンをそれぞれRaspiに以下のように接続します。
- VDD (白線) -> 5V
- GND (黒線) -> GND
- OUT (黄線) -> GPIOピン(上の例では25番ピン)
配線がうまくいっていれば、センサにタッチすることで基盤に付いているLEDが光るはずです。
タッチ検知
配線が終わったのでさっそくraspiでタッチを検知をしてみます。
今回はGPIO25に接続しているので、25番ピンでタッチの入力を受け付けるように設定します。
$ cd /sys/class/gpio $ echo 25 > export $ cd gpio25 $ echo in > direction
まずタッチしていないときの値を確認します。0(Low)であるはずです。
$ cat value $ 0
次にタッチした状態で値を確認します。0から1(High)に変わります。
$ cat value $ 1
おわりに
タッチの検知だけであれば案外簡単に実現可能でした。
つぎはタッチをトリガーとして、何か動かしてみたいと思います。