ぶていのログでぶログ

思い出したが吉日

電子工作を始めて2ヶ月で作ったものを紹介

この記事はGMOペパボアドベントカレンダー20日目の記事です。 昨日はなぜかIDが id:kikuchi1201 のendoが投稿したテスト駆動開発入門


最近、電子工作にハマってます。今日は、本職の話とかOpenStackの話とかせず電子工作の話を書きますw 先日の社内発表会PMF #1で発表/展示した工作物の補足とかその後の進捗です。

ラズパイ+照度センサーでLEDをON/OFFする「anmin」を作った

まず、社内発表会の時には間に合わなかった、ラズパイに照度センサーをつけて、ラズパイのパワーLED/アクセスLEDをON/OFFするものを作りました。 作ろうとしたきっかけですが、ラズパイのパワーLED/アクセスLEDってまぶしいんですよね。 私みたいにワンルーム暮らしで、寝室にラズパイやPCサーバがあると、LEDがまぶしくて全く眠れない!!!(高輝度青色LEDとか使われた日には怒りが有頂天)。 目張りや常にLEDをOFFにしてもいいのですが、LEDがついていないと稼働しているかわからないので不安になるじゃないですか!!! そこで、部屋が明るいときはLEDをONにして、暗くなったらOFFにする何かを作ろうと思ったのがきっかけです。

照度センサーはAdafruit Industries社製のTSL2561を使うことにしました。このモジュールは完成品で、ピンヘッダを半田付けするだけでよく工作難易度が低いのと、I2C通信でやりとりできること、ググると先人がラズパイから扱う記事が出てきたので、大丈夫だろう!という感じでこれに決めました。 最近は、こういうセンサー系やらなんやらがモジュールキット化していて、I2Cで通信するだけでいろいろできるのが便利ですね…!!!

ラズパイにはI2C通信用にPin3にSDAが、Pin5にSCLがありますので以下のようにTSL2561と接続します。

ラズパイ <-> TSL2561
Pin1(3.3V) <-> Vin
Pin6(GND) <-> GND
Pin3(SDA1) <-> SDA
Pin5(SCL1) <-> SCL

接続ができたらラズパイから確認します。 デフォルトではI2Cは有効化されていないので、有効化する必要があります。なお、私はArch Linux on Raspberry Piを使っていて、以降はそれを前提にしているのでArch以外の人は適宜補完するかググってください。

まず、 /boot/config.txt に以下の行を追加します。

dtparam=i2c_arm=on

次に、 /etc/modules-load.d/raspberrypi.confに以下の行を追加します。

i2c-dev
i2c-bcm2708

追加が終わったら再起動します。再起動したら i2cdetect コマンドを実行すると以下のような出力が得られるはずです(コマンドがない場合は、i2c-toolsパッケージをインストールしましょう)。 アドレス0x39に何かしらのデバイスがぶら下がっていることがわかります。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

TSL2561がつながっていることを確認したら、anminの出番です

anminの使い方

anminは https://github.com/buty4649/anmin にあるreleaseページからDLできます。DLしたら適当なディレクトリに解凍し実行します。実行すると計測された照度が出力されるはずです(/dev/i2c-1がroot:rootであるためsudoが必要です)。 また、照度が10未満になるとラズパイのパワーLED/アクセスLEDが消灯し、逆に照度が10以上になると点灯すると思います。

$ sudo ./anmin
142.53
142.53
11.80
0.22
66.24
141.51

anminは今のところデーモン機能がないので、バックグラウンド起動させる場合はsystemdを利用します。サンプルのUnitファイルを用意したので、これを使うとすぐにsystemdに組み込めます。

## anminが/usr/local/sbinにあることを期待している
$ sudo cp -p anmin /usr/local/sbin

$ sudo curl -o /etc/systemd/system/anmin.service https://raw.githubusercontent.com/buty4649/anmin/master/systemd/anmin.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable anmin
$ sudo systemctl start anmin

(余談) anminの実装について

ネット上でググるとTSL2561に限らずI2C通信を行うプログラムはPythonでかかれていることが多い気がします。これは、i2c-toolsにPythonモジュールが含まれていて、すぐにでも使えるのが大きいのかもしれません。 しかし、ラズパイという組み込み機器にPythonを入れるのは少し大きすぎるなぁっと思い、今回はGolangで実装してみました。 幸いにもGolangには公式のi2cパッケージが存在しており特に苦もなく実装できました。Golang便利だなぁ~

anminの問題点について

anminを起動していると常に0.2%ほどCPUを使用しています。通常のサーバなら気にはならないのですが、ラズパイという環境では無視できない値です。 照度を取得する時のプロセスは初期化->センサーの起動->sleep->後処理になっていて、これを毎秒実行しています。これが負荷の原因になっているのかなぁと考えています。 TSL2561には割り込み機能があり、設定した閾値を超えるとINTピンがHIGHになるっぽいです。これを利用すれば、毎回センサーに問い合わせせず、設定した閾値を超えた場合のみ動作するみたいな実装に変更でき、負荷が減るかもしれません。そのうち試したいです。 (詳しくはデータシートを参照)

安価にBluetooth-RS232C変換を作った

自宅サーバには普段SSHログインしているのですが、たまーに(例えばカーネルアップデートして再起動したら上がってこない時とか)コンソールログインしたくなる場合があります。 HDMIつないでキーボードをつなげばいいのですが、めんどくさい! 家に余っているUSB-RS232C変換を使ってラズパイをコンソールサーバにしたのですが、やっぱり無線にしたい!という気持ちになりました。 早速、ネットでBT-RS232C変換でググったところ、該当する製品は2万円以上しました!さすがに、個人で使うには高すぎると思って諦めかけていたのですが、RBT-001というBluetooth-シリアル変換モジュールを発見しました。 これを使えば、安価にBT-RS232C変換が作れるのでは?!と思い作ってみました。

