2017/01/07

日の出が遅いので、Raspberry Piで電気を点けて気持ちよく目覚めてみる

みなさん、今日は2017年の東京の日の出が最も遅い日ですね。*1 寒い上に日の出が遅いと早起きができない方も多いのではないでしょうか? 私もその一人です。

「朝起きたら日光を浴びる」これは早起き術としてよく紹介されている技ですが、日の出より前に起きる場合には適用不可能です。そこで、今回はそろそろ日本でも発売するというRaspberry Pi Zeroを使って、朝になったら部屋の電気を点けて部屋を明るくするということをしてみたいと思います。

実行環境

  • とても寒い冬季の日本
  • 日の出前の6時ごろ
  • LEDシーリングライト(赤外線リモコンによる操作が可能)

ハードウェアの準備

今回は赤外線を使ってシーリングライトをRaspberry Pi Zeroで制御します。このため、リモコンの信号を学習するための受信モジュールと赤外線LEDが必要です。まず、これらをRaspberry Pi Zeroに接続します。
Raspberry Pi のGPIOはそれほど多くの電流を流せないため、トランジスタで増幅しています。10Ωの抵抗をつけてだいたい100mAぐらい流すようにしてあります。

受信モジュールの出力は5Vであるのに対して、Raspberry Pi のGPIOは3.3Vであり5Vトレラントではないそうです。そこで、出力ピンに40kΩの抵抗(実際には10kΩの直列4本)をぶら下げておき、分圧することで3.3Vにしています。

使用している部品は全て秋月電子で入手可能です。型番などは以下の表の通りです。

部品名 型番 個数 URL
赤外線リモコン受信モジュール PL-IRM2121-A538 1 http://akizukidenshi.com/catalog/g/gI-01570/
赤外線LED OSI5LA5113A 2 http://akizukidenshi.com/catalog/g/gI-04311/
トランジスタ 2SC1815GR 2 http://akizukidenshi.com/catalog/g/gI-00881/
抵抗 10Ω 2 http://akizukidenshi.com/catalog/g/gR-25100/
抵抗 10kΩ 4 http://akizukidenshi.com/catalog/g/gR-25103/

作成した回路はこのような感じになりました。(ピンヘッダは1のModel B用に作ってしまったため、今回はジャンパで接続...)手前の白いキャップが付いているのが赤外線LEDで、その隣の黒いのが受信モジュールです。

ハードウェアの準備はこれで完了です。

LIRCの導入

LIRCというソフトウェアを使うと、Linuxで赤外線信号の送受信ができるようになります。まずはこれをインストールしましょう。OSはRaspbianを使用しました。
sudo apt update
sudo apt install lirc
インストールが終わったら、LIRCの有効化とピンの設定を行います。/boot/config.txtの51行目を次のように変更します。
# dtoverlay=lirc-rpi (変更前)
↓
dtoverlay=lirc-rpi,gpio_in_pin=17,gpio_out_pin=18 (変更後)
また、/etc/lirc/hardware.confも次のように変更します。
########################################################
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"

# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false

# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false

# Try to load appropriate kernel modules
LOAD_MODULES=true

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
変更が終わったら再起動します。
sudo reboot

再起動が終わったら、受信がうまくできるか確認します。
mode2 -d/dev/lirc0
このコマンドを実行を始めたら、リモコンを受信モジュールに向けてリモコンのボタンを押します。ここで、次のような出力が現れたらうまくいっています。出力の確認が終わったらCtrl-Cで実行を終了します。
space 1907936
pulse 10217
space 5133
space 641
pulse 632
.
.
.

リモコンの信号の学習

irrecord というコマンドを実行すると対話的にリモコンの学習を行うことができます。学習が終わると、設定ファイルが生成されます。-dオプションはデバイスの指定(デフォルトのデバイス名と違ったものが現れるので明示的に指定します)、--disable-namespaceはリモコンのボタンの名前を自由につけるためのオプション、-fオプションはraw mode(届いた信号をコード化せずにそのまま保存する)で学習を行うためのオプションです。以下はコマンドの実行例です。
$ sudo /etc/init.d/lirc stop  # 学習を行うので一旦止める
$ irrecord -d/dev/lirc0 --disable-namespace -f ceiling_light.conf

irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)
省略
Press RETURN to continue. (ENTERを押す)


Now start pressing buttons on your remote control.

It is very important that you press many different buttons and hold them
down for approximately one second. Each button should generate at least one
dot but in no case more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have been
generated.

Press RETURN now to start recording.(ENTERを押したらボタンをランダムに1秒ずつ押し続ける)
................................................................................
Found const length: 122383
Please keep on pressing buttons like described above.
Creating config file in raw mode.
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
FULL(ボタンの名前を入力してENTERを押す、押したらすぐに学習したいボタンを押下する)

Now hold down button "FULL".
Got it.
Signal length is 69

Please enter the name for the next button (press <ENTER> to finish recording)
OFF

Now hold down button "OFF".
Got it.
Signal length is 67

Please enter the name for the next button (press <ENTER> to finish recording)
(ENTERを押して終了する)
設定ファイルが出来上がったら、/etc/lirc/lircd.confに生成した設定を追記し(初回の場合は>>を>に変えて、上書きします)、lircdを起動します。
sudo bash -c "cat /path/to/ceiling_light.conf(生成した設定ファイル) >> /etc/lirc/lircd.conf"
$ sudo /etc/init.d/lirc start
起動できたら、実際に電気を操作してみます。
$ irsend SEND_ONCE ceiling_light.conf(設定の名前) FULL(ボタンの名前)
うまく動かなかったら、信号を複数回送信するオプションをつけてみます。raw modeで学習した場合は、信号のきちんとした区切りではないところで切れて学習されている場合があるので、複数回送るとつながってうまくいく場合があります。
$ irsend -#2 SEND_ONCE ceiling_light.conf(設定の名前) FULL(ボタンの名前)
それでもうまくいかない場合は学習をやり直してみましょう。

タイマーを設定する

朝になったらコマンドを実行する、という機能を実現するためにcronを使いました。次のコマンドを実行して設定ファイルを開きます。
touch /home/pi/crontab.log  # 適当なログを取るファイルを作っておく
crontab -e
設定ファイルの中には、次のような記述をします。これで、毎朝6時に電気がつきます。絶対に起きたいのでボタンは10回押します。
  0 6    *   *   *   irsend -#10 SEND_ONCE ceiling_light FULL && echo "`date` - Light turned on" >> /home/pi/crontab.log
タイムゾーンがJSTになってないとUTCで起こされたりして大変なので、ちゃんとタイムゾーンも確認しておきましょう。
timedatectl  # 確認。違ったら以下を実行
timedatectl set-timezone Asia/Tokyo
sudo systemctl restart cron.service  # タイムゾーンの変更をcronにも反映
これで朝のお目覚めバッチリですね!!!

参考サイト

http://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi/


