Raspberry PiのGPIOポートには、シリアルポートのほか、I2CやSPIといった電子デバイスと通信するための機能を持ったインターフェースがあります。そのインターフェースに対応したセンサーを取り付ければ、Raspberry Piからセンサーの値を読み取ることができます。
今回実験するのは1-wire接続のデジタル温度センサー DS18B20 です。1-wireとは1本の信号線だけで、低速なデータの送受信と電力供給ができる規格です。バス接続のため複数のデバイスを接続することもできます。
Raspbian OSでは1-wire用のモジュールをロードするだけで1-wireデバイスにも対応し、ファイルを読み書きする感覚で使用できるので、とても簡単です。今回はDS18B20を以下のようにRaspberry Piに接続します。DS18B20の2番ピンDQがデータ用のピンなので、これをGPIO4に接続します。
接続例

まずはじめにRaspberry Piを最新のバージョンにアップデートしておきましょう。
アップデートが終わったら、1-wireデバイス用のモジュールを起動時に読み込むように設定します。スーパーユーザーで /etc/modules に以下の2行を追加します。
続いて /boot/config.txt の最後に以下の行を追加します。gpiopin=4はGPIO 4という意味です。
/etc/modules と /boot/config.txt の編集が終わったら再起動します。
これで準備は完了です。温度センサーが認識されるかどうか確認します。まだGPIOポートに接続していない場合は接続してください。認識されると/sys/bus/w1/devices/の中に仮想のディレクトリが作成されます。lsコマンドでみると、28-000…ではじまるフォルダ(シンボリックリンク)が出てきました。
これが接続した温度センサーのデバイスIDです。複数接続している場合は、複数表示されます。デバイスIDは個々のデバイス毎に異なりますので、以下の説明は適宜ご自身の温度センサーのデバイスIDに読み替えてください。
温度センサーの値を取得するには、そのデバイスのフォルダの w1_slave というファイルを読み込みます。
色々な値が出てきますが、t=の値が温度です。1000倍された値のため、この例の場合は 24.750度 ということになります。このように全くプログラムを使用せず、ファイルを読むだけで簡単に温度センサーの値を読み取ることができました。
最後に簡単なスクリプトを作って、温度だけをわかりやすく表示させるようにしてみたいと思います。以下のサンプルスクリプトではPerlで t= の部分の値を抜き出して、1000で割った値を出力しています。(DEVID=の部分はご自身のデバイスIDにしてください)
サンプルプログラム ds18b20.sh
パーミッションを設定して実行すれば、温度だけが表示されて見やすくなりました。
Raspberry Piならこのように簡単にセンサーの値を読み取ることができますので、温度で制御する機械を作ったり、マシン室の温度監視用など、いろいろと便利な使い方ができそうです。測定日時と共にファイルに記録していけば温度ロガーにもなりますね。読み取った値をツイートしたり、Open JTalkを使ってRaspberry Piに喋らせても面白いでしょう。
【PR】
・1-wire温度センサー DS18B20キット【メール便可】
・1-wire温度センサー DS18B20×5キット【メール便可】
・1-wire温度センサー DS18B20防水仕様【メール便可】

Raspbian OSでは1-wire用のモジュールをロードするだけで1-wireデバイスにも対応し、ファイルを読み書きする感覚で使用できるので、とても簡単です。今回はDS18B20を以下のようにRaspberry Piに接続します。DS18B20の2番ピンDQがデータ用のピンなので、これをGPIO4に接続します。
接続例

まずはじめにRaspberry Piを最新のバージョンにアップデートしておきましょう。
$ sudo apt-get update
$ sudo apt-get upgrade
アップデートが終わったら、1-wireデバイス用のモジュールを起動時に読み込むように設定します。スーパーユーザーで /etc/modules に以下の2行を追加します。
w1-gpio
w1-therm
続いて /boot/config.txt の最後に以下の行を追加します。gpiopin=4はGPIO 4という意味です。
dtoverlay=w1-gpio-pullup,gpiopin=4
/etc/modules と /boot/config.txt の編集が終わったら再起動します。
$ sudo reboot
これで準備は完了です。温度センサーが認識されるかどうか確認します。まだGPIOポートに接続していない場合は接続してください。認識されると/sys/bus/w1/devices/の中に仮想のディレクトリが作成されます。lsコマンドでみると、28-000…ではじまるフォルダ(シンボリックリンク)が出てきました。
$ ls /sys/bus/w1/devices/
28-000003daaec3 w1_bus_master1
これが接続した温度センサーのデバイスIDです。複数接続している場合は、複数表示されます。デバイスIDは個々のデバイス毎に異なりますので、以下の説明は適宜ご自身の温度センサーのデバイスIDに読み替えてください。
温度センサーの値を取得するには、そのデバイスのフォルダの w1_slave というファイルを読み込みます。
$ cat /sys/bus/w1/devices/28-000003daaec3/w1_slave
8c 01 4b 46 7f ff 04 10 2e : crc=2e YES
8c 01 4b 46 7f ff 04 10 2e t=24750
色々な値が出てきますが、t=の値が温度です。1000倍された値のため、この例の場合は 24.750度 ということになります。このように全くプログラムを使用せず、ファイルを読むだけで簡単に温度センサーの値を読み取ることができました。
最後に簡単なスクリプトを作って、温度だけをわかりやすく表示させるようにしてみたいと思います。以下のサンプルスクリプトではPerlで t= の部分の値を抜き出して、1000で割った値を出力しています。(DEVID=の部分はご自身のデバイスIDにしてください)
サンプルプログラム ds18b20.sh
#!/bin/sh(2016.3.18 マイナス表示対応の修正をしました)
DEVID="28-000003daaec3"
cat /sys/bus/w1/devices/$DEVID/w1_slave \
| perl -e 'while(<stdin>){ if(/t=([-0-9]+)/){print $1/1000,"\n";} }'
パーミッションを設定して実行すれば、温度だけが表示されて見やすくなりました。
$ chmod 755 ds18b20.sh
$ ./ds18b20.sh
24.75
Raspberry Piならこのように簡単にセンサーの値を読み取ることができますので、温度で制御する機械を作ったり、マシン室の温度監視用など、いろいろと便利な使い方ができそうです。測定日時と共にファイルに記録していけば温度ロガーにもなりますね。読み取った値をツイートしたり、Open JTalkを使ってRaspberry Piに喋らせても面白いでしょう。
【PR】
・1-wire温度センサー DS18B20キット【メール便可】
・1-wire温度センサー DS18B20×5キット【メール便可】
・1-wire温度センサー DS18B20防水仕様【メール便可】
https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README