RBT-001は3.3V駆動でロジック信号の電圧レベルも3.3Vですが、RBT-001用のシリアルレベルコンバータ基板を使うと5Vが使用できます(地味にピンピッチが2mmから2.54mmになりブレッドボードに刺さるのもでかい)。 5V駆動ということはUSB給電が使えるということで、少しコストがかさみますが採用しました。 RBT-001のシリアル通信はUARTという方式で、RS-232Cとは電気的な互換性がありません。そのため、どうにかして電圧レベルを調整する必要がありますが、秋月のレベル変換基板で解決しました。 できた回路図は以下の通りです。

f:id:buty4649:20171220020900p:plain

完成したら自宅サーバRS-232C端子とUSBポートに接続し、ラズパイやPCからRBT-001とペアリングすれば接続できるはずです! なお、初期値ではRS-232Cの転送速度が9600bpsでものすごく遅いです…(dmesgに5分くらいかかる)。 RBT-001にコマンドを送ることで、転送速度を変更可能です。しかし、このコマンドはRBT-001オリジナルコマンドになっていて、また、バイナリコマンドであるため非常にめんどくさいです…。Golangでガッと作ろうと思ったのですが、一発限りなので以下のようなワンライナーを作って変更しました(なお、Windowsには専用のアプリがあるようです)。

$ perl -e 'binmode(STDOUT);print(pack("c*",0x02,0x52,0x23,0x01,0x00,0x76,0x07,0x03))' | sudo tee /dev/ttyS0 > /dev/null

設定値は、内部のフラッシュメモリに保存されるので電源を切っても保持されます。 これ以外のコマンドについてはマニュアルを参照してください。

で、いくらだったの?

材料費は以下の通りです。RBT-001は代理店によって値段が異なるらしく、私はマイクロテクニカから購入しました。

名前 値段(税込み)
RBT-001 ¥3,650
RBT-001用シリアルレベルコンバータ基板 ¥980
基板用マイクロUSBコネクタ(電源専用) ¥30
3V・3.3V・5V系-RS232レベル変換基板 ¥500
Dサブコネクタ 9P・メス (半田付けタイプ) ¥40
合計 ¥5,200

なんと、 ¥5,200 でできました!!!圧倒的な安さです!やったー!

ガワをつける

上記で作ったものはブレッドボード上に作ってしまったために、少々使い勝手が悪いです。 そこでユニバーサル基板に実装して、ケースをつけることにしました。 で、完成したものが↓になります。

f:id:buty4649:20171220023259p:plain

比較するものがなくてサイズ感が伝わりにくいですが…小型化を目指したかったため45mmx45mmのユニバーサル基板を選択しました。 また、アルミケースで囲ってしまうと通信に障害が出てしまうのと、ケースの加工がめんどくさかったので、ちょうど45mm基板用のアクリル板が売っていたので、それで挟む感じにしました。 ガワにかかった材料費は以下の通りです。

名前 値段(税込み)
両面ユニバーサル基板(スルーホール) 45x45mm ¥70
3mmプラネジ(7mm)+六角スペーサー(14mm)セット ¥50
スペーサー(5mm) TP-5SM ¥30x4
3mmプラネジ(5mm) ¥3.5 x 4 (100個で350円)
45基板用アクリルパネル(アクリル板) ¥105 x2
合計 ¥464

ガワと合わせると ¥5,646でした。

もっと安く・・・!

RBT-001を使って目的のものができて満足していたのですが、まだちょっと高いなぁっと思ってました。複数個作る必要ないのに それで、安いBTモジュールがないか秋月のHPを見て回っていたら、RN-42というさらに安いBTモジュールを発見しました!!! 1枚1800円という安さ!RBT-001の半額です!とはいえ、これ単体ではユニバーサル基板はおろか、ブレッドボードにはさせないので変換基板が必要で、2mm変換基板に刺したうえで、2.54mm変換基板に刺す必要があります…。 これを知らず、2.54mm変換基板を買わなかったためにブレッドボードに刺さらず苦労しました…。 とはいえ、なんとか動作確認することができたので、RBT-001をRN-42に置き換えると、材料費だけで¥2,870です!さらに安くなりました!!! (2.54mm変換基板が来て、基板に回路を実装できたら改めてブログで書きます)

もっともっと安く・・・!!!

もっと安くできないかと思ってネットをさまよっていたらAitendoにHC-06という格安BTモジュールが売ってました!お値段 ¥750 !!!!!!!!!安すぎる!!!! ・・・・・・・・が、安さ故の罠でどうやらこのモジュールは技適が通っていないようです…。とほほ…


私が最近作ったものを紹介しました。 記事タイトルにあるとおり、本格的に電子工作を始めたのはここ2ヶ月くらいですが、キットを使えばセンサーなどの回路がすぐに組み込めたりしますし、ネット上に情報が増えたのでやりたいことがすぐにできる環境になっているなぁっと感じました。

もちろんまだ、電子工作熱は冷めてなくてこれからもどんどん何かを作っていきたいと思っています! 具体的に今作りたいなぁっと思っているのは以下のような感じです!

  • GPSを使ったstratum1 NTPサーバ
  • 無線化モジュール(TWELITE)
  • mruby / mruby/cを使ったマイコン制御(GR-CITRUS / mbedあたり)
  • DTL NAND

この記事を通して、電子工作に目覚める人が増えたらいいなぁっと思っています!