(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
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個のセンサーが時々とんでもない値を返す場合があり、電力不足なのかなあ。
以下のファイルに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つまりこの値は無視される、ということのようです。