(2020-12-04)

デジタル温度センサー DS18B20 をRaspberry Piにつないで温度を測ります。
1-Wireという、配線が電源VDDとGND、信号線を含めても2本または3本のインターフェースになっていいます。
配線が非常に楽なのが特徴です。
しかも、1-Wireデバイスは、同一配線上に複数設置可能となっているので、温度センサーを複数設置したい場合など、ハードウェア的に非常に実装しやすくなっています。

Raspberry Pi OS(最近Raspbianという名前から変わった)では初めからドライバが用意されているので、ソフトウェア側での温度の読み出しも非常に簡単です。

秋月電子の通販(以下)で入手したが、アマゾンなどでも防水のものなどが売られています。
https://akizukidenshi.com/catalog/g/gI-05276/

少々残念な点

実験環境

ハードウェア

Raspberry Pi 1 Model B (初期型,メモリ512MB)

OS周り

$ uname -a
Linux rasp1a 5.4.72+ #1356 Thu Oct 22 13:56:00 BST 2020 armv6l GNU/Linux
$ grep NAME /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_CODENAME=buster

1-Wireインターフェースを有効化

Raspberry Pi OS(長いので RaspPiOS)の初期状態では1-Wireは無効です。
有効化するために下記の手順で作業します。

ターミナル画面(なんていうんだっけ)で以下のコマンドを実行します。管理人はたいていノートPCからSSHでつないでいます。

$ sudo raspi-config

GUI風のキャラクタ画面が出てくるので、カーソル、Enter、Tabキーなどを使い、以下に沿って選んでいく(項目の番号は違っているかもしれない)。

5 Interfacing Options → P7 1-Wire

下記のメッセージが表示されるので、Yesを選択します。

Would you like the one-wire interface to be enabled?

場合によってはRebootしますか、などと聞いてくるので適宜対応してください。 Rebootすると必要なモジュールが自動的に読み込まれます。

上記の設定がうまくいっていれば下記の1行が /boot/config ファイルの末尾あたりに追加されているはずです。

dtoverlay=w1-gpio

それと下記のモジュールがロードされています。

$ lsmod | grep w1
w1_therm               20480  0
w1_gpio                16384  0
wire                   40960  2 w1_gpio,w1_therm

配線、およびドライバモジュールの選択

((工事中))

デバイスとRaspPi本体を3本でつなぐか、2本にするか。

3本の場合、VDD + GND + DQでGPIOは1ポート使用

2本の場合、VDD + GNDはともにGNDに落とす

電源供給と通信はDQとなり、GPIOは1ポート使用

通信用のGPIOを1ポート、電源供給用のFET制御用にGPIOをもう1ポート使用

メーカーのデータシートでは2通りのパターンしか書いていない(https://akizukidenshi.com/download/ds/maxim/DS18B20.pdf)。 まあこれは概略図なわけで。

RaspPiのGPIOって、入出力の切り替えやプルアップ、プルダウン、トライステートなどやりたい放題なので、それを利用して、ドライバつっくった人がデータ線そのままで電源供給したれって作ったのかなあ、だれかドライバのソースコード見てくれ。

悩み中で工事中・・・

ちなみにDS18B20を並列に3個つないで2線でつないだら、とりあえずは3つとも値が取得できたが、どれか1個のセンサーが時々とんでもない値を返す場合があり、電力不足なのかなあ。

Tips

以下のファイルに1-Wireの設定に関する説明があります。ただし英語です。

/boot/overlays/README

/boot/configの中に

# Additional overlays and parameters are documented /boot/overlays/README

といった記載がある)

w1-gpioというキーワードで探すと、1-Wireモジュールの設定方法が出てくるので抜粋しておきます。

Name:   w1-gpio
Info:   Configures the w1-gpio Onewire interface module.
        Use this overlay if you *don't* need a GPIO to drive an external pullup.
Load:   dtoverlay=w1-gpio,<param>=<val>
Params: gpiopin                 GPIO for I/O (default "4")
        pullup                  Now enabled by default (ignored)


Name:   w1-gpio-pullup
Info:   Configures the w1-gpio Onewire interface module.
        Use this overlay if you *do* need a GPIO to drive an external pullup.
Load:   dtoverlay=w1-gpio-pullup,<param>=<val>
Params: gpiopin                 GPIO for I/O (default "4")
        extpullup               GPIO for external pullup (default "5")
        pullup                  Now enabled by default (ignored)

別の方々のサイトでは、pullup=yesとかonなどを指定可能、と書いてあったのですが、最近だと上記のように ignoreつまりこの値は無視される、ということのようです。



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-02-15 (火) 10:06:34