Raspberry Piで遊んでいると困るのが、リモート接続しようとするとDHCPで払い出されたIPアドレスがわからないことだ。
起動時にディスプレイとキーボードでもつけたり、UARTで接続でもしていればコマンド一つで確認できるけど、わざわざ起動時にそんなことをするのもめんどくさい。
ということで、LCDにIPアドレスを表示させてみようと思った。
いくつかLCDを買ってしばらく遊んでみるが、どうも相性の良し悪しが激しいようで利用可能なLCDはそれほど多くないようだ。
ストロベリー・リナックスで販売されているLCDがサイズ的にもちょうどよさそうなので、これを使ってみる。
I2C低電圧キャラクタ液晶モジュール(16x2行)[バックライト付](写真左上)
I2C低電圧キャラクタ液晶モジュール(16x2行)
マルツからも同等のLCDが出ている
液晶モジュール【MI2CLCD-01】(写真右上)
LCDモジュール 16*2LINE【BO1602DGRNJB$】(写真下)
ちなみに文字とアイコンを表示させてみたものが下の写真。
このアイコンも活用できればと思うのだが、使い道が思い浮かばなかった。
というか、使いようが不明なアイコンもあるのだが・・・
アンテナ、電話、上下の三角、鍵(だよな?)、電池はわかるのだけど。
左から順に3つ目はこれで一つのアイコンなので、電界強度で増減するといった使い方はできないし。
4つ目は何だろう、なんかの入力がされているってことだろうか。
7つ目はミュートの表示なのかな。でも○(丸)に×(バツ)の一辺が閉じていて本当にスピーカにバツ印なのだろうか?
一番右にいたっては、数字の1固定だし何に使えばよいのだろうか。
ちなみにストロベリー・リナックスのバックライト付きのものはシールなどで遮光してやらないとまぶしい。
秋月で細長い基板を買ってそれにLCDをのせることにしたが、ただLCDをつなげるだけでは芸がないので、少し考えてみる。
まずは電源用のLEDをつけようと思ったのだが、ただ5VラインにLEDをつけただけでは面白くないので、秋月電子で買ってきた電圧検出システムリセットIC(4個入) M51957Bを使って、低電圧を検知できるようにした。
このICで抵抗の値で検出電圧を自由に変えられるのだけれど、固定抵抗では狙った値に持って来ようとすると組み合わせを考えるのが結構面倒。
半固定抵抗使えば自由に設計できるけど、そこまで厳密である必要もないので半固定抵抗も無駄。
いくつか抵抗の組み合わせを計算してRaspberry Piで使われているリセットICより高めの4.66Vに設定した。
このICは基板の裏につけることにしたので、ICを載せるところを取り付け用の4か所を除いてポリイミドテープで絶縁する。
UARTも簡単に使えるようにしたいので、こちらの配線も引き出してある。
こちらは秋月の超小型USBシリアル変換モジュールを直接つなげられるようにピン配置を決めた。
LCDを基板に乗せる際、無理な力が加わって破損しないように、2.5mm厚のゴム板を取り付ける。
ケースの関係で、普通の10ピンコネクタだと上蓋につっかえてしまうので、ピンソケットを利用。
そのままだと使いにくいので、両面基板の切れ端を利用してピンヘッダへの取り付け取り外しがしやすいようにしている。
また、ケーブルの半田付け部分に力が加わって断線しないようにしている。
100円ショップで買ったL版用のフォトフレームを利用して基板を取り付け。
写真を挟むための折り返している部分を折り取って利用している。
Raspberry Piを置いてみたところ。
単体だと若干フォトフレームがでかすぎるな。
USBドライブと組み合わせたところ。
これまた100円ショップで買ったサイズが変えられるランチベルトでまとめている。
SSDをつないで利用することを考えていたので、これだとちょうどいい感じなのかな?
とりあえず、これでハードについては準備ができたので、次にLCDに文字列を表示させるためのスクリプトを準備する。
LCDへの文字表示はググって見つけた以下のサイトのスクリプトを利用。
http://web.sfc.keio.ac.jp/~yama/nos/?p=5047
http://netlog.jpn.org/r271-635/2013/01/raspberry_pi_i2c_lcd.html
http://d.hatena.ne.jp/NeoCat/20120926/1348684357
i2csetコマンドでエラーが返ってきた時の処理を追加しています。
i2c-disp.sh
#!/bin/bash function usage { echo "Usage: $0 [-ic] [-p pos] message" > /dev/stderr; echo " -i : LCD init, -c : Clear Screen" > /dev/stderr echo " -p : position (0:top left, 40:bottom left)" > /dev/stderr exit 1 } function abort { echo "$@" 1>&2 exit 1 } [ $# = 0 ] && usage while getopts "icp:" flag; do case $flag in \?) usage ;; i) i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5e 0x6c i || abort "i2c error:initialize step1" sleep 0.25 i2cset -y 1 0x3e 0 0x0c 0x01 0x06 i || abort "i2c error:initialize step2" sleep 0.05 ;; c) i2cset -y 1 0x3e 0 0x01 || abort "i2c error:clear screen" ;; p) i2cset -y 1 0x3e 0 $((OPTARG+128)) || abort "i2c error:set position" ;; esac done shift $((OPTIND-1)) [ $# = 0 ] && exit LANG=C MSG=`echo -n "$1" | perl -pe '$_=join" ",map{ord }split//'` #echo $MSG i2cset -y 1 0x3e 0x40 $MSG i || abort "i2c error:display string"
次に、IPアドレスの表示を行うスクリプトの準備。
/root/script/の下にi2c-disp.shを置いたので、フルパスでスクリプトを指定。
ipdisp.shを準備したら、以下のディレクトリにln -sコマンドでリンクを作成。
/etc/network/if-down.d
/etc/network/if-post-down.d
/etc/network/if-pre-up.d
/etc/network/if-up.d
これらのディレクトリにスクリプトを置くと、インターフェースの状態が変化するごとにディレクトリ内のスクリプトが実行される。
ipdisp.sh
#!/bin/sh ipaddr=`ip a show dev eth0 | grep inet | sed -e 's/^ *inet //' | cut -f1 -d "/"` case "$ipaddr" in "") /root/script/i2c-disp.sh -ic `uname -n` /root/script/i2c-disp.sh -p 0x40 "eth0 is down" ;; *) /root/script/i2c-disp.sh -ic `uname -n` /root/script/i2c-disp.sh -p 0x40 ${ipaddr} ;; esac
これで、電源起動時などでホスト名とIPアドレスが表示されるようになった。
せっかくアイコンがあるのだあから、Raspberry Piの状態に合わせてアイコンも表示できるようにすると面白そうなのだが、どう利用したものかな。