ぶていのログでぶログ

思い出したが吉日

電子工作を始めて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

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

Arch Linux on Raspberry Pi 3のTips

この記事は、先日の社内発表会の資料の補足です。


Arch Linuxは、豊富な日本語化されたドキュメントがあって、Arch Linux on Raspberry Piももちろん完備されている。 Raspberry Pi - ArchWiki

基本的にこれに沿っていけば、失敗することはないし、迷うことはない。素晴らしいディストリビューションであると思う。 ただ、いくつか説明不足なところがあって、私が試したときに気がついた or はまったことがあるのでメモしておく。

OSイメージ解凍時のWARNING

インストール手順はここにある。これは日本語化されていないが、内容的にそんな難しいことはないしコマンドが書いてあるので、その通りにやっていけばよい。 私は、Gentooでこの手順を行ったが、bsdtarコマンドを使ってtarballを回答するときにWARNINGが出た。内容をメモっておかなかったのだが、確か拡張ATTRあたりが設定できないみたいなやつだった記憶がある…。 まぁ、なんか問題なさそうだったし、実際今は問題なく動いているので、ん!?とはなるが気にする必要はない。 (そいえば、bsdtarとGNU tarの違いってなんだろうなぁ…)

OSインストール直後にやったこと

OSインストール直後は、ほとんど何もインストールされていない。sudoすら入っていないので、rootでログインするとsuしてsudoくらい入れておくと楽かもしれない。なお、sshは入っている。 インストール用のOSイメージは、最新のパッケージと乖離がある場合があるのでアップデートしておくとよい。以下のコマンドで、pacmanのパッケージリストをアップデートをした後、全パッケージをアップデートすることができる。

# pacman -Syy
# pacman -Syu

これ以外の使い方は公式ドキュメントが詳しい

pacman - ArchWiki

Raspberry Pi 3 内蔵Bluetoothを使う

Raspberry Pi 3には内蔵WiFiに加えて、内蔵Bluetoothも搭載されている(買ってから知ったw)。内蔵WiFiはインストール後になにもしなくても使えるのだが、内蔵Bluetoothは少し設定しないと使えなかった。 内蔵Bluetoothを使えるようにするには、以下の2つが必要になる。

このパッケージはAURと呼ばれるもので、いわゆる野良パッケージみたいなものである。AURの使い方はシンプルで、AURのページのDownload snapshotからtaballをDLし解凍。解凍先のディレクトリで makepkg -sri するだけである。詳しくは公式ドキュメントを参照。

Arch User Repository - ArchWiki

で、ここでハマったのだが、AURはバイナリパッケージではないのでビルドする必要がある。前述したとおり、ほぼ何も入っていない状態なので、ビルドツールも入っておらず、勘でgccを入れたもの依存パッケージが全然足りずにハマりまくっていた…。公式ドキュメントにもあるのだが、base-develパッケージグループを入れればこの問題は発生しない…。

まとめると、内蔵Bluetoothを使うためには以下の手順が必要だ。

# packman -S --needed base-devel
# curl -LO https://aur.archlinux.org/cgit/aur.git/snapshot/hciattach-rpi3.tar.gz
# tar zxvf hciattach-rpi3.tar.gz
# cd hciattach-rpi3
# makepkg -sri
# curl -LO zxvf https://aur.archlinux.org/cgit/aur.git/snapshot/pi-bluetooth.tar.gz
# tar zxvf pi-bluetooth.tar.gz
# cd pi-bluetooth
# makepkg -sri

これで内蔵Bluetoothが使えるようになっているはずである。この後の一般的なBluetoothの使い方は公式ドキュメントにかいてある。

Bluetooth - ArchWiki

…のだがこれにも罠がある。 blue-utilsパッケージをインストールするとCLIツールが入ってくるのだが、bluetoothcltなどはあるのだがrfcommなどのシェルコマンドが入っていないのだ…。 これはトラブルシューティングにも書かれているのだが、パッケージから削除されているらしい。 で、代わりの機能はD-Bus APIになったらしい。 なったらしいのだが、これをどう使えばいいのか書いていない!!!! D-BusAPIページにリンクが張ってあるのだが、本当にAPIの仕様のページであるために、どうやってこのAPIをたたけばいいのかすらわからない!!!! 挙げ句の果てに、一部の機能はD-Bus APIでは実装されていません!!!と書かれている…まじかよー。 しょうがないので、これらの削除されたコマンドを使いたい場合はbluez-utils-comapt AURパッケージを入れるとよい。