*1: 実は冬至と一番遅い日の出の日はズレています。(http://kuusou.asablo.jp/blog/1970/03/07/7925757?year=2017&rg=r25)

2016/01/11

VSCode使用中にKarabinerのVimモード(エミュレーション)に入らないようにする

KarabinerのVim Emulationを使用すると、Vim以外で文書を編集するときでもhjklでカーソルを動かしたりできて便利です。しかし、それ自体がVimモードを持っているアプリケーションを使うときは無効にする必要があります。

有効にするアプリケーションの選択

有効にするアプリケーションの設定はprivate.xmlに記述します。private.xmlについて詳しくはリファレンスを参照してください。 このXMLファイルは例えば次のようになります。 VIM_EMU_IGNORE_APPSと書いてあるところの下に列挙されているのが、Vim エミュレーションを使用しないアプリケーションです。この中で指定されたアプリケーション使用中はescキーを押してもVimエミュレーションが始まりません。

VSCodeの設定はまだない

たいていのアプリケーションはすでに設定が用意されているので、そのアプリケーションに対応するコードを調べて書けば良いのですが、VSCodeについてはまだありませんでした。このため自分で追加する必要があるようです。アプリケーション内のappdef.xmlに記述した方がキレイなのではないかと思ったものの、今後VSCodeが追加される可能性もありそうなので、ひとまずprivate.xmlの中にVSCodeの設定も一緒に書いてみました。
上に示したprivate.xmlの先頭にあるのがVSCodeの設定です。<appdef>から</appdef>までを記述してVIM_EMU_IGNORE_APPSのリストにVSCODEを追加すればVSCode使用中はVimエミュレーションが発動しなくなります。

2015/05/23

markdown->latexの変換をしたときに、表のキャプションを上にもってくる

最近、markdownで報告書を記述して、pandocを用いて一旦latexに変換し、そこからpdfにするということをしています。

このとき、markdownで記述した表はlatexのlongtableに変換されるようなのですが、表のキャプションが下に来てしまいます。表のキャプションは上に書きたいので、これでは困るわけです。

これを
こうしたい

始めの状態

記述したMarkdownはこんな感じです。
# 表 #################################

表

Table:例

|A        |B           |C           |D            |
|:--------|:-----------|:-----------|:------------|
|11111    |222         |33          |4            |
|5        |6           |7           |8            |
変換すると、キャプションが\end{longtable}の直前にきます。
\section{表}\label{ux8868}

表

\begin{longtable}[c]{@{}llll@{}}
\toprule\addlinespace
A & B & C & D
\\\addlinespace
\midrule\endhead
11111 & 222 & 33 & 4
\\\addlinespace
5 & 6 & 7 & 8
\\\addlinespace
\bottomrule
\addlinespace
\caption{例}
\end{longtable}

下に持ってくる

pandocで変換された後のTeXファイルに手を加えてなんとかしました。sedとかに慣れてないので、Pythonで作っています。

Makefileに書いて使っています。 Makefileの一部
convertmd: $(MDSCRIPT)
 @cat $^ \
 | sed s/.png/.eps/g \
 | pandoc -t latex \
 | sed 's/includegraphics/includegraphics[width=0.65\\columnwidth]/g' \
 | sed 's/\mathrm/\,\\mathrm/g' \
 | python FixTableCaption.py \
 | sed 's/\caption{\(.*\)}/\caption{\1\\label{fig:\1}}/g' \
 > $(MDSCRIPT:.md=.tex)
無事、キャプションが上にきました。
\section{表}\label{ux8868}

表

\begin{longtable}[c]{@{}llll@{}}
\caption{例\label{fig:例}}
\\
\toprule\addlinespace
A & B & C & D
\\\addlinespace
\midrule\endhead
11111 & 222 & 33 & 4
\\\addlinespace
5 & 6 & 7 & 8
\\\addlinespace
\bottomrule
\addlinespace
\end{longtable}

キャプションが\end{longtable}の直前にこない場合に遭遇すると失敗しますが、そうなったことがないので、一旦気にしないことにします。

まとめ

これが本当に良い方法なのかわかりませんが、とりあえずキャプションを上に持ってくることができました。
根本的に、pandocから出てくるときにキャプションを上にしておく方法などがあれは、ぜひ教えてください。

2015/02/13

Windows 8.1で、カーソルが表示されなくなった

Blogを書くのはずいぶん久しぶりのようです。

先日、Windowsが起動しなくなったためWindows8.1のリフレッシュを行ったところ、システムは復活したのですが、代わりにカーソルが表示されなくなってしまいました。

最終的には、こちらのサイト
Windows 8.1 Updateをインストールしたらマウスカーソル(マウスポインター)が表示されなくなった件について
の内容で解決しましたが、経緯とやったことを以下に示します。

環境

問題のWindows8.1は、MacBook Pro (Retina, 15-inch, Early 2013)にBoot Campでインストール、VirtalBoxからも起動できるようになっています。

犯人は、VirtualBoxではなかった

はじめはVirtalBox Guest Additionsが疑われました。だって、VirtualBoxから起動するとカーソルが出たんだもの。そのため、Guest Additionsをスタートアップから外したり、アンインストールしたりしましたが、一向に解決しません。

仲間がいないかと検索していると、上記のページが引っかかりました。
どうやら、問題は「VirtalBoxから起動しているか、否か」ではなく、「画面の解像度」のようです。

グラフィックドライバが原因

私の使っているMacにはNVIDIAのGPUが搭載されています。どうやら、これのドライバが原因のようです。VirtalBoxはまだRetina対応していないのか、Mac上で実行しても低解像度で実行されます。このため、問題が発生しなかったのでしょう。

ちょうどWindowsをリフレッシュ(個人用データを残しつつ、OSを再インストール)したところですから、グラフィックドライバが問題のあるバージョンに変わった可能性は十分にあります。

グラッフィックドライバを更新

調べてみると、インストールされていたドライバは最新のバージョンではなかったので、ドライバを更新してみました。
カーソルが出ない状況での作業になりますが、(キーボード操作で)Ctrlキーを押すとカーソルの位置を表示などをONにして、手探りで頑張りましょう...

ドライバを更新する際は、まずタスクバー右側の通知領域内から、NVIDIAのロゴをクリック。
メニューが出てくるので、

 更新プログラムの確認をクリックします。

すると、以下のような画面が出てきます。更新プログラムがある場合は、「インストールする」のようなボタンが現れるので、画面の指示に従ってインストールします。

私の環境では、更新プログラムのインストール後、再起動を行うと、カーソルが表示されるようになりました。

まとめ

今回、カーソルが表示されなくなるという(GUIだと)致命的な問題が発生しましたが、ちょっと特殊な環境だったためすぐに情報が見つからなく少々苦労しました。同様の問題が発生した方のお役に立てばと思います。


2014/11/08

TimeCapsuleのバックアップをrsyncでとる

TimeCapsuleのバックアップについてです。「バックアップのバックアップ?」と一瞬思われるかもしれません。しかし、TimeCapsuleをNASとして使っていると、そこにはiTunesライブラリやiPhotoライブラリなどが入っています。データが消失したら一大事ですね。

TimeCapsuleのバックアップ大事です。TimeCapsuleは壊れやすいと評判で、私のも1度壊れたのでそれ以来気をつけるようにしています。

TimeCapsuleにはTimeCapsuleにUSB接続されたストレージにアーカイブする機能が付いていますが、おそらくこの機能では差分バックアップができません。毎回すべてのファイルをコピーしてしまいます。さらに、バックアップするデータのサイズは合計で1テラバイトを超えますから、途中で失敗する事もしばしばあります。バックアップ処理中はTimeCapsuleの中のデータにアクセスする事もできないのでこれも不便です。
このように、TimeCapsuleのアーカイブ機能は決して便利という事のできるものではありません。

そこで、私はrsyncを使ってバックアップをとることにしました。このrsyncは、ファイルなどの同期を行うソフトウェアで、再開機能や、差分コピー機能などの便利な機能を備えています。

バックアップ用シェルスクリプト

簡単なバックアップ用シェルスクリプトを作ってみました。これをcronなどに登録して、定期的に実行すればいい感じになると思います。バックアップ先のディスクはTimeCapsuleにUSBで接続されていることを前提にしています。
スクリプトの利用は自己責任でお願いします。これを利用することによって発生した被害に対して一切の責任を負いません。

使い方

  1. 下のスクリプトをダウンロードして適当な所に置く
  2. スクリプトに実行権限がついていなければ
    chmod 755 timecapsule_backup.sh
    
    する
  3. SOURCEからPASSWORDまでの変数の中身を自分の環境に合わせて書き換える(アカウント名・パスワードは、AirMacユーティリティで設定したアカウントのもの)
  4. スクリプトを実行する
今の所エラーになった(マウントに失敗したとか、途中で接続が切れたとか)場合にリトライする機能はついてないです。

まとめ

こんな感じでバックアップをとることができます。再開可能というのが心強いですね。また、1回フルバックアップが終わったあとは、同様の手順で行うと差分だけバックアップしてくれます。
TimeCapsuleのバックアップで悩んでいた方はぜひ1度お試しください。

2014/09/13

Lightning - Micro USBアダプタでかさばるケーブルを減らそう!

iPhone付属のLightningケーブルが切れてしまったFlechaMakerです。

Lightningケーブルは、iPhoneを使っていく上での必需品で、充電などのために常に持ち歩いていました。しかし、他にもさまざまなケーブルを携帯していて、かさばって邪魔でした。

mini Bやmicro BなどUSB関連だけで5点、加えてThunderbolt - Ethernetアダプタ、Mini DisplayPort - VGAアダプタがありとても多いです。時にはUSB BとかOAタップとかLANケーブルまで持ってることも

そこで、せっかく買い換えるならば、ということでLightning - MicroUSBアダプタを購入してみました。これは、Androidなどのスマートフォンや、モバイルバッテリー、ワイヤレスイヤホンなど最近のガジェットのインターフェースとして多く採用されているMicro USB BのコネクタをLightningコネクタに変換してくれるものです。発売された時はちょっと話題になっていたような気がします。

LifeProofを使用しているので、アダプタが大きすぎると入らないということもあり、純正品を購入しました。LifeProofとの相性は「このアダプタを考慮して設計したのではないか」というぐらいピッタリのサイズ感でちょうどよいです。ピッタリとは言っても、角が当たるといったことは一切ありませんでした。


USB mini Bからmicroへの変換ケーブルも活用し、3本のケーブルを1つにまとめることができました。

購入後数週間使用してみましたが、特に不便なことはありません。小さいのでなくしてしまわないよう、気をつけながら使っていきたいところです。

 

2014/07/20

Atmel Studioが起動できなくなった

 先日、Atmel Studio6.2がリリースされていることに気づき、アップデートしようとした時のことです。もともとAtmel Studio6.1は外付けHDDにインストールしていたのですが、この機会に内臓ディスクにインストールし直そうと思い、一度アンインストールしてから、内臓ディスクにインストールし直しました。おそらく、これが問題の原因でした。インストール時にエラーが発生し、そのまま続行しましたが、Atmel Studioが起動不能となりました。
 現在ではなんとか使えるようになったので、解決までの手順を記録しておきたいと思います。

環境

  • Windows8.1 Pro
  • Atmel Studio 6.2 

症状

 Atmel Studioのインストール時に、Atmel Software FrameWorkなどのインストール中に"Cannot find one or more components. Please reinstall the application."というエラーが出る。
ウィンドウのタイトルからもわかるように、Atmel Studio本体のインストールの前にインストールされる(まだインストールされてなかった場合)Visual Studio Shell Isolatedに問題があるようです。エラーメッセージに従って再インストールしても問題は解決しませんでした。

解決

 少し検索して見ると、Visual Studio関係でこのようなエラーが出ている件がいくつかありました。
 そのうち、
http://social.msdn.microsoft.com/Forums/ja-JP/350fc4e6-df25-4c84-8ed9-a65908fd2059/vs2012-cannot-find-one-or-more-components-?forum=vsgeneralja
 の解決策を実践したところ、Atmel Studioが起動するようになりました。
 レジストリの設定の変更をすると、場合によっては重大な問題を引き起こし、OSの再インストールが必要になることがあります。レジストリの設定の変更は自己責任でお願いします。また、編集する前に、「ファイル>エクスポート」からバックアップを作成しておくと良いと思います。(http://support.microsoft.com/kb/322756/ja)

  • HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0
  • HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0_Config
  • HKEY_CURRENT_USER\Software\Atmel\AtmelStudio\6.2
  • HKEY_CURRENT_USER\Software\Atmel\AtmelStudio\6.2_config
  • HKEY_CURRENT_USER\Software\Atmel\AtmelStudio\6.1
  • HKEY_CURRENT_USER\Software\Atmel\AtmelStudio\6.1_config

    上記のレジストリキーを削除した後に、もう一度インストールを行いました。上の記事では11.0を削除していますが、Atmel Studioでは2010を使用しているため、10.0となっていました。念のため、Atmel Studioに関するレジストリも削除しています。
     これを行った後でも、Atmel Software FrameWorkのインストール時にエラーが出るのですが、Atmel Studioは起動できるようになりました。

     しかし、Atmel Software FrameWorkの更新の際には未だにエラーが出続けています。もし、正しい解決方法をご存知の方がいたら是非ご教授ください...