2014.09.29
Raspberry Pi : display IP address on I2C LCD
Raspberry Piにcharacter baseのLCDをI2Cで接続して、OS起動時にIPアドレスを表示する。
RpiをあちこちのDHCPに接続してリモートログインするような使い方をしていると、起動時に現在のIPアドレスを表示してくれると便利かも知れない。
このガジェット制作では、LCDにピンヘッダと抵抗器のハンダ付けが必要となる。
LCD : SB1602B
pin1=RST / pin2=SCL / pin3=SDA / pin4=VSS(GND) / pin5=VDD(2.7-3.6V)
ピンヘッダ(細いもの): 細ピンヘッダ 1×4
無ければ単芯線などでも良い
ジャンプワイヤ(メス-メス): ブレッドボード・ジャンパー延長ワイヤ(メス-メス) 15cm
回路図
>>Raspberry Piのピン配列
こちらの方が分かりやすいかも知れない。
このLCDは3Vで動作する低電圧のモジュールなので、Rpiの3.3V出力を供給する。
注意として、SCLとSDAの間のプルアップ抵抗はRpiに内蔵されているので不要だが、LCDのResetとVDDを直結しないとLCDが不安定になり、ちょっと触れただけで表示が消えたりするので、ここにはプルアップを接続しておく。
/etc/modules にi2c-devを追加
1 2 |
snd-bcm2835 i2c-dev |
/etc/modprobe.d/raspi-blacklist.conf でblacklist i2c-bcm2708をコメントアウト
1 2 3 4 |
# blacklist spi and i2c by default (many users don't need them) blacklist spi-bcm2708 #blacklist i2c-bcm2708 |
ライブラリをインストール
# apt-get install i2c-tools
LCD(SB1602B)に文字列を表示するためのスクリプト。こちらを参考にした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/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 } [ $# = 0 ] && usage while getopts "icp:" flag; do case $flag in \?) usage ;; i) i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5e 0x6c i sleep 0.25 i2cset -y 1 0x3e 0 0x0c 0x01 0x06 i sleep 0.05 ;; c) i2cset -y 1 0x3e 0 0x01 ;; p) i2cset -y 1 0x3e 0 $((OPTARG+128)) ;; 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 |
例えば、下記のように引数を与えると、LCDに2行表示される。
# bash lcd.sh -i "0123456789abcdef"
# bash lcd.sh -p 40 "Raspberry pi"
起動時にIPアドレスを調べてLCDに表示するように、起動スクリプトを書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash ### BEGIN INIT INFO # Provides: getip.sh # Required-Start: $all # Required-Stop: $syslog $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: getip.sh ### END INIT INFO PATH=/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin d=$(date +"%m/%d-%H:%M:%S") ip=$(wget -O - http://checkip.dyndns.org/ | awk -F '[("<"" ")]' '{print $12}') bash /root/lcd.sh -i $d bash /root/lcd.sh -p 40 $ip |
ここでは、/root にlcd.sh を保存している。
LCDの1行目に現在の日時、2行目にグローバルIPアドレスを表示している。
IPアドレスは内部コマンドで取得しても良いが、インターネットに接続できていることも確認するために、
http://checkip.dyndns.org/
にアクセスし、IPアドレスが表示されたindex.htmlを取得して、awkで整形している(HTMLタグの < とスペースを区切り文字にしてIPアドレスを抜き出す)。
もしくは以下の様なコマンドでIPアドレスを取得してもよい。
# ip route | awk 'END{print}' | awk -F " " '{print $NF}'
スタートアップの設定
# chmod +x /root/lcd.sh
# cd /etc/init.d
# chmod +x getip.sh
# update-rc.d getip.sh defaults