おまけ:ELECOM製無線LANアダプタWDC-433DU2HBKを使う

Raspberry Pi 3には内蔵WiFiがあることを前述した。 しかし、この内蔵WiFiは11acが使えず、また、そこそこ発熱するらしい(未検証)ので、私は外付けのアンテナを購入した。 超小型のUSB-WiFiドングルを昔使ったことがあるのだが、発熱がひどくWiFiがぶつ切りになってしまうので、発熱が少ないWDC-433DU2HBKみたいな外付けアンテナ式にした。 もちろんこいつはデフォルトのままではドライバが入っていないのでインストールする必要がある。 幸いにも、このアダプタに使われているチップは、RealTeakのRTL8812AUというメジャーなチップらしくLinux用のドライバが存在する。

…のだが、これもやっかいなのだ。 OSSとして公開されているのでgithub上に存在するのだが、検索すると大量のRTL8812AUドライバのソースが出てくる…。 どうやら源流は同じらしいのだが、各々が思い思いにforkしまくって、今やどれが最新なのかが全くわからない状態になっているのである…。 しょうがないので、私は以下のリポジトリを使うことにした。WDC-433DU2HBKのデバイスID(056e:4007)が登録されているというだけの理由である。

github.com

このドライバのビルドはmake && make installするだけなのだが、READMEにあるとおりMakefileの当該部分を書き換える必要がある。

CONFIG_PLATFORM_ARM_RPI=y
CONFIG_PLATFORM_I386_PC=n

また、DKMS対応なのでこれもやっておくと便利かもしれない。

Pepabo Maker Festival #1 に参加した

f:id:buty4649:20171207125717j:plain

会社でPepabo Maker Festival(PMF)というものづくりのための企画が開催されたので、先日社内発表会では動かなかったブツを動くようにして、リベンジマッチとして参加させてもらった。 当日の朝、寝落ちからの早起きをキメて、展示物の動作を確認し問題ないことをチェックしたのに、展示会になって動作しなくて現地でデバッグしていたw ↓デバッグしている様子

f:id:buty4649:20171206205249j:plain

私の展示物とは別に会社のプラモ部の展示も行った。 プラモ部で作ったキットを並べただけなのだが、数が揃うとそれはそれで楽しいものだw

f:id:buty4649:20171207125933j:plain

↓キットを並べるのがめちゃくちゃ楽しいの図

f:id:buty4649:20171206195245j:plain


モノを作ることはとても楽しいし、人に見てもらえるともっと楽しい! 他の人の作品をみて、いろいろな気づきや刺激を得られてとてもよかった!! また是非参加したい所存です!

ラズパイで始める電子工作というタイトルで社内発表した

資料のタイトルにある通り、最近ラズパイを使って電子工作を始めたら思った以上に楽しかったので、そのパッションをそのまま社内発表会で発表したw 案の定というか、勢いだけで資料を作って発表したせいで完全に時間オーバーしてしまったので反省。。 そして、資料には書いたけど一部未検証部分があるのも反省。。 ともかく、この発表を聞いて社内で電子工作を始める人が増えたらいいなぁ〜。

OpenStack ネットワークノードはgc_threshを増やしておいたほうがよい

会社のプライベートクラウドで、SNATルーターが度々不調になるということに出くわした…。 調べていくとネットワークノードで以下のメッセージが出ていた。

neighbour: arp_cache: neighbor table overflow!

このメッセージはARPキャッシュエントリーの数が設定値を超えると発生するらしい。 ARPエントリが追加できないので、通信ができなくなるということらしい。 プライベートクラウドのSNATルーターはHA構成になっているため、通信断になるとフェイルオーバーするのだが、フェイルオーバーしたことを検知することもできないし、即時にARPテーブルの空きができてフェイルバックするために、通信断の状態が長くなるのであった…。

