AQM0802をシェルスクリプトで操作する

いちいち文字コードを調べて入力するのは面倒くさいです。 シェルスクリプトを使って文字コード変換を自動化しましょう。

シェルスクリプトを書いた

GitHubにAQM0802液晶に文字列を表示するスクリプトを置きました。AQM0802の仕様で初期化コードを書きましたが、同じものをシェル変数を使って少しわかりやすくしました。

device="0x3e"
send_command="0x00"       # 液晶制御コード用データアドレス
 
init_first="0x38 0x39 0x14 0x70 0x56 0x6c i"
init_second="0x38 0x0d 0x01 i"
 
sudo i2cset -y 1 $device $send_command $init_first
sudo i2cset -y 1 $device $send_command $init_second

そして引数のひとつ目を1行目、ふたつ目を2行目に表示するようにしますが、仮に引数が与えられなかった時にはreadで読み込むようにします。

device="0x3e"
send_data="0x40"          # 文字表示データ用データアドレス
 
position_10="0xc0 i"      # 改行
 
if test "$1" != ""; then
  strings=$1
else
  echo -n "Input first line > "
  read strings
fi
hexcode                   # 文字コード変換関数
sudo i2cset -y 1 $device $send_data $code i
                          # 1行目文字列表示
sudo i2cset -y 1 $device $send_command $position_10
if test "$2" != ""; then
  strings=$2
else
  echo -n "Input second line > "
  read strings
fi
hexcode                   # 文字コード変換関数
sudo i2cset -y 1 $device $send_data $code i
                          # 2行目文字列表示

ここで12行目と22行目にあるhexcodeとなっている部分がこのスクリプトの心臓部、文字を16進数データに変換する関数です。

function hexcode() {
  code=""
  if test ${#strings} -ne 0; then
    for index in `seq 0 $((${#strings} - 1))`; do
      code="$code 0x`printf "%x" \'${strings:$index:1}`"
    done
  fi
}

その他、細かい処理を入れていますが基本これをつなげたものが文字表示用のシェルスクリプトです。

printfコマンドで16進変換

先ほどのhexcode関数の5行目printf “%x” \’${strings:$index:1}の部分、$stringsの1文字を取り出したものをprintf “%x”にて16進数のコードに変換しています。

で、よく見るとprintfに渡している引数の前に\’が付いています。これは\”でもいいんですが、値の前にシングルクォートかダブルクォートをひとつだけ付けておくとその値の文字コードに変換してくれるという機能があります。Bash Hackers Wikiのprintfコマンドのページにそう書いてあります。

printfコマンドって便利ですね。

表示はお任せ

というわけで任意の文字列を表示できるようになると。。。

pi@raspberrypi:~ $ vcgencmd measure_temp
temp=44.4'C

vcgencmdコマンドでRaspberry PiのCPU温度がわかります。”=”の部分を” “に置き換えてやるとちょうどふたつの文字列に分割されるので、温度表示ができるようになります。

液晶に温度を表示

他にもdateの結果をうまく編集して液晶に表示すれば、日付や時刻を知ることもできます。例えばcronで毎分実行するようにすれば、分単位のデジタル時計にもなります。

いろいろ遊べますね。