DS18B20 温度センサーの追加。

ds18ledpicRaspberry Pi にはGPIOがあるのが特徴です。ここにいろいろなものを接続することができます。普通のPCではこれができません。
自作のものをつけるので基板が壊れる可能性があるのですが、Raspberry Piなら壊れても損害額は小さくなります。これがいいところですね。

今回は簡単に使えて、わかりやすいセンサーを試してみました。温度センサのDS18B20 (秋月で300円。高い方だな。) です。温度をデジタルの数値で返すセンサなので調整不要なところがいいですね。

ds18led今回はDS18B20とLEDをGPIOにつけるためにこんな風にハンダ付けしてまとめました。
本体から離すためにコードの先についているのが温度センサです。
LEDは二色のLEDを使っています。(手元に余っていたので)
図は Raspberry Pi の基板にさした状態を上から見た図です。写真の反対側から見たものになります。緑と赤のLEDがそれぞれGPIO17と27に繋がっています。
rootではないと作業が出来ない場合があるのでそのときはsudo -iでrootになってしまうのも手です。

LED点灯

LEDの点滅は以下のようにできます。

## Set up GPIO 17,27 and set to output
$ echo "17" > /sys/class/gpio/export
$ echo "27" > /sys/class/gpio/export
$ echo "out" > /sys/class/gpio/gpio17/direction
$ echo "out" > /sys/class/gpio/gpio27/direction

## Write output
$ echo "1" > /sys/class/gpio/gpio17/value
$ echo "1" > /sys/class/gpio/gpio27/value

## Write output
$ echo "0" > /sys/class/gpio/gpio17/value
$ echo "0" > /sys/class/gpio/gpio27/value

## Clean up
$ echo "17" > /sys/class/gpio/unexport
$ echo "27" > /sys/class/gpio/unexport

ledtest.sh (シェルスクリプト)

#!/bin/sh
## Set up GPIO 17,27 and set to output
echo "17" > /sys/class/gpio/export
echo "27" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
echo "out" > /sys/class/gpio/gpio27/direction

## Write output...
echo "1" > /sys/class/gpio/gpio17/value
echo "0" > /sys/class/gpio/gpio27/value
sleep 2
echo "0" > /sys/class/gpio/gpio17/value
echo "1" > /sys/class/gpio/gpio27/value
sleep 2
echo "1" > /sys/class/gpio/gpio17/value
echo "1" > /sys/class/gpio/gpio27/value
sleep 2

## Write output 0 
echo "0" > /sys/class/gpio/gpio17/value
echo "0" > /sys/class/gpio/gpio27/value

## Clean up
echo "17" > /sys/class/gpio/unexport
echo "27" > /sys/class/gpio/unexport

これでLEDが点いたり付いたりします。
単純なことですが、これを普通のパソコンでやるのは難しいし、配線を間違えてマザーボードを壊す事などを考えるとこのRaspberry pi でこういうことが出来ることの便利さを感じます。
LEDの部分をブザーにしたら音が鳴ります。モータにしたら回転します。リレーにすれば家電が動きます。赤外線LEDをつければリモコンが動きます。
「ロボット」というものはこういうもので出来ているわけです。

まずはLEDを点滅できるというのをテストしてみました。
これだけでもサーバで何かをチェックして点灯させるという仕組みを作れば便利です。

gpiozero

最近はスクリプトはpythonで書くようなので、GPIO用のモジュールがすでにインストールされていました。
GPIO17のピンにつないだLEDを点滅させるのは以下のスクリプトを実行です。

from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

温度計 (DS18B20)

温度センサをつけると室温が測れるようになります。意外と自宅の室温のログを取る道具が無いものなので便利です。夏はサーバ周りの温度をチェックしていました。これで留守の間、エアコンを止めている間の温度がわかります。ペットを飼っている人にも便利でしょう。
今回は秋月で買ってきた温度センサを使ってみます。このセンサの使い方は英語ですが詳しく書いてあるものがありました。アメリカのパーツ屋さんの資料です。
http://learn.adafruit.com/downloads/pdf/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing.pdf

2016年3月に以前書いていた通りに作業をしようとしたらうまく認識してくれません。
少し試行錯誤してみました。

$ sudo echo dtoverlay=w1-gpio-pullup=on,gpiopin=4 >> /boot/config.txt
$ sudo modprobe w1-therm
$ ls /sys/bus/w1/devices/
28-000003b716fb  w1_bus_master1

次のようなコマンドで温度が表示されます。
これは摂氏(℃)で表示されるので使いやすいのですが、マイナスの値は使用できません。そのためマイナスの温度が無さそうな室温を測るのに使ってみました。

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm
$ ls /sys/bus/w1/devices/
28-000003b716fb  w1_bus_master1
$ cat /sys/bus/w1/devices/28-000003b716fb/w1_slave
71 01 4b 46 7f ff 0f 10 56 : crc=56 YES
71 01 4b 46 7f ff 0f 10 56 t=23062

結果の一行目がYESの時の二行目のt=の値が温度です。1000倍した値が出ています。
センサが一個だけならば cat /sys/bus/w1/devices/28-*/w1_slave でもいいですね。
テキストで値が取れればあとは適当に編集すればいろいろと使えます。

CPU温度

CPUの中に温度センサがすでに入っているのでCPUの温度は知る事ができます。次の様に表示できます。

cat /sys/class/thermal/thermal_zone0/temp

こんなスクリプトを作ってみました。
温度センサの値とCPU温度を表示します。これはあとでMRTGで使います。

#!/bin/sh
#
temp1=0
temp2=0
temp1max=0
temp2max=0
temp1min=99999
temp2min=99999
wk1=0
wk2=0
temp1path="/sys/bus/w1/devices/28-000003b716fb/w1_slave"
temp2path="/sys/class/thermal/thermal_zone0/temp"
# function
cputemp()
{
  wk=`cat ${temp2path}`
  return $wk
}
roomtemp()
{
  wk=`cat ${temp1path}`
  yes=`echo ${wk} | grep -c "YES"` 
  if [ ${yes} -eq 1 ];then
    tmp=`echo ${wk} | grep "t\=" | sed -e s/^.*t=// `
    return ${tmp}
  else
    return 0
  fi
}
# main
for i in 0 1 2 3 4
do
  sleep 0.5
  cputemp
  temp1=$?
  roomtemp
  temp2=$?
##  echo $temp1 $temp2

  if [ $temp1 -le $temp1min ];then
    temp1min=$temp1
  fi
  if [ $temp1 -ge $temp1max ];then
    temp1max=$temp1
  fi
  if [ $temp2 -le $temp2min ];then
    temp2min=$temp2
  fi
  if [ $temp2 -ge $temp2max ];then
    temp2max=$temp2
  fi
  wk1=`expr ${wk1} + $temp1`
  wk2=`expr ${wk2} + $temp2`
done
#
temp1=`expr \( ${wk1} - $temp1min - $temp1max \) / 3 `
temp2=`expr \( ${wk2} - $temp2min - $temp2max \) / 3 `
echo $temp1
echo $temp2
echo "0"
echo "Temp"
##__END__

(2014/12/1)
(2016/3/21)