これを解決するには以下のカーネルパラメータを変更すればよい

  • net.ipv4.neigh.default.gc_thresh1
  • net.ipv4.neigh.default.gc_thresh2
  • net.ipv4.neigh.default.gc_thresh3

それぞれのデフォルト値とパラメータの意味は以下を参照。 Man page of ARP


どうしたらneighbor table overflow!が発生するのか?

例の如く id:hiboma がどういう実装になっているのかを調べてくれた。hiboma++

static struct neighbour *neigh_alloc(struct neigh_table *tbl, struct net_device *dev)
{
    struct neighbour *n = NULL;
    unsigned long now = jiffies;
    int entries;

    entries = atomic_inc_return(&tbl->entries) - 1;
    if (entries >= tbl->gc_thresh3 ||
        (entries >= tbl->gc_thresh2 &&
         time_after(now, tbl->last_flush + 5 * HZ))) {
        if (!neigh_forced_gc(tbl) &&
            entries >= tbl->gc_thresh3) {
            net_info_ratelimited("%s: neighbor table overflow!\n",
                         tbl->id);
            NEIGH_CACHE_STAT_INC(tbl, table_fulls);
            goto out_entries;
        }
    }
-- -- snip -- --

上記を見ると gc_thresh3 を超えると発生するようだ。 ARPキャッシュエントリー数は lnstat コマンドで確認できる。 これも id:hiboma に教えてもらった。 hiboma++

$ lnstat -c 1 -k arp_cache:entries
arp_cach|
 entries|
    4162|

このエントリ数を見て gc_treshX を設定するのが良いと思う。 会社のプライベートクラウドでは、インスタンス数600、ポート数1600弱だったが上記の通りそこそこのエントリ数だったので以下のように設定し回避した。

echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 8192 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 8192 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

また、エントリ数をMackerelに投稿するやーつを @r_takaishi が作ったのでまたエントリ数が増えてきたら設定を増やすような運用にしたい。


(追記)各パラメータの設定値について、OpenStack-Ansibleでは8GBメモリ以上なら 4096 8192 16384 で設定しているように見受けられた。 搭載メモリが多ければなるべく大きめに設定しておくと良さそうだ。 OpenStack Docs: OpenStack-Ansible openstack_hosts

OpenStack Octaviaのamphoraイメージを作るスクリプト

OpenStack Octaviaではamphora(読み方はあんふぉらでいいのかな?)と呼ばれるロードバランサーを立てる必要ある。 amphoraはNova APIを経由してインスタンスとして作られるため、予めインスタンス用のイメージを作成しておく必要がある。

調べた限り公式のイメージはなく自分でビルドする必要があるようだ。 イメージは1から自分で作る必要はなくイメージ作成用のスクリプトが用意されている。 https://docs.openstack.org/octavia/latest/contributor/specs/version0.5/base-image.html

とはいえ、これを正しく動かすための環境を作るのがめんどくさかったので、一連の環境を用意してamphoraイメージを作成するスクリプトを作った。 Ubuntu-16.04で動作を確認している。

2017/10/03追記: リポジトリ名をamphora-imageからamphora-image-builderに変更した

github.com

最初はスクリプトではなく作成したイメージを置いておこうと思ったのだが、完成したイメージファイルが600MB強ありアップロードしただけでgit-lfsの上限を超えたのであった…

5分でわかるOpenStack Octaviaという内容で社内LTしました

社内LTの機会があったので、最近いじっているOpenStack Octaviaについて発表しました。 発表内容はブログで書いたことをもう少し利用者側よりにそして、Octaviaを使うとどう便利なのか?を主眼にしています。 また、今のところ公式CLIツールがないので、発表に間に合わせてツールを作りました!っとバーン感を出していますw 発表したツールは↓です。

github.com

yao(Yet Another OpenStack API Wrapper)は、弊社のOSSRubyのOpenStackライブラリです。 これを用いてCLIを作っています。 なぜあえてCLIを再実装しているかという話は別途できればと思います。。

github.com